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

Commit b1c681b

Browse files
authored
Multisig: Fix tests and re-introduce reserve logic (#12241)
* Fix tests and re-introduce reserve logic * fix benches * add todo * remove irrelevant bench
1 parent 36534f0 commit b1c681b

File tree

3 files changed

+60
-394
lines changed

3 files changed

+60
-394
lines changed

frame/multisig/src/benchmarking.rs

Lines changed: 17 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const SEED: u32 = 0;
3131
fn setup_multi<T: Config>(
3232
s: u32,
3333
z: u32,
34-
) -> Result<(Vec<T::AccountId>, OpaqueCall<T>), &'static str> {
34+
) -> Result<(Vec<T::AccountId>, Box<<T as Config>::Call>), &'static str> {
3535
let mut signatories: Vec<T::AccountId> = Vec::new();
3636
for i in 0..s {
3737
let signatory = account("signatory", i, SEED);
@@ -44,8 +44,7 @@ fn setup_multi<T: Config>(
4444
// Must first convert to outer call type.
4545
let call: <T as Config>::Call =
4646
frame_system::Call::<T>::remark { remark: vec![0; z as usize] }.into();
47-
let call_data = OpaqueCall::<T>::from_encoded(call.encode());
48-
Ok((signatories, call_data))
47+
Ok((signatories, Box::new(call)))
4948
}
5049

5150
benchmarks! {
@@ -74,35 +73,15 @@ benchmarks! {
7473
// Transaction Length
7574
let z in 0 .. 10_000;
7675
let (mut signatories, call) = setup_multi::<T>(s, z)?;
77-
let call_hash = blake2_256(call.encoded());
78-
let multi_account_id = Multisig::<T>::multi_account_id(&signatories, s.try_into().unwrap());
79-
let caller = signatories.pop().ok_or("signatories should have len 2 or more")?;
80-
// Whitelist caller account from further DB operations.
81-
let caller_key = frame_system::Account::<T>::hashed_key_for(&caller);
82-
frame_benchmarking::benchmarking::add_to_whitelist(caller_key.into());
83-
}: as_multi(RawOrigin::Signed(caller), s as u16, signatories, None, call, false, Weight::zero())
84-
verify {
85-
assert!(Multisigs::<T>::contains_key(multi_account_id, call_hash));
86-
assert!(!Calls::<T>::contains_key(call_hash));
87-
}
88-
89-
as_multi_create_store {
90-
// Signatories, need at least 2 total people
91-
let s in 2 .. T::MaxSignatories::get() as u32;
92-
// Transaction Length
93-
let z in 0 .. 10_000;
94-
let (mut signatories, call) = setup_multi::<T>(s, z)?;
95-
let call_hash = blake2_256(call.encoded());
76+
let call_hash = call.using_encoded(blake2_256);
9677
let multi_account_id = Multisig::<T>::multi_account_id(&signatories, s.try_into().unwrap());
9778
let caller = signatories.pop().ok_or("signatories should have len 2 or more")?;
98-
T::Currency::make_free_balance_be(&caller, BalanceOf::<T>::max_value());
9979
// Whitelist caller account from further DB operations.
10080
let caller_key = frame_system::Account::<T>::hashed_key_for(&caller);
10181
frame_benchmarking::benchmarking::add_to_whitelist(caller_key.into());
102-
}: as_multi(RawOrigin::Signed(caller), s as u16, signatories, None, call, true, Weight::zero())
82+
}: as_multi(RawOrigin::Signed(caller), s as u16, signatories, None, call, Weight::zero())
10383
verify {
10484
assert!(Multisigs::<T>::contains_key(multi_account_id, call_hash));
105-
assert!(Calls::<T>::contains_key(call_hash));
10685
}
10786

10887
as_multi_approve {
@@ -111,49 +90,22 @@ benchmarks! {
11190
// Transaction Length
11291
let z in 0 .. 10_000;
11392
let (mut signatories, call) = setup_multi::<T>(s, z)?;
114-
let call_hash = blake2_256(call.encoded());
115-
let multi_account_id = Multisig::<T>::multi_account_id(&signatories, s.try_into().unwrap());
116-
let mut signatories2 = signatories.clone();
117-
let caller = signatories.pop().ok_or("signatories should have len 2 or more")?;
118-
// before the call, get the timepoint
119-
let timepoint = Multisig::<T>::timepoint();
120-
// Create the multi, storing for worst case
121-
Multisig::<T>::as_multi(RawOrigin::Signed(caller).into(), s as u16, signatories, None, call.clone(), true, Weight::zero())?;
122-
assert!(Calls::<T>::contains_key(call_hash));
123-
let caller2 = signatories2.remove(0);
124-
// Whitelist caller account from further DB operations.
125-
let caller_key = frame_system::Account::<T>::hashed_key_for(&caller2);
126-
frame_benchmarking::benchmarking::add_to_whitelist(caller_key.into());
127-
}: as_multi(RawOrigin::Signed(caller2), s as u16, signatories2, Some(timepoint), call, false, Weight::zero())
128-
verify {
129-
let multisig = Multisigs::<T>::get(multi_account_id, call_hash).ok_or("multisig not created")?;
130-
assert_eq!(multisig.approvals.len(), 2);
131-
}
132-
133-
as_multi_approve_store {
134-
// Signatories, need at least 3 people (so we don't complete the multisig)
135-
let s in 3 .. T::MaxSignatories::get() as u32;
136-
// Transaction Length
137-
let z in 0 .. 10_000;
138-
let (mut signatories, call) = setup_multi::<T>(s, z)?;
139-
let call_hash = blake2_256(call.encoded());
93+
let call_hash = call.using_encoded(blake2_256);
14094
let multi_account_id = Multisig::<T>::multi_account_id(&signatories, s.try_into().unwrap());
14195
let mut signatories2 = signatories.clone();
14296
let caller = signatories.pop().ok_or("signatories should have len 2 or more")?;
14397
// before the call, get the timepoint
14498
let timepoint = Multisig::<T>::timepoint();
145-
// Create the multi, not storing
146-
Multisig::<T>::as_multi(RawOrigin::Signed(caller).into(), s as u16, signatories, None, call.clone(), false, Weight::zero())?;
147-
assert!(!Calls::<T>::contains_key(call_hash));
99+
// Create the multi
100+
Multisig::<T>::as_multi(RawOrigin::Signed(caller).into(), s as u16, signatories, None, call.clone(), Weight::zero())?;
148101
let caller2 = signatories2.remove(0);
149102
// Whitelist caller account from further DB operations.
150103
let caller_key = frame_system::Account::<T>::hashed_key_for(&caller2);
151104
frame_benchmarking::benchmarking::add_to_whitelist(caller_key.into());
152-
}: as_multi(RawOrigin::Signed(caller2), s as u16, signatories2, Some(timepoint), call, true, Weight::zero())
105+
}: as_multi(RawOrigin::Signed(caller2), s as u16, signatories2, Some(timepoint), call, Weight::zero())
153106
verify {
154107
let multisig = Multisigs::<T>::get(multi_account_id, call_hash).ok_or("multisig not created")?;
155108
assert_eq!(multisig.approvals.len(), 2);
156-
assert!(Calls::<T>::contains_key(call_hash));
157109
}
158110

159111
as_multi_complete {
@@ -162,27 +114,27 @@ benchmarks! {
162114
// Transaction Length
163115
let z in 0 .. 10_000;
164116
let (mut signatories, call) = setup_multi::<T>(s, z)?;
165-
let call_hash = blake2_256(call.encoded());
117+
let call_hash = call.using_encoded(blake2_256);
166118
let multi_account_id = Multisig::<T>::multi_account_id(&signatories, s.try_into().unwrap());
167119
let mut signatories2 = signatories.clone();
168120
let caller = signatories.pop().ok_or("signatories should have len 2 or more")?;
169121
// before the call, get the timepoint
170122
let timepoint = Multisig::<T>::timepoint();
171-
// Create the multi, storing it for worst case
172-
Multisig::<T>::as_multi(RawOrigin::Signed(caller).into(), s as u16, signatories, None, call.clone(), true, Weight::zero())?;
123+
// Create the multi
124+
Multisig::<T>::as_multi(RawOrigin::Signed(caller).into(), s as u16, signatories, None, call.clone(), Weight::zero())?;
173125
// Everyone except the first person approves
174126
for i in 1 .. s - 1 {
175127
let mut signatories_loop = signatories2.clone();
176128
let caller_loop = signatories_loop.remove(i as usize);
177129
let o = RawOrigin::Signed(caller_loop).into();
178-
Multisig::<T>::as_multi(o, s as u16, signatories_loop, Some(timepoint), call.clone(), false, Weight::zero())?;
130+
Multisig::<T>::as_multi(o, s as u16, signatories_loop, Some(timepoint), call.clone(), Weight::zero())?;
179131
}
180132
let caller2 = signatories2.remove(0);
181133
assert!(Multisigs::<T>::contains_key(&multi_account_id, call_hash));
182134
// Whitelist caller account from further DB operations.
183135
let caller_key = frame_system::Account::<T>::hashed_key_for(&caller2);
184136
frame_benchmarking::benchmarking::add_to_whitelist(caller_key.into());
185-
}: as_multi(RawOrigin::Signed(caller2), s as u16, signatories2, Some(timepoint), call, false, Weight::MAX)
137+
}: as_multi(RawOrigin::Signed(caller2), s as u16, signatories2, Some(timepoint), call, Weight::MAX)
186138
verify {
187139
assert!(!Multisigs::<T>::contains_key(&multi_account_id, call_hash));
188140
}
@@ -195,7 +147,7 @@ benchmarks! {
195147
let (mut signatories, call) = setup_multi::<T>(s, z)?;
196148
let multi_account_id = Multisig::<T>::multi_account_id(&signatories, s.try_into().unwrap());
197149
let caller = signatories.pop().ok_or("signatories should have len 2 or more")?;
198-
let call_hash = blake2_256(call.encoded());
150+
let call_hash = call.using_encoded(blake2_256);
199151
// Whitelist caller account from further DB operations.
200152
let caller_key = frame_system::Account::<T>::hashed_key_for(&caller);
201153
frame_benchmarking::benchmarking::add_to_whitelist(caller_key.into());
@@ -214,7 +166,7 @@ benchmarks! {
214166
let mut signatories2 = signatories.clone();
215167
let multi_account_id = Multisig::<T>::multi_account_id(&signatories, s.try_into().unwrap());
216168
let caller = signatories.pop().ok_or("signatories should have len 2 or more")?;
217-
let call_hash = blake2_256(call.encoded());
169+
let call_hash = call.using_encoded(blake2_256);
218170
// before the call, get the timepoint
219171
let timepoint = Multisig::<T>::timepoint();
220172
// Create the multi
@@ -224,7 +176,6 @@ benchmarks! {
224176
signatories,
225177
None,
226178
call,
227-
false,
228179
Weight::zero()
229180
)?;
230181
let caller2 = signatories2.remove(0);
@@ -237,45 +188,6 @@ benchmarks! {
237188
assert_eq!(multisig.approvals.len(), 2);
238189
}
239190

240-
approve_as_multi_complete {
241-
// Signatories, need at least 2 people
242-
let s in 2 .. T::MaxSignatories::get() as u32;
243-
// Transaction Length, not a component
244-
let z = 10_000;
245-
let (mut signatories, call) = setup_multi::<T>(s, z)?;
246-
let multi_account_id = Multisig::<T>::multi_account_id(&signatories, s.try_into().unwrap());
247-
let mut signatories2 = signatories.clone();
248-
let caller = signatories.pop().ok_or("signatories should have len 2 or more")?;
249-
T::Currency::make_free_balance_be(&caller, BalanceOf::<T>::max_value());
250-
let call_hash = blake2_256(call.encoded());
251-
// before the call, get the timepoint
252-
let timepoint = Multisig::<T>::timepoint();
253-
// Create the multi
254-
Multisig::<T>::as_multi(RawOrigin::Signed(caller).into(), s as u16, signatories, None, call.clone(), true, Weight::zero())?;
255-
// Everyone except the first person approves
256-
for i in 1 .. s - 1 {
257-
let mut signatories_loop = signatories2.clone();
258-
let caller_loop = signatories_loop.remove(i as usize);
259-
let o = RawOrigin::Signed(caller_loop).into();
260-
Multisig::<T>::as_multi(o, s as u16, signatories_loop, Some(timepoint), call.clone(), false, Weight::zero())?;
261-
}
262-
let caller2 = signatories2.remove(0);
263-
assert!(Multisigs::<T>::contains_key(&multi_account_id, call_hash));
264-
// Whitelist caller account from further DB operations.
265-
let caller_key = frame_system::Account::<T>::hashed_key_for(&caller2);
266-
frame_benchmarking::benchmarking::add_to_whitelist(caller_key.into());
267-
}: approve_as_multi(
268-
RawOrigin::Signed(caller2),
269-
s as u16,
270-
signatories2,
271-
Some(timepoint),
272-
call_hash,
273-
Weight::MAX
274-
)
275-
verify {
276-
assert!(!Multisigs::<T>::contains_key(multi_account_id, call_hash));
277-
}
278-
279191
cancel_as_multi {
280192
// Signatories, need at least 2 people
281193
let s in 2 .. T::MaxSignatories::get() as u32;
@@ -284,20 +196,18 @@ benchmarks! {
284196
let (mut signatories, call) = setup_multi::<T>(s, z)?;
285197
let multi_account_id = Multisig::<T>::multi_account_id(&signatories, s.try_into().unwrap());
286198
let caller = signatories.pop().ok_or("signatories should have len 2 or more")?;
287-
let call_hash = blake2_256(call.encoded());
199+
let call_hash = call.using_encoded(blake2_256);
288200
let timepoint = Multisig::<T>::timepoint();
289201
// Create the multi
290202
let o = RawOrigin::Signed(caller.clone()).into();
291-
Multisig::<T>::as_multi(o, s as u16, signatories.clone(), None, call, true, Weight::zero())?;
203+
Multisig::<T>::as_multi(o, s as u16, signatories.clone(), None, call, Weight::zero())?;
292204
assert!(Multisigs::<T>::contains_key(&multi_account_id, call_hash));
293-
assert!(Calls::<T>::contains_key(call_hash));
294205
// Whitelist caller account from further DB operations.
295206
let caller_key = frame_system::Account::<T>::hashed_key_for(&caller);
296207
frame_benchmarking::benchmarking::add_to_whitelist(caller_key.into());
297208
}: _(RawOrigin::Signed(caller), s as u16, signatories, timepoint, call_hash)
298209
verify {
299210
assert!(!Multisigs::<T>::contains_key(multi_account_id, call_hash));
300-
assert!(!Calls::<T>::contains_key(call_hash));
301211
}
302212

303213
impl_benchmark_test_suite!(Multisig, crate::tests::new_test_ext(), crate::tests::Test);

frame/multisig/src/lib.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ use frame_support::{
5656
DispatchErrorWithPostInfo, DispatchResult, DispatchResultWithPostInfo, PostDispatchInfo,
5757
},
5858
ensure,
59-
traits::{Currency, Get, ReservableCurrency, WrapperKeepOpaque},
59+
traits::{Currency, Get, ReservableCurrency},
6060
weights::{GetDispatchInfo, Weight},
6161
RuntimeDebug,
6262
};
@@ -592,7 +592,8 @@ impl<T: Config> Pallet<T> {
592592
Err(Error::<T>::AlreadyApproved)?
593593
}
594594

595-
let final_weight = T::WeightInfo::as_multi_approve(other_signatories_len as u32, call_len as u32);
595+
let final_weight =
596+
T::WeightInfo::as_multi_approve(other_signatories_len as u32, call_len as u32);
596597
// Call is not made, so the actual weight does not include call
597598
Ok(Some(final_weight).into())
598599
}
@@ -603,6 +604,8 @@ impl<T: Config> Pallet<T> {
603604
// Just start the operation by recording it in storage.
604605
let deposit = T::DepositBase::get() + T::DepositFactor::get() * threshold.into();
605606

607+
T::Currency::reserve(&who, deposit)?;
608+
606609
<Multisigs<T>>::insert(
607610
&id,
608611
call_hash,
@@ -615,7 +618,8 @@ impl<T: Config> Pallet<T> {
615618
);
616619
Self::deposit_event(Event::NewMultisig { approving: who, multisig: id, call_hash });
617620

618-
let final_weight = T::WeightInfo::as_multi_create(other_signatories_len as u32, call_len as u32);
621+
let final_weight =
622+
T::WeightInfo::as_multi_create(other_signatories_len as u32, call_len as u32);
619623
// Call is not made, so the actual weight does not include call
620624
Ok(Some(final_weight).into())
621625
}

0 commit comments

Comments
 (0)