Browse Source

implement our own CurrencyToVoteHandler to better match our currency configuration

Mokhtar Naamani 6 years ago
parent
commit
eae109bde3

+ 40 - 0
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<Self::AccountId>
+        + ReservableCurrency<Self::AccountId>
+        + LockableCurrency<Self::AccountId, Moment = Self::BlockNumber>;
+}
+
+pub type BalanceOf<T> =
+    <<T as GovernanceCurrency>::Currency as Currency<<T as system::Trait>::AccountId>>::Balance;
+
+
+/// A structure that converts the currency type into a lossy u64
+/// And back from u128
+pub struct CurrencyToVoteHandler;
+
+impl Convert<u128, u64> for CurrencyToVoteHandler {
+	fn convert(x: u128) -> u64 {
+		if x >> 96 == 0 {
+			x as u64
+		} else {
+			u64::max_value()
+		}
+	}
+}
+
+impl Convert<u128, u128> 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
+		}
+	}
+}

+ 1 - 1
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 {

+ 1 - 1
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;
 

+ 2 - 1
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;
 

+ 0 - 12
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<Self::AccountId>
-        + ReservableCurrency<Self::AccountId>
-        + LockableCurrency<Self::AccountId, Moment = Self::BlockNumber>;
-}
-
-pub type BalanceOf<T> =
-    <<T as GovernanceCurrency>::Currency as Currency<<T as system::Trait>::AccountId>>::Balance;
-
 mod mock;

+ 1 - 1
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;

+ 4 - 3
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,
@@ -227,14 +228,14 @@ impl sudo::Trait for Runtime {
 
 impl staking::Trait for Runtime {
     type Currency = balances::Module<Self>;
-    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<Self>;
 }
 

+ 1 - 1
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};

+ 1 - 1
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;
 

+ 1 - 1
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;

+ 0 - 3
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;
 

+ 1 - 1
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};

+ 1 - 1
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;

+ 1 - 1
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;