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

  1. Correct pool.quote_contract in the manifest to a valid hex address
  2. Populate from the pinned quote contract deployment record
  3. 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

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


AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08). Data as JSON: /api/errors/2ffe59e9bc1d28a7. Report an issue: GitHub.