Summary
pallets/subtensor/src/macros/dispatches.rs defines faucet() around lines 1256-1275 with a docstring that reads:
/// Facility extrinsic for user to get taken from faucet
/// It is only available when pow-faucet feature enabled
/// Just deployed in testnet and devnet for testing purpose
The docstring is stale. The call is gated behind #[cfg(feature = "pow-faucet")], and the feature is only enabled in the Docker local_builder stage. The deployed public testnet and devnet runtimes are built without it, so the faucet dispatchable is genuinely absent from the on-chain Call enum on both networks.
The line "Just deployed in testnet and devnet for testing purpose" actively misleads readers — any downstream tool that trusts the docstring will build a working PoW pipeline that then fails at submission time with a pallet-call-not-found error, not a helpful "wrong runtime" message.
Evidence
1. The cfg gate
pallets/subtensor/src/macros/dispatches.rs around line 1256:
/// Facility extrinsic for user to get taken from faucet
/// It is only available when pow-faucet feature enabled
/// Just deployed in testnet and devnet for testing purpose
#[pallet::call_index(60)]
#[pallet::weight((
Weight::from_parts(91_000_000, 0)
.saturating_add(T::DbWeight::get().reads(27))
.saturating_add(T::DbWeight::get().writes(22)),
DispatchClass::Normal,
Pays::No
))]
#[cfg(feature = "pow-faucet")]
pub fn faucet(
origin: OriginFor<T>,
block_number: u64,
nonce: u64,
work: Vec<u8>,
) -> DispatchResult {
Self::do_faucet(origin, block_number, nonce, work)
}
2. The Dockerfile only enables it in one stage
Dockerfile around line 86, local_builder stage:
RUN cargo build --workspace --profile release --features "pow-faucet"
No other cargo build in the Dockerfile passes --features pow-faucet. The subtensor production image therefore ships a runtime without the call.
3. Metadata dump proves the call is absent on deployed chains
On 2026-04-15, subxt metadata dumps were run against both public endpoints:
wss://test.finney.opentensor.ai:443 — no faucet / drip / tao dispatchable anywhere in the runtime metadata. A full cross-pallet scan for faucet|drip|tao returned only three unrelated AdminUtils::sudo_set_tao_flow_* parameter setters.
wss://dev.chain.opentensor.ai:443 — same result, no faucet dispatchable.
SubtensorModule (pallet 7) exposes 70+ calls on both chains (register, burned_register, root_register, add_stake, ...) but faucet is not among them on either network.
Proposed fixes
Either of the following would unstick downstream tooling. btt has no preference — either is fine from our perspective.
(a) Fix the docstring. Change the comment to accurately describe when the call is available, for example:
/// Facility extrinsic to acquire TAO from a proof-of-work faucet.
/// Only compiled into runtimes built with --features pow-faucet.
/// The production testnet and devnet images do NOT enable this feature;
/// it is only wired up in the Docker `local_builder` stage for local dev.
This costs nothing and prevents the next reader from hitting the same trap.
(b) Enable pow-faucet on the testnet build. Add --features pow-faucet to the testnet runtime's Docker build stage so the historical btcli / btt UX of "run the faucet command against testnet" works again on the real chain. This restores the workflow the docstring currently advertises.
Downstream impact
btt (https://github.com/ErgodicLabs/btt) merged a wallet faucet command in PR #66 on 2026-04-15 based on the upstream docstring and the btcli reference implementation. When the command was first exercised against wss://test.finney.opentensor.ai:443 hours later, it failed at extrinsic submission because the dispatchable does not exist on the deployed runtime. The command has now been removed from btt in ErgodicLabs/btt#80, with the local-only retarget tracked as a followup.
References
- Gate:
pallets/subtensor/src/macros/dispatches.rs ~L1256-L1275
- Docker feature enable:
Dockerfile ~L86 (local_builder stage)
- Metadata absence: confirmed on
wss://test.finney.opentensor.ai:443 and wss://dev.chain.opentensor.ai:443 on 2026-04-15
[cryptid]
Summary
pallets/subtensor/src/macros/dispatches.rsdefinesfaucet()around lines 1256-1275 with a docstring that reads:The docstring is stale. The call is gated behind
#[cfg(feature = "pow-faucet")], and the feature is only enabled in the Dockerlocal_builderstage. The deployed public testnet and devnet runtimes are built without it, so thefaucetdispatchable is genuinely absent from the on-chainCallenum on both networks.The line "Just deployed in testnet and devnet for testing purpose" actively misleads readers — any downstream tool that trusts the docstring will build a working PoW pipeline that then fails at submission time with a pallet-call-not-found error, not a helpful "wrong runtime" message.
Evidence
1. The cfg gate
pallets/subtensor/src/macros/dispatches.rsaround line 1256:2. The Dockerfile only enables it in one stage
Dockerfilearound line 86,local_builderstage:No other
cargo buildin the Dockerfile passes--features pow-faucet. Thesubtensorproduction image therefore ships a runtime without the call.3. Metadata dump proves the call is absent on deployed chains
On 2026-04-15,
subxtmetadata dumps were run against both public endpoints:wss://test.finney.opentensor.ai:443— nofaucet/drip/taodispatchable anywhere in the runtime metadata. A full cross-pallet scan forfaucet|drip|taoreturned only three unrelatedAdminUtils::sudo_set_tao_flow_*parameter setters.wss://dev.chain.opentensor.ai:443— same result, nofaucetdispatchable.SubtensorModule(pallet 7) exposes 70+ calls on both chains (register,burned_register,root_register,add_stake, ...) butfaucetis not among them on either network.Proposed fixes
Either of the following would unstick downstream tooling. btt has no preference — either is fine from our perspective.
(a) Fix the docstring. Change the comment to accurately describe when the call is available, for example:
This costs nothing and prevents the next reader from hitting the same trap.
(b) Enable
pow-fauceton the testnet build. Add--features pow-faucetto the testnet runtime's Docker build stage so the historical btcli / btt UX of "run the faucet command against testnet" works again on the real chain. This restores the workflow the docstring currently advertises.Downstream impact
btt(https://github.com/ErgodicLabs/btt) merged awallet faucetcommand in PR #66 on 2026-04-15 based on the upstream docstring and the btcli reference implementation. When the command was first exercised againstwss://test.finney.opentensor.ai:443hours later, it failed at extrinsic submission because the dispatchable does not exist on the deployed runtime. The command has now been removed from btt in ErgodicLabs/btt#80, with the local-only retarget tracked as a followup.References
pallets/subtensor/src/macros/dispatches.rs~L1256-L1275Dockerfile~L86 (local_builderstage)wss://test.finney.opentensor.ai:443andwss://dev.chain.opentensor.ai:443on 2026-04-15[cryptid]