datahaven-xyz/datahaven · error

CallFiltered

Error message

CallFiltered

What it means

Reverts the proxy precompile call because the requested proxied dispatch is disallowed by a filter: the proxy definition found for the real account restricts which calls the delegate may perform (or the runtime's call filter rejects the target), so this particular call through the proxy relationship is blocked. The inputs at fault are the target call and/or the force_proxy_type supplied by the caller.

Solutions

  1. Use a proxy type whose filter permits the intended call, or have the real account grant a proxy definition with broader permissions
  2. Invoke the call directly from the real account instead of through the proxy if the proxy type cannot authorize it
  3. Check the proxy type's ProxyType::is_superset filter configuration before delegating to ensure it covers the desired dispatches
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at operator/precompiles/proxy/src/lib.rs:396 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of datahaven-xyz/datahaven@edcb13dbbc (2026-09-13). Data as JSON: /api/errors/b9760fe3145dee0d. Report an issue: GitHub.

Appendix: source

Thrown at operator/precompiles/proxy/src/lib.rs:396

        let who = Runtime::AddressMapping::into_account_id(handle.context().caller);
        // Proxies:
        // Twox64Concat(8) + AccountId(20) + BoundedVec(ProxyDefinition * MaxProxies) + Balance(16)
        handle.record_db_read::<Runtime>(
            28 + (29 * (<Runtime as pallet_proxy::Config>::MaxProxies::get() as usize)) + 16,
        )?;
        let def =
            pallet_proxy::Pallet::<Runtime>::find_proxy(&real_account_id, &who, force_proxy_type)
                .map_err(|_| RevertReason::custom("Not proxy"))?;
        frame_support::ensure!(def.delay.is_zero(), revert("Unannounced"));

        // Read subcall recipient code
        // AccountCodesMetadata: 16 (hash) + 20 (key) + 40 (CodeMetadata).
        handle.record_db_read::<Runtime>(ACCOUNT_CODES_METADATA_PROOF_SIZE.saturated_into())?;
        let recipient_has_code =
            pallet_evm::AccountCodesMetadata::<Runtime>::get(evm_subcall.to.0).is_some();

        // Apply proxy type filter
        frame_support::ensure!(
            def.proxy_type.is_evm_proxy_call_allowed(
                &evm_subcall,
                recipient_has_code,
                handle.remaining_gas()
            )?,
            revert("CallFiltered")
        );

        let EvmSubCall {
            to,
            value,
            call_data,
        } = evm_subcall;
        let address = to.0;

        let sub_context = Context {
            caller: real.0,
            address: address.clone(),

View on GitHub (pinned to edcb13dbbc)