-1
     `the trait bound` `<RuntimeApi as ConstructRuntimeApi<sp_runtime::generic::Block<sp_runtime::generic::Header<u32, BlakeTwo256>, OpaqueExtrinsic>, sc_service::client::client::Client<sc_client_db::Backend<sp_runtime::generic::Block<sp_runtime::generic::Header<u32, BlakeTwo256>, OpaqueExtrinsic>>, LocalCallExecutor<sp_runtime::generic::Block<sp_runtime::generic::Header<u32, BlakeTwo256>, OpaqueExtrinsic>, sc_client_db::Backend<sp_runtime::generic::Block<sp_runtime::generic::Header<u32, BlakeTwo256>, OpaqueExtrinsic>>, NativeElseWasmExecutor<ExecutorDispatch>>, sp_runtime::generic::Block<sp_runtime::generic::Header<u32, BlakeTwo256>, OpaqueExtrinsic>, RuntimeApi>>>::RuntimeApi: fp_rpc::ConvertTransactionRuntimeApi<sp_runtime::generic::Block<sp_runtime::generic::Header<u32, BlakeTwo256>, OpaqueExtrinsic>>` is not satisfied
        --> node/service/src/lib.rs:1279:30
         |
    1279 |             polkadot_rpc::create_full(deps,subscription_executor.clone(), backend.clone()).map_err(Into::into)
         |             ------------------------- ^^^^ the trait `fp_rpc::ConvertTransactionRuntimeApi<sp_runtime::generic::Block<sp_runtime::generic::Header<u32, BlakeTwo256>, OpaqueExtrinsic>>` is not implemented for `<RuntimeApi as ConstructRuntimeApi<sp_runtime::generic::Block<sp_runtime::generic::Header<u32, BlakeTwo256>, OpaqueExtrinsic>, sc_service::client::client::Client<sc_client_db::Backend<sp_runtime::generic::Block<sp_runtime::generic::Header<u32, BlakeTwo256>, OpaqueExtrinsic>>, LocalCallExecutor<sp_runtime::generic::Block<sp_runtime::generic::Header<u32, BlakeTwo256>, OpaqueExtrinsic>, sc_client_db::Backend<sp_runtime::generic::Block<sp_runtime::generic::Header<u32, BlakeTwo256>, OpaqueExtrinsic>>, NativeElseWasmExecutor<ExecutorDispatch>>, sp_runtime::generic::Block<sp_runtime::generic::Header<u32, BlakeTwo256>, OpaqueExtrinsic>, RuntimeApi>>>::RuntimeApi`
         |             |
         |             required by a bound introduced by this call
         |
    note: required by a bound in `polkadot_rpc::create_full`
        --> /Users/user/parachain/peer-polka/rpc/src/lib.rs:205:10
         |
    205  |     C::Api: fp_rpc::ConvertTransactionRuntimeApi<Block>,    
         |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `create_full`
    help: consider further restricting the associated type
         |
    910  |     OverseerGenerator: OverseerGen, <RuntimeApi as ConstructRuntimeApi<sp_runtime::generic::Block<sp_runtime::generic::Header<u32, BlakeTwo256>, OpaqueExtrinsic>, sc_service::client::client::Client<sc_client_db::Backend<sp_runtime::generic::Block<sp_runtime::generic::Header<u32, BlakeTwo256>, OpaqueExtrinsic>>, LocalCallExecutor<sp_runtime::generic::Block<sp_runtime::generic::Header<u32, BlakeTwo256>, OpaqueExtrinsic>, sc_client_db::Backend<sp_runtime::generic::Block<sp_runtime::generic::Header<u32, BlakeTwo256>, OpaqueExtrinsic>>, NativeElseWasmExecutor<ExecutorDispatch>>, sp_runtime::generic::Block<sp_runtime::generic::Header<u32, BlakeTwo256>, OpaqueExtrinsic>, RuntimeApi>>>::RuntimeApi: fp_rpc::ConvertTransactionRuntimeApi<sp_runtime::generic::Block<sp_runtime::generic::Header<u32, BlakeTwo256>, OpaqueExtrinsic>> 

I'm integrating the Frontier in the Relay Chain. But in the service.rs i'm facing this issue. I've already mentioned this in the runtime.

    impl fp_rpc::ConvertTransaction<opaque::UncheckedExtrinsic> for TransactionConverter {
        fn convert_transaction(
            &self,
            transaction: pallet_ethereum::Transaction,
        ) -> opaque::UncheckedExtrinsic {
            let extrinsic = UncheckedExtrinsic::new_unsigned(
                pallet_ethereum::Call::<Runtime>::transact { transaction }.into(),
            );
            let encoded = extrinsic.encode();
            opaque::UncheckedExtrinsic::decode(&mut &encoded[..])
                .expect("Encoded extrinsic is always valid")
        }
    }
    

2 Answers 2

1

It looks like the code you pasted below implements ConvertTransaction for a struct TransactionConverter. This is not what the error is for. The error specifically says that this bound doesn't exist on C::Api which is your RuntimeApi. You need to add an implementation for fp_rpc::ConvertTransaction in your runtime api impl :

impl_runtime_apis! {
// -- snip --
 impl fp_rpc::ConvertTransaction<opaque::UncheckedExtrinsic> for Runtime {
        fn convert_transaction(
            &self,
            transaction: pallet_ethereum::Transaction,
        ) -> opaque::UncheckedExtrinsic {
            let extrinsic = UncheckedExtrinsic::new_unsigned(
                pallet_ethereum::Call::<Runtime>::transact { transaction }.into(),
            );
            let encoded = extrinsic.encode();
            opaque::UncheckedExtrinsic::decode(&mut &encoded[..])
                .expect("Encoded extrinsic is always valid")
        }
    }
} // end of impl_runtime_apis!
0

Do add ConvertTransaction and TransactionConverter in your runtime/lib.rs. And check in the trait RuntimeApiCollection of Node/Client/lib.rs that you have added or not

Not the answer you're looking for? Browse other questions tagged or ask your own question.