nautechsystems/nautilus_trader · error · anyhow::Error
Deployment manifest pool quote contract is invalid
Error message
Deployment manifest pool quote contract is invalid
What it means
validate_manifest_contracts found a pool in the deployment manifest whose configured quote contract does not resolve to a valid address under the expected contract role; the manifest and on-chain role assignment disagree, so contract validation fails before the client will operate.
Source
Thrown at crates/adapters/blockchain/src/execution/client.rs:470
}
for limit in config.quote_spend_limits.as_deref().unwrap_or_default() {
let spend_token = validate_address(&limit.spend_token)?;
anyhow::ensure!(
token_decimals.get(&spend_token) == Some(&limit.spend_token_decimals),
"Quote spend limit decimals do not match the deployment manifest"
);
}
let pool_contracts = role_addresses(BlockchainContractRole::Pool)?;
for pool in &manifest.pools {
let pool_address = Address::from_str(&pool.address)
.map_err(|_| anyhow::anyhow!("Deployment manifest pool address is invalid"))?;
let pool_factory = Address::from_str(&pool.factory)
.map_err(|_| anyhow::anyhow!("Deployment manifest pool factory is invalid"))?;
let pool_quote = Address::from_str(&pool.quote_contract).map_err(|_| {
anyhow::anyhow!("Deployment manifest pool quote contract is invalid")
})?;
anyhow::ensure!(
pool_contracts.contains(&pool_address)
&& pool_factory == factory
&& pool_quote == quote_contract,
"Deployment manifest pool does not use the pinned pool, factory, and quote identities"
);
}
Ok(())
}
async fn fetch_native_currency_balance(&self) -> anyhow::Result<Money> {
let balance_u256 = self
.http_rpc_client
.get_balance_with_timeout(&self.wallet_address, None, Some(EXECUTION_RPC_TIMEOUT_SECS))
.await?;
let native_currency = self.chain.native_currency();View on GitHub (pinned to 18893faf8b)
Solutions
- Correct pool.quote_contract in the manifest to a valid hex address
- Populate from the pinned quote contract deployment record
- Add a pre-commit lint that validates all manifest addresses
Example fix
// before quote_contract = "0xQUOTE" // after quote_contract = "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd"
Defensive patterns
Strategy: validation
Validate before calling
assert!(is_valid_address(&pool.quote_contract), "invalid quote contract address in manifest");
Prevention
- Populate quote_contract from deployment records programmatically
- Add manifest schema validation (regex for address fields) in CI
- Never leave placeholder strings in shipped manifests
When it happens
Trigger: Calling preflight/validate_manifest_contracts where a manifest.pools[].quote_contract string fails Address::from_str.
Common situations: Malformed or placeholder quote-contract address in the manifest; copy-paste truncation; quote contract field left empty after scaffold generation.
Understand the failure class
Background: "Invalid ... format", "must be in format X", "does not look like a ..." — invalid argument format errors across CLI tools and libraries — this error's family across 17 libraries.
Related errors
- Deployment manifest pool address is invalid
- Deployment manifest pool factory is invalid
- Chart function must be callable, was {type(f)}
- Chart function must be callable, was {type(func)}
- Chart '{name}' not found.{suggestion_text} Available charts:
AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08).
Data as JSON: /api/errors/2ffe59e9bc1d28a7.
Report an issue: GitHub.