{"record":{"id":"83b3649199345848","repo":"nautechsystems/nautilus_trader","slug":"wallet-token-address-does-not-have-exactly-one-d","errorCode":null,"errorMessage":"Wallet token {address} does not have exactly one deployment manifest identity","messagePattern":"Wallet token (.+?) does not have exactly one deployment manifest identity","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/execution/client.rs","lineNumber":4897,"sourceCode":"        \"finalized native balance\",\n    )?;\n    let native_balance = Money::from_u256(native_amount.value, plan.pool.chain.native_currency())?;\n    let mut decisions = vec![verification_decision(\n        &native_amount,\n        Some(included.block_number),\n        Some(included.block_number),\n    )];\n    let mut token_addresses = token_universe.iter().copied().collect::<Vec<_>>();\n    token_addresses.sort_unstable();\n    let mut token_balances = Vec::with_capacity(token_addresses.len());\n    for address in token_addresses {\n        let identities = executor\n            .deployment_manifest\n            .tokens\n            .iter()\n            .filter(|identity| Address::from_str(&identity.address).ok() == Some(address))\n            .collect::<Vec<_>>();\n        anyhow::ensure!(\n            identities.len() == 1,\n            \"Wallet token {address} does not have exactly one deployment manifest identity\"\n        );\n        let identity = identities[0];\n        let token = Token::new(\n            plan.pool.chain.clone(),\n            address,\n            identity.name.clone(),\n            identity.symbol.clone(),\n            identity.decimals,\n        );\n        let call = ERC20::balanceOfCall {\n            account: executor.wallet_address,\n        }\n        .abi_encode();\n        let amount = required_verification(\n            executor\n                .verification","sourceCodeStart":4879,"sourceCodeEnd":4915,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/blockchain/src/execution/client.rs#L4879-L4915","documentation":"When building a `Token` from the wallet, the adapter looks up the token address in the deployment manifest and requires exactly one matching identity. This `ensure!` fails when the number of manifest identities whose `address` parses to the given address is zero or greater than one, so the canonical token identity is ambiguous or missing.","triggerScenarios":"Executing a plan whose pool token address (1) is not present in `deployment_manifest.tokens`, or (2) appears in multiple identity entries (duplicate addresses, e.g. same token listed under different symbols/decimals or duplicated across chains in the manifest).","commonSituations":"Hand-edited or merged deployment manifest with duplicated token entries; a wallet token address from a testnet manifest used against a mainnet manifest; case/parity handling differences causing `Address::from_str` to resolve two entries to the same address; token added to the manifest twice during a deployment update.","solutions":["Deduplicate the token entries in the deployment manifest so the address appears exactly once","Add the missing token identity to the deployment manifest if it is absent","Ensure manifest addresses are canonical checksummed/lowercase and parse to the intended `Address`","Regenerate the manifest from the deployment source rather than editing it by hand"],"exampleFix":"// before: manifest with duplicate\n{\"tokens\": [{\"address\": \"0xABC...\"}, {\"address\": \"0xABC...\"}]}\n// after: single canonical entry\n{\"tokens\": [{\"address\": \"0xAbC...\", \"decimals\": 18, \"symbol\": \"WETH\"}]}","handlingStrategy":"validation","validationCode":"// before execution, confirm the token resolves uniquely\nlet matches: Vec<_> = manifest.tokens.iter()\n    .filter(|t| Address::from_str(&t.address).ok() == Some(token_address))\n    .collect();\nensure!(matches.len() == 1, \"token {token_address} must appear exactly once in the manifest\");","typeGuard":"fn unique_token_identity(manifest: &DeploymentManifest, address: Address) -> bool {\n    manifest.tokens.iter()\n        .filter(|t| Address::from_str(&t.address).ok() == Some(address))\n        .count() == 1\n}","tryCatchPattern":"if let Err(e) = execute_plan(&plan).await {\n    if e.to_string().contains(\"exactly one deployment manifest identity\") {\n        log::error!(\"fix manifest: deduplicate or add the token identity\");\n    }\n}","preventionTips":["Keep the deployment manifest generated from source; never hand-edit or merge duplicates","Use canonical (checksummed) addresses consistently in the manifest","Run a manifest lint step that rejects duplicate token addresses before deployment","Confirm wallet token addresses match the chain of the manifest in use"],"tags":["rust","blockchain","manifest","config"],"backgroundTag":"missing-required-config-field","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}