It looks like the same issue still occurs in 2023, moreover I realised that now interacting with Smart Contracts on https://polkadot.js.org/apps/ is broken as well. The only way to interact with them is by using https://contracts-ui.substrate.io/ which apparently has some kind of workaround for that WeightV2 issue. Nevertheless, as a fulfilment of the reply from Adam Wierzbicki, you need to add following parts to make your code work. First of all import these at the top of the code block import { BN, BN_ONE } from "@polkadot/util"; import type { WeightV2 } from '@polkadot/types/interfaces' Somewhere below define two new variables const MAX_CALL_WEIGHT = new BN(5_000_000_000_000).isub(BN_ONE); const PROOFSIZE = new BN(1_000_000); Execute query on the given function to retrieve the required gas limit const storageDepositLimit = null; const { gasRequired } = await contract.query.flip( account.address, { gasLimit: api?.registry.createType('WeightV2', { refTime: MAX_CALL_WEIGHT, proofSize: PROOFSIZE, }) as WeightV2, storageDepositLimit, } ); Define the gas limit variable and execute transaction call const gasLimit = api?.registry.createType('WeightV2', gasRequired) as WeightV2 await contract.tx .flip({ gasLimit, storageDepositLimit }) .signAndSend(alice, async (res) => { if (res.status.isInBlock) { console.log('in a block') } else if (res.status.isFinalized) { console.log('finalized') } }); If you need to only read some data from the Smart contract you can query it like in the code block below const { result, output } = await contract.query.get( alice.address, { gasLimit: api?.registry.createType('WeightV2', { refTime: MAX_CALL_WEIGHT, proofSize: PROOFSIZE, }) as WeightV2, storageDepositLimit, } ); // The actual result from RPC as `ContractExecResult` console.log(result.toHuman()); // check if the call was successful if (result.isOk) { // output the return value console.log("Success", output?.toHuman()); } else { console.error("Error", result.asErr); }