--- a/runtime/src/chain_extension.rs +++ b/runtime/src/chain_extension.rs @@ -77,10 +77,13 @@ /// The chain Extension of NFT pallet pub struct NFTExtension; +pub type NftWeightInfoOf = ::WeightInfo; + impl ChainExtension for NFTExtension { fn call(func_id: u32, env: Environment) -> Result where E: Ext, + C: pallet_nft::Config, ::AccountId: UncheckedFrom<::Hash> + AsRef<[u8]>, { // The memory of the vm stores buf in scale-codec @@ -88,6 +91,7 @@ 0 => { let mut env = env.buf_in_buf_out(); let input: NFTExtTransfer = env.read_as()?; + env.charge_weight(NftWeightInfoOf::::transfer())?; let collection = pallet_nft::Module::::get_collection(input.collection_id)?; @@ -106,6 +110,7 @@ // Create Item let mut env = env.buf_in_buf_out(); let input: NFTExtCreateItem = env.read_as()?; + env.charge_weight(NftWeightInfoOf::::create_item(input.data.len()))?; match pallet_nft::Module::::create_item_internal( env.ext().address().clone(), @@ -121,6 +126,11 @@ // Create multiple items let mut env = env.buf_in_buf_out(); let input: NFTExtCreateMultipleItems = env.read_as()?; + env.charge_weight(NftWeightInfoOf::::create_item( + input.data.iter() + .map(|i| i.len()) + .sum() + ))?; let collection = pallet_nft::Module::::get_collection(input.collection_id)?; @@ -138,6 +148,7 @@ // Approve let mut env = env.buf_in_buf_out(); let input: NFTExtApprove = env.read_as()?; + env.charge_weight(NftWeightInfoOf::::approve())?; let collection = pallet_nft::Module::::get_collection(input.collection_id)?; @@ -154,6 +165,7 @@ // Transfer from let mut env = env.buf_in_buf_out(); let input: NFTExtTransferFrom = env.read_as()?; + env.charge_weight(NftWeightInfoOf::::transfer_from())?; let collection = pallet_nft::Module::::get_collection(input.collection_id)?; @@ -171,6 +183,7 @@ // Set variable metadata let mut env = env.buf_in_buf_out(); let input: NFTExtSetVariableMetaData = env.read_as()?; + env.charge_weight(NftWeightInfoOf::::set_variable_meta_data())?; let collection = pallet_nft::Module::::get_collection(input.collection_id)?; @@ -186,6 +199,7 @@ // Toggle whitelist let mut env = env.buf_in_buf_out(); let input: NFTExtToggleWhiteList = env.read_as()?; + env.charge_weight(NftWeightInfoOf::::add_to_white_list())?; let collection = pallet_nft::Module::::get_collection(input.collection_id)?;