-1

The error is shown when i follow step to expose the contracts pallet api.

https://substrate.dev/docs/en/tutorials/add-a-pallet-to-your-runtime/#install-the-node-template

I followed the steps all the way and fixed another error that was associating the ContractExecResult::Success. Now i have trouble with these 2 errors.

I believe it has something to do with its syntax or maybe an updated library api that the tutorial has not updated to yet.

$ cargo check -p node-template-runtime
   Compiling node-template-runtime v2.0.0-rc5 (C:\substrate-node-template2\runtime)
error: failed to run custom build command for `node-template-runtime v2.0.0-rc5 (C:\substrate-node-template2\runtime)`

Caused by:
  process didn't exit successfully: `C:\substrate-node-template2\target\debug\build\node-template-runtime-8af1699a702fd7e8\build-script-build` (exit code: 1)
--- stdout
Executing build command: "rustup" "run" "nightly" "cargo" "rustc" "--target=wasm32-unknown-unknown" "--manifest-path=C:\\substrate-node-template2\\target\\debug\\wbuild\\node-template-runtime\\Cargo.toml" "--color=always" "--release"

--- stderr
   Compiling wasm-build-runner-impl v1.0.0 (C:\substrate-node-template2\target\debug\wbuild-runner\node-template-runtime6610820868370414452)
    Finished dev [unoptimized + debuginfo] target(s) in 0.75s
     Running `C:\substrate-node-template2\target\debug\wbuild-runner\node-template-runtime6610820868370414452\target\x86_64-pc-windows-msvc\debug\wasm-build-runner-impl.exe`
   Compiling node-template-runtime v2.0.0-rc5 (C:\substrate-node-template2\runtime)
error[E0308]: mismatched types
   --> C:\substrate-node-template2\runtime\src\lib.rs:477:17
    |
476 |             match exec_result {
    |                   ----------- this expression has type `(core::result::Result<pallet_contracts::ExecReturnValue, sp_runtime::DispatchError>, u64)`
477 |                 Ok(v) => ContractExecResult::Success{
    |                 ^^^^^ expected tuple, found enum `core::result::Result`
    |
    = note: expected tuple `(core::result::Result<pallet_contracts::ExecReturnValue, sp_runtime::DispatchError>, u64)`
                found enum `core::result::Result<_, _>`

error[E0308]: mismatched types
   --> C:\substrate-node-template2\runtime\src\lib.rs:482:17
    |
476 |             match exec_result {
    |                   ----------- this expression has type `(core::result::Result<pallet_contracts::ExecReturnValue, sp_runtime::DispatchError>, u64)`
...
482 |                 Err(_) => ContractExecResult::Error,
    |                 ^^^^^^ expected tuple, found enum `core::result::Result`
    |
    = note: expected tuple `(core::result::Result<pallet_contracts::ExecReturnValue, sp_runtime::DispatchError>, u64)`
                found enum `core::result::Result<_, _>`

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0308`.
error: could not compile `node-template-runtime`.

To learn more, run the command again with --verbose.
error: process didn't exit successfully: `C:\substrate-node-template2\target\debug\wbuild-runner\node-template-runtime6610820868370414452\target\x86_64-pc-windows-msvc\debug\wasm-build-runner-impl.exe` (exit code: 1)

here is the code that is in runtime\src\lib.rs that the tutorial had me add that is causing the issue, and my modified code where 'flags' and 'gas_consumed' is added and 'status' was removed.

 /*** Add This Block ***/
    impl contracts_rpc_runtime_api::ContractsApi<Block, AccountId, Balance, BlockNumber>
        for Runtime
    {
        fn call(
            origin: AccountId,
            dest: AccountId,
            value: Balance,
            gas_limit: u64,
            input_data: Vec<u8>,
        ) -> ContractExecResult {
            let exec_result =
                Contracts::bare_call(origin, dest.into(), value, gas_limit, input_data);
            match exec_result {
                Ok(v) => ContractExecResult::Success{
                flags: v.status,
                data: v.data,
                gas_consumed: v.gas_consumed,
                },
                Err(_) => ContractExecResult::Error,
            }
        }

        fn get_storage(
            address: AccountId,
            key: [u8; 32],
        ) -> contracts_primitives::GetStorageResult {
            Contracts::get_storage(address, key)
        }

        fn rent_projection(
            address: AccountId,
        ) -> contracts_primitives::RentProjectionResult<BlockNumber> {
            Contracts::rent_projection(address)
        }
    }
   /*** End Added Block ***/

2 Answers2

0

Based on the output, it looks like you are using version 2.0.0-rc5 of the node template. At the moment, the Contracts pallet tutorial is up-to-date as of v2.0.0-rc4. Can you clone the node template from that branch and use that as a starting point? git clone -b v2.0.0-rc4 --depth 1 https://github.com/substrate-developer-hub/substrate-node-template

Dan Forbes
  • 2,734
  • 3
  • 30
  • 60
0

Starting v2.0.0-rc5, the bare_call function in Contracts pallet returns ExecResult and Gas, which can be seen at line 633, whereas only ExecResult is returned on the previous version of the Contracts pallet.

In order to continue with the tutorial, I did some tweaks with the provided code snippet in the tutorial. Here's the version of my code.

fn call(
        origin: AccountId,
        dest: AccountId,
        value: Balance,
        gas_limit: u64,
        input_data: Vec<u8>,
    ) -> ContractExecResult {
        let exec_result =
            Contracts::bare_call(origin, dest.into(), value, gas_limit, input_data);
        match exec_result {
            (Ok(v), gas) => ContractExecResult::Success {
                flags: v.flags.bits(),
                data: v.data,
                gas_consumed: gas,
            },
            (Err(_), _) => ContractExecResult::Error,
        }
    }

Note: I'm fairly new with Rust so my code is probably not the most optimal solution.