{"record":{"id":"b2e74b7b0eeeeb9e","repo":"nautechsystems/nautilus_trader","slug":"pool-instrument-id-has-no-fee-tier","errorCode":null,"errorMessage":"Pool {instrument_id} has no fee tier","messagePattern":"Pool (.+?) has no fee tier","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/blockchain/src/execution/client.rs","lineNumber":1178,"sourceCode":"            );\n        }\n\n        if order.order_side() != OrderSide::Sell {\n            anyhow::bail!(\n                \"Unsupported order side {}; only Sell is supported\",\n                order.order_side()\n            );\n        }\n\n        if order.is_quote_quantity() {\n            anyhow::bail!(\n                \"Quote-denominated quantities are not supported; quantity must be denominated in the base token\"\n            );\n        }\n\n        let fee = pool\n            .fee\n            .ok_or_else(|| anyhow::anyhow!(\"Pool {instrument_id} has no fee tier\"))?;\n        let fee = U24::try_from(fee)\n            .map_err(|_| anyhow::anyhow!(\"Pool {instrument_id} fee {fee} exceeds uint24\"))?;\n\n        let base_token = pool.get_base_token();\n        let quote_token = pool.get_quote_token();\n        let quote_currency = Currency::new_checked(\n            &quote_token.symbol,\n            quote_token.decimals,\n            0,\n            &quote_token.name,\n            CurrencyType::Crypto,\n        )?;\n\n        if !self\n            .transaction_limits\n            .allowed_token_pairs\n            .contains(&(base_token.address, quote_token.address))\n        {","sourceCodeStart":1160,"sourceCodeEnd":1196,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/2114cf6f761429e0adb5ca9596fcd7b895b16011/crates/adapters/blockchain/src/execution/client.rs#L1160-L1196","documentation":"While preparing a swap order, the resolved pool for the instrument has fee = None. Uniswap V3 pools always have a fee tier (in hundredths of a bip, e.g. 500 = 0.05%), and the swap calldata cannot be built without it, so the order is rejected. The None comes from the pool metadata in the cache (fee is Option<u32>, populated from pool registry/PoolCreated data).","triggerScenarios":"submit_order on an instrument whose cached pool definition was registered without a fee tier: instrument/pool configuration missing the fee field, or a PoolCreated event observed without fee data before full pool initialization.","commonSituations":"Adding a new pool to the adapter config and forgetting the fee tier; pointing the instrument provider at a custom factory whose PoolCreated event omits fee; race at startup where the pool is resolved before its metadata is complete.","solutions":["Check the pool definition for the instrument in the adapter configuration and confirm it includes the fee tier","Verify on-chain that the pool address is a real Uniswap V3 pool and read its fee() (immutable) to get the correct value","Restart/refresh the data subscription so the pool cache repopulates with complete metadata before submitting orders","Use a fee value in hundredths of a bip (500 for 0.05%, 3000 for 0.30%, 10000 for 1%)"],"exampleFix":"# before: pool registered without a fee tier\nPool(instrument_id=WETH_USDC, address=\"0x...\", fee=None)\n\n# after: fee tier present in Uniswap V3 units (0.05%)\nPool(instrument_id=WETH_USDC, address=\"0x...\", fee=500)","handlingStrategy":"validation","validationCode":"# Before trading, confirm every configured pool exposes a fee tier\nfor instrument_id in instruments_to_trade:\n    pool = get_pool_definition(instrument_id)\n    assert pool.fee is not None, f'{instrument_id} has no fee tier configured'\n    assert 0 < pool.fee <= 0xFFFFFF, f'{instrument_id} fee out of Uniswap V3 range'","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always configure pools with their Uniswap V3 fee tier (500/3000/10000 etc.), read from the pool contract when in doubt","Prefer resolving pools via the adapter's own discovery/subscription flow instead of hand-written metadata"],"tags":["blockchain","uniswap-v3","pool-config","fee-tier","swap"],"backgroundTag":"missing-configuration","analyzedSha":"2114cf6f761429e0adb5ca9596fcd7b895b16011","analyzedAt":"2026-08-21T11:28:30.864Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}