{"record":{"id":"69dfa9d39ae70982","repo":"nautechsystems/nautilus_trader","slug":"chart-name-not-found-suggestion-text-availab","errorCode":null,"errorMessage":"Chart '{name}' not found.{suggestion_text} Available charts: {available}. Register custom charts with register_chart().","messagePattern":"Chart '(.+?)' not found\\.(.+?) Available charts: (.+?)\\. Register custom charts with register_chart\\(\\)\\.","errorType":"exception","errorClass":"KeyError","httpStatus":null,"severity":"error","filePath":"python/nautilus_trader/analysis/tearsheet.py","lineNumber":344,"sourceCode":"    -------\n    Callable\n        The chart function.\n\n    Raises\n    ------\n    KeyError\n        If the chart name is not registered.\n\n    \"\"\"\n    _require_not_none(name, \"name\")\n\n    if name not in _CHART_REGISTRY:\n        available = \", \".join(_CHART_REGISTRY.keys())\n\n        suggestions = get_close_matches(name, _CHART_REGISTRY.keys(), n=3, cutoff=0.6)\n        suggestion_text = f\" Did you mean: {', '.join(suggestions)}?\" if suggestions else \"\"\n\n        raise KeyError(\n            f\"Chart '{name}' not found.{suggestion_text} \"\n            f\"Available charts: {available}. \"\n            f\"Register custom charts with register_chart().\",\n        )\n\n    return _CHART_REGISTRY[name]\n\n\ndef list_charts() -> list[str]:\n    \"\"\"\n    List all registered chart names.\n\n    Returns\n    -------\n    list[str]\n        List of available chart names.\n\n    \"\"\"","sourceCodeStart":326,"sourceCodeEnd":362,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/python/nautilus_trader/analysis/tearsheet.py#L326-L362","documentation":"Thrown when the proxy entry's `storage_value` fails `B256::from_str`, i.e. it is not a valid 32-byte hex string. This value is expected to encode the implementation address in the slot's low 20 bytes and is validated both for format and semantic correctness downstream.","triggerScenarios":"Manifest validation (verification.rs:1294) parses a proxy whose `storage_value` is malformed — wrong length, non-hex characters, empty string, or a decimal/JSON number instead of a hex string.","commonSituations":"Hand-writing the stored implementation address without left-padding to 32 bytes; copying the value without the 0x prefix and with invalid characters; mixing up storage_value with storage_slot; tooling that wrote the raw address (40 hex chars) with a format the parser rejects mid-way.","solutions":["Set `storage_value` to the full 32-byte hex word read from the proxy's implementation slot, i.e. 0x + 64 hex chars with the 20-byte address left-padded with zeros.","Fetch the live value with eth_getStorageAt(proxy, slot) and paste it verbatim as hex.","Verify storage_value's low 20 bytes match the intended target_address."],"exampleFix":"// before (manifest.json)\n\"storage_value\": \"0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n// after (manifest.json)\n\"storage_value\": \"0x000000000000000000000000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"","handlingStrategy":"validation","validationCode":"let v = B256::from_str(&proxy.storage_value)?; // also check low-20-bytes == target address before submitting","typeGuard":"fn parse_storage_value(s: &str) -> Option<B256> { use alloy_primitives::B256; B256::from_str(s).ok() }","tryCatchPattern":"let value = B256::from_str(&proxy.storage_value).map_err(|_| anyhow!(\"invalid storage_value, expected 0x + 64 hex chars\"))?;","preventionTips":["Left-pad the address to 32 bytes when writing storage_value","Fetch the value live via eth_getStorageAt rather than constructing it manually","Assert storage_value[..12] is zeros and storage_value[12..] equals target_address before validating"],"tags":["validation","manifest","proxy","hex-parsing"],"backgroundTag":"invalid-argument-format","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}