git.delta.rocks / unique-network / refs/commits / 6090f15f03e0

difftreelog

Merge branch 'feature/NFTPAR-373_chain_extensions' into feature/NFTPAR-366_upstream_updates

Yaroslav Bolyukin2021-05-13parents: #6b456b9 #2260ad6.patch.diff
in: master

1 file changed

modifiedruntime/src/chain_extension.rsdiffbeforeafterboth
78/// The chain Extension of NFT pallet78/// The chain Extension of NFT pallet
79pub struct NFTExtension;79pub struct NFTExtension;
80
81pub type NftWeightInfoOf<C> = <C as pallet_nft::Config>::WeightInfo;
8082
81impl<C: Config> ChainExtension<C> for NFTExtension {83impl<C: Config> ChainExtension<C> for NFTExtension {
82 fn call<E: Ext>(func_id: u32, env: Environment<E, InitState>) -> Result<RetVal, DispatchError>84 fn call<E: Ext>(func_id: u32, env: Environment<E, InitState>) -> Result<RetVal, DispatchError>
83 where85 where
84 E: Ext<T = C>,86 E: Ext<T = C>,
87 C: pallet_nft::Config,
85 <E::T as SysConfig>::AccountId: UncheckedFrom<<E::T as SysConfig>::Hash> + AsRef<[u8]>,88 <E::T as SysConfig>::AccountId: UncheckedFrom<<E::T as SysConfig>::Hash> + AsRef<[u8]>,
86 {89 {
87 // The memory of the vm stores buf in scale-codec90 // The memory of the vm stores buf in scale-codec
88 match func_id {91 match func_id {
89 0 => {92 0 => {
90 let mut env = env.buf_in_buf_out();93 let mut env = env.buf_in_buf_out();
91 let input: NFTExtTransfer<E> = env.read_as()?;94 let input: NFTExtTransfer<E> = env.read_as()?;
95 env.charge_weight(NftWeightInfoOf::<C>::transfer())?;
9296
93 let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;97 let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
9498
101 )?;105 )?;
102106
103 pallet_nft::Module::<C>::submit_logs(collection)?;107 pallet_nft::Module::<C>::submit_logs(collection)?;
104 Ok(RetVal::Converging(func_id))108 Ok(RetVal::Converging(0))
105 },109 },
106 1 => {110 1 => {
107 // Create Item111 // Create Item
108 let mut env = env.buf_in_buf_out();112 let mut env = env.buf_in_buf_out();
109 let input: NFTExtCreateItem<E> = env.read_as()?;113 let input: NFTExtCreateItem<E> = env.read_as()?;
114 env.charge_weight(NftWeightInfoOf::<C>::create_item(input.data.len()))?;
110115
111 let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;116 let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
112117
118 )?;123 )?;
119124
120 pallet_nft::Module::<C>::submit_logs(collection)?;125 pallet_nft::Module::<C>::submit_logs(collection)?;
121 Ok(RetVal::Converging(func_id))126 Ok(RetVal::Converging(0))
122 },127 },
123 2 => {128 2 => {
124 // Create multiple items129 // Create multiple items
125 let mut env = env.buf_in_buf_out();130 let mut env = env.buf_in_buf_out();
126 let input: NFTExtCreateMultipleItems<E> = env.read_as()?;131 let input: NFTExtCreateMultipleItems<E> = env.read_as()?;
132 env.charge_weight(NftWeightInfoOf::<C>::create_item(
133 input.data.iter()
134 .map(|i| i.len())
135 .sum()
136 ))?;
127137
128 let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;138 let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
129139
135 )?;145 )?;
136146
137 pallet_nft::Module::<C>::submit_logs(collection)?;147 pallet_nft::Module::<C>::submit_logs(collection)?;
138 Ok(RetVal::Converging(func_id))148 Ok(RetVal::Converging(0))
139 },149 },
140 3 => {150 3 => {
141 // Approve151 // Approve
142 let mut env = env.buf_in_buf_out();152 let mut env = env.buf_in_buf_out();
143 let input: NFTExtApprove<E> = env.read_as()?;153 let input: NFTExtApprove<E> = env.read_as()?;
154 env.charge_weight(NftWeightInfoOf::<C>::approve())?;
144155
145 let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;156 let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
146157
153 )?;164 )?;
154165
155 pallet_nft::Module::<C>::submit_logs(collection)?;166 pallet_nft::Module::<C>::submit_logs(collection)?;
156 Ok(RetVal::Converging(func_id))167 Ok(RetVal::Converging(0))
157 },168 },
158 4 => {169 4 => {
159 // Transfer from170 // Transfer from
160 let mut env = env.buf_in_buf_out();171 let mut env = env.buf_in_buf_out();
161 let input: NFTExtTransferFrom<E> = env.read_as()?;172 let input: NFTExtTransferFrom<E> = env.read_as()?;
173 env.charge_weight(NftWeightInfoOf::<C>::transfer_from())?;
162174
163 let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;175 let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
164176
172 )?;184 )?;
173185
174 pallet_nft::Module::<C>::submit_logs(collection)?;186 pallet_nft::Module::<C>::submit_logs(collection)?;
175 Ok(RetVal::Converging(func_id))187 Ok(RetVal::Converging(0))
176 },188 },
177 5 => {189 5 => {
178 // Set variable metadata190 // Set variable metadata
179 let mut env = env.buf_in_buf_out();191 let mut env = env.buf_in_buf_out();
180 let input: NFTExtSetVariableMetaData = env.read_as()?;192 let input: NFTExtSetVariableMetaData = env.read_as()?;
193 env.charge_weight(NftWeightInfoOf::<C>::set_variable_meta_data())?;
181194
182 let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;195 let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
183196
189 )?;202 )?;
190203
191 pallet_nft::Module::<C>::submit_logs(collection)?;204 pallet_nft::Module::<C>::submit_logs(collection)?;
192 Ok(RetVal::Converging(func_id))205 Ok(RetVal::Converging(0))
193 },206 },
194 6 => {207 6 => {
195 // Toggle whitelist208 // Toggle whitelist
196 let mut env = env.buf_in_buf_out();209 let mut env = env.buf_in_buf_out();
197 let input: NFTExtToggleWhiteList<E> = env.read_as()?;210 let input: NFTExtToggleWhiteList<E> = env.read_as()?;
211 env.charge_weight(NftWeightInfoOf::<C>::add_to_white_list())?;
198212
199 let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;213 let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;
200214
206 )?;220 )?;
207 221
208 pallet_nft::Module::<C>::submit_logs(collection)?;222 pallet_nft::Module::<C>::submit_logs(collection)?;
209 Ok(RetVal::Converging(func_id))223 Ok(RetVal::Converging(0))
210 }224 }
211 _ => {225 _ => {
212 panic!("Passed unknown func_id to test chain extension: {}", func_id);226 Err(DispatchError::Other("unknown chain_extension func_id"));
213 }227 }
214 }228 }
215 }229 }