mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-13 01:11:10 +00:00
Contracts Add deposit for dependencies (#14079)
* wip * fixes * rm comment * join fns * clippy * Fix limits * reduce diff * fix * fix * fix typo * refactor store to use self * refactor run to take self by value * pass tests * rm comment * fixes * fix typo * rm * fix fmt * clippy * ".git/.scripts/commands/bench/bench.sh" pallet dev pallet_contracts * Update frame/contracts/src/lib.rs Co-authored-by: Sasha Gryaznov <hi@agryaznov.com> * Update frame/contracts/src/wasm/mod.rs Co-authored-by: Sasha Gryaznov <hi@agryaznov.com> * Update frame/contracts/src/wasm/mod.rs Co-authored-by: Sasha Gryaznov <hi@agryaznov.com> * PR review, rm duplicate increment_refcount * PR review * Update frame/contracts/src/wasm/prepare.rs Co-authored-by: Sasha Gryaznov <hi@agryaznov.com> * Add test for failing storage_deposit * fix lint * wip * Delegate update take 2 * update * fix migration * fix migration * doc * fix lint * update migration * fix warning * reformat comment * regenerate weightInfo trait * fix merge * PR review https://github.com/paritytech/substrate/pull/14079#discussion_r1255904563 * PR review https://github.com/paritytech/substrate/pull/14079/files#r1257521373 * PR review remove optimisation https://github.com/paritytech/substrate/pull/14079/files#r1263312237 * PR review fix return type https://github.com/paritytech/substrate/pull/14079/files#r1263315804 * Apply suggestions from code review Co-authored-by: Alexander Theißen <alex.theissen@me.com> * PR review pass CodeInfo and update docstring https://github.com/paritytech/substrate/pull/14079/files#r1257522327 * PR review add code_info to the executable https://github.com/paritytech/substrate/pull/14079/files#r1263309049 * rename info -> contract_info * Update frame/contracts/src/exec.rs Co-authored-by: Alexander Theißen <alex.theissen@me.com> * Update frame/contracts/fixtures/add_remove_delegate_dependency.wat Co-authored-by: Alexander Theißen <alex.theissen@me.com> * Update frame/contracts/src/migration/v13.rs * fix tests * Fmt & fix tests * Test Result<(), _> return type * Update frame/contracts/src/migration.rs Co-authored-by: Alexander Theißen <alex.theissen@me.com> * Revert "Test Result<(), _> return type" This reverts commit a876168f2054edf84d720c666387583ccbe78dcd. * add / update doc comments * fix backticks * Revert "Revert "Test Result<(), _> return type"" This reverts commit 3cbb6161d1abd9520cd9f8519b4dfbf4f29a2998. * fix bench * fix bench * fix * Update frame/contracts/src/storage/meter.rs Co-authored-by: Alexander Theißen <alex.theissen@me.com> * rm stale comments * Apply suggestions from code review Co-authored-by: Sasha Gryaznov <hi@agryaznov.com> * PR suggestion * Add missing doc * fx lint * ".git/.scripts/commands/bench/bench.sh" --subcommand=pallet --runtime=dev --target_dir=substrate --pallet=pallet_contracts * Update frame/contracts/src/lib.rs Co-authored-by: Juan <juangirini@gmail.com> --------- Co-authored-by: command-bot <> Co-authored-by: Sasha Gryaznov <hi@agryaznov.com> Co-authored-by: Alexander Theißen <alex.theissen@me.com> Co-authored-by: Juan <juangirini@gmail.com>
This commit is contained in:
@@ -300,6 +300,22 @@ impl<T: Config> CodeInfo<T> {
|
||||
pub fn refcount(&self) -> u64 {
|
||||
self.refcount
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
pub fn new(owner: T::AccountId) -> Self {
|
||||
CodeInfo {
|
||||
owner,
|
||||
deposit: Default::default(),
|
||||
refcount: 0,
|
||||
code_len: 0,
|
||||
determinism: Determinism::Enforced,
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the deposit of the module.
|
||||
pub fn deposit(&self) -> BalanceOf<T> {
|
||||
self.deposit
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Config> Executable<T> for WasmBlob<T> {
|
||||
@@ -396,6 +412,10 @@ impl<T: Config> Executable<T> for WasmBlob<T> {
|
||||
&self.code_hash
|
||||
}
|
||||
|
||||
fn code_info(&self) -> &CodeInfo<T> {
|
||||
&self.code_info
|
||||
}
|
||||
|
||||
fn code_len(&self) -> u32 {
|
||||
self.code.len() as u32
|
||||
}
|
||||
@@ -427,7 +447,10 @@ mod tests {
|
||||
use std::{
|
||||
borrow::BorrowMut,
|
||||
cell::RefCell,
|
||||
collections::hash_map::{Entry, HashMap},
|
||||
collections::{
|
||||
hash_map::{Entry, HashMap},
|
||||
HashSet,
|
||||
},
|
||||
};
|
||||
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
@@ -481,6 +504,7 @@ mod tests {
|
||||
sr25519_verify: RefCell<Vec<([u8; 64], Vec<u8>, [u8; 32])>>,
|
||||
code_hashes: Vec<CodeHash<Test>>,
|
||||
caller: Origin<Test>,
|
||||
delegate_dependencies: RefCell<HashSet<CodeHash<Test>>>,
|
||||
}
|
||||
|
||||
/// The call is mocked and just returns this hardcoded value.
|
||||
@@ -506,6 +530,7 @@ mod tests {
|
||||
ecdsa_recover: Default::default(),
|
||||
caller: Default::default(),
|
||||
sr25519_verify: Default::default(),
|
||||
delegate_dependencies: Default::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -691,6 +716,22 @@ mod tests {
|
||||
fn nonce(&mut self) -> u64 {
|
||||
995
|
||||
}
|
||||
|
||||
fn add_delegate_dependency(
|
||||
&mut self,
|
||||
code: CodeHash<Self::T>,
|
||||
) -> Result<(), DispatchError> {
|
||||
self.delegate_dependencies.borrow_mut().insert(code);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn remove_delegate_dependency(
|
||||
&mut self,
|
||||
code: &CodeHash<Self::T>,
|
||||
) -> Result<(), DispatchError> {
|
||||
self.delegate_dependencies.borrow_mut().remove(code);
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
/// Execute the supplied code.
|
||||
@@ -3317,4 +3358,39 @@ mod tests {
|
||||
<Error<Test>>::CodeRejected,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn add_remove_delegate_dependency() {
|
||||
const CODE_ADD_REMOVE_DELEGATE_DEPENDENCY: &str = r#"
|
||||
(module
|
||||
(import "seal0" "add_delegate_dependency" (func $add_delegate_dependency (param i32)))
|
||||
(import "seal0" "remove_delegate_dependency" (func $remove_delegate_dependency (param i32)))
|
||||
(import "env" "memory" (memory 1 1))
|
||||
(func (export "call")
|
||||
(call $add_delegate_dependency (i32.const 0))
|
||||
(call $add_delegate_dependency (i32.const 32))
|
||||
(call $remove_delegate_dependency (i32.const 32))
|
||||
)
|
||||
(func (export "deploy"))
|
||||
|
||||
;; hash1 (32 bytes)
|
||||
(data (i32.const 0)
|
||||
"\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01"
|
||||
"\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01"
|
||||
)
|
||||
|
||||
;; hash2 (32 bytes)
|
||||
(data (i32.const 32)
|
||||
"\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02"
|
||||
"\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02\02"
|
||||
)
|
||||
)
|
||||
"#;
|
||||
let mut mock_ext = MockExt::default();
|
||||
assert_ok!(execute(&CODE_ADD_REMOVE_DELEGATE_DEPENDENCY, vec![], &mut mock_ext));
|
||||
let delegate_dependencies: Vec<_> =
|
||||
mock_ext.delegate_dependencies.into_inner().into_iter().collect();
|
||||
assert_eq!(delegate_dependencies.len(), 1);
|
||||
assert_eq!(delegate_dependencies[0].as_bytes(), [1; 32]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -267,6 +267,10 @@ pub enum RuntimeCosts {
|
||||
AccountEntranceCount,
|
||||
/// Weight of calling `instantiation_nonce`
|
||||
InstantationNonce,
|
||||
/// Weight of calling `add_delegate_dependency`
|
||||
AddDelegateDependency,
|
||||
/// Weight of calling `remove_delegate_dependency`
|
||||
RemoveDelegateDependency,
|
||||
}
|
||||
|
||||
impl RuntimeCosts {
|
||||
@@ -348,6 +352,8 @@ impl RuntimeCosts {
|
||||
ReentrantCount => s.reentrance_count,
|
||||
AccountEntranceCount => s.account_reentrance_count,
|
||||
InstantationNonce => s.instantiation_nonce,
|
||||
AddDelegateDependency => s.add_delegate_dependency,
|
||||
RemoveDelegateDependency => s.remove_delegate_dependency,
|
||||
};
|
||||
RuntimeToken {
|
||||
#[cfg(test)]
|
||||
@@ -1573,9 +1579,6 @@ pub mod env {
|
||||
/// length to `output_len_ptr`. The copy of the output buffer and address can be skipped by
|
||||
/// supplying the sentinel value of `SENTINEL` to `output_ptr` or `address_ptr`.
|
||||
///
|
||||
/// `value` must be at least the minimum balance. Otherwise the instantiation fails and the
|
||||
/// contract is not created.
|
||||
///
|
||||
/// # Parameters
|
||||
///
|
||||
/// - `code_hash_ptr`: a pointer to the buffer that contains the initializer code.
|
||||
@@ -2821,4 +2824,30 @@ pub mod env {
|
||||
ctx.charge_gas(RuntimeCosts::InstantationNonce)?;
|
||||
Ok(ctx.ext.nonce())
|
||||
}
|
||||
|
||||
/// Adds a new delegate dependency to the contract.
|
||||
///
|
||||
/// # Parameters
|
||||
///
|
||||
/// - `code_hash_ptr`: A pointer to the code hash of the dependency.
|
||||
#[unstable]
|
||||
fn add_delegate_dependency(ctx: _, memory: _, code_hash_ptr: u32) -> Result<(), TrapReason> {
|
||||
ctx.charge_gas(RuntimeCosts::AddDelegateDependency)?;
|
||||
let code_hash = ctx.read_sandbox_memory_as(memory, code_hash_ptr)?;
|
||||
ctx.ext.add_delegate_dependency(code_hash)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Removes the delegate dependency from the contract.
|
||||
///
|
||||
/// # Parameters
|
||||
///
|
||||
/// - `code_hash_ptr`: A pointer to the code hash of the dependency.
|
||||
#[unstable]
|
||||
fn remove_delegate_dependency(ctx: _, memory: _, code_hash_ptr: u32) -> Result<(), TrapReason> {
|
||||
ctx.charge_gas(RuntimeCosts::RemoveDelegateDependency)?;
|
||||
let code_hash = ctx.read_sandbox_memory_as(memory, code_hash_ptr)?;
|
||||
ctx.ext.remove_delegate_dependency(&code_hash)?;
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user