diff --git a/frame/contracts/src/benchmarking/mod.rs b/frame/contracts/src/benchmarking/mod.rs index 368d8677f1431..111ccc2218310 100644 --- a/frame/contracts/src/benchmarking/mod.rs +++ b/frame/contracts/src/benchmarking/mod.rs @@ -808,6 +808,7 @@ benchmarks! { let origin = RawOrigin::Signed(instance.caller.clone()); }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + #[skip_meta] seal_set_code_hash { let r in 0 .. API_BENCHMARK_BATCHES; let code_hashes = (0..r * API_BENCHMARK_BATCH_SIZE) diff --git a/frame/contracts/src/wasm/code_cache.rs b/frame/contracts/src/wasm/code_cache.rs index d9c1c1a19690c..2f292ab08cf98 100644 --- a/frame/contracts/src/wasm/code_cache.rs +++ b/frame/contracts/src/wasm/code_cache.rs @@ -129,7 +129,7 @@ pub fn increment_refcount(code_hash: CodeHash) -> Result<(), Dispa info.refcount = info.refcount.saturating_add(1); Ok(()) } else { - Err(DispatchError::CannotLookup) + Err(Error::::CodeNotFound.into()) } }) } diff --git a/frame/contracts/src/wasm/mod.rs b/frame/contracts/src/wasm/mod.rs index 487108e757722..7a45743bcda53 100644 --- a/frame/contracts/src/wasm/mod.rs +++ b/frame/contracts/src/wasm/mod.rs @@ -306,6 +306,7 @@ mod tests { } pub struct MockExt { + code_hashes: Vec>, storage: HashMap>, instantiates: Vec, terminations: Vec, @@ -328,6 +329,7 @@ mod tests { impl Default for MockExt { fn default() -> Self { Self { + code_hashes: Default::default(), storage: Default::default(), instantiates: Default::default(), terminations: Default::default(), @@ -410,7 +412,7 @@ mod tests { Ok(result) } fn set_code_hash(&mut self, hash: CodeHash) -> Result<(), DispatchError> { - self.storage.insert(StorageKey::from(hash), vec![1, 2, 3]); + self.code_hashes.push(hash); Ok(()) } fn caller(&self) -> &AccountIdOf { @@ -2225,7 +2227,7 @@ mod tests { let mut mock_ext = MockExt::default(); execute(CODE, [0u8; 32].encode(), &mut mock_ext).unwrap(); - assert_eq!(mock_ext.storage.get(&[17u8; 32]), Some(&vec![1, 2, 3])); + assert_eq!(mock_ext.code_hashes.pop().unwrap(), H256::from_slice(&[17u8; 32])); } #[test] diff --git a/frame/contracts/src/wasm/runtime.rs b/frame/contracts/src/wasm/runtime.rs index f2ad1250263de..903884280e558 100644 --- a/frame/contracts/src/wasm/runtime.rs +++ b/frame/contracts/src/wasm/runtime.rs @@ -826,14 +826,17 @@ define_env!(Env, , // // # Errors // - // - requested buffer is not within the bounds of the sandbox memory. - // - the buffer contents cannot be decoded as the required type. - // - code for specified hash does not exist + // `ReturnCode::CodeNotFound` [__unstable__] seal_set_code_hash(ctx, code_hash_ptr: u32) -> ReturnCode => { ctx.charge_gas(RuntimeCosts::SetCodeHash)?; let code_hash: CodeHash<::T> = ctx.read_sandbox_memory_as(code_hash_ptr)?; - ctx.ext.set_code_hash(code_hash)?; - Ok(ReturnCode::Success) + match ctx.ext.set_code_hash(code_hash) { + Err(err) => { + let code = Runtime::::err_into_return_code(err)?; + Ok(code) + }, + Ok(()) => Ok(ReturnCode::Success) + } }, // Set the value at the given key in the contract storage.