forked from ghostchain/ghost-node
		
	rustfmt the ghost-claims pallet
Signed-off-by: Uncle Stinky <uncle.stinky@ghostchain.io>
This commit is contained in:
		
							parent
							
								
									116ca39dc4
								
							
						
					
					
						commit
						40a8152f69
					
				@ -1,6 +1,6 @@
 | 
				
			|||||||
[package]
 | 
					[package]
 | 
				
			||||||
name = "ghost-claims"
 | 
					name = "ghost-claims"
 | 
				
			||||||
version = "0.2.3"
 | 
					version = "0.2.4"
 | 
				
			||||||
description = "Ghost balance and rank claims based on EVM actions"
 | 
					description = "Ghost balance and rank claims based on EVM actions"
 | 
				
			||||||
license.workspace = true
 | 
					license.workspace = true
 | 
				
			||||||
authors.workspace = true
 | 
					authors.workspace = true
 | 
				
			||||||
 | 
				
			|||||||
@ -6,14 +6,14 @@ use frame_benchmarking::v2::*;
 | 
				
			|||||||
#[instance_benchmarks]
 | 
					#[instance_benchmarks]
 | 
				
			||||||
mod benchmarks {
 | 
					mod benchmarks {
 | 
				
			||||||
    use super::*;
 | 
					    use super::*;
 | 
				
			||||||
    use pallet_ranked_collective::Pallet as Club;
 | 
					 | 
				
			||||||
    use frame_support::dispatch::RawOrigin;
 | 
					    use frame_support::dispatch::RawOrigin;
 | 
				
			||||||
 | 
					    use pallet_ranked_collective::Pallet as Club;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #[benchmark]
 | 
					    #[benchmark]
 | 
				
			||||||
    fn claim() {
 | 
					    fn claim() {
 | 
				
			||||||
        let i = 1337u32;
 | 
					        let i = 1337u32;
 | 
				
			||||||
        let ethereum_secret_key = libsecp256k1::SecretKey::parse(
 | 
					        let ethereum_secret_key =
 | 
				
			||||||
            &keccak_256(&i.to_le_bytes())).unwrap();
 | 
					            libsecp256k1::SecretKey::parse(&keccak_256(&i.to_le_bytes())).unwrap();
 | 
				
			||||||
        let eth_address = crate::secp_utils::eth(ðereum_secret_key);
 | 
					        let eth_address = crate::secp_utils::eth(ðereum_secret_key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let balance = CurrencyOf::<T, I>::minimum_balance();
 | 
					        let balance = CurrencyOf::<T, I>::minimum_balance();
 | 
				
			||||||
@ -22,23 +22,30 @@ mod benchmarks {
 | 
				
			|||||||
        Total::<T, I>::put(balance);
 | 
					        Total::<T, I>::put(balance);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let pseudo_rank = 5u16;
 | 
					        let pseudo_rank = 5u16;
 | 
				
			||||||
        let _ = Club::<T, I>::do_add_member_to_rank(
 | 
					        let _ = Club::<T, I>::do_add_member_to_rank(pseudo_account.clone(), pseudo_rank, false);
 | 
				
			||||||
            pseudo_account.clone(), 
 | 
					 | 
				
			||||||
            pseudo_rank, 
 | 
					 | 
				
			||||||
            false,
 | 
					 | 
				
			||||||
        );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let user_account: T::AccountId = account("user", i, 0);
 | 
					        let user_account: T::AccountId = account("user", i, 0);
 | 
				
			||||||
        let signature = crate::secp_utils::sig::<T, I>(ðereum_secret_key, &user_account.encode());
 | 
					        let signature =
 | 
				
			||||||
 | 
					            crate::secp_utils::sig::<T, I>(ðereum_secret_key, &user_account.encode());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let prev_balance = CurrencyOf::<T, I>::free_balance(&user_account);
 | 
					        let prev_balance = CurrencyOf::<T, I>::free_balance(&user_account);
 | 
				
			||||||
        let prev_rank = Club::<T, I>::rank_of(&user_account);
 | 
					        let prev_rank = Club::<T, I>::rank_of(&user_account);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #[extrinsic_call]
 | 
					        #[extrinsic_call]
 | 
				
			||||||
        claim(RawOrigin::Signed(user_account.clone()), eth_address, signature);
 | 
					        claim(
 | 
				
			||||||
 | 
					            RawOrigin::Signed(user_account.clone()),
 | 
				
			||||||
 | 
					            eth_address,
 | 
				
			||||||
 | 
					            signature,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert_eq!(CurrencyOf::<T, I>::free_balance(&user_account), prev_balance + balance);
 | 
					        assert_eq!(
 | 
				
			||||||
        assert_eq!(CurrencyOf::<T, I>::free_balance(&pseudo_account), balance - balance);
 | 
					            CurrencyOf::<T, I>::free_balance(&user_account),
 | 
				
			||||||
 | 
					            prev_balance + balance
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        assert_eq!(
 | 
				
			||||||
 | 
					            CurrencyOf::<T, I>::free_balance(&pseudo_account),
 | 
				
			||||||
 | 
					            balance - balance
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let rank = match prev_rank {
 | 
					        let rank = match prev_rank {
 | 
				
			||||||
            Some(current_rank) if pseudo_rank <= current_rank => Some(current_rank),
 | 
					            Some(current_rank) if pseudo_rank <= current_rank => Some(current_rank),
 | 
				
			||||||
@ -48,9 +55,5 @@ mod benchmarks {
 | 
				
			|||||||
        assert_eq!(Club::<T, I>::rank_of(&pseudo_account), None);
 | 
					        assert_eq!(Club::<T, I>::rank_of(&pseudo_account), None);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    impl_benchmark_test_suite!(
 | 
					    impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::Test,);
 | 
				
			||||||
        Pallet,
 | 
					 | 
				
			||||||
        crate::mock::new_test_ext(),
 | 
					 | 
				
			||||||
        crate::mock::Test,
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,19 +1,20 @@
 | 
				
			|||||||
#![cfg_attr(not(feature = "std"), no_std)]
 | 
					#![cfg_attr(not(feature = "std"), no_std)]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use frame_support::{
 | 
					use frame_support::{
 | 
				
			||||||
    ensure, pallet_prelude::*,
 | 
					    ensure,
 | 
				
			||||||
 | 
					    pallet_prelude::*,
 | 
				
			||||||
    traits::{
 | 
					    traits::{
 | 
				
			||||||
        Currency, ExistenceRequirement, Get, RankedMembers, 
 | 
					        Currency, ExistenceRequirement, Get, RankedMembers, RankedMembersSwapHandler,
 | 
				
			||||||
        RankedMembersSwapHandler, VestingSchedule,
 | 
					        VestingSchedule,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    DefaultNoBound,
 | 
					    DefaultNoBound,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
use frame_system::pallet_prelude::*;
 | 
					use frame_system::pallet_prelude::*;
 | 
				
			||||||
use serde::{self, Deserialize, Deserializer, Serialize, Serializer};
 | 
					 | 
				
			||||||
pub use pallet::*;
 | 
					pub use pallet::*;
 | 
				
			||||||
 | 
					use serde::{self, Deserialize, Deserializer, Serialize, Serializer};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use sp_io::{crypto::secp256k1_ecdsa_recover, hashing::keccak_256};
 | 
					use sp_io::{crypto::secp256k1_ecdsa_recover, hashing::keccak_256};
 | 
				
			||||||
use sp_runtime::traits::{CheckedSub, CheckedDiv, BlockNumberProvider};
 | 
					use sp_runtime::traits::{BlockNumberProvider, CheckedDiv, CheckedSub};
 | 
				
			||||||
use sp_std::prelude::*;
 | 
					use sp_std::prelude::*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern crate alloc;
 | 
					extern crate alloc;
 | 
				
			||||||
@ -23,10 +24,10 @@ use alloc::{format, string::String};
 | 
				
			|||||||
mod weights;
 | 
					mod weights;
 | 
				
			||||||
pub use crate::weights::WeightInfo;
 | 
					pub use crate::weights::WeightInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
mod tests;
 | 
					 | 
				
			||||||
mod mock;
 | 
					 | 
				
			||||||
mod benchmarking;
 | 
					mod benchmarking;
 | 
				
			||||||
 | 
					mod mock;
 | 
				
			||||||
mod secp_utils;
 | 
					mod secp_utils;
 | 
				
			||||||
 | 
					mod tests;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// An ethereum address (i.e. 20 bytes, used to represent an Ethereum account).
 | 
					/// An ethereum address (i.e. 20 bytes, used to represent an Ethereum account).
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
@ -81,15 +82,14 @@ impl sp_std::fmt::Debug for EcdsaSignature {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type CurrencyOf<T, I> = <<T as Config<I>>::VestingSchedule as VestingSchedule<
 | 
					type CurrencyOf<T, I> = <<T as Config<I>>::VestingSchedule as VestingSchedule<
 | 
				
			||||||
    <T as frame_system::Config>::AccountId
 | 
					    <T as frame_system::Config>::AccountId,
 | 
				
			||||||
>>::Currency;
 | 
					>>::Currency;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type BalanceOf<T, I> = <CurrencyOf<T, I> as Currency<
 | 
					type BalanceOf<T, I> =
 | 
				
			||||||
    <T as frame_system::Config>::AccountId>
 | 
					    <CurrencyOf<T, I> as Currency<<T as frame_system::Config>::AccountId>>::Balance;
 | 
				
			||||||
>::Balance;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
type RankOf<T, I> = <pallet_ranked_collective::Pallet::<T, I> as RankedMembers>::Rank;
 | 
					type RankOf<T, I> = <pallet_ranked_collective::Pallet<T, I> as RankedMembers>::Rank;
 | 
				
			||||||
type AccountIdOf<T, I> = <pallet_ranked_collective::Pallet::<T, I> as RankedMembers>::AccountId;
 | 
					type AccountIdOf<T, I> = <pallet_ranked_collective::Pallet<T, I> as RankedMembers>::AccountId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[frame_support::pallet]
 | 
					#[frame_support::pallet]
 | 
				
			||||||
pub mod pallet {
 | 
					pub mod pallet {
 | 
				
			||||||
@ -100,8 +100,11 @@ pub mod pallet {
 | 
				
			|||||||
    pub struct Pallet<T, I = ()>(_);
 | 
					    pub struct Pallet<T, I = ()>(_);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #[pallet::config]
 | 
					    #[pallet::config]
 | 
				
			||||||
    pub trait Config<I: 'static = ()>: frame_system::Config + pallet_ranked_collective::Config<I> {
 | 
					    pub trait Config<I: 'static = ()>:
 | 
				
			||||||
        type RuntimeEvent: From<Event<Self, I>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
 | 
					        frame_system::Config + pallet_ranked_collective::Config<I>
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        type RuntimeEvent: From<Event<Self, I>>
 | 
				
			||||||
 | 
					            + IsType<<Self as frame_system::Config>::RuntimeEvent>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        type VestingSchedule: VestingSchedule<Self::AccountId, Moment = BlockNumberFor<Self>>;
 | 
					        type VestingSchedule: VestingSchedule<Self::AccountId, Moment = BlockNumberFor<Self>>;
 | 
				
			||||||
        type BlockNumberProvider: BlockNumberProvider<BlockNumber = BlockNumberFor<Self>>;
 | 
					        type BlockNumberProvider: BlockNumberProvider<BlockNumber = BlockNumberFor<Self>>;
 | 
				
			||||||
@ -159,12 +162,16 @@ pub mod pallet {
 | 
				
			|||||||
                .map(|(account_id, rank)| {
 | 
					                .map(|(account_id, rank)| {
 | 
				
			||||||
                    assert!(
 | 
					                    assert!(
 | 
				
			||||||
                        pallet_ranked_collective::Pallet::<T, I>::do_add_member_to_rank(
 | 
					                        pallet_ranked_collective::Pallet::<T, I>::do_add_member_to_rank(
 | 
				
			||||||
                            account_id.clone(), *rank, false).is_ok(),
 | 
					                            account_id.clone(),
 | 
				
			||||||
                            "error during adding and promotion"
 | 
					                            *rank,
 | 
				
			||||||
 | 
					                            false
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
 | 
					                        .is_ok(),
 | 
				
			||||||
 | 
					                        "error during adding and promotion"
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    account_id
 | 
					                    account_id
 | 
				
			||||||
                })
 | 
					                })
 | 
				
			||||||
            .collect();
 | 
					                .collect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            assert!(
 | 
					            assert!(
 | 
				
			||||||
                self.members_and_ranks.len() == cult_accounts.len(),
 | 
					                self.members_and_ranks.len() == cult_accounts.len(),
 | 
				
			||||||
@ -186,13 +193,13 @@ pub mod pallet {
 | 
				
			|||||||
        ) -> DispatchResult {
 | 
					        ) -> DispatchResult {
 | 
				
			||||||
            let who = ensure_signed(origin)?;
 | 
					            let who = ensure_signed(origin)?;
 | 
				
			||||||
            let data = who.using_encoded(to_ascii_hex);
 | 
					            let data = who.using_encoded(to_ascii_hex);
 | 
				
			||||||
            let recovered_address = Self::recover_ethereum_address(
 | 
					            let recovered_address = Self::recover_ethereum_address(ðereum_signature, &data)
 | 
				
			||||||
                ðereum_signature,
 | 
					                .ok_or(Error::<T, I>::InvalidEthereumSignature)?;
 | 
				
			||||||
                &data,
 | 
					 | 
				
			||||||
            ).ok_or(Error::<T, I>::InvalidEthereumSignature)?;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            ensure!(recovered_address == ethereum_address, 
 | 
					            ensure!(
 | 
				
			||||||
                Error::<T, I>::InvalidEthereumAddress);
 | 
					                recovered_address == ethereum_address,
 | 
				
			||||||
 | 
					                Error::<T, I>::InvalidEthereumAddress
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Self::do_claim(who, ethereum_address)
 | 
					            Self::do_claim(who, ethereum_address)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -200,37 +207,37 @@ pub mod pallet {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn to_ascii_hex(data: &[u8]) -> Vec<u8> {
 | 
					fn to_ascii_hex(data: &[u8]) -> Vec<u8> {
 | 
				
			||||||
	let mut r = Vec::with_capacity(data.len() * 2);
 | 
					    let mut r = Vec::with_capacity(data.len() * 2);
 | 
				
			||||||
	let mut push_nibble = |n| r.push(if n < 10 { b'0' + n } else { b'a' - 10 + n });
 | 
					    let mut push_nibble = |n| r.push(if n < 10 { b'0' + n } else { b'a' - 10 + n });
 | 
				
			||||||
	for &b in data.iter() {
 | 
					    for &b in data.iter() {
 | 
				
			||||||
		push_nibble(b / 16);
 | 
					        push_nibble(b / 16);
 | 
				
			||||||
		push_nibble(b % 16);
 | 
					        push_nibble(b % 16);
 | 
				
			||||||
	}
 | 
					    }
 | 
				
			||||||
	r
 | 
					    r
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl<T: Config<I>, I: 'static> Pallet<T, I> {
 | 
					impl<T: Config<I>, I: 'static> Pallet<T, I> {
 | 
				
			||||||
    fn ethereum_signable_message(what: &[u8]) -> Vec<u8> {
 | 
					    fn ethereum_signable_message(what: &[u8]) -> Vec<u8> {
 | 
				
			||||||
        let prefix = T::Prefix::get();
 | 
					        let prefix = T::Prefix::get();
 | 
				
			||||||
		let mut l = prefix.len() + what.len();
 | 
					        let mut l = prefix.len() + what.len();
 | 
				
			||||||
		let mut rev = Vec::new();
 | 
					        let mut rev = Vec::new();
 | 
				
			||||||
		while l > 0 {
 | 
					        while l > 0 {
 | 
				
			||||||
			rev.push(b'0' + (l % 10) as u8);
 | 
					            rev.push(b'0' + (l % 10) as u8);
 | 
				
			||||||
			l /= 10;
 | 
					            l /= 10;
 | 
				
			||||||
		}
 | 
					        }
 | 
				
			||||||
		let mut v = b"\x19Ethereum Signed Message:\n".to_vec();
 | 
					        let mut v = b"\x19Ethereum Signed Message:\n".to_vec();
 | 
				
			||||||
		v.extend(rev.into_iter().rev());
 | 
					        v.extend(rev.into_iter().rev());
 | 
				
			||||||
		v.extend_from_slice(prefix);
 | 
					        v.extend_from_slice(prefix);
 | 
				
			||||||
		v.extend_from_slice(what);
 | 
					        v.extend_from_slice(what);
 | 
				
			||||||
		v
 | 
					        v
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn recover_ethereum_address(s: &EcdsaSignature, what: &[u8]) -> Option<EthereumAddress> {
 | 
					    fn recover_ethereum_address(s: &EcdsaSignature, what: &[u8]) -> Option<EthereumAddress> {
 | 
				
			||||||
        let msg = keccak_256(&Self::ethereum_signable_message(what));
 | 
					        let msg = keccak_256(&Self::ethereum_signable_message(what));
 | 
				
			||||||
		let mut res = EthereumAddress::default();
 | 
					        let mut res = EthereumAddress::default();
 | 
				
			||||||
		res.0
 | 
					        res.0
 | 
				
			||||||
			.copy_from_slice(&keccak_256(&secp256k1_ecdsa_recover(&s.0, &msg).ok()?[..])[12..]);
 | 
					            .copy_from_slice(&keccak_256(&secp256k1_ecdsa_recover(&s.0, &msg).ok()?[..])[12..]);
 | 
				
			||||||
		Some(res)
 | 
					        Some(res)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn into_account_id(address: EthereumAddress) -> Result<T::AccountId, codec::Error> {
 | 
					    fn into_account_id(address: EthereumAddress) -> Result<T::AccountId, codec::Error> {
 | 
				
			||||||
@ -243,12 +250,15 @@ impl<T: Config<I>, I: 'static> Pallet<T, I> {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn do_claim(receiver: T::AccountId, ethereum_address: EthereumAddress) -> DispatchResult {
 | 
					    fn do_claim(receiver: T::AccountId, ethereum_address: EthereumAddress) -> DispatchResult {
 | 
				
			||||||
        let donor = Self::into_account_id(ethereum_address).ok()
 | 
					        let donor = Self::into_account_id(ethereum_address)
 | 
				
			||||||
 | 
					            .ok()
 | 
				
			||||||
            .ok_or(Error::<T, I>::AddressDecodingFailed)?;
 | 
					            .ok_or(Error::<T, I>::AddressDecodingFailed)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let balance_due = CurrencyOf::<T, I>::free_balance(&donor);
 | 
					        let balance_due = CurrencyOf::<T, I>::free_balance(&donor);
 | 
				
			||||||
        ensure!(balance_due >= CurrencyOf::<T, I>::minimum_balance(), 
 | 
					        ensure!(
 | 
				
			||||||
            Error::<T, I>::NoBalanceToClaim);
 | 
					            balance_due >= CurrencyOf::<T, I>::minimum_balance(),
 | 
				
			||||||
 | 
					            Error::<T, I>::NoBalanceToClaim
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let new_total = Total::<T, I>::get()
 | 
					        let new_total = Total::<T, I>::get()
 | 
				
			||||||
            .checked_sub(&balance_due)
 | 
					            .checked_sub(&balance_due)
 | 
				
			||||||
@ -280,21 +290,33 @@ impl<T: Config<I>, I: 'static> Pallet<T, I> {
 | 
				
			|||||||
            )?;
 | 
					            )?;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let rank = if let Some(rank) = <pallet_ranked_collective::Pallet::<T, I> as RankedMembers>::rank_of(&donor) {
 | 
					        let rank = if let Some(rank) =
 | 
				
			||||||
 | 
					            <pallet_ranked_collective::Pallet<T, I> as RankedMembers>::rank_of(&donor)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
            pallet_ranked_collective::Pallet::<T, I>::do_remove_member_from_rank(&donor, rank)?;
 | 
					            pallet_ranked_collective::Pallet::<T, I>::do_remove_member_from_rank(&donor, rank)?;
 | 
				
			||||||
            let new_rank = match <pallet_ranked_collective::Pallet::<T, I> as RankedMembers>::rank_of(&receiver) {
 | 
					            let new_rank =
 | 
				
			||||||
                Some(current_rank) if current_rank >= rank => current_rank,
 | 
					                match <pallet_ranked_collective::Pallet<T, I> as RankedMembers>::rank_of(&receiver)
 | 
				
			||||||
                Some(current_rank) if current_rank < rank => {
 | 
					                {
 | 
				
			||||||
                    for _ in 0..rank - current_rank {
 | 
					                    Some(current_rank) if current_rank >= rank => current_rank,
 | 
				
			||||||
                        pallet_ranked_collective::Pallet::<T, I>::do_promote_member(receiver.clone(), None, false)?;
 | 
					                    Some(current_rank) if current_rank < rank => {
 | 
				
			||||||
 | 
					                        for _ in 0..rank - current_rank {
 | 
				
			||||||
 | 
					                            pallet_ranked_collective::Pallet::<T, I>::do_promote_member(
 | 
				
			||||||
 | 
					                                receiver.clone(),
 | 
				
			||||||
 | 
					                                None,
 | 
				
			||||||
 | 
					                                false,
 | 
				
			||||||
 | 
					                            )?;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        rank
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    rank
 | 
					                    _ => {
 | 
				
			||||||
                },
 | 
					                        pallet_ranked_collective::Pallet::<T, I>::do_add_member_to_rank(
 | 
				
			||||||
                _ => {
 | 
					                            receiver.clone(),
 | 
				
			||||||
                    pallet_ranked_collective::Pallet::<T, I>::do_add_member_to_rank(receiver.clone(), rank, false)?;
 | 
					                            rank,
 | 
				
			||||||
                    rank
 | 
					                            false,
 | 
				
			||||||
                },
 | 
					                        )?;
 | 
				
			||||||
            };
 | 
					                        rank
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
            <T as pallet::Config<I>>::MemberSwappedHandler::swapped(&donor, &receiver, new_rank);
 | 
					            <T as pallet::Config<I>>::MemberSwappedHandler::swapped(&donor, &receiver, new_rank);
 | 
				
			||||||
            Some(new_rank)
 | 
					            Some(new_rank)
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
 | 
				
			|||||||
@ -4,51 +4,113 @@ use super::*;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
pub use crate as ghost_claims;
 | 
					pub use crate as ghost_claims;
 | 
				
			||||||
use frame_support::{
 | 
					use frame_support::{
 | 
				
			||||||
    parameter_types, derive_impl,
 | 
					    derive_impl, parameter_types,
 | 
				
			||||||
    traits::{PollStatus, Polling, WithdrawReasons, ConstU16, ConstU64},
 | 
					    traits::{ConstU16, ConstU64, PollStatus, Polling, WithdrawReasons},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
use frame_system::EnsureRootWithSuccess;
 | 
					use frame_system::EnsureRootWithSuccess;
 | 
				
			||||||
use sp_runtime::{BuildStorage, traits::Convert};
 | 
					pub use pallet_ranked_collective::{Rank, TallyOf};
 | 
				
			||||||
pub use pallet_ranked_collective::{TallyOf, Rank};
 | 
					use sp_runtime::{traits::Convert, BuildStorage};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub mod eth_keys {
 | 
					pub mod eth_keys {
 | 
				
			||||||
    use crate::{
 | 
					    use crate::{mock::Test, EcdsaSignature, EthereumAddress};
 | 
				
			||||||
        mock::Test,
 | 
					 | 
				
			||||||
        EcdsaSignature, EthereumAddress,
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
    use hex_literal::hex;
 | 
					 | 
				
			||||||
    use codec::Encode;
 | 
					    use codec::Encode;
 | 
				
			||||||
 | 
					    use hex_literal::hex;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn total_claims() -> u64 { 10 + 100 + 1000 }
 | 
					    pub fn total_claims() -> u64 {
 | 
				
			||||||
    pub fn alice_account_id() -> <Test as frame_system::Config>::AccountId { 69 }
 | 
					        10 + 100 + 1000
 | 
				
			||||||
    pub fn bob_account_id() -> <Test as frame_system::Config>::AccountId { 1337 }
 | 
					    }
 | 
				
			||||||
 | 
					    pub fn alice_account_id() -> <Test as frame_system::Config>::AccountId {
 | 
				
			||||||
 | 
					        69
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    pub fn bob_account_id() -> <Test as frame_system::Config>::AccountId {
 | 
				
			||||||
 | 
					        1337
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn first_eth_public_known()  -> EthereumAddress { EthereumAddress(hex!("1A69d2D5568D1878023EeB121a73d33B9116A760")) }
 | 
					    pub fn first_eth_public_known() -> EthereumAddress {
 | 
				
			||||||
    pub fn second_eth_public_known() -> EthereumAddress { EthereumAddress(hex!("2f86cfBED3fbc1eCf2989B9aE5fc019a837A9C12")) }
 | 
					        EthereumAddress(hex!("1A69d2D5568D1878023EeB121a73d33B9116A760"))
 | 
				
			||||||
    pub fn third_eth_public_known()  -> EthereumAddress { EthereumAddress(hex!("e83f67361Ac74D42A48E2DAfb6706eb047D8218D")) }
 | 
					    }
 | 
				
			||||||
    pub fn fourth_eth_public_known() -> EthereumAddress { EthereumAddress(hex!("827ee4ad9b259b6fa1390ed60921508c78befd63")) }
 | 
					    pub fn second_eth_public_known() -> EthereumAddress {
 | 
				
			||||||
 | 
					        EthereumAddress(hex!("2f86cfBED3fbc1eCf2989B9aE5fc019a837A9C12"))
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    pub fn third_eth_public_known() -> EthereumAddress {
 | 
				
			||||||
 | 
					        EthereumAddress(hex!("e83f67361Ac74D42A48E2DAfb6706eb047D8218D"))
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    pub fn fourth_eth_public_known() -> EthereumAddress {
 | 
				
			||||||
 | 
					        EthereumAddress(hex!("827ee4ad9b259b6fa1390ed60921508c78befd63"))
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn first_eth_private_key()  -> libsecp256k1::SecretKey { libsecp256k1::SecretKey::parse(&hex!("01c928771aea942a1e7ac06adf2b73dfbc9a25d9eaa516e3673116af7f345198")).unwrap() }
 | 
					    fn first_eth_private_key() -> libsecp256k1::SecretKey {
 | 
				
			||||||
    fn second_eth_private_key() -> libsecp256k1::SecretKey { libsecp256k1::SecretKey::parse(&hex!("b19a435901872f817185f7234a1484eae837613f9d10cf21927a23c2d8cb9139")).unwrap() }
 | 
					        libsecp256k1::SecretKey::parse(&hex!(
 | 
				
			||||||
    fn third_eth_private_key()  -> libsecp256k1::SecretKey { libsecp256k1::SecretKey::parse(&hex!("d3baf57b74d65719b2dc33f5a464176022d0cc5edbca002234229f3e733875fc")).unwrap() }
 | 
					            "01c928771aea942a1e7ac06adf2b73dfbc9a25d9eaa516e3673116af7f345198"
 | 
				
			||||||
    fn fourth_eth_private_key() -> libsecp256k1::SecretKey { libsecp256k1::SecretKey::parse(&hex!("c4683d566436af6b58b4a59c8f501319226e85b21869bf93d5eeb4596d4791d4")).unwrap() }
 | 
					        ))
 | 
				
			||||||
    fn wrong_eth_private_key()  -> libsecp256k1::SecretKey { libsecp256k1::SecretKey::parse(&hex!("deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef")).unwrap() }
 | 
					        .unwrap()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    fn second_eth_private_key() -> libsecp256k1::SecretKey {
 | 
				
			||||||
 | 
					        libsecp256k1::SecretKey::parse(&hex!(
 | 
				
			||||||
 | 
					            "b19a435901872f817185f7234a1484eae837613f9d10cf21927a23c2d8cb9139"
 | 
				
			||||||
 | 
					        ))
 | 
				
			||||||
 | 
					        .unwrap()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    fn third_eth_private_key() -> libsecp256k1::SecretKey {
 | 
				
			||||||
 | 
					        libsecp256k1::SecretKey::parse(&hex!(
 | 
				
			||||||
 | 
					            "d3baf57b74d65719b2dc33f5a464176022d0cc5edbca002234229f3e733875fc"
 | 
				
			||||||
 | 
					        ))
 | 
				
			||||||
 | 
					        .unwrap()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    fn fourth_eth_private_key() -> libsecp256k1::SecretKey {
 | 
				
			||||||
 | 
					        libsecp256k1::SecretKey::parse(&hex!(
 | 
				
			||||||
 | 
					            "c4683d566436af6b58b4a59c8f501319226e85b21869bf93d5eeb4596d4791d4"
 | 
				
			||||||
 | 
					        ))
 | 
				
			||||||
 | 
					        .unwrap()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    fn wrong_eth_private_key() -> libsecp256k1::SecretKey {
 | 
				
			||||||
 | 
					        libsecp256k1::SecretKey::parse(&hex!(
 | 
				
			||||||
 | 
					            "deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef"
 | 
				
			||||||
 | 
					        ))
 | 
				
			||||||
 | 
					        .unwrap()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn first_eth_public_key()  -> EthereumAddress { crate::secp_utils::eth(&first_eth_private_key())  }
 | 
					    pub fn first_eth_public_key() -> EthereumAddress {
 | 
				
			||||||
    pub fn second_eth_public_key() -> EthereumAddress { crate::secp_utils::eth(&second_eth_private_key()) }
 | 
					        crate::secp_utils::eth(&first_eth_private_key())
 | 
				
			||||||
    pub fn third_eth_public_key()  -> EthereumAddress { crate::secp_utils::eth(&third_eth_private_key())  }
 | 
					    }
 | 
				
			||||||
    pub fn fourth_eth_public_key() -> EthereumAddress { crate::secp_utils::eth(&fourth_eth_private_key()) }
 | 
					    pub fn second_eth_public_key() -> EthereumAddress {
 | 
				
			||||||
 | 
					        crate::secp_utils::eth(&second_eth_private_key())
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    pub fn third_eth_public_key() -> EthereumAddress {
 | 
				
			||||||
 | 
					        crate::secp_utils::eth(&third_eth_private_key())
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    pub fn fourth_eth_public_key() -> EthereumAddress {
 | 
				
			||||||
 | 
					        crate::secp_utils::eth(&fourth_eth_private_key())
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn first_account_id()  -> <Test as frame_system::Config>::AccountId { crate::secp_utils::into_account_id::<Test, ()>(first_eth_public_key())  }
 | 
					    pub fn first_account_id() -> <Test as frame_system::Config>::AccountId {
 | 
				
			||||||
    pub fn second_account_id() -> <Test as frame_system::Config>::AccountId { crate::secp_utils::into_account_id::<Test, ()>(second_eth_public_key()) }
 | 
					        crate::secp_utils::into_account_id::<Test, ()>(first_eth_public_key())
 | 
				
			||||||
    pub fn third_account_id()  -> <Test as frame_system::Config>::AccountId { crate::secp_utils::into_account_id::<Test, ()>(third_eth_public_key())  }
 | 
					    }
 | 
				
			||||||
    pub fn fourth_account_id() -> <Test as frame_system::Config>::AccountId { crate::secp_utils::into_account_id::<Test, ()>(fourth_eth_public_key()) }
 | 
					    pub fn second_account_id() -> <Test as frame_system::Config>::AccountId {
 | 
				
			||||||
 | 
					        crate::secp_utils::into_account_id::<Test, ()>(second_eth_public_key())
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    pub fn third_account_id() -> <Test as frame_system::Config>::AccountId {
 | 
				
			||||||
 | 
					        crate::secp_utils::into_account_id::<Test, ()>(third_eth_public_key())
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    pub fn fourth_account_id() -> <Test as frame_system::Config>::AccountId {
 | 
				
			||||||
 | 
					        crate::secp_utils::into_account_id::<Test, ()>(fourth_eth_public_key())
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn first_signature()  -> EcdsaSignature { crate::secp_utils::sig::<Test, ()>(&first_eth_private_key(),  &alice_account_id().encode()) }
 | 
					    pub fn first_signature() -> EcdsaSignature {
 | 
				
			||||||
    pub fn second_signature() -> EcdsaSignature { crate::secp_utils::sig::<Test, ()>(&second_eth_private_key(), &alice_account_id().encode()) }
 | 
					        crate::secp_utils::sig::<Test, ()>(&first_eth_private_key(), &alice_account_id().encode())
 | 
				
			||||||
    pub fn third_signature()  -> EcdsaSignature { crate::secp_utils::sig::<Test, ()>(&third_eth_private_key(),  &alice_account_id().encode()) }
 | 
					    }
 | 
				
			||||||
    pub fn fourth_signature() -> EcdsaSignature { crate::secp_utils::sig::<Test, ()>(&fourth_eth_private_key(), &bob_account_id().encode())   }
 | 
					    pub fn second_signature() -> EcdsaSignature {
 | 
				
			||||||
    pub fn wrong_signature()  -> EcdsaSignature { crate::secp_utils::sig::<Test, ()>(&wrong_eth_private_key(),  &alice_account_id().encode()) }
 | 
					        crate::secp_utils::sig::<Test, ()>(&second_eth_private_key(), &alice_account_id().encode())
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    pub fn third_signature() -> EcdsaSignature {
 | 
				
			||||||
 | 
					        crate::secp_utils::sig::<Test, ()>(&third_eth_private_key(), &alice_account_id().encode())
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    pub fn fourth_signature() -> EcdsaSignature {
 | 
				
			||||||
 | 
					        crate::secp_utils::sig::<Test, ()>(&fourth_eth_private_key(), &bob_account_id().encode())
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    pub fn wrong_signature() -> EcdsaSignature {
 | 
				
			||||||
 | 
					        crate::secp_utils::sig::<Test, ()>(&wrong_eth_private_key(), &alice_account_id().encode())
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive_impl(frame_system::config_preludes::TestDefaultConfig)]
 | 
					#[derive_impl(frame_system::config_preludes::TestDefaultConfig)]
 | 
				
			||||||
@ -66,7 +128,6 @@ impl pallet_balances::Config for Test {
 | 
				
			|||||||
    type AccountStore = System;
 | 
					    type AccountStore = System;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
parameter_types! {
 | 
					parameter_types! {
 | 
				
			||||||
    pub const MinVestedTransfer: u64 = 1;
 | 
					    pub const MinVestedTransfer: u64 = 1;
 | 
				
			||||||
    pub UnvestedFundsAllowedWithdrawReasons: WithdrawReasons =
 | 
					    pub UnvestedFundsAllowedWithdrawReasons: WithdrawReasons =
 | 
				
			||||||
@ -79,8 +140,7 @@ impl pallet_vesting::Config for Test {
 | 
				
			|||||||
    type BlockNumberToBalance = sp_runtime::traits::ConvertInto;
 | 
					    type BlockNumberToBalance = sp_runtime::traits::ConvertInto;
 | 
				
			||||||
    type MinVestedTransfer = MinVestedTransfer;
 | 
					    type MinVestedTransfer = MinVestedTransfer;
 | 
				
			||||||
    type WeightInfo = ();
 | 
					    type WeightInfo = ();
 | 
				
			||||||
    type UnvestedFundsAllowedWithdrawReasons = 
 | 
					    type UnvestedFundsAllowedWithdrawReasons = UnvestedFundsAllowedWithdrawReasons;
 | 
				
			||||||
        UnvestedFundsAllowedWithdrawReasons;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    type BlockNumberProvider = System;
 | 
					    type BlockNumberProvider = System;
 | 
				
			||||||
    const MAX_VESTING_SCHEDULES: u32 = 28;
 | 
					    const MAX_VESTING_SCHEDULES: u32 = 28;
 | 
				
			||||||
@ -200,8 +260,8 @@ pub fn new_test_ext() -> sp_io::TestExternalities {
 | 
				
			|||||||
            (crate::mock::eth_keys::third_account_id(), 1000),
 | 
					            (crate::mock::eth_keys::third_account_id(), 1000),
 | 
				
			||||||
        ],
 | 
					        ],
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
        .assimilate_storage(&mut t)
 | 
					    .assimilate_storage(&mut t)
 | 
				
			||||||
        .unwrap();
 | 
					    .unwrap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ghost_claims::GenesisConfig::<Test> {
 | 
					    ghost_claims::GenesisConfig::<Test> {
 | 
				
			||||||
        total: crate::mock::eth_keys::total_claims(),
 | 
					        total: crate::mock::eth_keys::total_claims(),
 | 
				
			||||||
@ -210,8 +270,8 @@ pub fn new_test_ext() -> sp_io::TestExternalities {
 | 
				
			|||||||
            (crate::mock::eth_keys::third_account_id(), 3),
 | 
					            (crate::mock::eth_keys::third_account_id(), 3),
 | 
				
			||||||
        ],
 | 
					        ],
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
        .assimilate_storage(&mut t)
 | 
					    .assimilate_storage(&mut t)
 | 
				
			||||||
        .unwrap();
 | 
					    .unwrap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let mut ext = sp_io::TestExternalities::new(t);
 | 
					    let mut ext = sp_io::TestExternalities::new(t);
 | 
				
			||||||
    ext.execute_with(|| {
 | 
					    ext.execute_with(|| {
 | 
				
			||||||
 | 
				
			|||||||
@ -8,7 +8,8 @@ pub fn public(secret: &libsecp256k1::SecretKey) -> libsecp256k1::PublicKey {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
pub fn eth(secret: &libsecp256k1::SecretKey) -> EthereumAddress {
 | 
					pub fn eth(secret: &libsecp256k1::SecretKey) -> EthereumAddress {
 | 
				
			||||||
    let mut res = EthereumAddress::default();
 | 
					    let mut res = EthereumAddress::default();
 | 
				
			||||||
    res.0.copy_from_slice(&keccak_256(&public(secret).serialize()[1..65])[12..]);
 | 
					    res.0
 | 
				
			||||||
 | 
					        .copy_from_slice(&keccak_256(&public(secret).serialize()[1..65])[12..]);
 | 
				
			||||||
    res
 | 
					    res
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -22,13 +23,10 @@ pub fn sig<T: Config<I>, I: 'static>(
 | 
				
			|||||||
    what: &[u8],
 | 
					    what: &[u8],
 | 
				
			||||||
) -> EcdsaSignature {
 | 
					) -> EcdsaSignature {
 | 
				
			||||||
    let msg = keccak_256(&super::Pallet::<T, I>::ethereum_signable_message(
 | 
					    let msg = keccak_256(&super::Pallet::<T, I>::ethereum_signable_message(
 | 
				
			||||||
            &crate::to_ascii_hex(what)[..],
 | 
					        &crate::to_ascii_hex(what)[..],
 | 
				
			||||||
    ));
 | 
					    ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let (sig, recovery_id) = libsecp256k1::sign(
 | 
					    let (sig, recovery_id) = libsecp256k1::sign(&libsecp256k1::Message::parse(&msg), secret);
 | 
				
			||||||
        &libsecp256k1::Message::parse(&msg),
 | 
					 | 
				
			||||||
        secret,
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let mut r = [0u8; 65];
 | 
					    let mut r = [0u8; 65];
 | 
				
			||||||
    r[0..64].copy_from_slice(&sig.serialize()[..]);
 | 
					    r[0..64].copy_from_slice(&sig.serialize()[..]);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,21 +1,19 @@
 | 
				
			|||||||
#![cfg(test)]
 | 
					#![cfg(test)]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use mock::{
 | 
					 | 
				
			||||||
    new_test_ext, ghost_claims,
 | 
					 | 
				
			||||||
    Test, System, Balances, Club, Vesting, Claims, RuntimeOrigin, RuntimeEvent,
 | 
					 | 
				
			||||||
    eth_keys::{
 | 
					 | 
				
			||||||
        alice_account_id, total_claims, first_eth_public_known, 
 | 
					 | 
				
			||||||
        first_eth_public_key, first_account_id, first_signature, 
 | 
					 | 
				
			||||||
        second_eth_public_known, second_eth_public_key, second_account_id, 
 | 
					 | 
				
			||||||
        second_signature, third_eth_public_known, third_eth_public_key, 
 | 
					 | 
				
			||||||
        third_account_id, third_signature, fourth_eth_public_known, 
 | 
					 | 
				
			||||||
        fourth_eth_public_key, fourth_account_id, fourth_signature, 
 | 
					 | 
				
			||||||
        wrong_signature, bob_account_id,
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
use hex_literal::hex;
 | 
					 | 
				
			||||||
use frame_support::{assert_err, assert_ok};
 | 
					 | 
				
			||||||
use super::*;
 | 
					use super::*;
 | 
				
			||||||
 | 
					use frame_support::{assert_err, assert_ok};
 | 
				
			||||||
 | 
					use hex_literal::hex;
 | 
				
			||||||
 | 
					use mock::{
 | 
				
			||||||
 | 
					    eth_keys::{
 | 
				
			||||||
 | 
					        alice_account_id, bob_account_id, first_account_id, first_eth_public_key,
 | 
				
			||||||
 | 
					        first_eth_public_known, first_signature, fourth_account_id, fourth_eth_public_key,
 | 
				
			||||||
 | 
					        fourth_eth_public_known, fourth_signature, second_account_id, second_eth_public_key,
 | 
				
			||||||
 | 
					        second_eth_public_known, second_signature, third_account_id, third_eth_public_key,
 | 
				
			||||||
 | 
					        third_eth_public_known, third_signature, total_claims, wrong_signature,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    ghost_claims, new_test_ext, Balances, Claims, Club, RuntimeEvent, RuntimeOrigin, System, Test,
 | 
				
			||||||
 | 
					    Vesting,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[test]
 | 
					#[test]
 | 
				
			||||||
fn serde_works() {
 | 
					fn serde_works() {
 | 
				
			||||||
@ -56,9 +54,10 @@ fn basic_setup_works() {
 | 
				
			|||||||
fn small_claiming_works() {
 | 
					fn small_claiming_works() {
 | 
				
			||||||
    new_test_ext().execute_with(|| {
 | 
					    new_test_ext().execute_with(|| {
 | 
				
			||||||
        assert_ok!(Claims::claim(
 | 
					        assert_ok!(Claims::claim(
 | 
				
			||||||
                RuntimeOrigin::signed(alice_account_id()),
 | 
					            RuntimeOrigin::signed(alice_account_id()),
 | 
				
			||||||
                first_eth_public_key(),
 | 
					            first_eth_public_key(),
 | 
				
			||||||
                first_signature()));
 | 
					            first_signature()
 | 
				
			||||||
 | 
					        ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert_eq!(Balances::usable_balance(&alice_account_id()), 10);
 | 
					        assert_eq!(Balances::usable_balance(&alice_account_id()), 10);
 | 
				
			||||||
        assert_eq!(Balances::usable_balance(&first_account_id()), 0);
 | 
					        assert_eq!(Balances::usable_balance(&first_account_id()), 0);
 | 
				
			||||||
@ -77,9 +76,9 @@ fn small_claiming_works() {
 | 
				
			|||||||
fn medium_claiming_works() {
 | 
					fn medium_claiming_works() {
 | 
				
			||||||
    new_test_ext().execute_with(|| {
 | 
					    new_test_ext().execute_with(|| {
 | 
				
			||||||
        assert_ok!(Claims::claim(
 | 
					        assert_ok!(Claims::claim(
 | 
				
			||||||
                RuntimeOrigin::signed(alice_account_id()),
 | 
					            RuntimeOrigin::signed(alice_account_id()),
 | 
				
			||||||
                second_eth_public_key(),
 | 
					            second_eth_public_key(),
 | 
				
			||||||
                second_signature(),
 | 
					            second_signature(),
 | 
				
			||||||
        ));
 | 
					        ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert_eq!(Balances::usable_balance(&alice_account_id()), 100);
 | 
					        assert_eq!(Balances::usable_balance(&alice_account_id()), 100);
 | 
				
			||||||
@ -99,9 +98,9 @@ fn medium_claiming_works() {
 | 
				
			|||||||
fn big_claiming_works() {
 | 
					fn big_claiming_works() {
 | 
				
			||||||
    new_test_ext().execute_with(|| {
 | 
					    new_test_ext().execute_with(|| {
 | 
				
			||||||
        assert_ok!(Claims::claim(
 | 
					        assert_ok!(Claims::claim(
 | 
				
			||||||
                RuntimeOrigin::signed(alice_account_id()),
 | 
					            RuntimeOrigin::signed(alice_account_id()),
 | 
				
			||||||
                third_eth_public_key(),
 | 
					            third_eth_public_key(),
 | 
				
			||||||
                third_signature(),
 | 
					            third_signature(),
 | 
				
			||||||
        ));
 | 
					        ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert_eq!(Balances::usable_balance(&alice_account_id()), 200);
 | 
					        assert_eq!(Balances::usable_balance(&alice_account_id()), 200);
 | 
				
			||||||
@ -113,11 +112,15 @@ fn big_claiming_works() {
 | 
				
			|||||||
        assert_eq!(Club::rank_of(&third_account_id()), None);
 | 
					        assert_eq!(Club::rank_of(&third_account_id()), None);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert_eq!(Vesting::vesting_balance(&alice_account_id()), Some(800));
 | 
					        assert_eq!(Vesting::vesting_balance(&alice_account_id()), Some(800));
 | 
				
			||||||
        assert_eq!(ghost_claims::Total::<Test, ()>::get(), total_claims() - 1000);
 | 
					        assert_eq!(
 | 
				
			||||||
 | 
					            ghost_claims::Total::<Test, ()>::get(),
 | 
				
			||||||
 | 
					            total_claims() - 1000
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
        assert_ok!(Balances::transfer_allow_death(
 | 
					        assert_ok!(Balances::transfer_allow_death(
 | 
				
			||||||
                RuntimeOrigin::signed(alice_account_id()),
 | 
					            RuntimeOrigin::signed(alice_account_id()),
 | 
				
			||||||
                bob_account_id(),
 | 
					            bob_account_id(),
 | 
				
			||||||
                200));
 | 
					            200
 | 
				
			||||||
 | 
					        ));
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -125,19 +128,19 @@ fn big_claiming_works() {
 | 
				
			|||||||
fn multiple_accounts_claiming_works() {
 | 
					fn multiple_accounts_claiming_works() {
 | 
				
			||||||
    new_test_ext().execute_with(|| {
 | 
					    new_test_ext().execute_with(|| {
 | 
				
			||||||
        assert_ok!(Claims::claim(
 | 
					        assert_ok!(Claims::claim(
 | 
				
			||||||
                RuntimeOrigin::signed(alice_account_id()),
 | 
					            RuntimeOrigin::signed(alice_account_id()),
 | 
				
			||||||
                first_eth_public_key(),
 | 
					            first_eth_public_key(),
 | 
				
			||||||
                first_signature(),
 | 
					            first_signature(),
 | 
				
			||||||
        ));
 | 
					        ));
 | 
				
			||||||
        assert_ok!(Claims::claim(
 | 
					        assert_ok!(Claims::claim(
 | 
				
			||||||
                RuntimeOrigin::signed(alice_account_id()),
 | 
					            RuntimeOrigin::signed(alice_account_id()),
 | 
				
			||||||
                second_eth_public_key(),
 | 
					            second_eth_public_key(),
 | 
				
			||||||
                second_signature(),
 | 
					            second_signature(),
 | 
				
			||||||
        ));
 | 
					        ));
 | 
				
			||||||
        assert_ok!(Claims::claim(
 | 
					        assert_ok!(Claims::claim(
 | 
				
			||||||
                RuntimeOrigin::signed(alice_account_id()),
 | 
					            RuntimeOrigin::signed(alice_account_id()),
 | 
				
			||||||
                third_eth_public_key(),
 | 
					            third_eth_public_key(),
 | 
				
			||||||
                third_signature(),
 | 
					            third_signature(),
 | 
				
			||||||
        ));
 | 
					        ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert_eq!(Balances::usable_balance(&alice_account_id()), 310);
 | 
					        assert_eq!(Balances::usable_balance(&alice_account_id()), 310);
 | 
				
			||||||
@ -157,19 +160,19 @@ fn multiple_accounts_claiming_works() {
 | 
				
			|||||||
fn multiple_accounts_reverese_claiming_works() {
 | 
					fn multiple_accounts_reverese_claiming_works() {
 | 
				
			||||||
    new_test_ext().execute_with(|| {
 | 
					    new_test_ext().execute_with(|| {
 | 
				
			||||||
        assert_ok!(Claims::claim(
 | 
					        assert_ok!(Claims::claim(
 | 
				
			||||||
                RuntimeOrigin::signed(alice_account_id()),
 | 
					            RuntimeOrigin::signed(alice_account_id()),
 | 
				
			||||||
                third_eth_public_key(),
 | 
					            third_eth_public_key(),
 | 
				
			||||||
                third_signature(),
 | 
					            third_signature(),
 | 
				
			||||||
        ));
 | 
					        ));
 | 
				
			||||||
        assert_ok!(Claims::claim(
 | 
					        assert_ok!(Claims::claim(
 | 
				
			||||||
                RuntimeOrigin::signed(alice_account_id()),
 | 
					            RuntimeOrigin::signed(alice_account_id()),
 | 
				
			||||||
                second_eth_public_key(),
 | 
					            second_eth_public_key(),
 | 
				
			||||||
                second_signature(),
 | 
					            second_signature(),
 | 
				
			||||||
        ));
 | 
					        ));
 | 
				
			||||||
        assert_ok!(Claims::claim(
 | 
					        assert_ok!(Claims::claim(
 | 
				
			||||||
                RuntimeOrigin::signed(alice_account_id()),
 | 
					            RuntimeOrigin::signed(alice_account_id()),
 | 
				
			||||||
                first_eth_public_key(),
 | 
					            first_eth_public_key(),
 | 
				
			||||||
                first_signature(),
 | 
					            first_signature(),
 | 
				
			||||||
        ));
 | 
					        ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert_eq!(Balances::usable_balance(&alice_account_id()), 310);
 | 
					        assert_eq!(Balances::usable_balance(&alice_account_id()), 310);
 | 
				
			||||||
@ -188,11 +191,14 @@ fn multiple_accounts_reverese_claiming_works() {
 | 
				
			|||||||
#[test]
 | 
					#[test]
 | 
				
			||||||
fn cannot_claim_with_bad_signature() {
 | 
					fn cannot_claim_with_bad_signature() {
 | 
				
			||||||
    new_test_ext().execute_with(|| {
 | 
					    new_test_ext().execute_with(|| {
 | 
				
			||||||
        assert_err!(Claims::claim(
 | 
					        assert_err!(
 | 
				
			||||||
 | 
					            Claims::claim(
 | 
				
			||||||
                RuntimeOrigin::signed(alice_account_id()),
 | 
					                RuntimeOrigin::signed(alice_account_id()),
 | 
				
			||||||
                first_eth_public_key(),
 | 
					                first_eth_public_key(),
 | 
				
			||||||
                wrong_signature()),
 | 
					                wrong_signature()
 | 
				
			||||||
                crate::Error::<Test>::InvalidEthereumAddress);
 | 
					            ),
 | 
				
			||||||
 | 
					            crate::Error::<Test>::InvalidEthereumAddress
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert_eq!(Balances::usable_balance(&alice_account_id()), 0);
 | 
					        assert_eq!(Balances::usable_balance(&alice_account_id()), 0);
 | 
				
			||||||
        assert_eq!(Balances::usable_balance(&first_account_id()), 10);
 | 
					        assert_eq!(Balances::usable_balance(&first_account_id()), 10);
 | 
				
			||||||
@ -212,11 +218,14 @@ fn cannot_claim_with_bad_signature() {
 | 
				
			|||||||
#[test]
 | 
					#[test]
 | 
				
			||||||
fn cannot_claim_with_wrong_address() {
 | 
					fn cannot_claim_with_wrong_address() {
 | 
				
			||||||
    new_test_ext().execute_with(|| {
 | 
					    new_test_ext().execute_with(|| {
 | 
				
			||||||
        assert_err!(Claims::claim(
 | 
					        assert_err!(
 | 
				
			||||||
 | 
					            Claims::claim(
 | 
				
			||||||
                RuntimeOrigin::signed(bob_account_id()),
 | 
					                RuntimeOrigin::signed(bob_account_id()),
 | 
				
			||||||
                first_eth_public_key(),
 | 
					                first_eth_public_key(),
 | 
				
			||||||
                first_signature()),
 | 
					                first_signature()
 | 
				
			||||||
                crate::Error::<Test>::InvalidEthereumAddress);
 | 
					            ),
 | 
				
			||||||
 | 
					            crate::Error::<Test>::InvalidEthereumAddress
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert_eq!(Balances::usable_balance(&bob_account_id()), 0);
 | 
					        assert_eq!(Balances::usable_balance(&bob_account_id()), 0);
 | 
				
			||||||
        assert_eq!(Balances::usable_balance(&alice_account_id()), 0);
 | 
					        assert_eq!(Balances::usable_balance(&alice_account_id()), 0);
 | 
				
			||||||
@ -237,11 +246,14 @@ fn cannot_claim_with_wrong_address() {
 | 
				
			|||||||
#[test]
 | 
					#[test]
 | 
				
			||||||
fn cannot_claim_nothing() {
 | 
					fn cannot_claim_nothing() {
 | 
				
			||||||
    new_test_ext().execute_with(|| {
 | 
					    new_test_ext().execute_with(|| {
 | 
				
			||||||
        assert_err!(Claims::claim(
 | 
					        assert_err!(
 | 
				
			||||||
 | 
					            Claims::claim(
 | 
				
			||||||
                RuntimeOrigin::signed(bob_account_id()),
 | 
					                RuntimeOrigin::signed(bob_account_id()),
 | 
				
			||||||
                fourth_eth_public_key(),
 | 
					                fourth_eth_public_key(),
 | 
				
			||||||
                fourth_signature()),
 | 
					                fourth_signature()
 | 
				
			||||||
            crate::Error::<Test>::NoBalanceToClaim);
 | 
					            ),
 | 
				
			||||||
 | 
					            crate::Error::<Test>::NoBalanceToClaim
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
        assert_eq!(Balances::usable_balance(&bob_account_id()), 0);
 | 
					        assert_eq!(Balances::usable_balance(&bob_account_id()), 0);
 | 
				
			||||||
        assert_eq!(Balances::usable_balance(&fourth_account_id()), 0);
 | 
					        assert_eq!(Balances::usable_balance(&fourth_account_id()), 0);
 | 
				
			||||||
        assert_eq!(Vesting::vesting_balance(&bob_account_id()), None);
 | 
					        assert_eq!(Vesting::vesting_balance(&bob_account_id()), None);
 | 
				
			||||||
@ -259,16 +271,15 @@ fn event_emitted_during_claim() {
 | 
				
			|||||||
        System::reset_events();
 | 
					        System::reset_events();
 | 
				
			||||||
        assert_eq!(System::event_count(), 0);
 | 
					        assert_eq!(System::event_count(), 0);
 | 
				
			||||||
        assert_ok!(Claims::claim(
 | 
					        assert_ok!(Claims::claim(
 | 
				
			||||||
                RuntimeOrigin::signed(alice_account_id()),
 | 
					            RuntimeOrigin::signed(alice_account_id()),
 | 
				
			||||||
                third_eth_public_key(),
 | 
					            third_eth_public_key(),
 | 
				
			||||||
                third_signature(),
 | 
					            third_signature(),
 | 
				
			||||||
        ));
 | 
					        ));
 | 
				
			||||||
        System::assert_has_event(RuntimeEvent::Claims(
 | 
					        System::assert_has_event(RuntimeEvent::Claims(crate::Event::Claimed {
 | 
				
			||||||
                crate::Event::Claimed {
 | 
					            receiver: alice_account_id(),
 | 
				
			||||||
                    receiver: alice_account_id(),
 | 
					            donor: account,
 | 
				
			||||||
                    donor: account,
 | 
					            amount,
 | 
				
			||||||
                    amount,
 | 
					            rank,
 | 
				
			||||||
                    rank,
 | 
					        }));
 | 
				
			||||||
                }));
 | 
					 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user