{"record":{"id":"cdbb859482ae3a5e","repo":"nautechsystems/nautilus_trader","slug":"liquidity-addition-overflow-x-current-y-y-d","errorCode":null,"errorMessage":"Liquidity addition overflow: x={current}, y={y}, delta={delta}","messagePattern":"Liquidity addition overflow: x=(.+?), y=(.+?), delta=(.+?)","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/model/src/defi/tick_map/liquidity_math.rs","lineNumber":64,"sourceCode":"/// with surrounding context is preferred. This panic-style variant is kept for\n/// in-pool invariants where overflow is treated as a contract bug rather than an\n/// expected runtime error.\n///\n/// # Returns\n///\n/// The resulting liquidity after applying the delta.\n///\n/// # Panics\n///\n/// This function panics if:\n/// - Adding positive delta causes overflow.\n/// - Subtracting causes underflow.\n#[must_use]\npub fn liquidity_math_add(x: u128, y: i128) -> u128 {\n    match try_liquidity_math_add(x, y) {\n        Ok(value) => value,\n        Err(LiquidityMathError::Overflow { current, delta }) => {\n            panic!(\"Liquidity addition overflow: x={current}, y={y}, delta={delta}\")\n        }\n        Err(LiquidityMathError::Underflow { current, delta }) => {\n            panic!(\"Liquidity subtraction underflow: x={current}, y={y}, delta={delta}\")\n        }\n    }\n}\n\n/// Derives max liquidity per tick from a given tick spacing.\n///\n/// # Panics\n///\n/// Panics if `tick_spacing` is zero.\n#[must_use]\npub fn tick_spacing_to_max_liquidity_per_tick(tick_spacing: i32) -> u128 {\n    assert!(tick_spacing != 0, \"Tick spacing must be non-zero\");\n\n    // Calculate min and max tick aligned to tick spacing\n    let min_tick = (PoolTick::MIN_TICK / tick_spacing) * tick_spacing;","sourceCodeStart":46,"sourceCodeEnd":82,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/model/src/defi/tick_map/liquidity_math.rs#L46-L82","documentation":"liquidity_math_add() converts the fallible try_liquidity_math_add result into a panic when adding a positive delta would overflow u128 liquidity. The checked version exists (try_liquidity_math_add / LiquidityMathError::Overflow) so callers needing graceful handling should use that instead.","triggerScenarios":"Calling liquidity_math_add(x, y) where x + y as positive delta exceeds u128::MAX; triggered transitively by apply_swap_quote or update_liquidity on corrupt/absurd liquidity values.","commonSituations":"Aggregating liquidity across many positions with unit mismatches (double-counting); feeding raw unclamped on-chain values; bugs in tick-crossing loops that add the same liquidity repeatedly.","solutions":["Use try_liquidity_math_add to handle the Overflow error gracefully","Clamp or validate liquidity values before repeated additions","Audit the accumulation loop for double-added deltas (e.g. same tick applied twice)"],"exampleFix":"// before\nlet liquidity = liquidity_math_add(current, delta); // panics on overflow\n// after\nmatch try_liquidity_math_add(current, delta) {\n    Ok(liquidity) => /* use it */,\n    Err(e) => /* handle overflow/underflow */,\n}","handlingStrategy":"try-catch","validationCode":"// Pre-check the addition\nfn add_will_not_overflow(x: u128, y: i128) -> bool {\n    y <= 0 || x.checked_add(y as u128).is_some()\n}","typeGuard":null,"tryCatchPattern":"let liquidity = try_liquidity_math_add(x, y)\n    .map_err(|e| format!(\"liquidity math failed: {e:?}\"))?;","preventionTips":["Prefer try_liquidity_math_add in non-test code","Clamp liquidity inputs to plausible on-chain ranges","Audit accumulation loops for repeated/double additions"],"tags":["rust","panic","arithmetic-overflow","defi","liquidity"],"backgroundTag":"value-out-of-range","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"}