mirror of
https://github.com/Routstr/routstr-core.git
synced 2026-10-06 12:38:23 +00:00
Prices reach the node from upstream catalogs, an operator's admin edit, a legacy database row and the BTC/USD feed. json.loads accepts the bare NaN and Infinity literals and overflows 1e999 to inf, so any of those sources can deliver a value that is not a price. Three guards let one through: - The token-rate gate tested truthiness, so NaN and inf reached the token math and raised ValueError/OverflowError *after* the response was served. The streaming handlers swallow that, so the request went unbilled. A negative rate produced a negative charge, which settlement subtracts from the balance. - An upstream-reported cost component was clamped with max(0.0, ...), which passes inf and NaN through. A non-finite component poisoned the proportional split in _calculate_from_usd_cost (inf / inf is NaN); the exception was absorbed by the broad handler around the USD path, so a request whose total was perfectly valid fell through to token estimation and was billed a fraction of what the upstream charged. Each spelling is now coerced before the fallback chooses between them, so a malformed first field cannot win the `or` and hide the usable figure beside it. - An exchange quote that was zero, negative or non-finite was accepted as the node's BTC/USD price, repricing every model on the node. Each now declines to price rather than billing a nonsensical amount. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>