Prerequisites:
- Install smove.
- Setup parachain node with pallet-move integrated and run it in the background.
- Switch the current working directory to the code example.
Now, let's compile this project to be ready for the estimation of needed gas and publication of the module.
smove buildGas can be seen as weights in the Substrate. It will adjust the fees for the execution or publication of Move resources. Hereby, we prevent malicious scripts from running forever.
To estimate the optimal amount of gas for your module, use smove tool:
smove node rpc estimate-gas-publish-module --account-id 5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty --module-path build/storage_project/bytecode_modules/StorageModule.mvThe successful result will look like:
Gas estimation:
used gas: 403
total extrinsic weight cost with the above gas:
Weight { ref_time: 8377058325, proof_size: 13927 }
vm_status_code: EXECUTEDThe compiled bytecode file can be found in the subfolder
build/storage_project/bytecode_modules/Do the following steps in [polkadot.js][polkadotjs] GUI:
- Switch to menu Developer->Extrinsics.
- Select the Move pallet
moveModule. - For this pallet, choose extrinsic
publishModule(bytecode, gasLimit)and selectBobas the user who shall submit the transaction.
Parameter explanation:
- bytecode represents the compiled module bytecode. Fill it up by uploading the compiled file
StorageModule.mv(from the previous compilation). - gasLimit - use the estimated optimal amount of gas for publishing this module from the previous subsection. Using less than that will make the extrinsic fail, while using more is unnecessary (and more costly).
![]() |
|---|
| Publish a module using [polkadot.js][polkadotjs] |
Note that the module can only be published if the specified module address DeveloperBob in the Move.toml file of the Move project matches the user's address (in this case, Bob's wallet address).
Additionally, we can verify that the module has successfully been published by requesting the module's ABI specification using smove:
smove node rpc get-module-abi --address 5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty --name StorageModuleYou should get a longer response that starts with:
Module ABI: Some(ModuleAbi { id: ModuleId { address: 8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48, name: Identifier("StorageModule") }, friends: [], structs: [Struct { name: Identifier("Data"), type_parameters: [], abilities: TypeAbilities { abilities: [Store, Key] }, fields: [Field { name: Identifier("value"), tp: U64 }] }], funcs: [Function { name: Identifier("get_value"), visibility: Public, type_parameters: [], parameters: [Reference(Signer)], returns: [U64] }, Function { name: Identifier("initialize"), visibility: Public, type_parameters: [], parameters: [Reference(Signer)], returns: [] }, Function { name: Identifier("set_value"), visibility: Public, type_parameters: [], parameters: [Reference(Signer), U64], returns: [] }] })That is the proof that the module has been published on the chain successfully.
