Summary
BitcoinProvider.blockstream_get_balance and SubtensorProvider.get_balance both return 0 on any backend failure. The validator's reserve handler uses the return value as a pre-flight check:
# allways/validator/axon_handlers.py:321-324
balance = provider.get_balance(synapse.from_address)
if balance < synapse.from_amount:
reject_synapse(synapse, 'Insufficient source balance', ctx)
return synapse
When Blockstream (or the subtensor RPC) is temporarily unreachable, the balance call returns 0, the check fails, and the validator rejects the reservation with a misleading "Insufficient source balance" error — even though the user actually has funds.
Locations
allways/chain_providers/bitcoin.py:294-308 — blockstream_get_balance swallows Exception and returns 0.
allways/chain_providers/subtensor.py:260-267 — same pattern for TAO balance lookups.
allways/validator/axon_handlers.py:321-324 — consumer that reads 0 as "insufficient".
Summary
BitcoinProvider.blockstream_get_balanceandSubtensorProvider.get_balanceboth return0on any backend failure. The validator's reserve handler uses the return value as a pre-flight check:When Blockstream (or the subtensor RPC) is temporarily unreachable, the balance call returns
0, the check fails, and the validator rejects the reservation with a misleading "Insufficient source balance" error — even though the user actually has funds.Locations
allways/chain_providers/bitcoin.py:294-308—blockstream_get_balanceswallowsExceptionand returns0.allways/chain_providers/subtensor.py:260-267— same pattern for TAO balance lookups.allways/validator/axon_handlers.py:321-324— consumer that reads0as "insufficient".