Skip to content

Commit 56d66f6

Browse files
authored
use BoundedVec for feed values (#925)
1 parent 0482bf2 commit 56d66f6

File tree

3 files changed

+96
-28
lines changed

3 files changed

+96
-28
lines changed

oracle/src/lib.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ pub mod module {
9696
/// Maximum size of HasDispatched
9797
#[pallet::constant]
9898
type MaxHasDispatchedSize: Get<u32>;
99+
100+
/// Maximum size the vector used for feed values
101+
#[pallet::constant]
102+
type MaxFeedValues: Get<u32>;
99103
}
100104

101105
#[pallet::error]
@@ -158,7 +162,7 @@ pub mod module {
158162
#[pallet::weight(T::WeightInfo::feed_values(values.len() as u32))]
159163
pub fn feed_values(
160164
origin: OriginFor<T>,
161-
values: Vec<(T::OracleKey, T::OracleValue)>,
165+
values: BoundedVec<(T::OracleKey, T::OracleValue), T::MaxFeedValues>,
162166
) -> DispatchResultWithPostInfo {
163167
let feeder = ensure_signed(origin.clone())
164168
.map(Some)
@@ -172,7 +176,7 @@ pub mod module {
172176
Error::<T, I>::AlreadyFeeded
173177
);
174178

175-
Self::do_feed_values(who, values)?;
179+
Self::do_feed_values(who, values.into())?;
176180
Ok(Pays::No.into())
177181
}
178182
}

oracle/src/mock.rs

+1
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ impl Config for Test {
9292
type Members = Members;
9393
type WeightInfo = ();
9494
type MaxHasDispatchedSize = ConstU32<100>;
95+
type MaxFeedValues = ConstU32<5>;
9596
}
9697

9798
type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic<Test>;

oracle/src/tests.rs

+89-26
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,17 @@ fn should_feed_values_from_member() {
1111
let account_id: AccountId = 1;
1212

1313
assert_noop!(
14-
ModuleOracle::feed_values(RuntimeOrigin::signed(5), vec![(50, 1000), (51, 900), (52, 800)]),
14+
ModuleOracle::feed_values(
15+
RuntimeOrigin::signed(5),
16+
vec![(50, 1000), (51, 900), (52, 800)].try_into().unwrap()
17+
),
1518
Error::<Test, _>::NoPermission,
1619
);
1720

1821
assert_eq!(
1922
ModuleOracle::feed_values(
2023
RuntimeOrigin::signed(account_id),
21-
vec![(50, 1000), (51, 900), (52, 800)]
24+
vec![(50, 1000), (51, 900), (52, 800)].try_into().unwrap()
2225
)
2326
.unwrap()
2427
.pays_fee,
@@ -62,7 +65,7 @@ fn should_feed_values_from_root() {
6265

6366
assert_ok!(ModuleOracle::feed_values(
6467
RuntimeOrigin::root(),
65-
vec![(50, 1000), (51, 900), (52, 800)]
68+
vec![(50, 1000), (51, 900), (52, 800)].try_into().unwrap()
6669
));
6770

6871
// Or feed from root using the DataFeeder trait with None
@@ -110,7 +113,7 @@ fn should_not_feed_values_from_root_directly() {
110113
assert_noop!(
111114
ModuleOracle::feed_values(
112115
RuntimeOrigin::signed(root_feeder),
113-
vec![(50, 1000), (51, 900), (52, 800)]
116+
vec![(50, 1000), (51, 900), (52, 800)].try_into().unwrap()
114117
),
115118
Error::<Test, _>::NoPermission,
116119
);
@@ -125,8 +128,14 @@ fn should_read_raw_values() {
125128
let raw_values = ModuleOracle::read_raw_values(&key);
126129
assert_eq!(raw_values, vec![]);
127130

128-
assert_ok!(ModuleOracle::feed_values(RuntimeOrigin::signed(1), vec![(key, 1000)]));
129-
assert_ok!(ModuleOracle::feed_values(RuntimeOrigin::signed(2), vec![(key, 1200)]));
131+
assert_ok!(ModuleOracle::feed_values(
132+
RuntimeOrigin::signed(1),
133+
vec![(key, 1000)].try_into().unwrap()
134+
));
135+
assert_ok!(ModuleOracle::feed_values(
136+
RuntimeOrigin::signed(2),
137+
vec![(key, 1200)].try_into().unwrap()
138+
));
130139

131140
let raw_values = ModuleOracle::read_raw_values(&key);
132141
assert_eq!(
@@ -150,9 +159,18 @@ fn should_combined_data() {
150159
new_test_ext().execute_with(|| {
151160
let key: u32 = 50;
152161

153-
assert_ok!(ModuleOracle::feed_values(RuntimeOrigin::signed(1), vec![(key, 1300)]));
154-
assert_ok!(ModuleOracle::feed_values(RuntimeOrigin::signed(2), vec![(key, 1000)]));
155-
assert_ok!(ModuleOracle::feed_values(RuntimeOrigin::signed(3), vec![(key, 1200)]));
162+
assert_ok!(ModuleOracle::feed_values(
163+
RuntimeOrigin::signed(1),
164+
vec![(key, 1300)].try_into().unwrap()
165+
));
166+
assert_ok!(ModuleOracle::feed_values(
167+
RuntimeOrigin::signed(2),
168+
vec![(key, 1000)].try_into().unwrap()
169+
));
170+
assert_ok!(ModuleOracle::feed_values(
171+
RuntimeOrigin::signed(3),
172+
vec![(key, 1200)].try_into().unwrap()
173+
));
156174

157175
let expected = Some(TimestampedValue {
158176
value: 1200,
@@ -177,11 +195,14 @@ fn should_return_none_for_non_exist_key() {
177195
#[test]
178196
fn multiple_calls_should_fail() {
179197
new_test_ext().execute_with(|| {
180-
assert_ok!(ModuleOracle::feed_values(RuntimeOrigin::signed(1), vec![(50, 1300)]));
198+
assert_ok!(ModuleOracle::feed_values(
199+
RuntimeOrigin::signed(1),
200+
vec![(50, 1300)].try_into().unwrap()
201+
));
181202

182203
// Fails feeding by the the extrinsic
183204
assert_noop!(
184-
ModuleOracle::feed_values(RuntimeOrigin::signed(1), vec![(50, 1300)]),
205+
ModuleOracle::feed_values(RuntimeOrigin::signed(1), vec![(50, 1300)].try_into().unwrap()),
185206
Error::<Test, _>::AlreadyFeeded,
186207
);
187208

@@ -190,7 +211,10 @@ fn multiple_calls_should_fail() {
190211

191212
ModuleOracle::on_finalize(1);
192213

193-
assert_ok!(ModuleOracle::feed_values(RuntimeOrigin::signed(1), vec![(50, 1300)]));
214+
assert_ok!(ModuleOracle::feed_values(
215+
RuntimeOrigin::signed(1),
216+
vec![(50, 1300)].try_into().unwrap()
217+
));
194218
});
195219
}
196220

@@ -203,9 +227,18 @@ fn get_all_values_should_work() {
203227
assert_eq!(ModuleOracle::get_all_values(), vec![]);
204228

205229
// feed eur & jpy
206-
assert_ok!(ModuleOracle::feed_values(RuntimeOrigin::signed(1), vec![(eur, 1300)]));
207-
assert_ok!(ModuleOracle::feed_values(RuntimeOrigin::signed(2), vec![(eur, 1000)]));
208-
assert_ok!(ModuleOracle::feed_values(RuntimeOrigin::signed(3), vec![(jpy, 9000)]));
230+
assert_ok!(ModuleOracle::feed_values(
231+
RuntimeOrigin::signed(1),
232+
vec![(eur, 1300)].try_into().unwrap()
233+
));
234+
assert_ok!(ModuleOracle::feed_values(
235+
RuntimeOrigin::signed(2),
236+
vec![(eur, 1000)].try_into().unwrap()
237+
));
238+
assert_ok!(ModuleOracle::feed_values(
239+
RuntimeOrigin::signed(3),
240+
vec![(jpy, 9000)].try_into().unwrap()
241+
));
209242

210243
// not enough eur & jpy prices
211244
assert_eq!(ModuleOracle::get(&eur), None);
@@ -216,8 +249,14 @@ fn get_all_values_should_work() {
216249
ModuleOracle::on_finalize(1);
217250

218251
// feed eur & jpy
219-
assert_ok!(ModuleOracle::feed_values(RuntimeOrigin::signed(3), vec![(eur, 1200)]));
220-
assert_ok!(ModuleOracle::feed_values(RuntimeOrigin::signed(1), vec![(jpy, 8000)]));
252+
assert_ok!(ModuleOracle::feed_values(
253+
RuntimeOrigin::signed(3),
254+
vec![(eur, 1200)].try_into().unwrap()
255+
));
256+
assert_ok!(ModuleOracle::feed_values(
257+
RuntimeOrigin::signed(1),
258+
vec![(jpy, 8000)].try_into().unwrap()
259+
));
221260

222261
// enough eur prices
223262
let eur_price = Some(TimestampedValue {
@@ -232,7 +271,10 @@ fn get_all_values_should_work() {
232271
assert_eq!(ModuleOracle::get_all_values(), vec![(eur, eur_price)]);
233272

234273
// feed jpy
235-
assert_ok!(ModuleOracle::feed_values(RuntimeOrigin::signed(2), vec![(jpy, 7000)]));
274+
assert_ok!(ModuleOracle::feed_values(
275+
RuntimeOrigin::signed(2),
276+
vec![(jpy, 7000)].try_into().unwrap()
277+
));
236278

237279
// enough jpy prices
238280
let jpy_price = Some(TimestampedValue {
@@ -251,19 +293,31 @@ fn change_member_should_work() {
251293
OracleMembers::set(vec![2, 3, 4]);
252294
<ModuleOracle as ChangeMembers<AccountId>>::change_members_sorted(&[4], &[1], &[2, 3, 4]);
253295
assert_noop!(
254-
ModuleOracle::feed_values(RuntimeOrigin::signed(1), vec![(50, 1000)]),
296+
ModuleOracle::feed_values(RuntimeOrigin::signed(1), vec![(50, 1000)].try_into().unwrap()),
255297
Error::<Test, _>::NoPermission,
256298
);
257-
assert_ok!(ModuleOracle::feed_values(RuntimeOrigin::signed(2), vec![(50, 1000)]));
258-
assert_ok!(ModuleOracle::feed_values(RuntimeOrigin::signed(4), vec![(50, 1000)]));
299+
assert_ok!(ModuleOracle::feed_values(
300+
RuntimeOrigin::signed(2),
301+
vec![(50, 1000)].try_into().unwrap()
302+
));
303+
assert_ok!(ModuleOracle::feed_values(
304+
RuntimeOrigin::signed(4),
305+
vec![(50, 1000)].try_into().unwrap()
306+
));
259307
});
260308
}
261309

262310
#[test]
263311
fn should_clear_data_for_removed_members() {
264312
new_test_ext().execute_with(|| {
265-
assert_ok!(ModuleOracle::feed_values(RuntimeOrigin::signed(1), vec![(50, 1000)]));
266-
assert_ok!(ModuleOracle::feed_values(RuntimeOrigin::signed(2), vec![(50, 1000)]));
313+
assert_ok!(ModuleOracle::feed_values(
314+
RuntimeOrigin::signed(1),
315+
vec![(50, 1000)].try_into().unwrap()
316+
));
317+
assert_ok!(ModuleOracle::feed_values(
318+
RuntimeOrigin::signed(2),
319+
vec![(50, 1000)].try_into().unwrap()
320+
));
267321

268322
ModuleOracle::change_members_sorted(&[4], &[1], &[2, 3, 4]);
269323

@@ -274,14 +328,23 @@ fn should_clear_data_for_removed_members() {
274328
#[test]
275329
fn values_are_updated_on_feed() {
276330
new_test_ext().execute_with(|| {
277-
assert_ok!(ModuleOracle::feed_values(RuntimeOrigin::signed(1), vec![(50, 900)]));
278-
assert_ok!(ModuleOracle::feed_values(RuntimeOrigin::signed(2), vec![(50, 1000)]));
331+
assert_ok!(ModuleOracle::feed_values(
332+
RuntimeOrigin::signed(1),
333+
vec![(50, 900)].try_into().unwrap()
334+
));
335+
assert_ok!(ModuleOracle::feed_values(
336+
RuntimeOrigin::signed(2),
337+
vec![(50, 1000)].try_into().unwrap()
338+
));
279339

280340
assert_eq!(ModuleOracle::values(50), None);
281341

282342
// Upon the third price feed, the value is updated immediately after `combine`
283343
// can produce valid result.
284-
assert_ok!(ModuleOracle::feed_values(RuntimeOrigin::signed(3), vec![(50, 1100)]));
344+
assert_ok!(ModuleOracle::feed_values(
345+
RuntimeOrigin::signed(3),
346+
vec![(50, 1100)].try_into().unwrap()
347+
));
285348
assert_eq!(
286349
ModuleOracle::values(50),
287350
Some(TimestampedValue {

0 commit comments

Comments
 (0)