Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.

Commit 94be94b

Browse files
juangirinipgherveouToufeeqPsam0x17liamaharon
authored
Contracts remove deposit accounts (#14589)
* contracts: refactor currency to use fungible traits * contracts: refactor currency to use fungible traits * contracts: add minor improvements * contracts: max holds config set * contracts: fix some typos * contracts: map token errors * fix typo * contracts: add 0 balance transfer to test * contracts: not transfer if value is zero * contracts: [WIP] add StorageDepositHold * contracts: add storage deposit held event * contracts: clean up some code and comments * contracts: add deposit storage released event * contracts: update comment * contracts: update slash cannot kill account test * contracts: fix tests * contracts: add some comments to the slashing test * contracts: add some comments to the slashing test * contracts: remove references to Currency * contracts: do not transfer if from equals to * bound BalanceOf<T> * added FixedPointOperand to Balance trait * move migrate sequence to config * remove commented out code * Update frame/contracts/src/lib.rs Co-authored-by: PG Herveou <[email protected]> * remove Migrations generic * make runtime use noop migrations * restrict is_upgrade_supported * undo is_upgrade_supported change * Update bin/node/runtime/src/lib.rs Co-authored-by: PG Herveou <[email protected]> * add rust doc example for `Migrations` * feature gate NoopMigration * fix example code * improve example * wip * remove FixedPointOperand from trait * trait bound BalanceOf * more trait bound BalanceOf * update to use RuntimeHoldReason * replace Fungible for Currency * update runtime * WIP * make v10 benchmark generic over currency * solve merge conflicts * make v12 migration benchmarking generic over DepositPerItem and DepositPerByte * give some format * fix tests and old migrations * add migration v13 placholder * wip * wip * add benchmarking * add weights * wip * [pallet_collective] Enforce prime is a valid member of collective in set_members extrinsic (#14354) * Updated set_members extrinsic to enforce prime is valid member of collective * Added additional tests for set_members extrinsic * applied the code review suggestions * update to docify 0.2.0 / crate-relative embed paths (#14570) * Fix Society v2 migration (#14421) * fix society v2 migration * Update frame/society/src/migrations.rs * Update frame/society/src/migrations.rs Co-authored-by: Bastian Köcher <[email protected]> * Update frame/society/src/migrations.rs Co-authored-by: Bastian Köcher <[email protected]> * update for versioned upgrade * fix society v2 migration * remove references to members being sorted from commnets * fix type * fix can_migrate check * add sanity log * fix sanity check * kick ci * kick ci * run tests with --experimental flag * versioned migration cleanup * revert pipeline change * use defensive! * semicolons * defensive and doc comment * address pr comment * feature gate the versioned migration * defensive_unwrap_or * fix test * fix doc comment * change defensive to a log warning * remove can_migrate anti-pattern * Update frame/society/Cargo.toml Co-authored-by: Bastian Köcher <[email protected]> * add experimental feature warning to doc comment * update doc comment * bump ci * kick ci * kick ci * kick ci --------- Co-authored-by: Kian Paimani <[email protected]> Co-authored-by: Bastian Köcher <[email protected]> * Moves `Block` to `frame_system` instead of `construct_runtime` and removes `Header` and `BlockNumber` (#14437) * Initial setup * Adds node block * Uses UncheckedExtrinsic and removes Where section * Updates frame_system to use Block * Adds deprecation warning * Fixes pallet-timestamp * Removes Header and BlockNumber * Addresses review comments * Addresses review comments * Adds comment about compiler bug * Removes where clause * Refactors code * Fixes errors in cargo check * Fixes errors in cargo check * Fixes warnings in cargo check * Formatting * Fixes construct_runtime tests * Uses import instead of full path for BlockNumber * Uses import instead of full path for Header * Formatting * Fixes construct_runtime tests * Fixes imports in benchmarks * Formatting * Fixes construct_runtime tests * Formatting * Minor updates * Fixes construct_runtime ui tests * Fixes construct_runtime ui tests with 1.70 * Fixes docs * Fixes docs * Adds u128 mock block type * Fixes split example * fixes for cumulus * ".git/.scripts/commands/fmt/fmt.sh" * Updates new tests * Fixes fully-qualified path in few places * Formatting * Update frame/examples/default-config/src/lib.rs Co-authored-by: Juan <[email protected]> * Update frame/support/procedural/src/construct_runtime/mod.rs Co-authored-by: Juan <[email protected]> * ".git/.scripts/commands/fmt/fmt.sh" * Addresses some review comments * Fixes build * ".git/.scripts/commands/fmt/fmt.sh" * Update frame/democracy/src/lib.rs Co-authored-by: Oliver Tale-Yazdi <[email protected]> * Update frame/democracy/src/lib.rs Co-authored-by: Oliver Tale-Yazdi <[email protected]> * Update frame/support/procedural/src/construct_runtime/mod.rs Co-authored-by: Oliver Tale-Yazdi <[email protected]> * Update frame/support/procedural/src/construct_runtime/mod.rs Co-authored-by: Oliver Tale-Yazdi <[email protected]> * Addresses review comments * Updates trait bounds * Minor fix * ".git/.scripts/commands/fmt/fmt.sh" * Removes unnecessary bound * ".git/.scripts/commands/fmt/fmt.sh" * Updates test * Fixes build * Adds a bound for header * ".git/.scripts/commands/fmt/fmt.sh" * Removes where block * Minor fix * Minor fix * Fixes tests * ".git/.scripts/commands/update-ui/update-ui.sh" 1.70 * Updates test * Update primitives/runtime/src/traits.rs Co-authored-by: Bastian Köcher <[email protected]> * Update primitives/runtime/src/traits.rs Co-authored-by: Bastian Köcher <[email protected]> * Updates doc * Updates doc --------- Co-authored-by: command-bot <> Co-authored-by: Juan <[email protected]> Co-authored-by: Oliver Tale-Yazdi <[email protected]> Co-authored-by: Bastian Köcher <[email protected]> * Refactor the asset-conversion-tx-payment pallet (#14558) * Code refactoring * Fix imports * Typo * Update frame/asset-conversion/src/types.rs Co-authored-by: joe petrowski <[email protected]> * Sync docs --------- Co-authored-by: parity-processbot <> Co-authored-by: joe petrowski <[email protected]> * wip * wip * wip * improve try-runtime imports * remove deposit account * wip * wip * fix benchmark test * improved rustdocs * improved rustdocs * remove log * ignore variable * reduce caller funding * wip * fix tests * fix tests * move v13 out * add v14 * update v13 migration * v13 migration * benchmark v13_migration * fix broken compilation * ".git/.scripts/commands/bench/bench.sh" --subcommand=pallet --runtime=dev --target_dir=substrate --pallet=pallet_contracts * remove all the `where BalanceOf` * add Balance to Config * improve docs * add new deposit storage error * remove todo message * wip * rename migration v13 pre rebase * fix tests * add missing migration; * bump storage version * apply review suggestions * improved comment * remove unnecessary code * simplify migrations * mock balance * mock more for benchmarks * make room for rebaes * make room for rebase * fix benchmarking tests * fix benchmarking tests with caller * improve cargo toml * solve nit * Update frame/contracts/src/lib.rs Co-authored-by: Alexander Theißen <[email protected]> * Update frame/contracts/src/exec.rs Co-authored-by: Alexander Theißen <[email protected]> * Update frame/contracts/src/exec.rs Co-authored-by: Alexander Theißen <[email protected]> * Update frame/contracts/src/storage/meter.rs Co-authored-by: Alexander Theißen <[email protected]> * review improvements * remove extra events * update cargo * undo update cargo * review updates * wip * wip * fix test * remove type Balance * add extra fields to events * fix zepter ci * fix tests * remove commented out code * remove deposit_account from benchmarking * update v15 migration * wip * remove deposit account from codebase * add contract info to v15 * make try-runtime fixes * fix wrong v14 logs * add extra post upgrade steps * remove old comments * wip * fix delegate deposit test * ".git/.scripts/commands/bench/bench.sh" --subcommand=pallet --runtime=dev --target_dir=substrate --pallet=pallet_contracts * wip * wip * wip * implement review updates * ".git/.scripts/commands/bench/bench.sh" --subcommand=pallet --runtime=dev --target_dir=substrate --pallet=pallet_contracts * fix documentation * fix consumers/providers * fix consumers/providers * do not check consumers in migration * review comments addressed * update fully qualified System * wip * wip * Transfer to beneficiary after `transfer_on_hold` (#14767) * transfer to beneficiary after transfer_on_hold * wip * add consumer comment * review updates * fix typo * make clippy happy * refactor `Terminated` * rename ContractStatus to ContractState * rename status to state * replace Contribution::Alive to ContractState::Alive * defer storage deposit charge * ".git/.scripts/commands/fmt/fmt.sh" * remove unused imports * Update frame/contracts/src/migration/v15.rs Co-authored-by: Sasha Gryaznov <[email protected]> * Update frame/contracts/src/storage/meter.rs Co-authored-by: Sasha Gryaznov <[email protected]> --------- Co-authored-by: PG Herveou <[email protected]> Co-authored-by: Toufeeq Pasha <[email protected]> Co-authored-by: Sam Johnson <[email protected]> Co-authored-by: Liam Aharon <[email protected]> Co-authored-by: Kian Paimani <[email protected]> Co-authored-by: Bastian Köcher <[email protected]> Co-authored-by: gupnik <[email protected]> Co-authored-by: Oliver Tale-Yazdi <[email protected]> Co-authored-by: Jegor Sidorenko <[email protected]> Co-authored-by: joe petrowski <[email protected]> Co-authored-by: command-bot <> Co-authored-by: Alexander Theißen <[email protected]> Co-authored-by: Sasha Gryaznov <[email protected]>
1 parent 0cdf702 commit 94be94b

File tree

15 files changed

+1931
-1523
lines changed

15 files changed

+1931
-1523
lines changed

frame/contracts/src/address.rs

-13
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,6 @@ pub trait AddressGenerator<T: Config> {
4040
input_data: &[u8],
4141
salt: &[u8],
4242
) -> T::AccountId;
43-
44-
/// The address of the deposit account of `contract_addr`.
45-
///
46-
/// The address is generated once on instantiation and then stored in the contracts
47-
/// metadata. Hence changes do only affect newly created contracts.
48-
fn deposit_address(contract_addr: &T::AccountId) -> T::AccountId;
4943
}
5044

5145
/// Default address generator.
@@ -71,11 +65,4 @@ impl<T: Config> AddressGenerator<T> for DefaultAddressGenerator {
7165
Decode::decode(&mut TrailingZeroInput::new(entropy.as_ref()))
7266
.expect("infinite length input; no invalid inputs for type; qed")
7367
}
74-
75-
/// Formula: `hash("contract_depo_v1" ++ contract_addr)`
76-
fn deposit_address(contract_addr: &T::AccountId) -> T::AccountId {
77-
let entropy = (b"contract_depo_v1", contract_addr).using_encoded(T::Hashing::hash);
78-
Decode::decode(&mut TrailingZeroInput::new(entropy.as_ref()))
79-
.expect("infinite length input; no invalid inputs for type; qed")
80-
}
8168
}

frame/contracts/src/benchmarking/mod.rs

+22-12
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ use self::{
3030
};
3131
use crate::{
3232
exec::{AccountIdOf, Key},
33-
migration::{codegen::LATEST_MIGRATION_VERSION, v09, v10, v11, v12, v13, v14, MigrationStep},
33+
migration::{
34+
codegen::LATEST_MIGRATION_VERSION, v09, v10, v11, v12, v13, v14, v15, MigrationStep,
35+
},
3436
wasm::CallFlags,
3537
Pallet as Contracts, *,
3638
};
@@ -296,6 +298,19 @@ benchmarks! {
296298
m.step();
297299
}
298300

301+
// This benchmarks the v15 migration step (remove deposit account).
302+
#[pov_mode = Measured]
303+
v15_migration_step {
304+
let contract = <Contract<T>>::with_caller(
305+
whitelisted_caller(), WasmModule::dummy(), vec![],
306+
)?;
307+
308+
v15::store_old_contract_info::<T>(contract.account_id.clone(), contract.info()?);
309+
let mut m = v15::Migration::<T>::default();
310+
}: {
311+
m.step();
312+
}
313+
299314
// This benchmarks the weight of executing Migration::migrate to execute a noop migration.
300315
#[pov_mode = Measured]
301316
migration_noop {
@@ -397,10 +412,9 @@ benchmarks! {
397412
let addr = Contracts::<T>::contract_address(&caller, &hash, &input, &salt);
398413
}: _(origin, value, Weight::MAX, None, code, input, salt)
399414
verify {
400-
let deposit_account = Contract::<T>::address_info(&addr)?.deposit_account().clone();
401-
let deposit = T::Currency::balance(&deposit_account);
415+
let deposit = T::Currency::balance_on_hold(&HoldReason::StorageDepositReserve.into(), &addr);
402416
// uploading the code reserves some balance in the callers account
403-
let code_deposit = T::Currency::total_balance_on_hold(&caller);
417+
let code_deposit = T::Currency::balance_on_hold(&HoldReason::CodeUploadDepositReserve.into(), &caller);
404418
assert_eq!(
405419
T::Currency::balance(&caller),
406420
caller_funding::<T>() - value - deposit - code_deposit - Pallet::<T>::min_balance(),
@@ -427,8 +441,7 @@ benchmarks! {
427441
Contracts::<T>::store_code_raw(code, caller.clone())?;
428442
}: _(origin, value, Weight::MAX, None, hash, input, salt)
429443
verify {
430-
let deposit_account = Contract::<T>::address_info(&addr)?.deposit_account().clone();
431-
let deposit = T::Currency::balance(&deposit_account);
444+
let deposit = T::Currency::balance_on_hold(&HoldReason::StorageDepositReserve.into(), &addr);
432445
// value was removed from the caller
433446
assert_eq!(
434447
T::Currency::balance(&caller),
@@ -451,15 +464,13 @@ benchmarks! {
451464
let instance = Contract::<T>::with_caller(
452465
whitelisted_caller(), WasmModule::dummy(), vec![],
453466
)?;
454-
let deposit_account = instance.info()?.deposit_account().clone();
455467
let value = Pallet::<T>::min_balance();
456468
let origin = RawOrigin::Signed(instance.caller.clone());
457469
let callee = instance.addr.clone();
458470
let before = T::Currency::balance(&instance.account_id);
459-
let before_deposit = T::Currency::balance(&deposit_account);
460471
}: _(origin, callee, value, Weight::MAX, None, data)
461472
verify {
462-
let deposit = T::Currency::balance(&deposit_account);
473+
let deposit = T::Currency::balance_on_hold(&HoldReason::StorageDepositReserve.into(), &instance.account_id);
463474
// value and value transferred via call should be removed from the caller
464475
assert_eq!(
465476
T::Currency::balance(&instance.caller),
@@ -930,15 +941,14 @@ benchmarks! {
930941
});
931942
let instance = Contract::<T>::new(code, vec![])?;
932943
let origin = RawOrigin::Signed(instance.caller.clone());
933-
let deposit_account = instance.info()?.deposit_account().clone();
934944
assert_eq!(T::Currency::total_balance(&beneficiary), 0u32.into());
935945
assert_eq!(T::Currency::balance(&instance.account_id), Pallet::<T>::min_balance() * 2u32.into());
936-
assert_ne!(T::Currency::balance(&deposit_account), 0u32.into());
946+
assert_ne!(T::Currency::balance_on_hold(&HoldReason::StorageDepositReserve.into(), &instance.account_id), 0u32.into());
937947
}: call(origin, instance.addr.clone(), 0u32.into(), Weight::MAX, None, vec![])
938948
verify {
939949
if r > 0 {
940950
assert_eq!(T::Currency::total_balance(&instance.account_id), 0u32.into());
941-
assert_eq!(T::Currency::total_balance(&deposit_account), 0u32.into());
951+
assert_eq!(T::Currency::balance_on_hold(&HoldReason::StorageDepositReserve.into(), &instance.account_id), 0u32.into());
942952
assert_eq!(T::Currency::total_balance(&beneficiary), Pallet::<T>::min_balance() * 2u32.into());
943953
}
944954
}

frame/contracts/src/exec.rs

+14-46
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919
use crate::unsafe_debug::ExecutionObserver;
2020
use crate::{
2121
gas::GasMeter,
22-
storage::{self, meter::Diff, DepositAccount, WriteOutcome},
22+
storage::{self, meter::Diff, WriteOutcome},
2323
BalanceOf, CodeHash, CodeInfo, CodeInfoOf, Config, ContractInfo, ContractInfoOf,
2424
DebugBufferVec, Determinism, Error, Event, Nonce, Origin, Pallet as Contracts, Schedule,
25-
System, WasmBlob, LOG_TARGET,
25+
WasmBlob, LOG_TARGET,
2626
};
2727
use frame_support::{
2828
crypto::ecdsa::ECDSAExt,
@@ -33,7 +33,7 @@ use frame_support::{
3333
storage::{with_transaction, TransactionOutcome},
3434
traits::{
3535
fungible::{Inspect, Mutate},
36-
tokens::{Fortitude::Polite, Preservation},
36+
tokens::Preservation,
3737
Contains, OriginTrait, Randomness, Time,
3838
},
3939
weights::Weight,
@@ -547,7 +547,7 @@ enum CachedContract<T: Config> {
547547
///
548548
/// In this case a reload is neither allowed nor possible. Please note that recursive
549549
/// calls cannot remove a contract as this is checked and denied.
550-
Terminated(DepositAccount<T>),
550+
Terminated,
551551
}
552552

553553
impl<T: Config> CachedContract<T> {
@@ -568,15 +568,6 @@ impl<T: Config> CachedContract<T> {
568568
None
569569
}
570570
}
571-
572-
/// Returns `Some` iff the contract is not `Cached::Invalidated`.
573-
fn deposit_account(&self) -> Option<&DepositAccount<T>> {
574-
match self {
575-
CachedContract::Cached(contract) => Some(contract.deposit_account()),
576-
CachedContract::Terminated(deposit_account) => Some(&deposit_account),
577-
CachedContract::Invalidated => None,
578-
}
579-
}
580571
}
581572

582573
impl<T: Config> Frame<T> {
@@ -655,9 +646,7 @@ impl<T: Config> CachedContract<T> {
655646
/// Terminate and return the contract info.
656647
fn terminate(&mut self, account_id: &T::AccountId) -> ContractInfo<T> {
657648
self.load(account_id);
658-
let contract = get_cached_or_panic_after_load!(self);
659-
let deposit_account = contract.deposit_account().clone();
660-
get_cached_or_panic_after_load!(mem::replace(self, Self::Terminated(deposit_account)))
649+
get_cached_or_panic_after_load!(mem::replace(self, Self::Terminated))
661650
}
662651
}
663652

@@ -955,7 +944,7 @@ where
955944
match (entry_point, delegated_code_hash) {
956945
(ExportedFunction::Constructor, _) => {
957946
// It is not allowed to terminate a contract inside its constructor.
958-
if matches!(frame.contract_info, CachedContract::Terminated(_)) {
947+
if matches!(frame.contract_info, CachedContract::Terminated) {
959948
return Err(Error::<T>::TerminatedInConstructor.into())
960949
}
961950

@@ -1059,18 +1048,8 @@ where
10591048
// in its contract info. The load is necessary to pull it from storage in case
10601049
// it was invalidated.
10611050
frame.contract_info.load(account_id);
1062-
let deposit_account = frame
1063-
.contract_info
1064-
.deposit_account()
1065-
.expect(
1066-
"Is only `None` when the info is invalidated.
1067-
We just re-loaded from storage which either makes the state `Cached` or `Terminated`.
1068-
qed",
1069-
)
1070-
.clone();
10711051
let mut contract = frame.contract_info.into_contract();
1072-
prev.nested_storage
1073-
.absorb(frame.nested_storage, deposit_account, contract.as_mut());
1052+
prev.nested_storage.absorb(frame.nested_storage, account_id, contract.as_mut());
10741053

10751054
// In case the contract wasn't terminated we need to persist changes made to it.
10761055
if let Some(contract) = contract {
@@ -1105,14 +1084,10 @@ where
11051084
if !persist {
11061085
return
11071086
}
1108-
let deposit_account = self.first_frame.contract_info.deposit_account().expect(
1109-
"Is only `None` when the info is invalidated. The first frame can't be invalidated.
1110-
qed",
1111-
).clone();
11121087
let mut contract = self.first_frame.contract_info.as_contract();
11131088
self.storage_meter.absorb(
11141089
mem::take(&mut self.first_frame.nested_storage),
1115-
deposit_account,
1090+
&self.first_frame.account_id,
11161091
contract.as_deref_mut(),
11171092
);
11181093
if let Some(contract) = contract {
@@ -1311,14 +1286,8 @@ where
13111286
}
13121287
let frame = self.top_frame_mut();
13131288
let info = frame.terminate();
1314-
frame.nested_storage.terminate(&info);
1315-
System::<T>::dec_consumers(&frame.account_id);
1316-
Self::transfer(
1317-
Preservation::Expendable,
1318-
&frame.account_id,
1319-
beneficiary,
1320-
T::Currency::reducible_balance(&frame.account_id, Preservation::Expendable, Polite),
1321-
)?;
1289+
frame.nested_storage.terminate(&info, beneficiary.clone());
1290+
13221291
info.queue_trie_for_deletion();
13231292
ContractInfoOf::<T>::remove(&frame.account_id);
13241293
E::decrement_refcount(info.code_hash);
@@ -1327,7 +1296,7 @@ where
13271296
E::decrement_refcount(*code_hash);
13281297
frame
13291298
.nested_storage
1330-
.charge_deposit(info.deposit_account().clone(), StorageDeposit::Refund(*deposit));
1299+
.charge_deposit(frame.account_id.clone(), StorageDeposit::Refund(*deposit));
13311300
}
13321301

13331302
Contracts::<T>::deposit_event(
@@ -1521,8 +1490,7 @@ where
15211490
let deposit = StorageDeposit::Charge(new_base_deposit)
15221491
.saturating_sub(&StorageDeposit::Charge(old_base_deposit));
15231492

1524-
let deposit_account = info.deposit_account().clone();
1525-
frame.nested_storage.charge_deposit(deposit_account, deposit);
1493+
frame.nested_storage.charge_deposit(frame.account_id.clone(), deposit);
15261494

15271495
E::increment_refcount(hash)?;
15281496
E::decrement_refcount(prev_hash);
@@ -1573,7 +1541,7 @@ where
15731541
<WasmBlob<T>>::increment_refcount(code_hash)?;
15741542
frame
15751543
.nested_storage
1576-
.charge_deposit(info.deposit_account().clone(), StorageDeposit::Charge(deposit));
1544+
.charge_deposit(frame.account_id.clone(), StorageDeposit::Charge(deposit));
15771545
Ok(())
15781546
}
15791547

@@ -1589,7 +1557,7 @@ where
15891557

15901558
frame
15911559
.nested_storage
1592-
.charge_deposit(info.deposit_account().clone(), StorageDeposit::Refund(deposit));
1560+
.charge_deposit(frame.account_id.clone(), StorageDeposit::Refund(deposit));
15931561
Ok(())
15941562
}
15951563
}

frame/contracts/src/lib.rs

+17-1
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ pub mod pallet {
187187
use sp_runtime::Perbill;
188188

189189
/// The current storage version.
190-
pub(crate) const STORAGE_VERSION: StorageVersion = StorageVersion::new(14);
190+
pub(crate) const STORAGE_VERSION: StorageVersion = StorageVersion::new(15);
191191

192192
#[pallet::pallet]
193193
#[pallet::storage_version(STORAGE_VERSION)]
@@ -899,6 +899,20 @@ pub mod pallet {
899899
/// The code hash that was delegate called.
900900
code_hash: CodeHash<T>,
901901
},
902+
903+
/// Some funds have been transferred and held as storage deposit.
904+
StorageDepositTransferredAndHeld {
905+
from: T::AccountId,
906+
to: T::AccountId,
907+
amount: BalanceOf<T>,
908+
},
909+
910+
/// Some storage deposit funds have been transferred and released.
911+
StorageDepositTransferredAndReleased {
912+
from: T::AccountId,
913+
to: T::AccountId,
914+
amount: BalanceOf<T>,
915+
},
902916
}
903917

904918
#[pallet::error]
@@ -999,6 +1013,8 @@ pub mod pallet {
9991013
pub enum HoldReason {
10001014
/// The Pallet has reserved it for storing code on-chain.
10011015
CodeUploadDepositReserve,
1016+
/// The Pallet has reserved it for storage deposit.
1017+
StorageDepositReserve,
10021018
}
10031019

10041020
/// A mapping from a contract's code hash to its code.

frame/contracts/src/migration.rs

+1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ pub mod v11;
6363
pub mod v12;
6464
pub mod v13;
6565
pub mod v14;
66+
pub mod v15;
6667
include!(concat!(env!("OUT_DIR"), "/migration_codegen.rs"));
6768

6869
use crate::{weights::WeightInfo, Config, Error, MigrationInProgress, Pallet, Weight, LOG_TARGET};

frame/contracts/src/migration/v10.rs

+15-4
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
//! See <https://github.com/paritytech/substrate/pull/13369>.
2020
2121
use crate::{
22-
address::AddressGenerator,
2322
exec::AccountIdOf,
2423
migration::{IsFinished, MigrationStep},
2524
weights::WeightInfo,
@@ -40,7 +39,10 @@ use frame_support::{
4039
use sp_core::hexdisplay::HexDisplay;
4140
#[cfg(feature = "try-runtime")]
4241
use sp_runtime::TryRuntimeError;
43-
use sp_runtime::{traits::Zero, Perbill, Saturating};
42+
use sp_runtime::{
43+
traits::{Hash, TrailingZeroInput, Zero},
44+
Perbill, Saturating,
45+
};
4446
use sp_std::{ops::Deref, prelude::*};
4547

4648
mod old {
@@ -135,6 +137,16 @@ type ContractInfoOf<T: Config, OldCurrency> = StorageMap<
135137
ContractInfo<T, OldCurrency>,
136138
>;
137139

140+
/// Formula: `hash("contract_depo_v1" ++ contract_addr)`
141+
fn deposit_address<T: Config>(
142+
contract_addr: &<T as frame_system::Config>::AccountId,
143+
) -> <T as frame_system::Config>::AccountId {
144+
let entropy = (b"contract_depo_v1", contract_addr)
145+
.using_encoded(<T as frame_system::Config>::Hashing::hash);
146+
Decode::decode(&mut TrailingZeroInput::new(entropy.as_ref()))
147+
.expect("infinite length input; no invalid inputs for type; qed")
148+
}
149+
138150
impl<T: Config, OldCurrency: 'static> MigrationStep for Migration<T, OldCurrency>
139151
where
140152
OldCurrency: ReservableCurrency<<T as frame_system::Config>::AccountId>
@@ -162,8 +174,7 @@ where
162174
log::debug!(target: LOG_TARGET, "Account: 0x{} ", HexDisplay::from(&account.encode()));
163175

164176
// Get the new deposit account address
165-
let deposit_account: DepositAccount<T> =
166-
DepositAccount(T::AddressGenerator::deposit_address(&account));
177+
let deposit_account: DepositAccount<T> = DepositAccount(deposit_address::<T>(&account));
167178

168179
// Calculate the existing deposit, that should be reserved on the contract account
169180
let old_deposit = contract

0 commit comments

Comments
 (0)