diff --git a/src/currency.rs b/src/currency.rs new file mode 100644 index 0000000000..7d2e27be7a --- /dev/null +++ b/src/currency.rs @@ -0,0 +1,40 @@ +use runtime_primitives::traits::Convert; +use srml_support::traits::{Currency, LockableCurrency, ReservableCurrency}; +use system; + +pub trait GovernanceCurrency: system::Trait + Sized { + type Currency: Currency + + ReservableCurrency + + LockableCurrency; +} + +pub type BalanceOf = + <::Currency as Currency<::AccountId>>::Balance; + + +/// A structure that converts the currency type into a lossy u64 +/// And back from u128 +pub struct CurrencyToVoteHandler; + +impl Convert for CurrencyToVoteHandler { + fn convert(x: u128) -> u64 { + if x >> 96 == 0 { + x as u64 + } else { + u64::max_value() + } + } +} + +impl Convert for CurrencyToVoteHandler { + fn convert(x: u128) -> u128 { + // if it practically fits in u64 + if x >> 64 == 0 { + x + } + else { + // 0000_0000_FFFF_FFFF_FFFF_FFFF_0000_0000 + u64::max_value() as u128 + } + } +} \ No newline at end of file diff --git a/src/governance/council.rs b/src/governance/council.rs index 2a954b1651..ed006f99f7 100644 --- a/src/governance/council.rs +++ b/src/governance/council.rs @@ -4,7 +4,7 @@ use srml_support::{decl_event, decl_module, decl_storage, ensure, StorageValue}; use system; pub use super::election::{self, CouncilElected, Seat, Seats}; -pub use super::{BalanceOf, GovernanceCurrency}; +pub use crate::currency::{BalanceOf, GovernanceCurrency}; // Hook For announcing that council term has ended pub trait CouncilTermEnded { diff --git a/src/governance/election.rs b/src/governance/election.rs index 31a5de4495..3fca5749ff 100644 --- a/src/governance/election.rs +++ b/src/governance/election.rs @@ -14,7 +14,7 @@ use super::sealed_vote::SealedVote; use super::stake::Stake; use super::council; -pub use super::{BalanceOf, GovernanceCurrency}; +pub use crate::currency::{BalanceOf, GovernanceCurrency}; use crate::traits::Members; diff --git a/src/governance/mock.rs b/src/governance/mock.rs index bdbb7863ff..319594925d 100644 --- a/src/governance/mock.rs +++ b/src/governance/mock.rs @@ -1,6 +1,7 @@ #![cfg(test)] -pub use super::{council, election, proposals, GovernanceCurrency}; +pub use super::{council, election, proposals}; +pub use crate::currency::GovernanceCurrency; use crate::traits::Members; pub use system; diff --git a/src/governance/mod.rs b/src/governance/mod.rs index 9f63204781..8998d99428 100644 --- a/src/governance/mod.rs +++ b/src/governance/mod.rs @@ -1,6 +1,3 @@ -use srml_support::traits::{Currency, LockableCurrency, ReservableCurrency}; -use system; - pub mod council; pub mod election; pub mod proposals; @@ -8,13 +5,4 @@ pub mod proposals; mod sealed_vote; mod stake; -pub trait GovernanceCurrency: system::Trait + Sized { - type Currency: Currency - + ReservableCurrency - + LockableCurrency; -} - -pub type BalanceOf = - <::Currency as Currency<::AccountId>>::Balance; - mod mock; diff --git a/src/governance/proposals.rs b/src/governance/proposals.rs index cf0de52e78..f308ac5f23 100644 --- a/src/governance/proposals.rs +++ b/src/governance/proposals.rs @@ -14,7 +14,7 @@ use { use primitives::storage::well_known_keys; use super::council; -pub use super::{BalanceOf, GovernanceCurrency}; +pub use crate::currency::{BalanceOf, GovernanceCurrency}; use crate::traits::Members; const DEFAULT_APPROVAL_QUORUM: u32 = 60; diff --git a/src/lib.rs b/src/lib.rs index 3d7c7b454a..d03c852d06 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -14,6 +14,7 @@ use substrate_client as client; #[macro_use] extern crate parity_codec_derive; +pub mod currency; pub mod governance; use governance::{council, election, proposals}; pub mod storage; @@ -41,7 +42,7 @@ use runtime_primitives::{ create_runtime_str, generic, traits::{ self as runtime_traits, AuthorityIdFor, BlakeTwo256, Block as BlockT, - CurrencyToVoteHandler, DigestFor, NumberFor, StaticLookup, Verify, + DigestFor, NumberFor, StaticLookup, Verify, }, transaction_validity::TransactionValidity, AnySignature, ApplyResult, @@ -182,7 +183,7 @@ impl consensus::Trait for Runtime { impl session::Trait for Runtime { type ConvertAccountIdToSessionKey = (); - type OnSessionChange = (Staking,); + type OnSessionChange = (Staking, grandpa::SyncedAuthorities); type Event = Event; } @@ -227,14 +228,14 @@ impl sudo::Trait for Runtime { impl staking::Trait for Runtime { type Currency = balances::Module; - type CurrencyToVote = CurrencyToVoteHandler; + type CurrencyToVote = currency::CurrencyToVoteHandler; type OnRewardMinted = (); type Event = Event; type Slash = (); type Reward = (); } -impl governance::GovernanceCurrency for Runtime { +impl currency::GovernanceCurrency for Runtime { type Currency = balances::Module; } diff --git a/src/membership/members.rs b/src/membership/members.rs index 6d32f276f0..25c4429358 100644 --- a/src/membership/members.rs +++ b/src/membership/members.rs @@ -1,4 +1,4 @@ -use crate::governance::{BalanceOf, GovernanceCurrency}; +use crate::currency::{BalanceOf, GovernanceCurrency}; use crate::traits::{Members, Roles}; use parity_codec::Codec; use parity_codec_derive::{Decode, Encode}; diff --git a/src/membership/mock.rs b/src/membership/mock.rs index 7cacab22d5..6ae48d415a 100644 --- a/src/membership/mock.rs +++ b/src/membership/mock.rs @@ -1,7 +1,7 @@ #![cfg(test)] pub use super::members; -pub use crate::governance::GovernanceCurrency; +pub use crate::currency::GovernanceCurrency; pub use srml_support::traits::Currency; pub use system; diff --git a/src/memo.rs b/src/memo.rs index fdda6481d1..29294c69dc 100644 --- a/src/memo.rs +++ b/src/memo.rs @@ -1,4 +1,4 @@ -use crate::governance::GovernanceCurrency; +use crate::currency::GovernanceCurrency; use rstd::prelude::*; use runtime_primitives::traits::Zero; use srml_support::traits::Currency; diff --git a/src/migration.rs b/src/migration.rs index b86ef11eba..b1244c05bd 100644 --- a/src/migration.rs +++ b/src/migration.rs @@ -1,10 +1,7 @@ -//use crate::governance::BalanceOf; use crate::membership::members; use crate::roles::actors; use crate::VERSION; -use rstd::prelude::*; use runtime_io::print; -//use runtime_primitives::traits::As; use srml_support::{decl_event, decl_module, decl_storage, StorageValue}; use system; diff --git a/src/roles/actors.rs b/src/roles/actors.rs index 781ccddbaf..7a21ca66e4 100644 --- a/src/roles/actors.rs +++ b/src/roles/actors.rs @@ -1,4 +1,4 @@ -use crate::governance::{BalanceOf, GovernanceCurrency}; +use crate::currency::{BalanceOf, GovernanceCurrency}; use parity_codec_derive::{Decode, Encode}; use rstd::prelude::*; use runtime_primitives::traits::{As, Bounded, MaybeDebug, Zero}; diff --git a/src/roles/mock.rs b/src/roles/mock.rs index 3cbabef330..ba3c5aed7d 100644 --- a/src/roles/mock.rs +++ b/src/roles/mock.rs @@ -1,7 +1,7 @@ #![cfg(test)] pub use super::actors; -pub use crate::governance::GovernanceCurrency; +pub use crate::currency::GovernanceCurrency; use crate::traits::Members; pub use srml_support::traits::Currency; pub use system; diff --git a/src/storage/mock.rs b/src/storage/mock.rs index 6b0b8394e3..9e29dbc054 100644 --- a/src/storage/mock.rs +++ b/src/storage/mock.rs @@ -3,7 +3,7 @@ pub use super::{ data_directory, data_object_storage_registry, data_object_type_registry, }; -use crate::governance::GovernanceCurrency; +use crate::currency::GovernanceCurrency; use crate::roles::actors; use crate::traits; use runtime_io::with_externalities;