mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-30 16:21:02 +00:00
[contracts] Add ext_tombstone_deposit (#4722)
* [contracts] add ext_tombstone_deposit * [contracts] update tombstone_deposit docs
This commit is contained in:
committed by
Sergei Pepyakin
parent
81004eabfd
commit
389b8f1698
@@ -161,6 +161,9 @@ pub trait Ext {
|
|||||||
/// Returns the minimum balance that is required for creating an account.
|
/// Returns the minimum balance that is required for creating an account.
|
||||||
fn minimum_balance(&self) -> BalanceOf<Self::T>;
|
fn minimum_balance(&self) -> BalanceOf<Self::T>;
|
||||||
|
|
||||||
|
/// Returns the deposit required to create a tombstone upon contract eviction.
|
||||||
|
fn tombstone_deposit(&self) -> BalanceOf<Self::T>;
|
||||||
|
|
||||||
/// Returns a random number for the current block with the given subject.
|
/// Returns a random number for the current block with the given subject.
|
||||||
fn random(&self, subject: &[u8]) -> SeedOf<Self::T>;
|
fn random(&self, subject: &[u8]) -> SeedOf<Self::T>;
|
||||||
|
|
||||||
@@ -779,6 +782,10 @@ where
|
|||||||
self.ctx.config.existential_deposit
|
self.ctx.config.existential_deposit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn tombstone_deposit(&self) -> BalanceOf<T> {
|
||||||
|
self.ctx.config.tombstone_deposit
|
||||||
|
}
|
||||||
|
|
||||||
fn deposit_event(&mut self, topics: Vec<T::Hash>, data: Vec<u8>) {
|
fn deposit_event(&mut self, topics: Vec<T::Hash>, data: Vec<u8>) {
|
||||||
self.ctx.deferred.push(DeferredAction::DepositEvent {
|
self.ctx.deferred.push(DeferredAction::DepositEvent {
|
||||||
topics,
|
topics,
|
||||||
|
|||||||
@@ -969,6 +969,7 @@ impl<T: Trait> OnFreeBalanceZero<T::AccountId> for Module<T> {
|
|||||||
pub struct Config<T: Trait> {
|
pub struct Config<T: Trait> {
|
||||||
pub schedule: Schedule,
|
pub schedule: Schedule,
|
||||||
pub existential_deposit: BalanceOf<T>,
|
pub existential_deposit: BalanceOf<T>,
|
||||||
|
pub tombstone_deposit: BalanceOf<T>,
|
||||||
pub max_depth: u32,
|
pub max_depth: u32,
|
||||||
pub max_value_size: u32,
|
pub max_value_size: u32,
|
||||||
pub contract_account_instantiate_fee: BalanceOf<T>,
|
pub contract_account_instantiate_fee: BalanceOf<T>,
|
||||||
@@ -981,6 +982,7 @@ impl<T: Trait> Config<T> {
|
|||||||
Config {
|
Config {
|
||||||
schedule: <Module<T>>::current_schedule(),
|
schedule: <Module<T>>::current_schedule(),
|
||||||
existential_deposit: T::Currency::minimum_balance(),
|
existential_deposit: T::Currency::minimum_balance(),
|
||||||
|
tombstone_deposit: T::TombstoneDeposit::get(),
|
||||||
max_depth: T::MaxDepth::get(),
|
max_depth: T::MaxDepth::get(),
|
||||||
max_value_size: T::MaxValueSize::get(),
|
max_value_size: T::MaxValueSize::get(),
|
||||||
contract_account_instantiate_fee: T::ContractFee::get(),
|
contract_account_instantiate_fee: T::ContractFee::get(),
|
||||||
|
|||||||
@@ -299,6 +299,10 @@ mod tests {
|
|||||||
666
|
666
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn tombstone_deposit(&self) -> u64 {
|
||||||
|
16
|
||||||
|
}
|
||||||
|
|
||||||
fn random(&self, subject: &[u8]) -> H256 {
|
fn random(&self, subject: &[u8]) -> H256 {
|
||||||
H256::from_slice(subject)
|
H256::from_slice(subject)
|
||||||
}
|
}
|
||||||
@@ -397,6 +401,9 @@ mod tests {
|
|||||||
fn minimum_balance(&self) -> u64 {
|
fn minimum_balance(&self) -> u64 {
|
||||||
(**self).minimum_balance()
|
(**self).minimum_balance()
|
||||||
}
|
}
|
||||||
|
fn tombstone_deposit(&self) -> u64 {
|
||||||
|
(**self).tombstone_deposit()
|
||||||
|
}
|
||||||
fn random(&self, subject: &[u8]) -> H256 {
|
fn random(&self, subject: &[u8]) -> H256 {
|
||||||
(**self).random(subject)
|
(**self).random(subject)
|
||||||
}
|
}
|
||||||
@@ -1271,6 +1278,65 @@ mod tests {
|
|||||||
).unwrap();
|
).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const CODE_TOMBSTONE_DEPOSIT: &str = r#"
|
||||||
|
(module
|
||||||
|
(import "env" "ext_tombstone_deposit" (func $ext_tombstone_deposit))
|
||||||
|
(import "env" "ext_scratch_size" (func $ext_scratch_size (result i32)))
|
||||||
|
(import "env" "ext_scratch_read" (func $ext_scratch_read (param i32 i32 i32)))
|
||||||
|
(import "env" "memory" (memory 1 1))
|
||||||
|
|
||||||
|
(func $assert (param i32)
|
||||||
|
(block $ok
|
||||||
|
(br_if $ok
|
||||||
|
(get_local 0)
|
||||||
|
)
|
||||||
|
(unreachable)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
(func (export "call")
|
||||||
|
(call $ext_tombstone_deposit)
|
||||||
|
|
||||||
|
;; assert $ext_scratch_size == 8
|
||||||
|
(call $assert
|
||||||
|
(i32.eq
|
||||||
|
(call $ext_scratch_size)
|
||||||
|
(i32.const 8)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
;; copy contents of the scratch buffer into the contract's memory.
|
||||||
|
(call $ext_scratch_read
|
||||||
|
(i32.const 8) ;; Pointer in memory to the place where to copy.
|
||||||
|
(i32.const 0) ;; Offset from the start of the scratch buffer.
|
||||||
|
(i32.const 8) ;; Count of bytes to copy.
|
||||||
|
)
|
||||||
|
|
||||||
|
;; assert that contents of the buffer is equal to the i64 value of 16.
|
||||||
|
(call $assert
|
||||||
|
(i64.eq
|
||||||
|
(i64.load
|
||||||
|
(i32.const 8)
|
||||||
|
)
|
||||||
|
(i64.const 16)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(func (export "deploy"))
|
||||||
|
)
|
||||||
|
"#;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn tombstone_deposit() {
|
||||||
|
let mut gas_meter = GasMeter::with_limit(50_000, 1);
|
||||||
|
let _ = execute(
|
||||||
|
CODE_TOMBSTONE_DEPOSIT,
|
||||||
|
vec![],
|
||||||
|
MockExt::default(),
|
||||||
|
&mut gas_meter,
|
||||||
|
).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
const CODE_RANDOM: &str = r#"
|
const CODE_RANDOM: &str = r#"
|
||||||
(module
|
(module
|
||||||
(import "env" "ext_random" (func $ext_random (param i32 i32)))
|
(import "env" "ext_random" (func $ext_random (param i32 i32)))
|
||||||
|
|||||||
@@ -623,6 +623,23 @@ define_env!(Env, <E: Ext>,
|
|||||||
Ok(())
|
Ok(())
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Stores the tombstone deposit into the scratch buffer.
|
||||||
|
//
|
||||||
|
// The data is encoded as T::Balance. The current contents of the scratch
|
||||||
|
// buffer are overwritten.
|
||||||
|
//
|
||||||
|
// # Note
|
||||||
|
//
|
||||||
|
// The tombstone deposit is on top of the existential deposit. So in order for
|
||||||
|
// a contract to leave a tombstone the balance of the contract must not go
|
||||||
|
// below the sum of existential deposit and the tombstone deposit. The sum
|
||||||
|
// is commonly referred as subsistence threshold in code.
|
||||||
|
ext_tombstone_deposit(ctx) => {
|
||||||
|
ctx.scratch_buf.clear();
|
||||||
|
ctx.ext.tombstone_deposit().encode_to(&mut ctx.scratch_buf);
|
||||||
|
Ok(())
|
||||||
|
},
|
||||||
|
|
||||||
// Decodes the given buffer as a `T::Call` and adds it to the list
|
// Decodes the given buffer as a `T::Call` and adds it to the list
|
||||||
// of to-be-dispatched calls.
|
// of to-be-dispatched calls.
|
||||||
//
|
//
|
||||||
|
|||||||
Reference in New Issue
Block a user