linera-io/linera-protocol · error · async_graphql::Error
No chain created for owner {}
Error message
No chain created for owner {} What it means
After the faucet commits a batch, it parses chain descriptions of newly opened chains out of the certificate's blobs (`extract_opened_single_owner_chains`) and maps them back to requesters. This error means an initial-claim request reached the response stage but no chain description for that owner was found in the certificate — an internal inconsistency between what was queued and what the block actually executed. The batch itself was committed, so the user's request fails after on-chain execution.
Source
Thrown at linera-faucet/server/src/lib.rs:1108
for request in requests {
#[cfg(with_metrics)]
{
let wait_time = request.queued_at.elapsed().as_secs_f64() * 1000.0;
metrics::QUEUE_WAIT_TIME
.with_label_values(&[])
.observe(wait_time);
}
let response = if let Some(target_chain_id) = request.target_chain_id {
PendingResponse::Daily(Ok(ClaimOutcome {
chain_id: target_chain_id,
certificate_hash,
amount: request.amount,
}))
} else if let Some(description) = initial_desc_map.get(&request.owner) {
PendingResponse::Initial(Ok(Box::new(description.clone())))
} else {
PendingResponse::Initial(Err(Error::new(format!(
"No chain created for owner {}",
request.owner
))))
};
if request.responder.send(response).is_err() {
tracing::warn!(
"Receiver dropped while sending response to {}.",
request.owner
);
}
}
#[cfg(with_metrics)]
metrics::CHAINS_CREATED_TOTAL
.with_label_values(&[])
.inc_by(chains_created as u64);
Ok(())View on GitHub (pinned to 6c226ddcb3)
Solutions
- Retry the `claim` mutation — the front door returns the existing ChainDescription if the chain was in fact created and stored.
- Check faucet logs for 'retryable error' and batch-size reduction events around the same time; verify on-chain whether the chain exists before re-claiming.
- If it recurs, report it as a faucet bug, attaching the certificate hash from the logs.
- For operators: lower `max_batch_size` so the shrink-and-retry path is not exercised.
Example fix
// before
const desc = await faucet.claim(owner); // 'No chain created for owner 0x…'
// after
let desc;
try { desc = await faucet.claim(owner); }
catch (e) {
if (!/No chain created for owner/i.test(String(e.message))) throw e;
desc = await faucet.claim(owner); // front door now returns the existing chain, or queues a fresh one
} Defensive patterns
Strategy: fallback
Try / catch
try { return await faucet.claim(owner); } catch (e) { if (!/No chain created for owner/i.test(e.message)) throw e; return await faucet.claim(owner); /* re-claim: idempotent fetch or fresh creation */ } Prevention
- Log the full error including the owner; keep the response of successful claims so a fallback fetch is possible.
- Report repeated occurrences upstream — this path indicates a faucet-internal inconsistency.
- Operators: lower max_batch_size to avoid the batch-shrink retry path.
When it happens
Trigger: The faucet's internal retry path (a retryable execution error like BlockTooLarge or FeesExceedFunding reduces `max_batch_size` and re-queues requests) desynchronizing requests from the operations that were finally executed; the chain-description blob missing from the certificate for that owner's OpenChain operation.
Common situations: Rare server-side race under concurrent load or with oversized batches; multi-owner faucet chains where leadership changes produce unexpected block contents.
Related errors
- This user already has a chain
- The faucet is empty.
- please specify one of `--faucet` or `--genesis`.
- Failed to start faucet
- no admin chain (Root(0)) in genesis config
AI-assisted analysis of linera-io/linera-protocol@6c226ddcb3 (2026-08-22).
Data as JSON: /api/errors/3d49366cf7062644.
Report an issue: GitHub.