From b84b5606b113e18d286e020372f9a6d3a8a2872c Mon Sep 17 00:00:00 2001 From: Vivek Pandya Date: Wed, 7 Dec 2022 19:00:36 +0530 Subject: [PATCH 1/6] Remove use of MarketCommonsApi from prediction markets pallet --- zrml/market-commons/src/lib.rs | 113 ++++-- zrml/prediction-markets/src/benchmarks.rs | 80 ++-- zrml/prediction-markets/src/lib.rs | 170 ++++---- zrml/prediction-markets/src/migrations.rs | 462 ---------------------- zrml/prediction-markets/src/mock.rs | 1 - 5 files changed, 208 insertions(+), 618 deletions(-) diff --git a/zrml/market-commons/src/lib.rs b/zrml/market-commons/src/lib.rs index 24080a2dd..160cccc04 100644 --- a/zrml/market-commons/src/lib.rs +++ b/zrml/market-commons/src/lib.rs @@ -115,12 +115,80 @@ mod pallet { // on the storage so next following calls will return yet another incremented number. // // Returns `Err` if `MarketId` addition overflows. - fn next_market_id() -> Result { + pub fn next_market_id() -> Result { let id = MarketCounter::::get(); let new_counter = id.checked_add(&1u8.into()).ok_or(ArithmeticError::Overflow)?; >::put(new_counter); Ok(id) } + + pub fn mutate_market(market_id: &T::MarketId, cb: F) -> DispatchResult + where + F: FnOnce(&mut Market>) -> DispatchResult, + { + >::try_mutate(market_id, |opt| { + if let Some(market) = opt { + cb(market)?; + return Ok(()); + } + Err(Error::::MarketDoesNotExist.into()) + }) + } + + pub fn insert_market_pool(market_id: T::MarketId, pool_id: PoolId) -> DispatchResult { + ensure!(!>::contains_key(market_id), Error::::PoolAlreadyExists); + ensure!(>::contains_key(market_id), Error::::MarketDoesNotExist); + >::insert(market_id, pool_id); + Ok(()) + } + + pub fn remove_market_pool(market_id: &T::MarketId) -> DispatchResult { + if !>::contains_key(market_id) { + return Err(Error::::MarketPoolDoesNotExist.into()); + } + >::remove(market_id); + Ok(()) + } + + pub fn now() -> MomentOf { + T::Timestamp::now() + } + + pub fn latest_market_id() -> Result { + match >::try_get() { + Ok(market_id) => { + Ok(market_id.saturating_sub(1u8.into())) // Note: market_id > 0! + } + _ => Err(Error::::NoMarketHasBeenCreated.into()), + } + } + + pub fn push_market( + market: Market>, + ) -> Result { + let market_id = Self::next_market_id()?; + >::insert(market_id, market); + Ok(market_id) + } + + pub fn remove_market(market_id: &T::MarketId) -> DispatchResult { + if !>::contains_key(market_id) { + return Err(Error::::MarketDoesNotExist.into()); + } + >::remove(market_id); + Ok(()) + } + + pub fn market( + market_id: &T::MarketId, + ) -> Result>, DispatchError> { + >::try_get(market_id).map_err(|_err| Error::::MarketDoesNotExist.into()) + } + + pub fn market_pool(market_id: &T::MarketId) -> Result { + >::try_get(market_id) + .map_err(|_err| Error::::MarketPoolDoesNotExist.into()) + } } impl MarketCommonsPalletApi for Pallet @@ -137,12 +205,7 @@ mod pallet { // Market fn latest_market_id() -> Result { - match >::try_get() { - Ok(market_id) => { - Ok(market_id.saturating_sub(1u8.into())) // Note: market_id > 0! - } - _ => Err(Error::::NoMarketHasBeenCreated.into()), - } + Self::latest_market_id() } fn market_iter() -> PrefixIterator<( @@ -156,7 +219,7 @@ mod pallet { market_id: &Self::MarketId, ) -> Result, DispatchError> { - >::try_get(market_id).map_err(|_err| Error::::MarketDoesNotExist.into()) + Self::market(market_id) } fn mutate_market(market_id: &Self::MarketId, cb: F) -> DispatchResult @@ -165,29 +228,17 @@ mod pallet { &mut Market, ) -> DispatchResult, { - >::try_mutate(market_id, |opt| { - if let Some(market) = opt { - cb(market)?; - return Ok(()); - } - Err(Error::::MarketDoesNotExist.into()) - }) + Self::mutate_market(market_id, cb) } fn push_market( market: Market, ) -> Result { - let market_id = Self::next_market_id()?; - >::insert(market_id, market); - Ok(market_id) + Self::push_market(market) } fn remove_market(market_id: &Self::MarketId) -> DispatchResult { - if !>::contains_key(market_id) { - return Err(Error::::MarketDoesNotExist.into()); - } - >::remove(market_id); - Ok(()) + Self::remove_market(market_id) } // TODO(#837): Remove when on-chain arbitrage is removed! @@ -200,29 +251,21 @@ mod pallet { // MarketPool fn insert_market_pool(market_id: Self::MarketId, pool_id: PoolId) -> DispatchResult { - ensure!(!>::contains_key(market_id), Error::::PoolAlreadyExists); - ensure!(>::contains_key(market_id), Error::::MarketDoesNotExist); - >::insert(market_id, pool_id); - Ok(()) + Self::insert_market_pool(market_id, pool_id) } fn remove_market_pool(market_id: &Self::MarketId) -> DispatchResult { - if !>::contains_key(market_id) { - return Err(Error::::MarketPoolDoesNotExist.into()); - } - >::remove(market_id); - Ok(()) + Self::remove_market_pool(market_id) } fn market_pool(market_id: &Self::MarketId) -> Result { - >::try_get(market_id) - .map_err(|_err| Error::::MarketPoolDoesNotExist.into()) + Self::market_pool(market_id) } // Etc fn now() -> Self::Moment { - T::Timestamp::now() + Self::now() } } diff --git a/zrml/prediction-markets/src/benchmarks.rs b/zrml/prediction-markets/src/benchmarks.rs index 2c6618134..fc6aef7a3 100644 --- a/zrml/prediction-markets/src/benchmarks.rs +++ b/zrml/prediction-markets/src/benchmarks.rs @@ -98,7 +98,7 @@ fn create_market_common( scoring_rule, } .dispatch_bypass_filter(RawOrigin::Signed(caller.clone()).into())?; - let market_id = T::MarketCommons::latest_market_id()?; + let market_id = zrml_market_commons::Pallet::::latest_market_id()?; Ok((caller, market_id)) } @@ -114,7 +114,7 @@ fn create_close_and_report_market( create_market_common::(permission, options, ScoringRule::CPMM, Some(period))?; Call::::admin_move_market_to_closed { market_id } .dispatch_bypass_filter(T::CloseOrigin::successful_origin())?; - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; let end: u32 = match market.period { MarketPeriod::Timestamp(range) => range.end.saturated_into::(), _ => { @@ -157,7 +157,7 @@ fn setup_redeem_shares_common( let close_origin = T::CloseOrigin::successful_origin(); let resolve_origin = T::ResolveOrigin::successful_origin(); Call::::admin_move_market_to_closed { market_id }.dispatch_bypass_filter(close_origin)?; - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; let end: u32 = match market.period { MarketPeriod::Timestamp(range) => range.end.saturated_into::(), _ => { @@ -201,7 +201,7 @@ fn setup_reported_categorical_market_with_pool::admin_move_market_to_closed { market_id } .dispatch_bypass_filter(T::CloseOrigin::successful_origin())?; - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; let end: u32 = match market.period { MarketPeriod::Timestamp(range) => range.end.saturated_into::(), _ => { @@ -239,7 +239,7 @@ benchmarks! { OutcomeReport::Categorical(0u16), )?; - let pool_id = T::MarketCommons::market_pool(&market_id)?; + let pool_id = zrml_market_commons::Pallet::::market_pool(&market_id)?; for i in 1..=d { let outcome = OutcomeReport::Categorical((i % a).saturated_into()); @@ -249,7 +249,7 @@ benchmarks! { let _ = Pallet::::dispute(RawOrigin::Signed(disputor).into(), market_id, outcome)?; } - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; let (range_start, range_end) = match market.period { MarketPeriod::Timestamp(range) => (range.start, range.end), @@ -303,9 +303,9 @@ benchmarks! { OutcomeReport::Categorical(0u16), )?; - let pool_id = T::MarketCommons::market_pool(&market_id)?; + let pool_id = zrml_market_commons::Pallet::::market_pool(&market_id)?; - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; let (range_start, range_end) = match market.period { MarketPeriod::Timestamp(range) => (range.start, range.end), @@ -385,7 +385,7 @@ benchmarks! { OutcomeReport::Scalar(u128::MAX), )?; - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; let report_at = market.report.unwrap().at; let resolves_at = report_at.saturating_add(market.deadlines.dispute_duration); @@ -416,12 +416,12 @@ benchmarks! { categories.into(), OutcomeReport::Categorical(0u16), )?; - T::MarketCommons::mutate_market(&market_id, |market| { + zrml_market_commons::Pallet::::mutate_market(&market_id, |market| { market.dispute_mechanism = MarketDisputeMechanism::Authorized; Ok(()) })?; - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; let report_at = market.report.unwrap().at; let resolves_at = report_at.saturating_add(market.deadlines.dispute_duration); @@ -454,12 +454,12 @@ benchmarks! { OutcomeReport::Scalar(u128::MAX), )?; - T::MarketCommons::mutate_market(&market_id, |market| { + zrml_market_commons::Pallet::::mutate_market(&market_id, |market| { market.dispute_mechanism = MarketDisputeMechanism::Authorized; Ok(()) })?; - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; if let MarketType::Scalar(range) = market.market_type { assert!((d as u128) < *range.end()); } else { @@ -511,7 +511,7 @@ benchmarks! { OutcomeReport::Categorical(0u16) )?; - T::MarketCommons::mutate_market(&market_id, |market| { + zrml_market_commons::Pallet::::mutate_market(&market_id, |market| { market.dispute_mechanism = MarketDisputeMechanism::Authorized; Ok(()) })?; @@ -529,7 +529,7 @@ benchmarks! { } let disputes = Disputes::::get(market_id); let last_dispute = disputes.last().unwrap(); - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; let resolves_at = last_dispute.at.saturating_add(market.deadlines.dispute_duration); for i in 0..r { MarketIdsPerDisputeBlock::::try_mutate( @@ -638,7 +638,7 @@ benchmarks! { scoring_rule, } .dispatch_bypass_filter(RawOrigin::Signed(caller.clone()).into())?; - let market_id = T::MarketCommons::latest_market_id()?; + let market_id = zrml_market_commons::Pallet::::latest_market_id()?; let approve_origin = T::ApproveOrigin::successful_origin(); let edit_reason = vec![0_u8; 1024]; @@ -682,7 +682,7 @@ benchmarks! { )?; assert!( - Pallet::::calculate_time_frame_of_moment(T::MarketCommons::now()) + Pallet::::calculate_time_frame_of_moment(zrml_market_commons::Pallet::::now()) < Pallet::::calculate_time_frame_of_moment(range_start) ); @@ -728,7 +728,7 @@ benchmarks! { // We need to ensure, that period range start is now, // because we would like to open the pool now - let range_start: MomentOf = T::MarketCommons::now(); + let range_start: MomentOf = zrml_market_commons::Pallet::::now(); let range_end: MomentOf = 1_000_000u64.saturated_into(); let (caller, market_id) = create_market_common::( MarketCreation::Permissionless, @@ -737,7 +737,7 @@ benchmarks! { Some(MarketPeriod::Timestamp(range_start..range_end)), )?; - let market = T::MarketCommons::market(&market_id.saturated_into())?; + let market = zrml_market_commons::Pallet::::market(&market_id.saturated_into())?; let max_swap_fee: BalanceOf:: = MaxSwapFee::get().saturated_into(); let min_liquidity: BalanceOf:: = MinLiquidity::get().saturated_into(); @@ -759,7 +759,7 @@ benchmarks! { }: { call.dispatch_bypass_filter(RawOrigin::Signed(caller).into())?; } verify { - let market_pool_id = T::MarketCommons::market_pool(&market_id.saturated_into())?; + let market_pool_id = zrml_market_commons::Pallet::::market_pool(&market_id.saturated_into())?; let pool = T::Swaps::pool(market_pool_id)?; assert_eq!(pool.pool_status, PoolStatus::Active); } @@ -821,12 +821,12 @@ benchmarks! { report_outcome, )?; - T::MarketCommons::mutate_market(&market_id, |market| { + zrml_market_commons::Pallet::::mutate_market(&market_id, |market| { market.dispute_mechanism = MarketDisputeMechanism::Authorized; Ok(()) })?; - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; if let MarketType::Scalar(range) = market.market_type { assert!((d as u128) < *range.end()); } else { @@ -861,7 +861,7 @@ benchmarks! { ScoringRule::CPMM, Some(MarketPeriod::Timestamp(T::MinSubsidyPeriod::get()..T::MaxSubsidyPeriod::get())), )?; - let market = T::MarketCommons::market(&market_id.saturated_into())?; + let market = zrml_market_commons::Pallet::::market(&market_id.saturated_into())?; }: { Pallet::::handle_expired_advised_market(&market_id, market)? } internal_resolve_categorical_reported { @@ -870,15 +870,15 @@ benchmarks! { categories.into(), OutcomeReport::Categorical(1u16), )?; - T::MarketCommons::mutate_market(&market_id, |market| { + zrml_market_commons::Pallet::::mutate_market(&market_id, |market| { market.dispute_mechanism = MarketDisputeMechanism::Authorized; Ok(()) })?; - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; }: { Pallet::::on_resolution(&market_id, &market)?; } verify { - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; assert_eq!(market.status, MarketStatus::Resolved); } @@ -892,7 +892,7 @@ benchmarks! { categories.into(), OutcomeReport::Categorical(1u16) )?; - T::MarketCommons::mutate_market(&market_id, |market| { + zrml_market_commons::Pallet::::mutate_market(&market_id, |market| { market.dispute_mechanism = MarketDisputeMechanism::Authorized; Ok(()) })?; @@ -905,11 +905,11 @@ benchmarks! { OutcomeReport::Categorical((i % 2).saturated_into::()), )?; } - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; }: { Pallet::::on_resolution(&market_id, &market)?; } verify { - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; assert_eq!(market.status, MarketStatus::Resolved); } @@ -919,11 +919,11 @@ benchmarks! { MarketType::Scalar(0u128..=u128::MAX), OutcomeReport::Scalar(u128::MAX), )?; - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; }: { Pallet::::on_resolution(&market_id, &market)?; } verify { - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; assert_eq!(market.status, MarketStatus::Resolved); } @@ -935,11 +935,11 @@ benchmarks! { MarketType::Scalar(0u128..=u128::MAX), OutcomeReport::Scalar(u128::MAX), )?; - T::MarketCommons::mutate_market(&market_id, |market| { + zrml_market_commons::Pallet::::mutate_market(&market_id, |market| { market.dispute_mechanism = MarketDisputeMechanism::Authorized; Ok(()) })?; - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; if let MarketType::Scalar(range) = market.market_type { assert!((d as u128) < *range.end()); } else { @@ -953,11 +953,11 @@ benchmarks! { OutcomeReport::Scalar(i.into()) )?; } - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; }: { Pallet::::on_resolution(&market_id, &market)?; } verify { - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; assert_eq!(market.status, MarketStatus::Resolved); } @@ -1034,7 +1034,7 @@ benchmarks! { let m in 0..63; // ensure range.start is now to get the heaviest path - let range_start: MomentOf = T::MarketCommons::now(); + let range_start: MomentOf = zrml_market_commons::Pallet::::now(); let range_end: MomentOf = 1_000_000u64.saturated_into(); let (caller, market_id) = create_market_common::( MarketCreation::Permissionless, @@ -1043,7 +1043,7 @@ benchmarks! { Some(MarketPeriod::Timestamp(range_start..range_end)), )?; - T::MarketCommons::mutate_market(&market_id, |market| { + zrml_market_commons::Pallet::::mutate_market(&market_id, |market| { // ensure sender is oracle to succeed extrinsic call market.oracle = caller.clone(); Ok(()) @@ -1052,7 +1052,7 @@ benchmarks! { let outcome = OutcomeReport::Categorical(0); let close_origin = T::CloseOrigin::successful_origin(); Pallet::::admin_move_market_to_closed(close_origin, market_id)?; - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; let end : u32 = match market.period { MarketPeriod::Timestamp(range) => { range.end.saturated_into::() @@ -1103,7 +1103,7 @@ benchmarks! { Some(MarketPeriod::Timestamp(T::MinSubsidyPeriod::get()..T::MaxSubsidyPeriod::get())), )?; let mut market_clone = None; - T::MarketCommons::mutate_market(&market_id, |market| { + zrml_market_commons::Pallet::::mutate_market(&market_id, |market| { market.status = MarketStatus::CollectingSubsidy; market_clone = Some(market.clone()); Ok(()) @@ -1188,7 +1188,7 @@ benchmarks! { Some(MarketPeriod::Timestamp(range_start..range_end)), )?; // ensure market is reported - T::MarketCommons::mutate_market(&market_id, |market| { + zrml_market_commons::Pallet::::mutate_market(&market_id, |market| { market.status = MarketStatus::Reported; Ok(()) })?; diff --git a/zrml/prediction-markets/src/lib.rs b/zrml/prediction-markets/src/lib.rs index 875c59053..9eea7419f 100644 --- a/zrml/prediction-markets/src/lib.rs +++ b/zrml/prediction-markets/src/lib.rs @@ -51,7 +51,7 @@ mod pallet { use orml_traits::{MultiCurrency, NamedMultiReservableCurrency}; use sp_arithmetic::per_things::{Perbill, Percent}; use sp_runtime::{ - traits::{CheckedDiv, Saturating, Zero}, + traits::{AccountIdConversion, CheckedDiv, Saturating, Zero}, DispatchError, DispatchResult, SaturatedConversion, }; use zeitgeist_primitives::{ @@ -67,7 +67,6 @@ mod pallet { use zrml_global_disputes::GlobalDisputesPalletApi; use zrml_liquidity_mining::LiquidityMiningPalletApi; - use zrml_market_commons::MarketCommonsPalletApi; /// The current storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(6); @@ -75,14 +74,13 @@ mod pallet { pub(crate) type BalanceOf = <::AssetManager as MultiCurrency< ::AccountId, >>::Balance; - pub(crate) type CurrencyOf = - <::MarketCommons as MarketCommonsPalletApi>::Currency; + pub(crate) type CurrencyOf = ::Currency; pub(crate) type NegativeImbalanceOf = as Currency<::AccountId>>::NegativeImbalance; pub(crate) type TimeFrame = u64; - pub(crate) type MarketIdOf = - <::MarketCommons as MarketCommonsPalletApi>::MarketId; - pub(crate) type MomentOf = <::MarketCommons as MarketCommonsPalletApi>::Moment; + pub(crate) type MarketIdOf = ::MarketId; + pub(crate) type MomentOf = + <::Timestamp as frame_support::traits::Time>::Moment; pub type MarketOf = Market< ::AccountId, ::BlockNumber, @@ -122,10 +120,10 @@ mod pallet { // TODO(#618): Not implemented for Rikiddo! T::DestroyOrigin::ensure_origin(origin)?; - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; ensure!(market.scoring_rule == ScoringRule::CPMM, Error::::InvalidScoringRule); let market_status = market.status; - let market_account = T::MarketCommons::market_account(market_id); + let market_account = Self::market_account(market_id); // Slash outstanding bonds; see // https://github.com/zeitgeistpm/runtime-audit-1/issues/34#issuecomment-1120187097 for @@ -159,17 +157,17 @@ mod pallet { T::AssetManager::free_balance(Asset::Ztg, &market_account), ); let mut category_count = 0u32; - if let Ok(pool_id) = T::MarketCommons::market_pool(&market_id) { + if let Ok(pool_id) = zrml_market_commons::Pallet::::market_pool(&market_id) { let pool = T::Swaps::pool(pool_id)?; category_count = pool.assets.len().saturated_into(); let _ = T::Swaps::destroy_pool(pool_id)?; - T::MarketCommons::remove_market_pool(&market_id)?; + zrml_market_commons::Pallet::::remove_market_pool(&market_id)?; } let open_ids_len = Self::clear_auto_open(&market_id)?; let close_ids_len = Self::clear_auto_close(&market_id)?; let (ids_len, disputes_len) = Self::clear_auto_resolve(&market_id)?; - T::MarketCommons::remove_market(&market_id)?; + zrml_market_commons::Pallet::::remove_market(&market_id)?; Disputes::::remove(market_id); Self::deposit_event(Event::MarketDestroyed(market_id)); @@ -229,7 +227,7 @@ mod pallet { ) -> DispatchResultWithPostInfo { // TODO(#638): Handle Rikiddo markets! T::CloseOrigin::ensure_origin(origin)?; - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; Self::ensure_market_is_active(&market)?; let open_ids_len = Self::clear_auto_open(&market_id)?; let close_ids_len = Self::clear_auto_close(&market_id)?; @@ -273,13 +271,13 @@ mod pallet { ) -> DispatchResultWithPostInfo { T::ResolveOrigin::ensure_origin(origin)?; - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; ensure!( market.status == MarketStatus::Reported || market.status == MarketStatus::Disputed, Error::::InvalidMarketStatus, ); let (ids_len, disputes_len) = Self::clear_auto_resolve(&market_id)?; - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; let _ = Self::on_resolution(&market_id, &market)?; let weight = match market.market_type { MarketType::Scalar(_) => match market.status { @@ -332,7 +330,7 @@ mod pallet { let mut extra_weight = 0; let mut status = MarketStatus::Active; - T::MarketCommons::mutate_market(&market_id, |m| { + zrml_market_commons::Pallet::::mutate_market(&market_id, |m| { ensure!(m.status == MarketStatus::Proposed, Error::::MarketIsNotProposed); ensure!( !MarketIdsForEdit::::contains_key(market_id), @@ -391,7 +389,7 @@ mod pallet { let edit_reason: EditReason = edit_reason .try_into() .map_err(|_| Error::::EditReasonLengthExceedsMaxEditReasonLen)?; - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; ensure!(market.status == MarketStatus::Proposed, Error::::MarketIsNotProposed); MarketIdsForEdit::::try_mutate(market_id, |reason| { if reason.is_some() { @@ -451,7 +449,7 @@ mod pallet { let who = ensure_signed(origin)?; let disputes = Disputes::::get(market_id); let curr_block_num = >::block_number(); - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; ensure!( matches!(market.status, MarketStatus::Reported | MarketStatus::Disputed), Error::::InvalidMarketStatus @@ -564,7 +562,7 @@ mod pallet { .ok_or(Error::::UnexpectedNoneInPostInfo)?; // Deploy the swap pool and populate it. - let market_id = T::MarketCommons::latest_market_id()?; + let market_id = zrml_market_commons::Pallet::::latest_market_id()?; let deploy_and_populate_weight = Self::deploy_swap_pool_and_additional_liquidity( origin, market_id, @@ -636,8 +634,8 @@ mod pallet { } } - let market_id = T::MarketCommons::push_market(market.clone())?; - let market_account = T::MarketCommons::market_account(market_id); + let market_id = zrml_market_commons::Pallet::::push_market(market.clone())?; + let market_account = Self::market_account(market_id); let mut extra_weight = 0; if market.status == MarketStatus::CollectingSubsidy { @@ -689,7 +687,7 @@ mod pallet { MarketIdsForEdit::::contains_key(market_id), Error::::MarketEditNotRequested ); - let old_market = T::MarketCommons::market(&market_id)?; + let old_market = zrml_market_commons::Pallet::::market(&market_id)?; ensure!(old_market.creator == sender, Error::::EditorNotCreator); ensure!(old_market.status == MarketStatus::Proposed, Error::::InvalidMarketStatus); @@ -708,7 +706,7 @@ mod pallet { old_market.report, old_market.resolved_outcome, )?; - T::MarketCommons::mutate_market(&market_id, |market| { + zrml_market_commons::Pallet::::mutate_market(&market_id, |market| { *market = edited_market.clone(); Ok(()) })?; @@ -812,7 +810,7 @@ mod pallet { ) -> DispatchResultWithPostInfo { let sender = ensure_signed(origin)?; - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; ensure!(market.scoring_rule == ScoringRule::CPMM, Error::::InvalidScoringRule); Self::ensure_market_is_active(&market)?; @@ -860,8 +858,9 @@ mod pallet { } } MarketPeriod::Timestamp(ref range) => { - let current_time_frame = - Self::calculate_time_frame_of_moment(T::MarketCommons::now()); + let current_time_frame = Self::calculate_time_frame_of_moment( + zrml_market_commons::Pallet::::now(), + ); let open_time_frame = Self::calculate_time_frame_of_moment(range.start); if current_time_frame < open_time_frame { let ids_len = MarketIdsPerOpenTimeFrame::::try_mutate( @@ -880,7 +879,7 @@ mod pallet { }; // This errors if a pool already exists! - T::MarketCommons::insert_market_pool(market_id, pool_id)?; + zrml_market_commons::Pallet::::insert_market_pool(market_id, pool_id)?; match ids_len { Some(market_ids_len) => { Ok(Some(T::WeightInfo::deploy_swap_pool_for_market_future_pool( @@ -911,8 +910,8 @@ mod pallet { ) -> DispatchResultWithPostInfo { let sender = ensure_signed(origin)?; - let market = T::MarketCommons::market(&market_id)?; - let market_account = T::MarketCommons::market_account(market_id); + let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market_account = Self::market_account(market_id); ensure!(market.status == MarketStatus::Resolved, Error::::MarketIsNotResolved); @@ -1053,7 +1052,7 @@ mod pallet { reject_reason: Vec, ) -> DispatchResultWithPostInfo { T::RejectOrigin::ensure_origin(origin)?; - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; let open_ids_len = Self::clear_auto_open(&market_id)?; let close_ids_len = Self::clear_auto_close(&market_id)?; let reject_reason: RejectReason = reject_reason @@ -1087,7 +1086,7 @@ mod pallet { let current_block = >::block_number(); let market_report = Report { at: current_block, by: sender.clone(), outcome }; - T::MarketCommons::mutate_market(&market_id, |market| { + zrml_market_commons::Pallet::::mutate_market(&market_id, |market| { ensure!(market.report.is_none(), Error::::MarketAlreadyReported); Self::ensure_market_is_closed(market)?; ensure!( @@ -1118,7 +1117,7 @@ mod pallet { let grace_period_in_ms = grace_period_in_moments.saturating_mul(MILLISECS_PER_BLOCK.into()); let grace_period_end = range.end.saturating_add(grace_period_in_ms); - let now = T::MarketCommons::now(); + let now = zrml_market_commons::Pallet::::now(); ensure!(grace_period_end <= now, Error::::NotAllowedToReportYet); let oracle_duration_in_moments: MomentOf = market.deadlines.oracle_duration.saturated_into::().into(); @@ -1147,7 +1146,7 @@ mod pallet { Ok(()) })?; - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; let block_after_dispute_duration = current_block.saturating_add(market.deadlines.dispute_duration); let ids_len = MarketIdsPerReportBlock::::try_mutate( @@ -1185,11 +1184,11 @@ mod pallet { let sender = ensure_signed(origin)?; ensure!(amount != BalanceOf::::zero(), Error::::ZeroAmount); - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; ensure!(market.scoring_rule == ScoringRule::CPMM, Error::::InvalidScoringRule); Self::ensure_market_is_active(&market)?; - let market_account = T::MarketCommons::market_account(market_id); + let market_account = Self::market_account(market_id); ensure!( T::AssetManager::free_balance(Asset::Ztg, &market_account) >= amount, "Market account does not have sufficient reserves.", @@ -1242,7 +1241,7 @@ mod pallet { #[cfg(feature = "with-global-disputes")] { - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; ensure!(market.status == MarketStatus::Disputed, Error::::InvalidMarketStatus); ensure!( @@ -1306,7 +1305,7 @@ mod pallet { } #[pallet::config] - pub trait Config: frame_system::Config { + pub trait Config: frame_system::Config + zrml_market_commons::Config { /// The base amount of currency that must be bonded for a market approved by the /// advisory committee. #[pallet::constant] @@ -1383,12 +1382,6 @@ mod pallet { MarketId = MarketIdOf, >; - /// Common market parameters - type MarketCommons: MarketCommonsPalletApi< - AccountId = Self::AccountId, - BlockNumber = Self::BlockNumber, - >; - /// The maximum number of categories available for categorical markets. #[pallet::constant] type MaxCategories: Get; @@ -1652,7 +1645,10 @@ mod pallet { let mut total_weight: Weight = 0u64; // TODO(#808): Use weight when Rikiddo is ready - let _ = Self::process_subsidy_collecting_markets(now, T::MarketCommons::now()); + let _ = Self::process_subsidy_collecting_markets( + now, + zrml_market_commons::Pallet::::now(), + ); total_weight = total_weight .saturating_add(T::WeightInfo::process_subsidy_collecting_markets_dummy()); @@ -1669,7 +1665,8 @@ mod pallet { // `on_initialize` is called, so calling `now()` during `on_initialize` gives us // the timestamp of the previous block. let current_time_frame = - Self::calculate_time_frame_of_moment(T::MarketCommons::now()).saturating_add(1); + Self::calculate_time_frame_of_moment(zrml_market_commons::Pallet::::now()) + .saturating_add(1); // On first pass, we use current_time - 1 to ensure that the chain doesn't try to // check all time frames since epoch. @@ -1871,7 +1868,7 @@ mod pallet { } fn insert_auto_close(market_id: &MarketIdOf) -> Result { - let market = T::MarketCommons::market(market_id)?; + let market = zrml_market_commons::Pallet::::market(market_id)?; match market.period { MarketPeriod::Block(range) => MarketIdsPerCloseBlock::::try_mutate( @@ -1893,7 +1890,7 @@ mod pallet { // Manually remove market from cache for auto close. fn clear_auto_close(market_id: &MarketIdOf) -> Result { - let market = T::MarketCommons::market(market_id)?; + let market = zrml_market_commons::Pallet::::market(market_id)?; // No-op if market isn't cached for auto close according to its state. match market.status { @@ -1923,7 +1920,7 @@ mod pallet { // Manually remove market from cache for auto open. fn clear_auto_open(market_id: &MarketIdOf) -> Result { - let market = T::MarketCommons::market(market_id)?; + let market = zrml_market_commons::Pallet::::market(market_id)?; // No-op if market isn't cached for auto open according to its state. match market.status { @@ -1953,7 +1950,7 @@ mod pallet { /// Clears this market from being stored for automatic resolution. fn clear_auto_resolve(market_id: &MarketIdOf) -> Result<(u32, u32), DispatchError> { - let market = T::MarketCommons::market(market_id)?; + let market = zrml_market_commons::Pallet::::market(market_id)?; let (ids_len, disputes_len) = match market.status { MarketStatus::Reported => { let report = market.report.ok_or(Error::::MarketIsNotReported)?; @@ -1999,11 +1996,11 @@ mod pallet { Error::::NotEnoughBalance ); - let market = T::MarketCommons::market(&market_id)?; + let market = zrml_market_commons::Pallet::::market(&market_id)?; ensure!(market.scoring_rule == ScoringRule::CPMM, Error::::InvalidScoringRule); Self::ensure_market_is_active(&market)?; - let market_account = T::MarketCommons::market_account(market_id); + let market_account = Self::market_account(market_id); T::AssetManager::transfer(Asset::Ztg, &who, &market_account, amount)?; let assets = Self::outcome_assets(market_id, &market); @@ -2040,7 +2037,7 @@ mod pallet { creator, T::OracleBond::get().saturating_add(advisory_bond_unreserve_amount), ); - T::MarketCommons::remove_market(market_id)?; + zrml_market_commons::Pallet::::remove_market(market_id)?; MarketIdsForEdit::::remove(market_id); Self::deposit_event(Event::MarketRejected(*market_id, reject_reason)); Self::deposit_event(Event::MarketDestroyed(*market_id)); @@ -2065,7 +2062,7 @@ mod pallet { creator, T::OracleBond::get(), ); - T::MarketCommons::remove_market(market_id)?; + zrml_market_commons::Pallet::::remove_market(market_id)?; MarketIdsForEdit::::remove(market_id); Self::deposit_event(Event::MarketExpired(*market_id)); Ok(T::WeightInfo::handle_expired_advised_market()) @@ -2134,12 +2131,14 @@ mod pallet { } MarketPeriod::Timestamp(ref range) => { // Ensure that the market lasts at least one time frame into the future. - let now_frame = Self::calculate_time_frame_of_moment(T::MarketCommons::now()); + let now_frame = Self::calculate_time_frame_of_moment( + zrml_market_commons::Pallet::::now(), + ); let end_frame = Self::calculate_time_frame_of_moment(range.end); ensure!(now_frame < end_frame, Error::::InvalidMarketPeriod); ensure!(range.start < range.end, Error::::InvalidMarketPeriod); ensure!( - range.end <= T::MaxMarketPeriod::get().saturated_into(), + range.end <= T::MaxMarketPeriod::get().saturated_into::>(), Error::::InvalidMarketPeriod ); } @@ -2209,9 +2208,10 @@ mod pallet { .saturated_into(); interval_blocks.saturating_mul(MILLISECS_PER_BLOCK.into()) } - MarketPeriod::Timestamp(range) => { - range.start.saturating_sub(T::MarketCommons::now()).saturated_into() - } + MarketPeriod::Timestamp(range) => range + .start + .saturating_sub(zrml_market_commons::Pallet::::now()) + .saturated_into(), }; ensure!( @@ -2229,7 +2229,7 @@ mod pallet { // Is no-op if market has no pool. This should never happen, but it's safer to not // error in this case. let mut total_weight = T::DbWeight::get().reads(1); // (For the `market_pool` read) - if let Ok(pool_id) = T::MarketCommons::market_pool(market_id) { + if let Ok(pool_id) = zrml_market_commons::Pallet::::market_pool(market_id) { let open_pool_weight = T::Swaps::open_pool(pool_id)?; total_weight = total_weight.saturating_add(open_pool_weight); } @@ -2237,13 +2237,13 @@ mod pallet { } pub(crate) fn close_market(market_id: &MarketIdOf) -> Result { - T::MarketCommons::mutate_market(market_id, |market| { + zrml_market_commons::Pallet::::mutate_market(market_id, |market| { ensure!(market.status == MarketStatus::Active, Error::::InvalidMarketStatus); market.status = MarketStatus::Closed; Ok(()) })?; let mut total_weight = T::DbWeight::get().reads_writes(1, 1); - if let Ok(pool_id) = T::MarketCommons::market_pool(market_id) { + if let Ok(pool_id) = zrml_market_commons::Pallet::::market_pool(market_id) { let close_pool_weight = T::Swaps::close_pool(pool_id)?; total_weight = total_weight.saturating_add(close_pool_weight); }; @@ -2418,7 +2418,7 @@ mod pallet { // NOTE: Currently we don't clean up outcome assets. // TODO(#792): Remove outcome assets for accounts! Delete "resolved" assets of `orml_tokens` with storage migration. - T::MarketCommons::mutate_market(market_id, |m| { + zrml_market_commons::Pallet::::mutate_market(market_id, |m| { m.status = MarketStatus::Resolved; m.resolved_outcome = Some(resolved_outcome.clone()); Ok(()) @@ -2455,7 +2455,8 @@ mod pallet { }; if market_ready { - let pool_id = T::MarketCommons::market_pool(&subsidy_info.market_id); + let pool_id = + zrml_market_commons::Pallet::::market_pool(&subsidy_info.market_id); total_weight.saturating_add(one_read); if let Ok(pool_id) = pool_id { @@ -2466,11 +2467,13 @@ mod pallet { if result.result { // Sufficient subsidy, activate market. - let mutate_result = - T::MarketCommons::mutate_market(&subsidy_info.market_id, |m| { + let mutate_result = zrml_market_commons::Pallet::::mutate_market( + &subsidy_info.market_id, + |m| { m.status = MarketStatus::Active; Ok(()) - }); + }, + ); total_weight = total_weight.saturating_add(one_read).saturating_add(one_write); @@ -2508,8 +2511,9 @@ mod pallet { total_weight = total_weight.saturating_add(weight); } - let market_result = - T::MarketCommons::mutate_market(&subsidy_info.market_id, |m| { + let market_result = zrml_market_commons::Pallet::::mutate_market( + &subsidy_info.market_id, + |m| { m.status = MarketStatus::InsufficientSubsidy; // Unreserve funds reserved during market creation @@ -2537,7 +2541,8 @@ mod pallet { .saturating_add(dbweight.reads(2)) .saturating_add(dbweight.writes(2)); Ok(()) - }); + }, + ); if let Err(err) = market_result { log::error!( @@ -2552,8 +2557,9 @@ mod pallet { // `remove_market_pool` can only error due to missing pool, but // above we ensured that the pool exists. - let _ = - T::MarketCommons::remove_market_pool(&subsidy_info.market_id); + let _ = zrml_market_commons::Pallet::::remove_market_pool( + &subsidy_info.market_id, + ); total_weight = total_weight.saturating_add(one_read).saturating_add(one_write); Self::deposit_event(Event::MarketInsufficientSubsidy( @@ -2607,7 +2613,7 @@ mod pallet { market_id: &MarketIdOf, ) -> DispatchResult { if let Some(last_dispute) = disputes.last() { - let market = T::MarketCommons::market(market_id)?; + let market = zrml_market_commons::Pallet::::market(market_id)?; let dispute_duration_ends_at_block = last_dispute.at.saturating_add(market.deadlines.dispute_duration); MarketIdsPerDisputeBlock::::mutate(dispute_duration_ends_at_block, |ids| { @@ -2623,6 +2629,10 @@ mod pallet { T::PalletId::get().0 } + fn market_account(market_id: MarketIdOf) -> T::AccountId { + T::PalletId::get().into_sub_account_truncating(market_id.saturated_into::()) + } + pub(crate) fn market_status_manager( block_number: T::BlockNumber, last_time_frame: TimeFrame, @@ -2644,7 +2654,7 @@ mod pallet { { let market_ids_per_block = MarketIdsPerBlock::get(block_number); for market_id in market_ids_per_block.iter() { - let market = T::MarketCommons::market(market_id)?; + let market = zrml_market_commons::Pallet::::market(market_id)?; mutation(market_id, market)?; } MarketIdsPerBlock::remove(block_number); @@ -2655,7 +2665,7 @@ mod pallet { time_frame_ids_len = time_frame_ids_len.saturating_add(market_ids_per_time_frame.len() as u32); for market_id in market_ids_per_time_frame.iter() { - let market = T::MarketCommons::market(market_id)?; + let market = zrml_market_commons::Pallet::::market(market_id)?; mutation(market_id, market)?; } MarketIdsPerTimeFrame::remove(time_frame); @@ -2677,7 +2687,7 @@ mod pallet { // Resolve all regularly reported markets. let market_ids_per_report_block = MarketIdsPerReportBlock::::get(now); for id in market_ids_per_report_block.iter() { - let market = T::MarketCommons::market(id)?; + let market = zrml_market_commons::Pallet::::market(id)?; if let MarketStatus::Reported = market.status { cb(id, &market)?; } @@ -2687,7 +2697,7 @@ mod pallet { // Resolve any disputed markets. let market_ids_per_dispute_block = MarketIdsPerDisputeBlock::::get(now); for id in market_ids_per_dispute_block.iter() { - let market = T::MarketCommons::market(id)?; + let market = zrml_market_commons::Pallet::::market(id)?; cb(id, &market)?; } MarketIdsPerDisputeBlock::::remove(now); @@ -2704,7 +2714,7 @@ mod pallet { market_id: &MarketIdOf, ) -> DispatchResult { if market.status != MarketStatus::Disputed { - T::MarketCommons::mutate_market(market_id, |m| { + zrml_market_commons::Pallet::::mutate_market(market_id, |m| { m.status = MarketStatus::Disputed; Ok(()) })?; @@ -2719,12 +2729,12 @@ mod pallet { market_id: &MarketIdOf, outcome_report: &OutcomeReport, ) -> Result { - let pool_id = if let Ok(el) = T::MarketCommons::market_pool(market_id) { + let pool_id = if let Ok(el) = zrml_market_commons::Pallet::::market_pool(market_id) { el } else { return Ok(T::DbWeight::get().reads(1)); }; - let market_account = T::MarketCommons::market_account(*market_id); + let market_account = Self::market_account(*market_id); let weight = T::Swaps::clean_up_pool( &market.market_type, pool_id, @@ -2762,7 +2772,7 @@ mod pallet { )?; // This errors if a pool already exists! - T::MarketCommons::insert_market_pool(market_id, pool_id)?; + zrml_market_commons::Pallet::::insert_market_pool(market_id, pool_id)?; >::try_mutate(|markets| { markets .try_push(SubsidyUntil { market_id, period: market.period.clone() }) diff --git a/zrml/prediction-markets/src/migrations.rs b/zrml/prediction-markets/src/migrations.rs index f4171a5df..16887b73b 100644 --- a/zrml/prediction-markets/src/migrations.rs +++ b/zrml/prediction-markets/src/migrations.rs @@ -14,465 +14,3 @@ // // You should have received a copy of the GNU General Public License // along with Zeitgeist. If not, see . - -use crate::{Config, Disputes, Pallet}; -use alloc::{vec, vec::Vec}; -use frame_support::{ - dispatch::Weight, - log, - pallet_prelude::PhantomData, - traits::{Get, OnRuntimeUpgrade, StorageVersion}, - BoundedVec, -}; -use parity_scale_codec::EncodeLike; -use zeitgeist_primitives::{ - constants::BASE, - types::{MarketType, OutcomeReport}, -}; -use zrml_authorized::{AuthorizedOutcomeReports, Pallet as AuthorizedPallet}; -use zrml_court::{Pallet as CourtPallet, Votes}; -use zrml_market_commons::{MarketCommonsPalletApi, Pallet as MarketCommonsPallet}; - -const AUTHORIZED_REQUIRED_STORAGE_VERSION: u16 = 1; -const AUTHORIZED_NEXT_STORAGE_VERSION: u16 = 2; -const COURT_REQUIRED_STORAGE_VERSION: u16 = 1; -const COURT_NEXT_STORAGE_VERSION: u16 = 2; -const MARKET_COMMONS_REQUIRED_STORAGE_VERSION: u16 = 3; -const MARKET_COMMONS_NEXT_STORAGE_VERSION: u16 = 4; -const PREDICTION_MARKETS_REQUIRED_STORAGE_VERSION: u16 = 5; -const PREDICTION_MARKETS_NEXT_STORAGE_VERSION: u16 = 6; - -pub struct TransformScalarMarketsToFixedPoint(PhantomData); - -// Transform all scalar intervals by BASE, thereby turning every scalar position into a fixed point -// number with ten digits after the decimal point. This update should only be executed if the -// interpretation of metadata in changed in parallel. If that is the case, market description need -// not be updated. -impl - OnRuntimeUpgrade for TransformScalarMarketsToFixedPoint -where - ::MarketId: EncodeLike< - <::MarketCommons as MarketCommonsPalletApi>::MarketId, - >, - ::MarketId: - EncodeLike<<::MarketCommons as MarketCommonsPalletApi>::MarketId>, - ::MarketId: - EncodeLike<<::MarketCommons as MarketCommonsPalletApi>::MarketId>, -{ - fn on_runtime_upgrade() -> Weight - where - T: Config, - { - let mut total_weight = T::DbWeight::get().reads(4); - let authorized_version = StorageVersion::get::>(); - let court_version = StorageVersion::get::>(); - let market_commons_version = StorageVersion::get::>(); - let prediction_markets_version = StorageVersion::get::>(); - if authorized_version != AUTHORIZED_REQUIRED_STORAGE_VERSION - || court_version != COURT_REQUIRED_STORAGE_VERSION - || market_commons_version != MARKET_COMMONS_REQUIRED_STORAGE_VERSION - || prediction_markets_version != PREDICTION_MARKETS_REQUIRED_STORAGE_VERSION - { - log::info!( - "TransformScalarMarketsToFixedPoint: authorized version is {:?}, require {:?}; \ - court version is {:?}, require {:?}; market-commons version is {:?}, require \ - {:?}; prediction-markets version is {:?}, require {:?}", - authorized_version, - AUTHORIZED_REQUIRED_STORAGE_VERSION, - court_version, - COURT_REQUIRED_STORAGE_VERSION, - market_commons_version, - MARKET_COMMONS_REQUIRED_STORAGE_VERSION, - prediction_markets_version, - PREDICTION_MARKETS_REQUIRED_STORAGE_VERSION, - ); - return total_weight; - } - log::info!("TransformScalarMarketsToFixedPoint: Starting..."); - - let mut new_scalar_markets: Vec<_> = vec![]; - for (market_id, mut market) in MarketCommonsPallet::::market_iter() { - total_weight = total_weight.saturating_add(T::DbWeight::get().reads(1)); - if let MarketType::Scalar(range) = market.market_type { - let new_start = to_fixed_point(*range.start()); - let new_end = to_fixed_point(*range.end()); - market.market_type = MarketType::Scalar(new_start..=new_end); - - if let Some(mut report) = market.report { - if let OutcomeReport::Scalar(value) = report.outcome { - report.outcome = OutcomeReport::Scalar(to_fixed_point(value)); - } - market.report = Some(report); - } - - if let Some(mut resolved_outcome) = market.resolved_outcome { - if let OutcomeReport::Scalar(value) = resolved_outcome { - resolved_outcome = OutcomeReport::Scalar(to_fixed_point(value)); - } - market.resolved_outcome = Some(resolved_outcome); - } - - let old_disputes = Disputes::::get(market_id); - total_weight = total_weight.saturating_add(T::DbWeight::get().reads(1)); - let new_disputes = if old_disputes.is_empty() { - None - } else { - BoundedVec::try_from( - old_disputes - .into_iter() - .map(|mut dispute| { - if let OutcomeReport::Scalar(value) = dispute.outcome { - dispute.outcome = OutcomeReport::Scalar(to_fixed_point(value)); - }; - dispute - }) - .collect::>(), - ) - .ok() - }; - - let authorized_report = match AuthorizedOutcomeReports::::get(market_id) { - Some(mut outcome_report) => { - if let OutcomeReport::Scalar(value) = outcome_report { - outcome_report = OutcomeReport::Scalar(to_fixed_point(value)); - }; - Some(outcome_report) - } - None => None, - }; - total_weight = total_weight.saturating_add(T::DbWeight::get().reads(1)); - - let votes = Votes::::iter_prefix(market_id) - .filter_map(|(juror, (block_number, outcome_report))| { - total_weight = total_weight.saturating_add(T::DbWeight::get().reads(1)); - match outcome_report { - OutcomeReport::Scalar(value) => Some(( - juror, - (block_number, OutcomeReport::Scalar(to_fixed_point(value))), - )), - _ => None, - } - }) - .collect::>(); - - new_scalar_markets.push(( - market_id, - market, - new_disputes, - authorized_report, - votes, - )); - } - } - - for (market_id, market, disputes, authorized_report, votes) in new_scalar_markets { - let _ = MarketCommonsPallet::::mutate_market(&market_id, |old_market| { - *old_market = market; - Ok(()) - }); - total_weight = total_weight.saturating_add(T::DbWeight::get().writes(1)); - - if let Some(disputes_unwrapped) = disputes { - Disputes::::insert(market_id, disputes_unwrapped); - total_weight = total_weight.saturating_add(T::DbWeight::get().writes(1)); - } - - if let Some(outcome_report) = authorized_report { - AuthorizedOutcomeReports::::insert(market_id, outcome_report); - total_weight = total_weight.saturating_add(T::DbWeight::get().writes(1)); - } - - for (juror, vote) in votes { - Votes::::insert(market_id, juror, vote); - total_weight = total_weight.saturating_add(T::DbWeight::get().writes(1)); - } - } - - StorageVersion::new(AUTHORIZED_NEXT_STORAGE_VERSION).put::>(); - StorageVersion::new(COURT_NEXT_STORAGE_VERSION).put::>(); - StorageVersion::new(MARKET_COMMONS_NEXT_STORAGE_VERSION).put::>(); - StorageVersion::new(PREDICTION_MARKETS_NEXT_STORAGE_VERSION).put::>(); - total_weight = total_weight.saturating_add(T::DbWeight::get().writes(4)); - log::info!("TransformScalarMarketsToFixedPoint: Done!"); - total_weight - } - - #[cfg(feature = "try-runtime")] - fn pre_upgrade() -> Result<(), &'static str> { - // Check that no saturation occurs. - for (market_id, market) in MarketCommonsPallet::::market_iter() { - if let MarketType::Scalar(range) = market.market_type { - assert!( - range.end().checked_mul(BASE).is_some(), - "TransformScalarMarketsToFixedPoint: Arithmetic overflow when transforming \ - market {:?}", - market_id, - ); - } - } - Ok(()) - } - - #[cfg(feature = "try-runtime")] - fn post_upgrade() -> Result<(), &'static str> { - for (market_id, market) in MarketCommonsPallet::::market_iter() { - if let MarketType::Scalar(range) = market.market_type { - assert_ne!( - range.start(), - range.end(), - "TransformScalarMarketsToFixedPoint: Scalar range broken after transformation \ - of market {:?}", - market_id, - ); - } - } - Ok(()) - } -} - -fn to_fixed_point(value: u128) -> u128 { - value.saturating_mul(BASE) -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::{ - mock::{ExtBuilder, Runtime}, - Disputes, MomentOf, - }; - use zeitgeist_primitives::types::{ - Deadlines, MarketCreation, MarketDispute, MarketDisputeMechanism, MarketId, MarketPeriod, - MarketStatus, OutcomeReport, Report, ScoringRule, - }; - use zrml_market_commons::Markets; - - type Market = zeitgeist_primitives::types::Market< - ::AccountId, - ::BlockNumber, - MomentOf, - >; - type MarketDisputeOf = MarketDispute< - ::AccountId, - ::BlockNumber, - >; - - #[test] - fn on_runtime_upgrade_increments_the_storage_versions() { - ExtBuilder::default().build().execute_with(|| { - set_up_chain(); - TransformScalarMarketsToFixedPoint::::on_runtime_upgrade(); - let authorized_version = StorageVersion::get::>(); - let court_version = StorageVersion::get::>(); - let market_commons_version = StorageVersion::get::>(); - let prediction_markets_version = StorageVersion::get::>(); - assert_eq!(authorized_version, AUTHORIZED_NEXT_STORAGE_VERSION); - assert_eq!(court_version, COURT_NEXT_STORAGE_VERSION); - assert_eq!(market_commons_version, MARKET_COMMONS_NEXT_STORAGE_VERSION); - assert_eq!(prediction_markets_version, PREDICTION_MARKETS_NEXT_STORAGE_VERSION); - }); - } - - #[test] - fn on_runtime_upgrade_ignores_categorical_markets() { - ExtBuilder::default().build().execute_with(|| { - set_up_chain(); - let market_id: MarketId = 7; - let market = Market { - creator: 1, - creation: MarketCreation::Permissionless, - creator_fee: 2, - oracle: 3, - metadata: vec![4, 5], - market_type: MarketType::Categorical(14), - period: MarketPeriod::Block(6..7), - deadlines: Deadlines { grace_period: 8, oracle_duration: 9, dispute_duration: 10 }, - scoring_rule: ScoringRule::CPMM, - status: MarketStatus::Resolved, - report: Some(Report { at: 11, by: 12, outcome: OutcomeReport::Categorical(13) }), - resolved_outcome: Some(OutcomeReport::Categorical(13)), - dispute_mechanism: MarketDisputeMechanism::Court, - }; - Markets::::insert(market_id, market.clone()); - TransformScalarMarketsToFixedPoint::::on_runtime_upgrade(); - let market_after = Markets::::get(market_id); - assert_eq!(market, market_after.unwrap()); - }); - } - - #[test] - fn on_runtime_transforms_scalar_markets_and_their_disputes() { - ExtBuilder::default().build().execute_with(|| { - set_up_chain(); - - let market_id: MarketId = 7; - let market = Market { - creator: 1, - creation: MarketCreation::Permissionless, - creator_fee: 2, - oracle: 3, - metadata: vec![4, 5], - market_type: MarketType::Scalar(14..=15), - period: MarketPeriod::Block(6..7), - deadlines: Deadlines { grace_period: 8, oracle_duration: 9, dispute_duration: 10 }, - scoring_rule: ScoringRule::CPMM, - status: MarketStatus::Resolved, - report: Some(Report { at: 11, by: 12, outcome: OutcomeReport::Categorical(13) }), - resolved_outcome: Some(OutcomeReport::Categorical(13)), - dispute_mechanism: MarketDisputeMechanism::Court, - }; - Markets::::insert(market_id, market.clone()); - - let dispute = - MarketDisputeOf:: { at: 16, by: 17, outcome: OutcomeReport::Scalar(18) }; - Disputes::::insert( - market_id, - BoundedVec::try_from(vec![dispute.clone()]).unwrap(), - ); - - AuthorizedOutcomeReports::::insert(market_id, OutcomeReport::Scalar(19)); - - let juror = 20; - let block_number = 21; - Votes::::insert(market_id, juror, (block_number, OutcomeReport::Scalar(22))); - - TransformScalarMarketsToFixedPoint::::on_runtime_upgrade(); - - let mut market_expected = market; - market_expected.market_type = MarketType::Scalar(140_000_000_000..=150_000_000_000); - let market_after = Markets::::get(market_id).unwrap(); - assert_eq!(market_after, market_expected); - - let mut dispute_expected = dispute; - dispute_expected.outcome = OutcomeReport::Scalar(180_000_000_000); - let disputes_after = Disputes::::get(market_id); - assert_eq!(disputes_after.len(), 1); - assert_eq!(disputes_after[0], dispute_expected); - - let authorized_report_after = - AuthorizedOutcomeReports::::get(market_id).unwrap(); - assert_eq!(authorized_report_after, OutcomeReport::Scalar(190_000_000_000)); - - let vote_after = Votes::::get(market_id, juror).unwrap(); - assert_eq!(vote_after, (block_number, OutcomeReport::Scalar(220_000_000_000))); - }); - } - - #[test] - fn on_runtime_is_noop_if_versions_are_not_correct() { - ExtBuilder::default().build().execute_with(|| { - // Don't set up chain to signal that storage is already up to date. - - let market_id: MarketId = 7; - let market = Market { - creator: 1, - creation: MarketCreation::Permissionless, - creator_fee: 2, - oracle: 3, - metadata: vec![4, 5], - market_type: MarketType::Scalar(14..=15), - period: MarketPeriod::Block(6..7), - deadlines: Deadlines { grace_period: 8, oracle_duration: 9, dispute_duration: 10 }, - scoring_rule: ScoringRule::CPMM, - status: MarketStatus::Resolved, - report: Some(Report { at: 11, by: 12, outcome: OutcomeReport::Categorical(13) }), - resolved_outcome: Some(OutcomeReport::Categorical(13)), - dispute_mechanism: MarketDisputeMechanism::Court, - }; - Markets::::insert(market_id, market.clone()); - - let dispute = - MarketDisputeOf:: { at: 16, by: 17, outcome: OutcomeReport::Scalar(18) }; - Disputes::::insert( - market_id, - BoundedVec::try_from(vec![dispute.clone()]).unwrap(), - ); - - AuthorizedOutcomeReports::::insert(market_id, OutcomeReport::Scalar(19)); - - let juror = 20; - let vote = (21, OutcomeReport::Scalar(22)); - Votes::::insert(market_id, juror, vote.clone()); - - TransformScalarMarketsToFixedPoint::::on_runtime_upgrade(); - - let market_after = Markets::::get(market_id).unwrap(); - assert_eq!(market_after, market); - - let disputes_after = Disputes::::get(market_id); - assert_eq!(disputes_after.len(), 1); - assert_eq!(disputes_after[0], dispute); - - let authorized_report_after = - AuthorizedOutcomeReports::::get(market_id).unwrap(); - assert_eq!(authorized_report_after, OutcomeReport::Scalar(19)); - - let vote_after = Votes::::get(market_id, juror).unwrap(); - assert_eq!(vote_after, vote); - }); - } - - fn set_up_chain() { - StorageVersion::new(AUTHORIZED_REQUIRED_STORAGE_VERSION).put::>(); - StorageVersion::new(COURT_REQUIRED_STORAGE_VERSION).put::>(); - StorageVersion::new(MARKET_COMMONS_REQUIRED_STORAGE_VERSION) - .put::>(); - StorageVersion::new(PREDICTION_MARKETS_REQUIRED_STORAGE_VERSION).put::>(); - } -} - -// We use these utilities to prevent having to make the swaps pallet a dependency of -// prediciton-markets. The calls are based on the implementation of `StorageVersion`, found here: -// https://github.com/paritytech/substrate/blob/bc7a1e6c19aec92bfa247d8ca68ec63e07061032/frame/support/src/traits/metadata.rs#L168-L230 -// and previous migrations. -mod utility { - use crate::{BalanceOf, Config, MarketIdOf}; - use alloc::vec::Vec; - use frame_support::{ - migration::{get_storage_value, put_storage_value}, - storage::{storage_prefix, unhashed}, - traits::StorageVersion, - Blake2_128Concat, StorageHasher, - }; - use parity_scale_codec::Encode; - use zeitgeist_primitives::types::{Pool, PoolId}; - - #[allow(unused)] - const SWAPS: &[u8] = b"Swaps"; - #[allow(unused)] - const POOLS: &[u8] = b"Pools"; - #[allow(unused)] - fn storage_prefix_of_swaps_pallet() -> [u8; 32] { - storage_prefix(b"Swaps", b":__STORAGE_VERSION__:") - } - #[allow(unused)] - pub fn key_to_hash(key: K) -> Vec - where - H: StorageHasher, - K: Encode, - { - key.using_encoded(H::hash).as_ref().to_vec() - } - #[allow(unused)] - pub fn get_on_chain_storage_version_of_swaps_pallet() -> StorageVersion { - let key = storage_prefix_of_swaps_pallet(); - unhashed::get_or_default(&key) - } - #[allow(unused)] - pub fn put_storage_version_of_swaps_pallet(value: u16) { - let key = storage_prefix_of_swaps_pallet(); - unhashed::put(&key, &StorageVersion::new(value)); - } - #[allow(unused)] - pub fn get_pool(pool_id: PoolId) -> Option, MarketIdOf>> { - let hash = key_to_hash::(pool_id); - let pool_maybe = - get_storage_value::, MarketIdOf>>>(SWAPS, POOLS, &hash); - pool_maybe.unwrap_or(None) - } - #[allow(unused)] - pub fn set_pool(pool_id: PoolId, pool: Pool, MarketIdOf>) { - let hash = key_to_hash::(pool_id); - put_storage_value(SWAPS, POOLS, &hash, Some(pool)); - } -} diff --git a/zrml/prediction-markets/src/mock.rs b/zrml/prediction-markets/src/mock.rs index f5873ffe1..366a683dd 100644 --- a/zrml/prediction-markets/src/mock.rs +++ b/zrml/prediction-markets/src/mock.rs @@ -153,7 +153,6 @@ impl crate::Config for Runtime { #[cfg(feature = "with-global-disputes")] type GlobalDisputePeriod = GlobalDisputePeriod; type LiquidityMining = LiquidityMining; - type MarketCommons = MarketCommons; type MaxCategories = MaxCategories; type MaxDisputes = MaxDisputes; type MinDisputeDuration = MinDisputeDuration; From bfcbf4391906f941655da738ee0febe2bb9846b4 Mon Sep 17 00:00:00 2001 From: Vivek Pandya Date: Wed, 7 Dec 2022 20:41:50 +0530 Subject: [PATCH 2/6] Fix build --- runtime/common/src/lib.rs | 1 - zrml/market-commons/src/lib.rs | 15 ++++++++------- zrml/market-commons/src/tests.rs | 1 - zrml/prediction-markets/src/benchmarks.rs | 1 - 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/runtime/common/src/lib.rs b/runtime/common/src/lib.rs index 79cddb1e3..6614c6128 100644 --- a/runtime/common/src/lib.rs +++ b/runtime/common/src/lib.rs @@ -988,7 +988,6 @@ macro_rules! impl_config_traits { // NoopLiquidityMining will be applied only to mainnet once runtimes are separated. type LiquidityMining = NoopLiquidityMining; // type LiquidityMining = LiquidityMining; - type MarketCommons = MarketCommons; type MaxCategories = MaxCategories; type MaxDisputes = MaxDisputes; type MinDisputeDuration = MinDisputeDuration; diff --git a/zrml/market-commons/src/lib.rs b/zrml/market-commons/src/lib.rs index 160cccc04..77f113c08 100644 --- a/zrml/market-commons/src/lib.rs +++ b/zrml/market-commons/src/lib.rs @@ -55,6 +55,12 @@ mod pallet { pub type MomentOf = <::Timestamp as frame_support::traits::Time>::Moment; + type MarketOf = Market< + ::AccountId, + ::BlockNumber, + MomentOf, + >; + #[pallet::call] impl Pallet {} @@ -179,9 +185,7 @@ mod pallet { Ok(()) } - pub fn market( - market_id: &T::MarketId, - ) -> Result>, DispatchError> { + pub fn market(market_id: &T::MarketId) -> Result, DispatchError> { >::try_get(market_id).map_err(|_err| Error::::MarketDoesNotExist.into()) } @@ -215,10 +219,7 @@ mod pallet { >::iter() } - fn market( - market_id: &Self::MarketId, - ) -> Result, DispatchError> - { + fn market(market_id: &Self::MarketId) -> Result, DispatchError> { Self::market(market_id) } diff --git a/zrml/market-commons/src/tests.rs b/zrml/market-commons/src/tests.rs index e087c07b1..4e156ad45 100644 --- a/zrml/market-commons/src/tests.rs +++ b/zrml/market-commons/src/tests.rs @@ -18,7 +18,6 @@ #![cfg(test)] use crate::{ - market_commons_pallet_api::MarketCommonsPalletApi, mock::{ExtBuilder, MarketCommons, Runtime}, MarketCounter, Markets, }; diff --git a/zrml/prediction-markets/src/benchmarks.rs b/zrml/prediction-markets/src/benchmarks.rs index fc6aef7a3..d5b22a4a7 100644 --- a/zrml/prediction-markets/src/benchmarks.rs +++ b/zrml/prediction-markets/src/benchmarks.rs @@ -43,7 +43,6 @@ use zeitgeist_primitives::{ SubsidyUntil, }, }; -use zrml_market_commons::MarketCommonsPalletApi; use frame_support::{traits::Hooks, BoundedVec}; From d6a3b8a5e1d056127c51f00f2f02be3409ebe742 Mon Sep 17 00:00:00 2001 From: Vivek Pandya Date: Thu, 8 Dec 2022 15:50:27 +0530 Subject: [PATCH 3/6] Changes as per review comments --- zrml/market-commons/src/lib.rs | 109 +++---- zrml/market-commons/src/tests.rs | 1 + zrml/prediction-markets/src/benchmarks.rs | 81 ++--- zrml/prediction-markets/src/lib.rs | 346 +++++++++++++--------- 4 files changed, 283 insertions(+), 254 deletions(-) diff --git a/zrml/market-commons/src/lib.rs b/zrml/market-commons/src/lib.rs index 77f113c08..cb4b0371f 100644 --- a/zrml/market-commons/src/lib.rs +++ b/zrml/market-commons/src/lib.rs @@ -127,72 +127,6 @@ mod pallet { >::put(new_counter); Ok(id) } - - pub fn mutate_market(market_id: &T::MarketId, cb: F) -> DispatchResult - where - F: FnOnce(&mut Market>) -> DispatchResult, - { - >::try_mutate(market_id, |opt| { - if let Some(market) = opt { - cb(market)?; - return Ok(()); - } - Err(Error::::MarketDoesNotExist.into()) - }) - } - - pub fn insert_market_pool(market_id: T::MarketId, pool_id: PoolId) -> DispatchResult { - ensure!(!>::contains_key(market_id), Error::::PoolAlreadyExists); - ensure!(>::contains_key(market_id), Error::::MarketDoesNotExist); - >::insert(market_id, pool_id); - Ok(()) - } - - pub fn remove_market_pool(market_id: &T::MarketId) -> DispatchResult { - if !>::contains_key(market_id) { - return Err(Error::::MarketPoolDoesNotExist.into()); - } - >::remove(market_id); - Ok(()) - } - - pub fn now() -> MomentOf { - T::Timestamp::now() - } - - pub fn latest_market_id() -> Result { - match >::try_get() { - Ok(market_id) => { - Ok(market_id.saturating_sub(1u8.into())) // Note: market_id > 0! - } - _ => Err(Error::::NoMarketHasBeenCreated.into()), - } - } - - pub fn push_market( - market: Market>, - ) -> Result { - let market_id = Self::next_market_id()?; - >::insert(market_id, market); - Ok(market_id) - } - - pub fn remove_market(market_id: &T::MarketId) -> DispatchResult { - if !>::contains_key(market_id) { - return Err(Error::::MarketDoesNotExist.into()); - } - >::remove(market_id); - Ok(()) - } - - pub fn market(market_id: &T::MarketId) -> Result, DispatchError> { - >::try_get(market_id).map_err(|_err| Error::::MarketDoesNotExist.into()) - } - - pub fn market_pool(market_id: &T::MarketId) -> Result { - >::try_get(market_id) - .map_err(|_err| Error::::MarketPoolDoesNotExist.into()) - } } impl MarketCommonsPalletApi for Pallet @@ -209,7 +143,12 @@ mod pallet { // Market fn latest_market_id() -> Result { - Self::latest_market_id() + match >::try_get() { + Ok(market_id) => { + Ok(market_id.saturating_sub(1u8.into())) // Note: market_id > 0! + } + _ => Err(Error::::NoMarketHasBeenCreated.into()), + } } fn market_iter() -> PrefixIterator<( @@ -220,7 +159,7 @@ mod pallet { } fn market(market_id: &Self::MarketId) -> Result, DispatchError> { - Self::market(market_id) + >::try_get(market_id).map_err(|_err| Error::::MarketDoesNotExist.into()) } fn mutate_market(market_id: &Self::MarketId, cb: F) -> DispatchResult @@ -229,17 +168,29 @@ mod pallet { &mut Market, ) -> DispatchResult, { - Self::mutate_market(market_id, cb) + >::try_mutate(market_id, |opt| { + if let Some(market) = opt { + cb(market)?; + return Ok(()); + } + Err(Error::::MarketDoesNotExist.into()) + }) } fn push_market( market: Market, ) -> Result { - Self::push_market(market) + let market_id = Self::next_market_id()?; + >::insert(market_id, market); + Ok(market_id) } fn remove_market(market_id: &Self::MarketId) -> DispatchResult { - Self::remove_market(market_id) + if !>::contains_key(market_id) { + return Err(Error::::MarketDoesNotExist.into()); + } + >::remove(market_id); + Ok(()) } // TODO(#837): Remove when on-chain arbitrage is removed! @@ -252,21 +203,29 @@ mod pallet { // MarketPool fn insert_market_pool(market_id: Self::MarketId, pool_id: PoolId) -> DispatchResult { - Self::insert_market_pool(market_id, pool_id) + ensure!(!>::contains_key(market_id), Error::::PoolAlreadyExists); + ensure!(>::contains_key(market_id), Error::::MarketDoesNotExist); + >::insert(market_id, pool_id); + Ok(()) } fn remove_market_pool(market_id: &Self::MarketId) -> DispatchResult { - Self::remove_market_pool(market_id) + if !>::contains_key(market_id) { + return Err(Error::::MarketPoolDoesNotExist.into()); + } + >::remove(market_id); + Ok(()) } fn market_pool(market_id: &Self::MarketId) -> Result { - Self::market_pool(market_id) + >::try_get(market_id) + .map_err(|_err| Error::::MarketPoolDoesNotExist.into()) } // Etc fn now() -> Self::Moment { - Self::now() + T::Timestamp::now() } } diff --git a/zrml/market-commons/src/tests.rs b/zrml/market-commons/src/tests.rs index 4e156ad45..e087c07b1 100644 --- a/zrml/market-commons/src/tests.rs +++ b/zrml/market-commons/src/tests.rs @@ -18,6 +18,7 @@ #![cfg(test)] use crate::{ + market_commons_pallet_api::MarketCommonsPalletApi, mock::{ExtBuilder, MarketCommons, Runtime}, MarketCounter, Markets, }; diff --git a/zrml/prediction-markets/src/benchmarks.rs b/zrml/prediction-markets/src/benchmarks.rs index d5b22a4a7..775f7bbdd 100644 --- a/zrml/prediction-markets/src/benchmarks.rs +++ b/zrml/prediction-markets/src/benchmarks.rs @@ -43,6 +43,7 @@ use zeitgeist_primitives::{ SubsidyUntil, }, }; +use zrml_market_commons::MarketCommonsPalletApi; use frame_support::{traits::Hooks, BoundedVec}; @@ -97,7 +98,7 @@ fn create_market_common( scoring_rule, } .dispatch_bypass_filter(RawOrigin::Signed(caller.clone()).into())?; - let market_id = zrml_market_commons::Pallet::::latest_market_id()?; + let market_id = as MarketCommonsPalletApi>::latest_market_id()?; Ok((caller, market_id)) } @@ -113,7 +114,7 @@ fn create_close_and_report_market( create_market_common::(permission, options, ScoringRule::CPMM, Some(period))?; Call::::admin_move_market_to_closed { market_id } .dispatch_bypass_filter(T::CloseOrigin::successful_origin())?; - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = as MarketCommonsPalletApi>::market(&market_id)?; let end: u32 = match market.period { MarketPeriod::Timestamp(range) => range.end.saturated_into::(), _ => { @@ -156,7 +157,7 @@ fn setup_redeem_shares_common( let close_origin = T::CloseOrigin::successful_origin(); let resolve_origin = T::ResolveOrigin::successful_origin(); Call::::admin_move_market_to_closed { market_id }.dispatch_bypass_filter(close_origin)?; - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = as MarketCommonsPalletApi>::market(&market_id)?; let end: u32 = match market.period { MarketPeriod::Timestamp(range) => range.end.saturated_into::(), _ => { @@ -200,7 +201,7 @@ fn setup_reported_categorical_market_with_pool::admin_move_market_to_closed { market_id } .dispatch_bypass_filter(T::CloseOrigin::successful_origin())?; - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = as MarketCommonsPalletApi>::market(&market_id)?; let end: u32 = match market.period { MarketPeriod::Timestamp(range) => range.end.saturated_into::(), _ => { @@ -238,7 +239,7 @@ benchmarks! { OutcomeReport::Categorical(0u16), )?; - let pool_id = zrml_market_commons::Pallet::::market_pool(&market_id)?; + let pool_id = as MarketCommonsPalletApi>::market_pool(&market_id)?; for i in 1..=d { let outcome = OutcomeReport::Categorical((i % a).saturated_into()); @@ -248,7 +249,7 @@ benchmarks! { let _ = Pallet::::dispute(RawOrigin::Signed(disputor).into(), market_id, outcome)?; } - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = as MarketCommonsPalletApi>::market(&market_id)?; let (range_start, range_end) = match market.period { MarketPeriod::Timestamp(range) => (range.start, range.end), @@ -302,9 +303,9 @@ benchmarks! { OutcomeReport::Categorical(0u16), )?; - let pool_id = zrml_market_commons::Pallet::::market_pool(&market_id)?; + let pool_id = as MarketCommonsPalletApi>::market_pool(&market_id)?; - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = as MarketCommonsPalletApi>::market(&market_id)?; let (range_start, range_end) = match market.period { MarketPeriod::Timestamp(range) => (range.start, range.end), @@ -384,7 +385,7 @@ benchmarks! { OutcomeReport::Scalar(u128::MAX), )?; - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = as MarketCommonsPalletApi>::market(&market_id)?; let report_at = market.report.unwrap().at; let resolves_at = report_at.saturating_add(market.deadlines.dispute_duration); @@ -415,12 +416,12 @@ benchmarks! { categories.into(), OutcomeReport::Categorical(0u16), )?; - zrml_market_commons::Pallet::::mutate_market(&market_id, |market| { + as MarketCommonsPalletApi>::mutate_market(&market_id, |market| { market.dispute_mechanism = MarketDisputeMechanism::Authorized; Ok(()) })?; - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = as MarketCommonsPalletApi>::market(&market_id)?; let report_at = market.report.unwrap().at; let resolves_at = report_at.saturating_add(market.deadlines.dispute_duration); @@ -453,12 +454,12 @@ benchmarks! { OutcomeReport::Scalar(u128::MAX), )?; - zrml_market_commons::Pallet::::mutate_market(&market_id, |market| { + as MarketCommonsPalletApi>::mutate_market(&market_id, |market| { market.dispute_mechanism = MarketDisputeMechanism::Authorized; Ok(()) })?; - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = as MarketCommonsPalletApi>::market(&market_id)?; if let MarketType::Scalar(range) = market.market_type { assert!((d as u128) < *range.end()); } else { @@ -510,7 +511,7 @@ benchmarks! { OutcomeReport::Categorical(0u16) )?; - zrml_market_commons::Pallet::::mutate_market(&market_id, |market| { + as MarketCommonsPalletApi>::mutate_market(&market_id, |market| { market.dispute_mechanism = MarketDisputeMechanism::Authorized; Ok(()) })?; @@ -528,7 +529,7 @@ benchmarks! { } let disputes = Disputes::::get(market_id); let last_dispute = disputes.last().unwrap(); - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = as MarketCommonsPalletApi>::market(&market_id)?; let resolves_at = last_dispute.at.saturating_add(market.deadlines.dispute_duration); for i in 0..r { MarketIdsPerDisputeBlock::::try_mutate( @@ -637,7 +638,7 @@ benchmarks! { scoring_rule, } .dispatch_bypass_filter(RawOrigin::Signed(caller.clone()).into())?; - let market_id = zrml_market_commons::Pallet::::latest_market_id()?; + let market_id = as MarketCommonsPalletApi>::latest_market_id()?; let approve_origin = T::ApproveOrigin::successful_origin(); let edit_reason = vec![0_u8; 1024]; @@ -681,7 +682,7 @@ benchmarks! { )?; assert!( - Pallet::::calculate_time_frame_of_moment(zrml_market_commons::Pallet::::now()) + Pallet::::calculate_time_frame_of_moment( as MarketCommonsPalletApi>::now()) < Pallet::::calculate_time_frame_of_moment(range_start) ); @@ -727,7 +728,7 @@ benchmarks! { // We need to ensure, that period range start is now, // because we would like to open the pool now - let range_start: MomentOf = zrml_market_commons::Pallet::::now(); + let range_start: MomentOf = as MarketCommonsPalletApi>::now(); let range_end: MomentOf = 1_000_000u64.saturated_into(); let (caller, market_id) = create_market_common::( MarketCreation::Permissionless, @@ -736,7 +737,7 @@ benchmarks! { Some(MarketPeriod::Timestamp(range_start..range_end)), )?; - let market = zrml_market_commons::Pallet::::market(&market_id.saturated_into())?; + let market = as MarketCommonsPalletApi>::market(&market_id.saturated_into())?; let max_swap_fee: BalanceOf:: = MaxSwapFee::get().saturated_into(); let min_liquidity: BalanceOf:: = MinLiquidity::get().saturated_into(); @@ -758,7 +759,7 @@ benchmarks! { }: { call.dispatch_bypass_filter(RawOrigin::Signed(caller).into())?; } verify { - let market_pool_id = zrml_market_commons::Pallet::::market_pool(&market_id.saturated_into())?; + let market_pool_id = as MarketCommonsPalletApi>::market_pool(&market_id.saturated_into())?; let pool = T::Swaps::pool(market_pool_id)?; assert_eq!(pool.pool_status, PoolStatus::Active); } @@ -820,12 +821,12 @@ benchmarks! { report_outcome, )?; - zrml_market_commons::Pallet::::mutate_market(&market_id, |market| { + as MarketCommonsPalletApi>::mutate_market(&market_id, |market| { market.dispute_mechanism = MarketDisputeMechanism::Authorized; Ok(()) })?; - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = as MarketCommonsPalletApi>::market(&market_id)?; if let MarketType::Scalar(range) = market.market_type { assert!((d as u128) < *range.end()); } else { @@ -860,7 +861,7 @@ benchmarks! { ScoringRule::CPMM, Some(MarketPeriod::Timestamp(T::MinSubsidyPeriod::get()..T::MaxSubsidyPeriod::get())), )?; - let market = zrml_market_commons::Pallet::::market(&market_id.saturated_into())?; + let market = as MarketCommonsPalletApi>::market(&market_id.saturated_into())?; }: { Pallet::::handle_expired_advised_market(&market_id, market)? } internal_resolve_categorical_reported { @@ -869,15 +870,15 @@ benchmarks! { categories.into(), OutcomeReport::Categorical(1u16), )?; - zrml_market_commons::Pallet::::mutate_market(&market_id, |market| { + as MarketCommonsPalletApi>::mutate_market(&market_id, |market| { market.dispute_mechanism = MarketDisputeMechanism::Authorized; Ok(()) })?; - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = as MarketCommonsPalletApi>::market(&market_id)?; }: { Pallet::::on_resolution(&market_id, &market)?; } verify { - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = as MarketCommonsPalletApi>::market(&market_id)?; assert_eq!(market.status, MarketStatus::Resolved); } @@ -891,7 +892,7 @@ benchmarks! { categories.into(), OutcomeReport::Categorical(1u16) )?; - zrml_market_commons::Pallet::::mutate_market(&market_id, |market| { + as MarketCommonsPalletApi>::mutate_market(&market_id, |market| { market.dispute_mechanism = MarketDisputeMechanism::Authorized; Ok(()) })?; @@ -904,11 +905,11 @@ benchmarks! { OutcomeReport::Categorical((i % 2).saturated_into::()), )?; } - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = as MarketCommonsPalletApi>::market(&market_id)?; }: { Pallet::::on_resolution(&market_id, &market)?; } verify { - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = as MarketCommonsPalletApi>::market(&market_id)?; assert_eq!(market.status, MarketStatus::Resolved); } @@ -918,11 +919,11 @@ benchmarks! { MarketType::Scalar(0u128..=u128::MAX), OutcomeReport::Scalar(u128::MAX), )?; - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = as MarketCommonsPalletApi>::market(&market_id)?; }: { Pallet::::on_resolution(&market_id, &market)?; } verify { - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = as MarketCommonsPalletApi>::market(&market_id)?; assert_eq!(market.status, MarketStatus::Resolved); } @@ -934,11 +935,11 @@ benchmarks! { MarketType::Scalar(0u128..=u128::MAX), OutcomeReport::Scalar(u128::MAX), )?; - zrml_market_commons::Pallet::::mutate_market(&market_id, |market| { + as MarketCommonsPalletApi>::mutate_market(&market_id, |market| { market.dispute_mechanism = MarketDisputeMechanism::Authorized; Ok(()) })?; - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = as MarketCommonsPalletApi>::market(&market_id)?; if let MarketType::Scalar(range) = market.market_type { assert!((d as u128) < *range.end()); } else { @@ -952,11 +953,11 @@ benchmarks! { OutcomeReport::Scalar(i.into()) )?; } - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = as MarketCommonsPalletApi>::market(&market_id)?; }: { Pallet::::on_resolution(&market_id, &market)?; } verify { - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = as MarketCommonsPalletApi>::market(&market_id)?; assert_eq!(market.status, MarketStatus::Resolved); } @@ -1033,7 +1034,7 @@ benchmarks! { let m in 0..63; // ensure range.start is now to get the heaviest path - let range_start: MomentOf = zrml_market_commons::Pallet::::now(); + let range_start: MomentOf = as MarketCommonsPalletApi>::now(); let range_end: MomentOf = 1_000_000u64.saturated_into(); let (caller, market_id) = create_market_common::( MarketCreation::Permissionless, @@ -1042,7 +1043,7 @@ benchmarks! { Some(MarketPeriod::Timestamp(range_start..range_end)), )?; - zrml_market_commons::Pallet::::mutate_market(&market_id, |market| { + as MarketCommonsPalletApi>::mutate_market(&market_id, |market| { // ensure sender is oracle to succeed extrinsic call market.oracle = caller.clone(); Ok(()) @@ -1051,7 +1052,7 @@ benchmarks! { let outcome = OutcomeReport::Categorical(0); let close_origin = T::CloseOrigin::successful_origin(); Pallet::::admin_move_market_to_closed(close_origin, market_id)?; - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = as MarketCommonsPalletApi>::market(&market_id)?; let end : u32 = match market.period { MarketPeriod::Timestamp(range) => { range.end.saturated_into::() @@ -1102,7 +1103,7 @@ benchmarks! { Some(MarketPeriod::Timestamp(T::MinSubsidyPeriod::get()..T::MaxSubsidyPeriod::get())), )?; let mut market_clone = None; - zrml_market_commons::Pallet::::mutate_market(&market_id, |market| { + as MarketCommonsPalletApi>::mutate_market(&market_id, |market| { market.status = MarketStatus::CollectingSubsidy; market_clone = Some(market.clone()); Ok(()) @@ -1187,7 +1188,7 @@ benchmarks! { Some(MarketPeriod::Timestamp(range_start..range_end)), )?; // ensure market is reported - zrml_market_commons::Pallet::::mutate_market(&market_id, |market| { + as MarketCommonsPalletApi>::mutate_market(&market_id, |market| { market.status = MarketStatus::Reported; Ok(()) })?; diff --git a/zrml/prediction-markets/src/lib.rs b/zrml/prediction-markets/src/lib.rs index 114b105b6..1252515e4 100644 --- a/zrml/prediction-markets/src/lib.rs +++ b/zrml/prediction-markets/src/lib.rs @@ -67,6 +67,7 @@ mod pallet { use zrml_global_disputes::GlobalDisputesPalletApi; use zrml_liquidity_mining::LiquidityMiningPalletApi; + use zrml_market_commons::MarketCommonsPalletApi; /// The current storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(6); @@ -120,7 +121,8 @@ mod pallet { // TODO(#618): Not implemented for Rikiddo! T::DestroyOrigin::ensure_origin(origin)?; - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = + as MarketCommonsPalletApi>::market(&market_id)?; ensure!(market.scoring_rule == ScoringRule::CPMM, Error::::InvalidScoringRule); let market_status = market.status; let market_account = Self::market_account(market_id); @@ -157,17 +159,21 @@ mod pallet { T::AssetManager::free_balance(Asset::Ztg, &market_account), ); let mut category_count = 0u32; - if let Ok(pool_id) = zrml_market_commons::Pallet::::market_pool(&market_id) { + if let Ok(pool_id) = + as MarketCommonsPalletApi>::market_pool(&market_id) + { let pool = T::Swaps::pool(pool_id)?; category_count = pool.assets.len().saturated_into(); let _ = T::Swaps::destroy_pool(pool_id)?; - zrml_market_commons::Pallet::::remove_market_pool(&market_id)?; + as MarketCommonsPalletApi>::remove_market_pool( + &market_id, + )?; } let open_ids_len = Self::clear_auto_open(&market_id)?; let close_ids_len = Self::clear_auto_close(&market_id)?; let (ids_len, disputes_len) = Self::clear_auto_resolve(&market_id)?; - zrml_market_commons::Pallet::::remove_market(&market_id)?; + as MarketCommonsPalletApi>::remove_market(&market_id)?; Disputes::::remove(market_id); Self::deposit_event(Event::MarketDestroyed(market_id)); @@ -227,7 +233,8 @@ mod pallet { ) -> DispatchResultWithPostInfo { // TODO(#638): Handle Rikiddo markets! T::CloseOrigin::ensure_origin(origin)?; - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = + as MarketCommonsPalletApi>::market(&market_id)?; Self::ensure_market_is_active(&market)?; let open_ids_len = Self::clear_auto_open(&market_id)?; let close_ids_len = Self::clear_auto_close(&market_id)?; @@ -271,13 +278,15 @@ mod pallet { ) -> DispatchResultWithPostInfo { T::ResolveOrigin::ensure_origin(origin)?; - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = + as MarketCommonsPalletApi>::market(&market_id)?; ensure!( market.status == MarketStatus::Reported || market.status == MarketStatus::Disputed, Error::::InvalidMarketStatus, ); let (ids_len, disputes_len) = Self::clear_auto_resolve(&market_id)?; - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = + as MarketCommonsPalletApi>::market(&market_id)?; let _ = Self::on_resolution(&market_id, &market)?; let weight = match market.market_type { MarketType::Scalar(_) => match market.status { @@ -330,32 +339,35 @@ mod pallet { let mut extra_weight = 0; let mut status = MarketStatus::Active; - zrml_market_commons::Pallet::::mutate_market(&market_id, |m| { - ensure!(m.status == MarketStatus::Proposed, Error::::MarketIsNotProposed); - ensure!( - !MarketIdsForEdit::::contains_key(market_id), - Error::::MarketEditRequestAlreadyInProgress - ); + as MarketCommonsPalletApi>::mutate_market( + &market_id, + |m| { + ensure!(m.status == MarketStatus::Proposed, Error::::MarketIsNotProposed); + ensure!( + !MarketIdsForEdit::::contains_key(market_id), + Error::::MarketEditRequestAlreadyInProgress + ); - match m.scoring_rule { - ScoringRule::CPMM => { - m.status = MarketStatus::Active; - } - ScoringRule::RikiddoSigmoidFeeMarketEma => { - m.status = MarketStatus::CollectingSubsidy; - status = MarketStatus::CollectingSubsidy; - extra_weight = Self::start_subsidy(m, market_id)?; + match m.scoring_rule { + ScoringRule::CPMM => { + m.status = MarketStatus::Active; + } + ScoringRule::RikiddoSigmoidFeeMarketEma => { + m.status = MarketStatus::CollectingSubsidy; + status = MarketStatus::CollectingSubsidy; + extra_weight = Self::start_subsidy(m, market_id)?; + } } - } - T::AssetManager::unreserve_named( - &Self::reserve_id(), - Asset::Ztg, - &m.creator, - T::AdvisoryBond::get(), - ); - Ok(()) - })?; + T::AssetManager::unreserve_named( + &Self::reserve_id(), + Asset::Ztg, + &m.creator, + T::AdvisoryBond::get(), + ); + Ok(()) + }, + )?; Self::deposit_event(Event::MarketApproved(market_id, status)); // The ApproveOrigin should not pay fees for providing this service @@ -389,7 +401,8 @@ mod pallet { let edit_reason: EditReason = edit_reason .try_into() .map_err(|_| Error::::EditReasonLengthExceedsMaxEditReasonLen)?; - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = + as MarketCommonsPalletApi>::market(&market_id)?; ensure!(market.status == MarketStatus::Proposed, Error::::MarketIsNotProposed); MarketIdsForEdit::::try_mutate(market_id, |reason| { if reason.is_some() { @@ -449,7 +462,8 @@ mod pallet { let who = ensure_signed(origin)?; let disputes = Disputes::::get(market_id); let curr_block_num = >::block_number(); - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = + as MarketCommonsPalletApi>::market(&market_id)?; ensure!( matches!(market.status, MarketStatus::Reported | MarketStatus::Disputed), Error::::InvalidMarketStatus @@ -562,7 +576,8 @@ mod pallet { .ok_or(Error::::UnexpectedNoneInPostInfo)?; // Deploy the swap pool and populate it. - let market_id = zrml_market_commons::Pallet::::latest_market_id()?; + let market_id = + as MarketCommonsPalletApi>::latest_market_id()?; let deploy_and_populate_weight = Self::deploy_swap_pool_and_additional_liquidity( origin, market_id, @@ -634,7 +649,10 @@ mod pallet { } } - let market_id = zrml_market_commons::Pallet::::push_market(market.clone())?; + let market_id = + as MarketCommonsPalletApi>::push_market( + market.clone(), + )?; let market_account = Self::market_account(market_id); let mut extra_weight = 0; @@ -687,7 +705,8 @@ mod pallet { MarketIdsForEdit::::contains_key(market_id), Error::::MarketEditNotRequested ); - let old_market = zrml_market_commons::Pallet::::market(&market_id)?; + let old_market = + as MarketCommonsPalletApi>::market(&market_id)?; ensure!(old_market.creator == sender, Error::::EditorNotCreator); ensure!(old_market.status == MarketStatus::Proposed, Error::::InvalidMarketStatus); @@ -706,10 +725,13 @@ mod pallet { old_market.report, old_market.resolved_outcome, )?; - zrml_market_commons::Pallet::::mutate_market(&market_id, |market| { - *market = edited_market.clone(); - Ok(()) - })?; + as MarketCommonsPalletApi>::mutate_market( + &market_id, + |market| { + *market = edited_market.clone(); + Ok(()) + }, + )?; let ids_amount: u32 = Self::insert_auto_close(&market_id)?; @@ -810,7 +832,8 @@ mod pallet { ) -> DispatchResultWithPostInfo { let sender = ensure_signed(origin)?; - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = + as MarketCommonsPalletApi>::market(&market_id)?; ensure!(market.scoring_rule == ScoringRule::CPMM, Error::::InvalidScoringRule); Self::ensure_market_is_active(&market)?; @@ -859,7 +882,7 @@ mod pallet { } MarketPeriod::Timestamp(ref range) => { let current_time_frame = Self::calculate_time_frame_of_moment( - zrml_market_commons::Pallet::::now(), + as MarketCommonsPalletApi>::now(), ); let open_time_frame = Self::calculate_time_frame_of_moment(range.start); if current_time_frame < open_time_frame { @@ -879,7 +902,9 @@ mod pallet { }; // This errors if a pool already exists! - zrml_market_commons::Pallet::::insert_market_pool(market_id, pool_id)?; + as MarketCommonsPalletApi>::insert_market_pool( + market_id, pool_id, + )?; match ids_len { Some(market_ids_len) => { Ok(Some(T::WeightInfo::deploy_swap_pool_for_market_future_pool( @@ -910,7 +935,8 @@ mod pallet { ) -> DispatchResultWithPostInfo { let sender = ensure_signed(origin)?; - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = + as MarketCommonsPalletApi>::market(&market_id)?; let market_account = Self::market_account(market_id); ensure!(market.status == MarketStatus::Resolved, Error::::MarketIsNotResolved); @@ -1052,7 +1078,8 @@ mod pallet { reject_reason: Vec, ) -> DispatchResultWithPostInfo { T::RejectOrigin::ensure_origin(origin)?; - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = + as MarketCommonsPalletApi>::market(&market_id)?; let open_ids_len = Self::clear_auto_open(&market_id)?; let close_ids_len = Self::clear_auto_close(&market_id)?; let reject_reason: RejectReason = reject_reason @@ -1086,67 +1113,72 @@ mod pallet { let current_block = >::block_number(); let market_report = Report { at: current_block, by: sender.clone(), outcome }; - zrml_market_commons::Pallet::::mutate_market(&market_id, |market| { - ensure!(market.report.is_none(), Error::::MarketAlreadyReported); - Self::ensure_market_is_closed(market)?; - ensure!( - market.matches_outcome_report(&market_report.outcome), - Error::::OutcomeMismatch - ); + as MarketCommonsPalletApi>::mutate_market( + &market_id, + |market| { + ensure!(market.report.is_none(), Error::::MarketAlreadyReported); + Self::ensure_market_is_closed(market)?; + ensure!( + market.matches_outcome_report(&market_report.outcome), + Error::::OutcomeMismatch + ); - let mut should_check_origin = false; - //NOTE: Saturating operation in following block may saturate to u32::MAX value - // but that will be the case after thousands of years time. So it is fine. - match market.period { - MarketPeriod::Block(ref range) => { - let grace_period_end = - range.end.saturating_add(market.deadlines.grace_period); - ensure!( - grace_period_end <= current_block, - Error::::NotAllowedToReportYet - ); - let oracle_duration_end = - grace_period_end.saturating_add(market.deadlines.oracle_duration); - if current_block <= oracle_duration_end { - should_check_origin = true; + let mut should_check_origin = false; + //NOTE: Saturating operation in following block may saturate to u32::MAX value + // but that will be the case after thousands of years time. So it is fine. + match market.period { + MarketPeriod::Block(ref range) => { + let grace_period_end = + range.end.saturating_add(market.deadlines.grace_period); + ensure!( + grace_period_end <= current_block, + Error::::NotAllowedToReportYet + ); + let oracle_duration_end = + grace_period_end.saturating_add(market.deadlines.oracle_duration); + if current_block <= oracle_duration_end { + should_check_origin = true; + } } - } - MarketPeriod::Timestamp(ref range) => { - let grace_period_in_moments: MomentOf = - market.deadlines.grace_period.saturated_into::().into(); - let grace_period_in_ms = - grace_period_in_moments.saturating_mul(MILLISECS_PER_BLOCK.into()); - let grace_period_end = range.end.saturating_add(grace_period_in_ms); - let now = zrml_market_commons::Pallet::::now(); - ensure!(grace_period_end <= now, Error::::NotAllowedToReportYet); - let oracle_duration_in_moments: MomentOf = - market.deadlines.oracle_duration.saturated_into::().into(); - let oracle_duration_in_ms = - oracle_duration_in_moments.saturating_mul(MILLISECS_PER_BLOCK.into()); - let oracle_duration_end = - grace_period_end.saturating_add(oracle_duration_in_ms); - if now <= oracle_duration_end { - should_check_origin = true; + MarketPeriod::Timestamp(ref range) => { + let grace_period_in_moments: MomentOf = + market.deadlines.grace_period.saturated_into::().into(); + let grace_period_in_ms = + grace_period_in_moments.saturating_mul(MILLISECS_PER_BLOCK.into()); + let grace_period_end = range.end.saturating_add(grace_period_in_ms); + let now = + as MarketCommonsPalletApi>::now(); + ensure!(grace_period_end <= now, Error::::NotAllowedToReportYet); + let oracle_duration_in_moments: MomentOf = + market.deadlines.oracle_duration.saturated_into::().into(); + let oracle_duration_in_ms = oracle_duration_in_moments + .saturating_mul(MILLISECS_PER_BLOCK.into()); + let oracle_duration_end = + grace_period_end.saturating_add(oracle_duration_in_ms); + if now <= oracle_duration_end { + should_check_origin = true; + } } } - } - if should_check_origin { - let sender_is_oracle = sender == market.oracle; - let origin_has_permission = T::ResolveOrigin::ensure_origin(origin).is_ok(); - ensure!( - sender_is_oracle || origin_has_permission, - Error::::ReporterNotOracle - ); - } + if should_check_origin { + let sender_is_oracle = sender == market.oracle; + let origin_has_permission = T::ResolveOrigin::ensure_origin(origin).is_ok(); + ensure!( + sender_is_oracle || origin_has_permission, + Error::::ReporterNotOracle + ); + } - market.report = Some(market_report.clone()); - market.status = MarketStatus::Reported; + market.report = Some(market_report.clone()); + market.status = MarketStatus::Reported; - Ok(()) - })?; + Ok(()) + }, + )?; - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = + as MarketCommonsPalletApi>::market(&market_id)?; let block_after_dispute_duration = current_block.saturating_add(market.deadlines.dispute_duration); let ids_len = MarketIdsPerReportBlock::::try_mutate( @@ -1184,7 +1216,8 @@ mod pallet { let sender = ensure_signed(origin)?; ensure!(amount != BalanceOf::::zero(), Error::::ZeroAmount); - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = + as MarketCommonsPalletApi>::market(&market_id)?; ensure!(market.scoring_rule == ScoringRule::CPMM, Error::::InvalidScoringRule); Self::ensure_market_is_active(&market)?; @@ -1241,7 +1274,8 @@ mod pallet { #[cfg(feature = "with-global-disputes")] { - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = + as MarketCommonsPalletApi>::market(&market_id)?; ensure!(market.status == MarketStatus::Disputed, Error::::InvalidMarketStatus); ensure!( @@ -1637,7 +1671,7 @@ mod pallet { // TODO(#808): Use weight when Rikiddo is ready let _ = Self::process_subsidy_collecting_markets( now, - zrml_market_commons::Pallet::::now(), + as MarketCommonsPalletApi>::now(), ); total_weight = total_weight .saturating_add(T::WeightInfo::process_subsidy_collecting_markets_dummy()); @@ -1654,9 +1688,10 @@ mod pallet { // We add one to the count, because `pallet-timestamp` sets the timestamp _after_ // `on_initialize` is called, so calling `now()` during `on_initialize` gives us // the timestamp of the previous block. - let current_time_frame = - Self::calculate_time_frame_of_moment(zrml_market_commons::Pallet::::now()) - .saturating_add(1); + let current_time_frame = Self::calculate_time_frame_of_moment( + as MarketCommonsPalletApi>::now(), + ) + .saturating_add(1); // On first pass, we use current_time - 1 to ensure that the chain doesn't try to // check all time frames since epoch. @@ -1858,7 +1893,8 @@ mod pallet { } fn insert_auto_close(market_id: &MarketIdOf) -> Result { - let market = zrml_market_commons::Pallet::::market(market_id)?; + let market = + as MarketCommonsPalletApi>::market(market_id)?; match market.period { MarketPeriod::Block(range) => MarketIdsPerCloseBlock::::try_mutate( @@ -1880,7 +1916,8 @@ mod pallet { // Manually remove market from cache for auto close. fn clear_auto_close(market_id: &MarketIdOf) -> Result { - let market = zrml_market_commons::Pallet::::market(market_id)?; + let market = + as MarketCommonsPalletApi>::market(market_id)?; // No-op if market isn't cached for auto close according to its state. match market.status { @@ -1910,7 +1947,8 @@ mod pallet { // Manually remove market from cache for auto open. fn clear_auto_open(market_id: &MarketIdOf) -> Result { - let market = zrml_market_commons::Pallet::::market(market_id)?; + let market = + as MarketCommonsPalletApi>::market(market_id)?; // No-op if market isn't cached for auto open according to its state. match market.status { @@ -1940,7 +1978,8 @@ mod pallet { /// Clears this market from being stored for automatic resolution. fn clear_auto_resolve(market_id: &MarketIdOf) -> Result<(u32, u32), DispatchError> { - let market = zrml_market_commons::Pallet::::market(market_id)?; + let market = + as MarketCommonsPalletApi>::market(market_id)?; let (ids_len, disputes_len) = match market.status { MarketStatus::Reported => { let report = market.report.ok_or(Error::::MarketIsNotReported)?; @@ -1986,7 +2025,8 @@ mod pallet { Error::::NotEnoughBalance ); - let market = zrml_market_commons::Pallet::::market(&market_id)?; + let market = + as MarketCommonsPalletApi>::market(&market_id)?; ensure!(market.scoring_rule == ScoringRule::CPMM, Error::::InvalidScoringRule); Self::ensure_market_is_active(&market)?; @@ -2027,7 +2067,7 @@ mod pallet { creator, T::OracleBond::get().saturating_add(advisory_bond_unreserve_amount), ); - zrml_market_commons::Pallet::::remove_market(market_id)?; + as MarketCommonsPalletApi>::remove_market(market_id)?; MarketIdsForEdit::::remove(market_id); Self::deposit_event(Event::MarketRejected(*market_id, reject_reason)); Self::deposit_event(Event::MarketDestroyed(*market_id)); @@ -2052,7 +2092,7 @@ mod pallet { creator, T::OracleBond::get(), ); - zrml_market_commons::Pallet::::remove_market(market_id)?; + as MarketCommonsPalletApi>::remove_market(market_id)?; MarketIdsForEdit::::remove(market_id); Self::deposit_event(Event::MarketExpired(*market_id)); Ok(T::WeightInfo::handle_expired_advised_market()) @@ -2122,7 +2162,7 @@ mod pallet { MarketPeriod::Timestamp(ref range) => { // Ensure that the market lasts at least one time frame into the future. let now_frame = Self::calculate_time_frame_of_moment( - zrml_market_commons::Pallet::::now(), + as MarketCommonsPalletApi>::now(), ); let end_frame = Self::calculate_time_frame_of_moment(range.end); ensure!(now_frame < end_frame, Error::::InvalidMarketPeriod); @@ -2200,7 +2240,9 @@ mod pallet { } MarketPeriod::Timestamp(range) => range .start - .saturating_sub(zrml_market_commons::Pallet::::now()) + .saturating_sub( + as MarketCommonsPalletApi>::now(), + ) .saturated_into(), }; @@ -2219,7 +2261,9 @@ mod pallet { // Is no-op if market has no pool. This should never happen, but it's safer to not // error in this case. let mut total_weight = T::DbWeight::get().reads(1); // (For the `market_pool` read) - if let Ok(pool_id) = zrml_market_commons::Pallet::::market_pool(market_id) { + if let Ok(pool_id) = + as MarketCommonsPalletApi>::market_pool(market_id) + { let open_pool_weight = T::Swaps::open_pool(pool_id)?; total_weight = total_weight.saturating_add(open_pool_weight); } @@ -2227,13 +2271,18 @@ mod pallet { } pub(crate) fn close_market(market_id: &MarketIdOf) -> Result { - zrml_market_commons::Pallet::::mutate_market(market_id, |market| { - ensure!(market.status == MarketStatus::Active, Error::::InvalidMarketStatus); - market.status = MarketStatus::Closed; - Ok(()) - })?; + as MarketCommonsPalletApi>::mutate_market( + market_id, + |market| { + ensure!(market.status == MarketStatus::Active, Error::::InvalidMarketStatus); + market.status = MarketStatus::Closed; + Ok(()) + }, + )?; let mut total_weight = T::DbWeight::get().reads_writes(1, 1); - if let Ok(pool_id) = zrml_market_commons::Pallet::::market_pool(market_id) { + if let Ok(pool_id) = + as MarketCommonsPalletApi>::market_pool(market_id) + { let close_pool_weight = T::Swaps::close_pool(pool_id)?; total_weight = total_weight.saturating_add(close_pool_weight); }; @@ -2408,11 +2457,14 @@ mod pallet { // NOTE: Currently we don't clean up outcome assets. // TODO(#792): Remove outcome assets for accounts! Delete "resolved" assets of `orml_tokens` with storage migration. - zrml_market_commons::Pallet::::mutate_market(market_id, |m| { - m.status = MarketStatus::Resolved; - m.resolved_outcome = Some(resolved_outcome.clone()); - Ok(()) - })?; + as MarketCommonsPalletApi>::mutate_market( + market_id, + |m| { + m.status = MarketStatus::Resolved; + m.resolved_outcome = Some(resolved_outcome.clone()); + Ok(()) + }, + )?; Disputes::::remove(market_id); Self::deposit_event(Event::MarketResolved( *market_id, @@ -2446,7 +2498,9 @@ mod pallet { if market_ready { let pool_id = - zrml_market_commons::Pallet::::market_pool(&subsidy_info.market_id); + as MarketCommonsPalletApi>::market_pool( + &subsidy_info.market_id, + ); total_weight.saturating_add(one_read); if let Ok(pool_id) = pool_id { @@ -2457,7 +2511,7 @@ mod pallet { if result.result { // Sufficient subsidy, activate market. - let mutate_result = zrml_market_commons::Pallet::::mutate_market( + let mutate_result = as MarketCommonsPalletApi>::mutate_market( &subsidy_info.market_id, |m| { m.status = MarketStatus::Active; @@ -2501,7 +2555,7 @@ mod pallet { total_weight = total_weight.saturating_add(weight); } - let market_result = zrml_market_commons::Pallet::::mutate_market( + let market_result = as MarketCommonsPalletApi>::mutate_market( &subsidy_info.market_id, |m| { m.status = MarketStatus::InsufficientSubsidy; @@ -2547,7 +2601,7 @@ mod pallet { // `remove_market_pool` can only error due to missing pool, but // above we ensured that the pool exists. - let _ = zrml_market_commons::Pallet::::remove_market_pool( + let _ = as MarketCommonsPalletApi>::remove_market_pool( &subsidy_info.market_id, ); total_weight = @@ -2603,7 +2657,8 @@ mod pallet { market_id: &MarketIdOf, ) -> DispatchResult { if let Some(last_dispute) = disputes.last() { - let market = zrml_market_commons::Pallet::::market(market_id)?; + let market = + as MarketCommonsPalletApi>::market(market_id)?; let dispute_duration_ends_at_block = last_dispute.at.saturating_add(market.deadlines.dispute_duration); MarketIdsPerDisputeBlock::::mutate(dispute_duration_ends_at_block, |ids| { @@ -2644,7 +2699,8 @@ mod pallet { { let market_ids_per_block = MarketIdsPerBlock::get(block_number); for market_id in market_ids_per_block.iter() { - let market = zrml_market_commons::Pallet::::market(market_id)?; + let market = + as MarketCommonsPalletApi>::market(market_id)?; mutation(market_id, market)?; } MarketIdsPerBlock::remove(block_number); @@ -2655,7 +2711,10 @@ mod pallet { time_frame_ids_len = time_frame_ids_len.saturating_add(market_ids_per_time_frame.len() as u32); for market_id in market_ids_per_time_frame.iter() { - let market = zrml_market_commons::Pallet::::market(market_id)?; + let market = + as MarketCommonsPalletApi>::market( + market_id, + )?; mutation(market_id, market)?; } MarketIdsPerTimeFrame::remove(time_frame); @@ -2677,7 +2736,8 @@ mod pallet { // Resolve all regularly reported markets. let market_ids_per_report_block = MarketIdsPerReportBlock::::get(now); for id in market_ids_per_report_block.iter() { - let market = zrml_market_commons::Pallet::::market(id)?; + let market = + as MarketCommonsPalletApi>::market(id)?; if let MarketStatus::Reported = market.status { cb(id, &market)?; } @@ -2687,7 +2747,8 @@ mod pallet { // Resolve any disputed markets. let market_ids_per_dispute_block = MarketIdsPerDisputeBlock::::get(now); for id in market_ids_per_dispute_block.iter() { - let market = zrml_market_commons::Pallet::::market(id)?; + let market = + as MarketCommonsPalletApi>::market(id)?; cb(id, &market)?; } MarketIdsPerDisputeBlock::::remove(now); @@ -2704,10 +2765,13 @@ mod pallet { market_id: &MarketIdOf, ) -> DispatchResult { if market.status != MarketStatus::Disputed { - zrml_market_commons::Pallet::::mutate_market(market_id, |m| { - m.status = MarketStatus::Disputed; - Ok(()) - })?; + as MarketCommonsPalletApi>::mutate_market( + market_id, + |m| { + m.status = MarketStatus::Disputed; + Ok(()) + }, + )?; } Ok(()) } @@ -2719,7 +2783,9 @@ mod pallet { market_id: &MarketIdOf, outcome_report: &OutcomeReport, ) -> Result { - let pool_id = if let Ok(el) = zrml_market_commons::Pallet::::market_pool(market_id) { + let pool_id = if let Ok(el) = + as MarketCommonsPalletApi>::market_pool(market_id) + { el } else { return Ok(T::DbWeight::get().reads(1)); @@ -2762,7 +2828,9 @@ mod pallet { )?; // This errors if a pool already exists! - zrml_market_commons::Pallet::::insert_market_pool(market_id, pool_id)?; + as MarketCommonsPalletApi>::insert_market_pool( + market_id, pool_id, + )?; >::try_mutate(|markets| { markets .try_push(SubsidyUntil { market_id, period: market.period.clone() }) From 45d9b7c5704514bc50e15dfcd20471e3c4bd56d0 Mon Sep 17 00:00:00 2001 From: Vivek Pandya Date: Mon, 12 Dec 2022 17:25:10 +0530 Subject: [PATCH 4/6] Move MarketCommonsPalletApi trait to primitives and fixes as per review comment. --- primitives/src/traits.rs | 2 + .../src/traits}/market_commons_pallet_api.rs | 2 +- zrml/market-commons/src/lib.rs | 23 +- zrml/market-commons/src/tests.rs | 10 +- zrml/prediction-markets/src/lib.rs | 345 +++++++----------- 5 files changed, 153 insertions(+), 229 deletions(-) rename {zrml/market-commons/src => primitives/src/traits}/market_commons_pallet_api.rs (98%) diff --git a/primitives/src/traits.rs b/primitives/src/traits.rs index 966592ff0..ee21643ac 100644 --- a/primitives/src/traits.rs +++ b/primitives/src/traits.rs @@ -16,11 +16,13 @@ // along with Zeitgeist. If not, see . mod dispute_api; +mod market_commons_pallet_api; mod market_id; mod swaps; mod zeitgeist_multi_reservable_currency; pub use dispute_api::DisputeApi; +pub use market_commons_pallet_api::MarketCommonsPalletApi; pub use market_id::MarketId; pub use swaps::Swaps; pub use zeitgeist_multi_reservable_currency::ZeitgeistAssetManager; diff --git a/zrml/market-commons/src/market_commons_pallet_api.rs b/primitives/src/traits/market_commons_pallet_api.rs similarity index 98% rename from zrml/market-commons/src/market_commons_pallet_api.rs rename to primitives/src/traits/market_commons_pallet_api.rs index 877f47866..246cb3a17 100644 --- a/zrml/market-commons/src/market_commons_pallet_api.rs +++ b/primitives/src/traits/market_commons_pallet_api.rs @@ -16,6 +16,7 @@ // along with Zeitgeist. If not, see . #![allow(clippy::type_complexity)] +use crate::types::{Market, PoolId}; use frame_support::{ dispatch::{DispatchError, DispatchResult}, pallet_prelude::{MaybeSerializeDeserialize, Member}, @@ -25,7 +26,6 @@ use frame_support::{ }; use parity_scale_codec::MaxEncodedLen; use sp_runtime::traits::AtLeast32Bit; -use zeitgeist_primitives::types::{Market, PoolId}; /// Simple disputes - Pallet Api pub trait MarketCommonsPalletApi { diff --git a/zrml/market-commons/src/lib.rs b/zrml/market-commons/src/lib.rs index cb4b0371f..84dca395d 100644 --- a/zrml/market-commons/src/lib.rs +++ b/zrml/market-commons/src/lib.rs @@ -20,13 +20,12 @@ extern crate alloc; -mod market_commons_pallet_api; pub mod migrations; mod mock; mod tests; -pub use market_commons_pallet_api::MarketCommonsPalletApi; pub use pallet::*; +pub use zeitgeist_primitives::traits::MarketCommonsPalletApi; #[frame_support::pallet] mod pallet { @@ -151,10 +150,7 @@ mod pallet { } } - fn market_iter() -> PrefixIterator<( - Self::MarketId, - Market, - )> { + fn market_iter() -> PrefixIterator<(Self::MarketId, MarketOf)> { >::iter() } @@ -164,9 +160,7 @@ mod pallet { fn mutate_market(market_id: &Self::MarketId, cb: F) -> DispatchResult where - F: FnOnce( - &mut Market, - ) -> DispatchResult, + F: FnOnce(&mut MarketOf) -> DispatchResult, { >::try_mutate(market_id, |opt| { if let Some(market) = opt { @@ -177,9 +171,7 @@ mod pallet { }) } - fn push_market( - market: Market, - ) -> Result { + fn push_market(market: MarketOf) -> Result { let market_id = Self::next_market_id()?; >::insert(market_id, market); Ok(market_id) @@ -231,12 +223,7 @@ mod pallet { /// Holds all markets #[pallet::storage] - pub type Markets = StorageMap< - _, - Blake2_128Concat, - T::MarketId, - Market>, - >; + pub type Markets = StorageMap<_, Blake2_128Concat, T::MarketId, MarketOf>; /// The number of markets that have been created (including removed markets) and the next /// identifier for a created market. diff --git a/zrml/market-commons/src/tests.rs b/zrml/market-commons/src/tests.rs index e087c07b1..71ed973c9 100644 --- a/zrml/market-commons/src/tests.rs +++ b/zrml/market-commons/src/tests.rs @@ -18,15 +18,17 @@ #![cfg(test)] use crate::{ - market_commons_pallet_api::MarketCommonsPalletApi, mock::{ExtBuilder, MarketCommons, Runtime}, MarketCounter, Markets, }; use frame_support::{assert_err, assert_noop, assert_ok}; use sp_runtime::DispatchError; -use zeitgeist_primitives::types::{ - AccountIdTest, BlockNumber, Deadlines, Market, MarketCreation, MarketDisputeMechanism, - MarketPeriod, MarketStatus, MarketType, Moment, ScoringRule, +use zeitgeist_primitives::{ + traits::MarketCommonsPalletApi, + types::{ + AccountIdTest, BlockNumber, Deadlines, Market, MarketCreation, MarketDisputeMechanism, + MarketPeriod, MarketStatus, MarketType, Moment, ScoringRule, + }, }; const MARKET_DUMMY: Market = Market { diff --git a/zrml/prediction-markets/src/lib.rs b/zrml/prediction-markets/src/lib.rs index 1252515e4..1cc96eee4 100644 --- a/zrml/prediction-markets/src/lib.rs +++ b/zrml/prediction-markets/src/lib.rs @@ -121,8 +121,7 @@ mod pallet { // TODO(#618): Not implemented for Rikiddo! T::DestroyOrigin::ensure_origin(origin)?; - let market = - as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; ensure!(market.scoring_rule == ScoringRule::CPMM, Error::::InvalidScoringRule); let market_status = market.status; let market_account = Self::market_account(market_id); @@ -159,21 +158,17 @@ mod pallet { T::AssetManager::free_balance(Asset::Ztg, &market_account), ); let mut category_count = 0u32; - if let Ok(pool_id) = - as MarketCommonsPalletApi>::market_pool(&market_id) - { + if let Ok(pool_id) = >::market_pool(&market_id) { let pool = T::Swaps::pool(pool_id)?; category_count = pool.assets.len().saturated_into(); let _ = T::Swaps::destroy_pool(pool_id)?; - as MarketCommonsPalletApi>::remove_market_pool( - &market_id, - )?; + >::remove_market_pool(&market_id)?; } let open_ids_len = Self::clear_auto_open(&market_id)?; let close_ids_len = Self::clear_auto_close(&market_id)?; let (ids_len, disputes_len) = Self::clear_auto_resolve(&market_id)?; - as MarketCommonsPalletApi>::remove_market(&market_id)?; + >::remove_market(&market_id)?; Disputes::::remove(market_id); Self::deposit_event(Event::MarketDestroyed(market_id)); @@ -233,8 +228,7 @@ mod pallet { ) -> DispatchResultWithPostInfo { // TODO(#638): Handle Rikiddo markets! T::CloseOrigin::ensure_origin(origin)?; - let market = - as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; Self::ensure_market_is_active(&market)?; let open_ids_len = Self::clear_auto_open(&market_id)?; let close_ids_len = Self::clear_auto_close(&market_id)?; @@ -278,15 +272,13 @@ mod pallet { ) -> DispatchResultWithPostInfo { T::ResolveOrigin::ensure_origin(origin)?; - let market = - as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; ensure!( market.status == MarketStatus::Reported || market.status == MarketStatus::Disputed, Error::::InvalidMarketStatus, ); let (ids_len, disputes_len) = Self::clear_auto_resolve(&market_id)?; - let market = - as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; let _ = Self::on_resolution(&market_id, &market)?; let weight = match market.market_type { MarketType::Scalar(_) => match market.status { @@ -339,35 +331,32 @@ mod pallet { let mut extra_weight = 0; let mut status = MarketStatus::Active; - as MarketCommonsPalletApi>::mutate_market( - &market_id, - |m| { - ensure!(m.status == MarketStatus::Proposed, Error::::MarketIsNotProposed); - ensure!( - !MarketIdsForEdit::::contains_key(market_id), - Error::::MarketEditRequestAlreadyInProgress - ); + >::mutate_market(&market_id, |m| { + ensure!(m.status == MarketStatus::Proposed, Error::::MarketIsNotProposed); + ensure!( + !MarketIdsForEdit::::contains_key(market_id), + Error::::MarketEditRequestAlreadyInProgress + ); - match m.scoring_rule { - ScoringRule::CPMM => { - m.status = MarketStatus::Active; - } - ScoringRule::RikiddoSigmoidFeeMarketEma => { - m.status = MarketStatus::CollectingSubsidy; - status = MarketStatus::CollectingSubsidy; - extra_weight = Self::start_subsidy(m, market_id)?; - } + match m.scoring_rule { + ScoringRule::CPMM => { + m.status = MarketStatus::Active; + } + ScoringRule::RikiddoSigmoidFeeMarketEma => { + m.status = MarketStatus::CollectingSubsidy; + status = MarketStatus::CollectingSubsidy; + extra_weight = Self::start_subsidy(m, market_id)?; } + } - T::AssetManager::unreserve_named( - &Self::reserve_id(), - Asset::Ztg, - &m.creator, - T::AdvisoryBond::get(), - ); - Ok(()) - }, - )?; + T::AssetManager::unreserve_named( + &Self::reserve_id(), + Asset::Ztg, + &m.creator, + T::AdvisoryBond::get(), + ); + Ok(()) + })?; Self::deposit_event(Event::MarketApproved(market_id, status)); // The ApproveOrigin should not pay fees for providing this service @@ -401,8 +390,7 @@ mod pallet { let edit_reason: EditReason = edit_reason .try_into() .map_err(|_| Error::::EditReasonLengthExceedsMaxEditReasonLen)?; - let market = - as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; ensure!(market.status == MarketStatus::Proposed, Error::::MarketIsNotProposed); MarketIdsForEdit::::try_mutate(market_id, |reason| { if reason.is_some() { @@ -462,8 +450,7 @@ mod pallet { let who = ensure_signed(origin)?; let disputes = Disputes::::get(market_id); let curr_block_num = >::block_number(); - let market = - as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; ensure!( matches!(market.status, MarketStatus::Reported | MarketStatus::Disputed), Error::::InvalidMarketStatus @@ -576,8 +563,7 @@ mod pallet { .ok_or(Error::::UnexpectedNoneInPostInfo)?; // Deploy the swap pool and populate it. - let market_id = - as MarketCommonsPalletApi>::latest_market_id()?; + let market_id = >::latest_market_id()?; let deploy_and_populate_weight = Self::deploy_swap_pool_and_additional_liquidity( origin, market_id, @@ -649,10 +635,7 @@ mod pallet { } } - let market_id = - as MarketCommonsPalletApi>::push_market( - market.clone(), - )?; + let market_id = >::push_market(market.clone())?; let market_account = Self::market_account(market_id); let mut extra_weight = 0; @@ -705,8 +688,7 @@ mod pallet { MarketIdsForEdit::::contains_key(market_id), Error::::MarketEditNotRequested ); - let old_market = - as MarketCommonsPalletApi>::market(&market_id)?; + let old_market = >::market(&market_id)?; ensure!(old_market.creator == sender, Error::::EditorNotCreator); ensure!(old_market.status == MarketStatus::Proposed, Error::::InvalidMarketStatus); @@ -725,13 +707,10 @@ mod pallet { old_market.report, old_market.resolved_outcome, )?; - as MarketCommonsPalletApi>::mutate_market( - &market_id, - |market| { - *market = edited_market.clone(); - Ok(()) - }, - )?; + >::mutate_market(&market_id, |market| { + *market = edited_market.clone(); + Ok(()) + })?; let ids_amount: u32 = Self::insert_auto_close(&market_id)?; @@ -832,8 +811,7 @@ mod pallet { ) -> DispatchResultWithPostInfo { let sender = ensure_signed(origin)?; - let market = - as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; ensure!(market.scoring_rule == ScoringRule::CPMM, Error::::InvalidScoringRule); Self::ensure_market_is_active(&market)?; @@ -882,7 +860,7 @@ mod pallet { } MarketPeriod::Timestamp(ref range) => { let current_time_frame = Self::calculate_time_frame_of_moment( - as MarketCommonsPalletApi>::now(), + >::now(), ); let open_time_frame = Self::calculate_time_frame_of_moment(range.start); if current_time_frame < open_time_frame { @@ -902,9 +880,7 @@ mod pallet { }; // This errors if a pool already exists! - as MarketCommonsPalletApi>::insert_market_pool( - market_id, pool_id, - )?; + >::insert_market_pool(market_id, pool_id)?; match ids_len { Some(market_ids_len) => { Ok(Some(T::WeightInfo::deploy_swap_pool_for_market_future_pool( @@ -935,8 +911,7 @@ mod pallet { ) -> DispatchResultWithPostInfo { let sender = ensure_signed(origin)?; - let market = - as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; let market_account = Self::market_account(market_id); ensure!(market.status == MarketStatus::Resolved, Error::::MarketIsNotResolved); @@ -1078,8 +1053,7 @@ mod pallet { reject_reason: Vec, ) -> DispatchResultWithPostInfo { T::RejectOrigin::ensure_origin(origin)?; - let market = - as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; let open_ids_len = Self::clear_auto_open(&market_id)?; let close_ids_len = Self::clear_auto_close(&market_id)?; let reject_reason: RejectReason = reject_reason @@ -1113,72 +1087,67 @@ mod pallet { let current_block = >::block_number(); let market_report = Report { at: current_block, by: sender.clone(), outcome }; - as MarketCommonsPalletApi>::mutate_market( - &market_id, - |market| { - ensure!(market.report.is_none(), Error::::MarketAlreadyReported); - Self::ensure_market_is_closed(market)?; - ensure!( - market.matches_outcome_report(&market_report.outcome), - Error::::OutcomeMismatch - ); + >::mutate_market(&market_id, |market| { + ensure!(market.report.is_none(), Error::::MarketAlreadyReported); + Self::ensure_market_is_closed(market)?; + ensure!( + market.matches_outcome_report(&market_report.outcome), + Error::::OutcomeMismatch + ); - let mut should_check_origin = false; - //NOTE: Saturating operation in following block may saturate to u32::MAX value - // but that will be the case after thousands of years time. So it is fine. - match market.period { - MarketPeriod::Block(ref range) => { - let grace_period_end = - range.end.saturating_add(market.deadlines.grace_period); - ensure!( - grace_period_end <= current_block, - Error::::NotAllowedToReportYet - ); - let oracle_duration_end = - grace_period_end.saturating_add(market.deadlines.oracle_duration); - if current_block <= oracle_duration_end { - should_check_origin = true; - } + let mut should_check_origin = false; + //NOTE: Saturating operation in following block may saturate to u32::MAX value + // but that will be the case after thousands of years time. So it is fine. + match market.period { + MarketPeriod::Block(ref range) => { + let grace_period_end = + range.end.saturating_add(market.deadlines.grace_period); + ensure!( + grace_period_end <= current_block, + Error::::NotAllowedToReportYet + ); + let oracle_duration_end = + grace_period_end.saturating_add(market.deadlines.oracle_duration); + if current_block <= oracle_duration_end { + should_check_origin = true; } - MarketPeriod::Timestamp(ref range) => { - let grace_period_in_moments: MomentOf = - market.deadlines.grace_period.saturated_into::().into(); - let grace_period_in_ms = - grace_period_in_moments.saturating_mul(MILLISECS_PER_BLOCK.into()); - let grace_period_end = range.end.saturating_add(grace_period_in_ms); - let now = - as MarketCommonsPalletApi>::now(); - ensure!(grace_period_end <= now, Error::::NotAllowedToReportYet); - let oracle_duration_in_moments: MomentOf = - market.deadlines.oracle_duration.saturated_into::().into(); - let oracle_duration_in_ms = oracle_duration_in_moments - .saturating_mul(MILLISECS_PER_BLOCK.into()); - let oracle_duration_end = - grace_period_end.saturating_add(oracle_duration_in_ms); - if now <= oracle_duration_end { - should_check_origin = true; - } + } + MarketPeriod::Timestamp(ref range) => { + let grace_period_in_moments: MomentOf = + market.deadlines.grace_period.saturated_into::().into(); + let grace_period_in_ms = + grace_period_in_moments.saturating_mul(MILLISECS_PER_BLOCK.into()); + let grace_period_end = range.end.saturating_add(grace_period_in_ms); + let now = >::now(); + ensure!(grace_period_end <= now, Error::::NotAllowedToReportYet); + let oracle_duration_in_moments: MomentOf = + market.deadlines.oracle_duration.saturated_into::().into(); + let oracle_duration_in_ms = + oracle_duration_in_moments.saturating_mul(MILLISECS_PER_BLOCK.into()); + let oracle_duration_end = + grace_period_end.saturating_add(oracle_duration_in_ms); + if now <= oracle_duration_end { + should_check_origin = true; } } + } - if should_check_origin { - let sender_is_oracle = sender == market.oracle; - let origin_has_permission = T::ResolveOrigin::ensure_origin(origin).is_ok(); - ensure!( - sender_is_oracle || origin_has_permission, - Error::::ReporterNotOracle - ); - } + if should_check_origin { + let sender_is_oracle = sender == market.oracle; + let origin_has_permission = T::ResolveOrigin::ensure_origin(origin).is_ok(); + ensure!( + sender_is_oracle || origin_has_permission, + Error::::ReporterNotOracle + ); + } - market.report = Some(market_report.clone()); - market.status = MarketStatus::Reported; + market.report = Some(market_report.clone()); + market.status = MarketStatus::Reported; - Ok(()) - }, - )?; + Ok(()) + })?; - let market = - as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; let block_after_dispute_duration = current_block.saturating_add(market.deadlines.dispute_duration); let ids_len = MarketIdsPerReportBlock::::try_mutate( @@ -1216,8 +1185,7 @@ mod pallet { let sender = ensure_signed(origin)?; ensure!(amount != BalanceOf::::zero(), Error::::ZeroAmount); - let market = - as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; ensure!(market.scoring_rule == ScoringRule::CPMM, Error::::InvalidScoringRule); Self::ensure_market_is_active(&market)?; @@ -1274,8 +1242,7 @@ mod pallet { #[cfg(feature = "with-global-disputes")] { - let market = - as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; ensure!(market.status == MarketStatus::Disputed, Error::::InvalidMarketStatus); ensure!( @@ -1671,7 +1638,7 @@ mod pallet { // TODO(#808): Use weight when Rikiddo is ready let _ = Self::process_subsidy_collecting_markets( now, - as MarketCommonsPalletApi>::now(), + >::now(), ); total_weight = total_weight .saturating_add(T::WeightInfo::process_subsidy_collecting_markets_dummy()); @@ -1688,10 +1655,9 @@ mod pallet { // We add one to the count, because `pallet-timestamp` sets the timestamp _after_ // `on_initialize` is called, so calling `now()` during `on_initialize` gives us // the timestamp of the previous block. - let current_time_frame = Self::calculate_time_frame_of_moment( - as MarketCommonsPalletApi>::now(), - ) - .saturating_add(1); + let current_time_frame = + Self::calculate_time_frame_of_moment(>::now()) + .saturating_add(1); // On first pass, we use current_time - 1 to ensure that the chain doesn't try to // check all time frames since epoch. @@ -1893,8 +1859,7 @@ mod pallet { } fn insert_auto_close(market_id: &MarketIdOf) -> Result { - let market = - as MarketCommonsPalletApi>::market(market_id)?; + let market = >::market(market_id)?; match market.period { MarketPeriod::Block(range) => MarketIdsPerCloseBlock::::try_mutate( @@ -1916,8 +1881,7 @@ mod pallet { // Manually remove market from cache for auto close. fn clear_auto_close(market_id: &MarketIdOf) -> Result { - let market = - as MarketCommonsPalletApi>::market(market_id)?; + let market = >::market(market_id)?; // No-op if market isn't cached for auto close according to its state. match market.status { @@ -1947,8 +1911,7 @@ mod pallet { // Manually remove market from cache for auto open. fn clear_auto_open(market_id: &MarketIdOf) -> Result { - let market = - as MarketCommonsPalletApi>::market(market_id)?; + let market = >::market(market_id)?; // No-op if market isn't cached for auto open according to its state. match market.status { @@ -1978,8 +1941,7 @@ mod pallet { /// Clears this market from being stored for automatic resolution. fn clear_auto_resolve(market_id: &MarketIdOf) -> Result<(u32, u32), DispatchError> { - let market = - as MarketCommonsPalletApi>::market(market_id)?; + let market = >::market(market_id)?; let (ids_len, disputes_len) = match market.status { MarketStatus::Reported => { let report = market.report.ok_or(Error::::MarketIsNotReported)?; @@ -2025,8 +1987,7 @@ mod pallet { Error::::NotEnoughBalance ); - let market = - as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; ensure!(market.scoring_rule == ScoringRule::CPMM, Error::::InvalidScoringRule); Self::ensure_market_is_active(&market)?; @@ -2067,7 +2028,7 @@ mod pallet { creator, T::OracleBond::get().saturating_add(advisory_bond_unreserve_amount), ); - as MarketCommonsPalletApi>::remove_market(market_id)?; + >::remove_market(market_id)?; MarketIdsForEdit::::remove(market_id); Self::deposit_event(Event::MarketRejected(*market_id, reject_reason)); Self::deposit_event(Event::MarketDestroyed(*market_id)); @@ -2092,7 +2053,7 @@ mod pallet { creator, T::OracleBond::get(), ); - as MarketCommonsPalletApi>::remove_market(market_id)?; + >::remove_market(market_id)?; MarketIdsForEdit::::remove(market_id); Self::deposit_event(Event::MarketExpired(*market_id)); Ok(T::WeightInfo::handle_expired_advised_market()) @@ -2162,7 +2123,7 @@ mod pallet { MarketPeriod::Timestamp(ref range) => { // Ensure that the market lasts at least one time frame into the future. let now_frame = Self::calculate_time_frame_of_moment( - as MarketCommonsPalletApi>::now(), + >::now(), ); let end_frame = Self::calculate_time_frame_of_moment(range.end); ensure!(now_frame < end_frame, Error::::InvalidMarketPeriod); @@ -2240,9 +2201,7 @@ mod pallet { } MarketPeriod::Timestamp(range) => range .start - .saturating_sub( - as MarketCommonsPalletApi>::now(), - ) + .saturating_sub(>::now()) .saturated_into(), }; @@ -2261,9 +2220,7 @@ mod pallet { // Is no-op if market has no pool. This should never happen, but it's safer to not // error in this case. let mut total_weight = T::DbWeight::get().reads(1); // (For the `market_pool` read) - if let Ok(pool_id) = - as MarketCommonsPalletApi>::market_pool(market_id) - { + if let Ok(pool_id) = >::market_pool(market_id) { let open_pool_weight = T::Swaps::open_pool(pool_id)?; total_weight = total_weight.saturating_add(open_pool_weight); } @@ -2271,18 +2228,13 @@ mod pallet { } pub(crate) fn close_market(market_id: &MarketIdOf) -> Result { - as MarketCommonsPalletApi>::mutate_market( - market_id, - |market| { - ensure!(market.status == MarketStatus::Active, Error::::InvalidMarketStatus); - market.status = MarketStatus::Closed; - Ok(()) - }, - )?; + >::mutate_market(market_id, |market| { + ensure!(market.status == MarketStatus::Active, Error::::InvalidMarketStatus); + market.status = MarketStatus::Closed; + Ok(()) + })?; let mut total_weight = T::DbWeight::get().reads_writes(1, 1); - if let Ok(pool_id) = - as MarketCommonsPalletApi>::market_pool(market_id) - { + if let Ok(pool_id) = >::market_pool(market_id) { let close_pool_weight = T::Swaps::close_pool(pool_id)?; total_weight = total_weight.saturating_add(close_pool_weight); }; @@ -2457,14 +2409,11 @@ mod pallet { // NOTE: Currently we don't clean up outcome assets. // TODO(#792): Remove outcome assets for accounts! Delete "resolved" assets of `orml_tokens` with storage migration. - as MarketCommonsPalletApi>::mutate_market( - market_id, - |m| { - m.status = MarketStatus::Resolved; - m.resolved_outcome = Some(resolved_outcome.clone()); - Ok(()) - }, - )?; + >::mutate_market(market_id, |m| { + m.status = MarketStatus::Resolved; + m.resolved_outcome = Some(resolved_outcome.clone()); + Ok(()) + })?; Disputes::::remove(market_id); Self::deposit_event(Event::MarketResolved( *market_id, @@ -2498,9 +2447,7 @@ mod pallet { if market_ready { let pool_id = - as MarketCommonsPalletApi>::market_pool( - &subsidy_info.market_id, - ); + >::market_pool(&subsidy_info.market_id); total_weight.saturating_add(one_read); if let Ok(pool_id) = pool_id { @@ -2511,7 +2458,7 @@ mod pallet { if result.result { // Sufficient subsidy, activate market. - let mutate_result = as MarketCommonsPalletApi>::mutate_market( + let mutate_result = >::mutate_market( &subsidy_info.market_id, |m| { m.status = MarketStatus::Active; @@ -2555,7 +2502,7 @@ mod pallet { total_weight = total_weight.saturating_add(weight); } - let market_result = as MarketCommonsPalletApi>::mutate_market( + let market_result = >::mutate_market( &subsidy_info.market_id, |m| { m.status = MarketStatus::InsufficientSubsidy; @@ -2601,7 +2548,7 @@ mod pallet { // `remove_market_pool` can only error due to missing pool, but // above we ensured that the pool exists. - let _ = as MarketCommonsPalletApi>::remove_market_pool( + let _ = >::remove_market_pool( &subsidy_info.market_id, ); total_weight = @@ -2657,8 +2604,7 @@ mod pallet { market_id: &MarketIdOf, ) -> DispatchResult { if let Some(last_dispute) = disputes.last() { - let market = - as MarketCommonsPalletApi>::market(market_id)?; + let market = >::market(market_id)?; let dispute_duration_ends_at_block = last_dispute.at.saturating_add(market.deadlines.dispute_duration); MarketIdsPerDisputeBlock::::mutate(dispute_duration_ends_at_block, |ids| { @@ -2699,8 +2645,7 @@ mod pallet { { let market_ids_per_block = MarketIdsPerBlock::get(block_number); for market_id in market_ids_per_block.iter() { - let market = - as MarketCommonsPalletApi>::market(market_id)?; + let market = >::market(market_id)?; mutation(market_id, market)?; } MarketIdsPerBlock::remove(block_number); @@ -2711,10 +2656,7 @@ mod pallet { time_frame_ids_len = time_frame_ids_len.saturating_add(market_ids_per_time_frame.len() as u32); for market_id in market_ids_per_time_frame.iter() { - let market = - as MarketCommonsPalletApi>::market( - market_id, - )?; + let market = >::market(market_id)?; mutation(market_id, market)?; } MarketIdsPerTimeFrame::remove(time_frame); @@ -2736,8 +2678,7 @@ mod pallet { // Resolve all regularly reported markets. let market_ids_per_report_block = MarketIdsPerReportBlock::::get(now); for id in market_ids_per_report_block.iter() { - let market = - as MarketCommonsPalletApi>::market(id)?; + let market = >::market(id)?; if let MarketStatus::Reported = market.status { cb(id, &market)?; } @@ -2747,8 +2688,7 @@ mod pallet { // Resolve any disputed markets. let market_ids_per_dispute_block = MarketIdsPerDisputeBlock::::get(now); for id in market_ids_per_dispute_block.iter() { - let market = - as MarketCommonsPalletApi>::market(id)?; + let market = >::market(id)?; cb(id, &market)?; } MarketIdsPerDisputeBlock::::remove(now); @@ -2765,13 +2705,10 @@ mod pallet { market_id: &MarketIdOf, ) -> DispatchResult { if market.status != MarketStatus::Disputed { - as MarketCommonsPalletApi>::mutate_market( - market_id, - |m| { - m.status = MarketStatus::Disputed; - Ok(()) - }, - )?; + >::mutate_market(market_id, |m| { + m.status = MarketStatus::Disputed; + Ok(()) + })?; } Ok(()) } @@ -2783,9 +2720,7 @@ mod pallet { market_id: &MarketIdOf, outcome_report: &OutcomeReport, ) -> Result { - let pool_id = if let Ok(el) = - as MarketCommonsPalletApi>::market_pool(market_id) - { + let pool_id = if let Ok(el) = >::market_pool(market_id) { el } else { return Ok(T::DbWeight::get().reads(1)); @@ -2828,9 +2763,7 @@ mod pallet { )?; // This errors if a pool already exists! - as MarketCommonsPalletApi>::insert_market_pool( - market_id, pool_id, - )?; + >::insert_market_pool(market_id, pool_id)?; >::try_mutate(|markets| { markets .try_push(SubsidyUntil { market_id, period: market.period.clone() }) From a7d4deb1eb15f2dcbd58f283a70b2bc748b7582f Mon Sep 17 00:00:00 2001 From: Vivek Pandya Date: Mon, 12 Dec 2022 19:10:36 +0530 Subject: [PATCH 5/6] Changes as per review comments --- zrml/prediction-markets/src/benchmarks.rs | 80 +++++++++++------------ zrml/prediction-markets/src/lib.rs | 16 ++--- 2 files changed, 46 insertions(+), 50 deletions(-) diff --git a/zrml/prediction-markets/src/benchmarks.rs b/zrml/prediction-markets/src/benchmarks.rs index 775f7bbdd..ea0a96fb5 100644 --- a/zrml/prediction-markets/src/benchmarks.rs +++ b/zrml/prediction-markets/src/benchmarks.rs @@ -98,7 +98,7 @@ fn create_market_common( scoring_rule, } .dispatch_bypass_filter(RawOrigin::Signed(caller.clone()).into())?; - let market_id = as MarketCommonsPalletApi>::latest_market_id()?; + let market_id = >::latest_market_id()?; Ok((caller, market_id)) } @@ -114,7 +114,7 @@ fn create_close_and_report_market( create_market_common::(permission, options, ScoringRule::CPMM, Some(period))?; Call::::admin_move_market_to_closed { market_id } .dispatch_bypass_filter(T::CloseOrigin::successful_origin())?; - let market = as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; let end: u32 = match market.period { MarketPeriod::Timestamp(range) => range.end.saturated_into::(), _ => { @@ -157,7 +157,7 @@ fn setup_redeem_shares_common( let close_origin = T::CloseOrigin::successful_origin(); let resolve_origin = T::ResolveOrigin::successful_origin(); Call::::admin_move_market_to_closed { market_id }.dispatch_bypass_filter(close_origin)?; - let market = as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; let end: u32 = match market.period { MarketPeriod::Timestamp(range) => range.end.saturated_into::(), _ => { @@ -201,7 +201,7 @@ fn setup_reported_categorical_market_with_pool::admin_move_market_to_closed { market_id } .dispatch_bypass_filter(T::CloseOrigin::successful_origin())?; - let market = as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; let end: u32 = match market.period { MarketPeriod::Timestamp(range) => range.end.saturated_into::(), _ => { @@ -239,7 +239,7 @@ benchmarks! { OutcomeReport::Categorical(0u16), )?; - let pool_id = as MarketCommonsPalletApi>::market_pool(&market_id)?; + let pool_id = >::market_pool(&market_id)?; for i in 1..=d { let outcome = OutcomeReport::Categorical((i % a).saturated_into()); @@ -249,7 +249,7 @@ benchmarks! { let _ = Pallet::::dispute(RawOrigin::Signed(disputor).into(), market_id, outcome)?; } - let market = as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; let (range_start, range_end) = match market.period { MarketPeriod::Timestamp(range) => (range.start, range.end), @@ -303,9 +303,9 @@ benchmarks! { OutcomeReport::Categorical(0u16), )?; - let pool_id = as MarketCommonsPalletApi>::market_pool(&market_id)?; + let pool_id = >::market_pool(&market_id)?; - let market = as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; let (range_start, range_end) = match market.period { MarketPeriod::Timestamp(range) => (range.start, range.end), @@ -385,7 +385,7 @@ benchmarks! { OutcomeReport::Scalar(u128::MAX), )?; - let market = as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; let report_at = market.report.unwrap().at; let resolves_at = report_at.saturating_add(market.deadlines.dispute_duration); @@ -416,12 +416,12 @@ benchmarks! { categories.into(), OutcomeReport::Categorical(0u16), )?; - as MarketCommonsPalletApi>::mutate_market(&market_id, |market| { + >::mutate_market(&market_id, |market| { market.dispute_mechanism = MarketDisputeMechanism::Authorized; Ok(()) })?; - let market = as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; let report_at = market.report.unwrap().at; let resolves_at = report_at.saturating_add(market.deadlines.dispute_duration); @@ -454,12 +454,12 @@ benchmarks! { OutcomeReport::Scalar(u128::MAX), )?; - as MarketCommonsPalletApi>::mutate_market(&market_id, |market| { + >::mutate_market(&market_id, |market| { market.dispute_mechanism = MarketDisputeMechanism::Authorized; Ok(()) })?; - let market = as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; if let MarketType::Scalar(range) = market.market_type { assert!((d as u128) < *range.end()); } else { @@ -511,7 +511,7 @@ benchmarks! { OutcomeReport::Categorical(0u16) )?; - as MarketCommonsPalletApi>::mutate_market(&market_id, |market| { + >::mutate_market(&market_id, |market| { market.dispute_mechanism = MarketDisputeMechanism::Authorized; Ok(()) })?; @@ -529,7 +529,7 @@ benchmarks! { } let disputes = Disputes::::get(market_id); let last_dispute = disputes.last().unwrap(); - let market = as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; let resolves_at = last_dispute.at.saturating_add(market.deadlines.dispute_duration); for i in 0..r { MarketIdsPerDisputeBlock::::try_mutate( @@ -638,7 +638,7 @@ benchmarks! { scoring_rule, } .dispatch_bypass_filter(RawOrigin::Signed(caller.clone()).into())?; - let market_id = as MarketCommonsPalletApi>::latest_market_id()?; + let market_id = >::latest_market_id()?; let approve_origin = T::ApproveOrigin::successful_origin(); let edit_reason = vec![0_u8; 1024]; @@ -682,7 +682,7 @@ benchmarks! { )?; assert!( - Pallet::::calculate_time_frame_of_moment( as MarketCommonsPalletApi>::now()) + Pallet::::calculate_time_frame_of_moment(>::now()) < Pallet::::calculate_time_frame_of_moment(range_start) ); @@ -728,7 +728,7 @@ benchmarks! { // We need to ensure, that period range start is now, // because we would like to open the pool now - let range_start: MomentOf = as MarketCommonsPalletApi>::now(); + let range_start: MomentOf = >::now(); let range_end: MomentOf = 1_000_000u64.saturated_into(); let (caller, market_id) = create_market_common::( MarketCreation::Permissionless, @@ -737,7 +737,7 @@ benchmarks! { Some(MarketPeriod::Timestamp(range_start..range_end)), )?; - let market = as MarketCommonsPalletApi>::market(&market_id.saturated_into())?; + let market = >::market(&market_id.saturated_into())?; let max_swap_fee: BalanceOf:: = MaxSwapFee::get().saturated_into(); let min_liquidity: BalanceOf:: = MinLiquidity::get().saturated_into(); @@ -759,7 +759,7 @@ benchmarks! { }: { call.dispatch_bypass_filter(RawOrigin::Signed(caller).into())?; } verify { - let market_pool_id = as MarketCommonsPalletApi>::market_pool(&market_id.saturated_into())?; + let market_pool_id = >::market_pool(&market_id.saturated_into())?; let pool = T::Swaps::pool(market_pool_id)?; assert_eq!(pool.pool_status, PoolStatus::Active); } @@ -821,12 +821,12 @@ benchmarks! { report_outcome, )?; - as MarketCommonsPalletApi>::mutate_market(&market_id, |market| { + >::mutate_market(&market_id, |market| { market.dispute_mechanism = MarketDisputeMechanism::Authorized; Ok(()) })?; - let market = as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; if let MarketType::Scalar(range) = market.market_type { assert!((d as u128) < *range.end()); } else { @@ -861,7 +861,7 @@ benchmarks! { ScoringRule::CPMM, Some(MarketPeriod::Timestamp(T::MinSubsidyPeriod::get()..T::MaxSubsidyPeriod::get())), )?; - let market = as MarketCommonsPalletApi>::market(&market_id.saturated_into())?; + let market = >::market(&market_id.saturated_into())?; }: { Pallet::::handle_expired_advised_market(&market_id, market)? } internal_resolve_categorical_reported { @@ -870,15 +870,15 @@ benchmarks! { categories.into(), OutcomeReport::Categorical(1u16), )?; - as MarketCommonsPalletApi>::mutate_market(&market_id, |market| { + >::mutate_market(&market_id, |market| { market.dispute_mechanism = MarketDisputeMechanism::Authorized; Ok(()) })?; - let market = as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; }: { Pallet::::on_resolution(&market_id, &market)?; } verify { - let market = as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; assert_eq!(market.status, MarketStatus::Resolved); } @@ -892,7 +892,7 @@ benchmarks! { categories.into(), OutcomeReport::Categorical(1u16) )?; - as MarketCommonsPalletApi>::mutate_market(&market_id, |market| { + >::mutate_market(&market_id, |market| { market.dispute_mechanism = MarketDisputeMechanism::Authorized; Ok(()) })?; @@ -905,11 +905,11 @@ benchmarks! { OutcomeReport::Categorical((i % 2).saturated_into::()), )?; } - let market = as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; }: { Pallet::::on_resolution(&market_id, &market)?; } verify { - let market = as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; assert_eq!(market.status, MarketStatus::Resolved); } @@ -919,11 +919,11 @@ benchmarks! { MarketType::Scalar(0u128..=u128::MAX), OutcomeReport::Scalar(u128::MAX), )?; - let market = as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; }: { Pallet::::on_resolution(&market_id, &market)?; } verify { - let market = as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; assert_eq!(market.status, MarketStatus::Resolved); } @@ -935,11 +935,11 @@ benchmarks! { MarketType::Scalar(0u128..=u128::MAX), OutcomeReport::Scalar(u128::MAX), )?; - as MarketCommonsPalletApi>::mutate_market(&market_id, |market| { + >::mutate_market(&market_id, |market| { market.dispute_mechanism = MarketDisputeMechanism::Authorized; Ok(()) })?; - let market = as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; if let MarketType::Scalar(range) = market.market_type { assert!((d as u128) < *range.end()); } else { @@ -953,11 +953,11 @@ benchmarks! { OutcomeReport::Scalar(i.into()) )?; } - let market = as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; }: { Pallet::::on_resolution(&market_id, &market)?; } verify { - let market = as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; assert_eq!(market.status, MarketStatus::Resolved); } @@ -1034,7 +1034,7 @@ benchmarks! { let m in 0..63; // ensure range.start is now to get the heaviest path - let range_start: MomentOf = as MarketCommonsPalletApi>::now(); + let range_start: MomentOf = >::now(); let range_end: MomentOf = 1_000_000u64.saturated_into(); let (caller, market_id) = create_market_common::( MarketCreation::Permissionless, @@ -1043,7 +1043,7 @@ benchmarks! { Some(MarketPeriod::Timestamp(range_start..range_end)), )?; - as MarketCommonsPalletApi>::mutate_market(&market_id, |market| { + >::mutate_market(&market_id, |market| { // ensure sender is oracle to succeed extrinsic call market.oracle = caller.clone(); Ok(()) @@ -1052,7 +1052,7 @@ benchmarks! { let outcome = OutcomeReport::Categorical(0); let close_origin = T::CloseOrigin::successful_origin(); Pallet::::admin_move_market_to_closed(close_origin, market_id)?; - let market = as MarketCommonsPalletApi>::market(&market_id)?; + let market = >::market(&market_id)?; let end : u32 = match market.period { MarketPeriod::Timestamp(range) => { range.end.saturated_into::() @@ -1103,7 +1103,7 @@ benchmarks! { Some(MarketPeriod::Timestamp(T::MinSubsidyPeriod::get()..T::MaxSubsidyPeriod::get())), )?; let mut market_clone = None; - as MarketCommonsPalletApi>::mutate_market(&market_id, |market| { + >::mutate_market(&market_id, |market| { market.status = MarketStatus::CollectingSubsidy; market_clone = Some(market.clone()); Ok(()) @@ -1188,7 +1188,7 @@ benchmarks! { Some(MarketPeriod::Timestamp(range_start..range_end)), )?; // ensure market is reported - as MarketCommonsPalletApi>::mutate_market(&market_id, |market| { + >::mutate_market(&market_id, |market| { market.status = MarketStatus::Reported; Ok(()) })?; diff --git a/zrml/prediction-markets/src/lib.rs b/zrml/prediction-markets/src/lib.rs index 1cc96eee4..6c13aa5d6 100644 --- a/zrml/prediction-markets/src/lib.rs +++ b/zrml/prediction-markets/src/lib.rs @@ -124,7 +124,7 @@ mod pallet { let market = >::market(&market_id)?; ensure!(market.scoring_rule == ScoringRule::CPMM, Error::::InvalidScoringRule); let market_status = market.status; - let market_account = Self::market_account(market_id); + let market_account = >::market_account(market_id); // Slash outstanding bonds; see // https://github.com/zeitgeistpm/runtime-audit-1/issues/34#issuecomment-1120187097 for @@ -636,7 +636,7 @@ mod pallet { } let market_id = >::push_market(market.clone())?; - let market_account = Self::market_account(market_id); + let market_account = >::market_account(market_id); let mut extra_weight = 0; if market.status == MarketStatus::CollectingSubsidy { @@ -912,7 +912,7 @@ mod pallet { let sender = ensure_signed(origin)?; let market = >::market(&market_id)?; - let market_account = Self::market_account(market_id); + let market_account = >::market_account(market_id); ensure!(market.status == MarketStatus::Resolved, Error::::MarketIsNotResolved); @@ -1189,7 +1189,7 @@ mod pallet { ensure!(market.scoring_rule == ScoringRule::CPMM, Error::::InvalidScoringRule); Self::ensure_market_is_active(&market)?; - let market_account = Self::market_account(market_id); + let market_account = >::market_account(market_id); ensure!( T::AssetManager::free_balance(Asset::Ztg, &market_account) >= amount, "Market account does not have sufficient reserves.", @@ -1991,7 +1991,7 @@ mod pallet { ensure!(market.scoring_rule == ScoringRule::CPMM, Error::::InvalidScoringRule); Self::ensure_market_is_active(&market)?; - let market_account = Self::market_account(market_id); + let market_account = >::market_account(market_id); T::AssetManager::transfer(Asset::Ztg, &who, &market_account, amount)?; let assets = Self::outcome_assets(market_id, &market); @@ -2620,10 +2620,6 @@ mod pallet { T::PalletId::get().0 } - fn market_account(market_id: MarketIdOf) -> T::AccountId { - T::PalletId::get().into_sub_account_truncating(market_id.saturated_into::()) - } - pub(crate) fn market_status_manager( block_number: T::BlockNumber, last_time_frame: TimeFrame, @@ -2725,7 +2721,7 @@ mod pallet { } else { return Ok(T::DbWeight::get().reads(1)); }; - let market_account = Self::market_account(*market_id); + let market_account = >::market_account(*market_id); let weight = T::Swaps::clean_up_pool( &market.market_type, pool_id, From 3d055d92f61f83e5760c84e1c9be10b50d3fd336 Mon Sep 17 00:00:00 2001 From: Vivek Pandya Date: Mon, 12 Dec 2022 20:19:42 +0530 Subject: [PATCH 6/6] Fix clippy warning --- zrml/prediction-markets/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zrml/prediction-markets/src/lib.rs b/zrml/prediction-markets/src/lib.rs index 6c13aa5d6..0d327a4d7 100644 --- a/zrml/prediction-markets/src/lib.rs +++ b/zrml/prediction-markets/src/lib.rs @@ -51,7 +51,7 @@ mod pallet { use orml_traits::{MultiCurrency, NamedMultiReservableCurrency}; use sp_arithmetic::per_things::{Perbill, Percent}; use sp_runtime::{ - traits::{AccountIdConversion, CheckedDiv, Saturating, Zero}, + traits::{CheckedDiv, Saturating, Zero}, DispatchError, DispatchResult, SaturatedConversion, }; use zeitgeist_primitives::{