Unverified Commit 185384a8 authored by Nikolay Volf's avatar Nikolay Volf Committed by GitHub
Browse files

Update to latest substrate master (#853)



* try to update

* latest updates

* final fixes

* Fix claim w/ vesting logic

* Make claim tests a bit better
Co-authored-by: Shawn Tabrizi's avatarShawn Tabrizi <shawntabrizi@gmail.com>
parent 4e4a9778
Pipeline #79684 passed with stages
in 23 minutes and 15 seconds
This diff is collapsed.
...@@ -4,7 +4,7 @@ path = "src/main.rs" ...@@ -4,7 +4,7 @@ path = "src/main.rs"
[package] [package]
name = "polkadot" name = "polkadot"
version = "0.7.20" version = "0.7.21"
authors = ["Parity Technologies <admin@parity.io>"] authors = ["Parity Technologies <admin@parity.io>"]
build = "build.rs" build = "build.rs"
edition = "2018" edition = "2018"
......
[package] [package]
name = "polkadot-availability-store" name = "polkadot-availability-store"
description = "Persistent database for parachain data" description = "Persistent database for parachain data"
version = "0.7.20" version = "0.7.21"
authors = ["Parity Technologies <admin@parity.io>"] authors = ["Parity Technologies <admin@parity.io>"]
edition = "2018" edition = "2018"
......
...@@ -647,7 +647,7 @@ impl<I, P> BlockImport<Block> for AvailabilityBlockImport<I, P> where ...@@ -647,7 +647,7 @@ impl<I, P> BlockImport<Block> for AvailabilityBlockImport<I, P> where
target: LOG_TARGET, target: LOG_TARGET,
"Importing block #{}, ({})", "Importing block #{}, ({})",
block.header.number(), block.header.number(),
block.post_header().hash() block.post_hash(),
); );
if let Some(ref extrinsics) = block.body { if let Some(ref extrinsics) = block.body {
......
[package] [package]
name = "polkadot-cli" name = "polkadot-cli"
version = "0.7.20" version = "0.7.21"
authors = ["Parity Technologies <admin@parity.io>"] authors = ["Parity Technologies <admin@parity.io>"]
description = "Polkadot node implementation in Rust." description = "Polkadot node implementation in Rust."
edition = "2018" edition = "2018"
......
[package] [package]
name = "polkadot-collator" name = "polkadot-collator"
version = "0.7.20" version = "0.7.21"
authors = ["Parity Technologies <admin@parity.io>"] authors = ["Parity Technologies <admin@parity.io>"]
description = "Collator node implementation" description = "Collator node implementation"
edition = "2018" edition = "2018"
......
[package] [package]
name = "polkadot-erasure-coding" name = "polkadot-erasure-coding"
version = "0.7.20" version = "0.7.21"
authors = ["Parity Technologies <admin@parity.io>"] authors = ["Parity Technologies <admin@parity.io>"]
edition = "2018" edition = "2018"
......
[package] [package]
name = "polkadot-network" name = "polkadot-network"
version = "0.7.20" version = "0.7.21"
authors = ["Parity Technologies <admin@parity.io>"] authors = ["Parity Technologies <admin@parity.io>"]
description = "Polkadot-specific networking protocol" description = "Polkadot-specific networking protocol"
edition = "2018" edition = "2018"
......
...@@ -283,11 +283,19 @@ pub fn register_validator<C: ChainContext + 'static, S: NetworkSpecialization<Bl ...@@ -283,11 +283,19 @@ pub fn register_validator<C: ChainContext + 'static, S: NetworkSpecialization<Bl
let gossip_side = validator.clone(); let gossip_side = validator.clone();
let gossip_engine = sc_network_gossip::GossipEngine::new( let gossip_engine = sc_network_gossip::GossipEngine::new(
service.clone(), service.clone(),
executor,
POLKADOT_ENGINE_ID, POLKADOT_ENGINE_ID,
gossip_side, gossip_side,
); );
// Ideally this would not be spawned as an orphaned task, but polled by
// `RegisteredMessageValidator` which in turn would be polled by a `ValidationNetwork`.
let spawn_res = executor.spawn_obj(futures::task::FutureObj::from(Box::new(gossip_engine.clone())));
// Note: we consider the chances of an error to spawn a background task almost null.
if spawn_res.is_err() {
log::error!(target: "polkadot-gossip", "Failed to spawn background task");
}
RegisteredMessageValidator { RegisteredMessageValidator {
inner: validator as _, inner: validator as _,
service: Some(service), service: Some(service),
......
[package] [package]
name = "polkadot-parachain" name = "polkadot-parachain"
version = "0.7.20" version = "0.7.21"
authors = ["Parity Technologies <admin@parity.io>"] authors = ["Parity Technologies <admin@parity.io>"]
description = "Types and utilities for creating and working with parachains" description = "Types and utilities for creating and working with parachains"
edition = "2018" edition = "2018"
......
[package] [package]
name = "polkadot-primitives" name = "polkadot-primitives"
version = "0.7.20" version = "0.7.21"
authors = ["Parity Technologies <admin@parity.io>"] authors = ["Parity Technologies <admin@parity.io>"]
edition = "2018" edition = "2018"
......
[package] [package]
name = "polkadot-rpc" name = "polkadot-rpc"
version = "0.7.20" version = "0.7.21"
authors = ["Parity Technologies <admin@parity.io>"] authors = ["Parity Technologies <admin@parity.io>"]
edition = "2018" edition = "2018"
......
[package] [package]
name = "polkadot-runtime-common" name = "polkadot-runtime-common"
version = "0.7.20" version = "0.7.21"
authors = ["Parity Technologies <admin@parity.io>"] authors = ["Parity Technologies <admin@parity.io>"]
edition = "2018" edition = "2018"
......
...@@ -125,14 +125,14 @@ decl_module! { ...@@ -125,14 +125,14 @@ decl_module! {
/// Provide candidate receipts for parachains, in ascending order by id. /// Provide candidate receipts for parachains, in ascending order by id.
fn more_attestations(origin, _more: MoreAttestations) -> DispatchResult { fn more_attestations(origin, _more: MoreAttestations) -> DispatchResult {
ensure_none(origin)?; ensure_none(origin)?;
ensure!(!<DidUpdate>::exists(), Error::<T>::TooManyAttestations); ensure!(!DidUpdate::exists(), Error::<T>::TooManyAttestations);
<DidUpdate>::put(true); DidUpdate::put(true);
Ok(()) Ok(())
} }
fn on_finalize(_n: T::BlockNumber) { fn on_finalize(_n: T::BlockNumber) {
<DidUpdate>::kill(); DidUpdate::kill();
} }
} }
} }
......
...@@ -18,8 +18,8 @@ ...@@ -18,8 +18,8 @@
use rstd::prelude::*; use rstd::prelude::*;
use sp_io::{hashing::keccak_256, crypto::secp256k1_ecdsa_recover}; use sp_io::{hashing::keccak_256, crypto::secp256k1_ecdsa_recover};
use frame_support::{decl_event, decl_storage, decl_module, decl_error, ensure}; use frame_support::{decl_event, decl_storage, decl_module, decl_error};
use frame_support::{dispatch::DispatchResult, weights::SimpleDispatchInfo}; use frame_support::weights::SimpleDispatchInfo;
use frame_support::traits::{Currency, Get, VestingSchedule}; use frame_support::traits::{Currency, Get, VestingSchedule};
use system::{ensure_root, ensure_none}; use system::{ensure_root, ensure_none};
use codec::{Encode, Decode}; use codec::{Encode, Decode};
...@@ -161,31 +161,18 @@ decl_module! { ...@@ -161,31 +161,18 @@ decl_module! {
let balance_due = <Claims<T>>::get(&signer) let balance_due = <Claims<T>>::get(&signer)
.ok_or(Error::<T>::SignerHasNoClaim)?; .ok_or(Error::<T>::SignerHasNoClaim)?;
let maybe_vested = <Vesting<T>>::get(&signer); let new_total = Self::total().checked_sub(&balance_due).ok_or(Error::<T>::PotUnderflow)?;
// If this fails, destination account already has a vesting schedule
// applied to it, and this claim should not be processed.
ensure!(
maybe_vested.is_none() || T::VestingSchedule::vesting_balance(&dest).is_zero(),
Error::<T>::DestinationVesting
);
<Total<T>>::mutate(|t| -> DispatchResult {
*t = t.checked_sub(&balance_due).ok_or(Error::<T>::PotUnderflow)?;
Ok(())
})?;
// This must happen before the add_vesting_schedule otherwise the schedule will be
// nullified.
CurrencyOf::<T>::deposit_creating(&dest, balance_due);
// Check if this claim should have a vesting schedule. // Check if this claim should have a vesting schedule.
if let Some(vs) = maybe_vested { if let Some(vs) = <Vesting<T>>::get(&signer) {
// Should never fail since we ensured that the destination is not already vesting. // If this fails, destination account already has a vesting schedule
// However, we already deposited, so can't error out here anyway. // applied to it, and this claim should not be processed.
let _ = T::VestingSchedule::add_vesting_schedule(&dest, vs.0, vs.1, vs.2); T::VestingSchedule::add_vesting_schedule(&dest, vs.0, vs.1, vs.2)
.map_err(|_| Error::<T>::DestinationVesting)?;
} }
CurrencyOf::<T>::deposit_creating(&dest, balance_due);
<Total<T>>::put(new_total);
<Claims<T>>::remove(&signer); <Claims<T>>::remove(&signer);
<Vesting<T>>::remove(&signer); <Vesting<T>>::remove(&signer);
...@@ -268,7 +255,7 @@ impl<T: Trait> sp_runtime::traits::ValidateUnsigned for Module<T> { ...@@ -268,7 +255,7 @@ impl<T: Trait> sp_runtime::traits::ValidateUnsigned for Module<T> {
).into(); ).into();
}; };
if !<Claims<T>>::exists(&signer) { if !<Claims<T>>::contains_key(&signer) {
return Err(InvalidTransaction::Custom( return Err(InvalidTransaction::Custom(
ValidityError::SignerHasNoClaim.into(), ValidityError::SignerHasNoClaim.into(),
).into()); ).into());
...@@ -335,6 +322,9 @@ mod tests { ...@@ -335,6 +322,9 @@ mod tests {
type AvailableBlockRatio = AvailableBlockRatio; type AvailableBlockRatio = AvailableBlockRatio;
type Version = (); type Version = ();
type ModuleToIndex = (); type ModuleToIndex = ();
type AccountData = balances::AccountData<u64>;
type OnNewAccount = ();
type OnReapAccount = Balances;
} }
parameter_types! { parameter_types! {
...@@ -344,13 +334,10 @@ mod tests { ...@@ -344,13 +334,10 @@ mod tests {
impl balances::Trait for Test { impl balances::Trait for Test {
type Balance = u64; type Balance = u64;
type OnReapAccount = System;
type OnNewAccount = ();
type TransferPayment = ();
type DustRemoval = ();
type Event = (); type Event = ();
type DustRemoval = ();
type ExistentialDeposit = ExistentialDeposit; type ExistentialDeposit = ExistentialDeposit;
type CreationFee = CreationFee; type AccountStore = System;
} }
impl vesting::Trait for Test { impl vesting::Trait for Test {
...@@ -431,10 +418,11 @@ mod tests { ...@@ -431,10 +418,11 @@ mod tests {
#[test] #[test]
fn claiming_works() { fn claiming_works() {
new_test_ext().execute_with(|| { new_test_ext().execute_with(|| {
assert_eq!(Balances::free_balance(&42), 0); assert_eq!(Balances::free_balance(42), 0);
assert_ok!(Claims::claim(Origin::NONE, 42, sig(&alice(), &42u64.encode()))); assert_ok!(Claims::claim(Origin::NONE, 42, sig(&alice(), &42u64.encode())));
assert_eq!(Balances::free_balance(&42), 100); assert_eq!(Balances::free_balance(&42), 100);
assert_eq!(Vesting::vesting_balance(&42), 50); assert_eq!(Vesting::vesting_balance(&42), 50);
assert_eq!(Claims::total(), 0);
}); });
} }
...@@ -445,15 +433,17 @@ mod tests { ...@@ -445,15 +433,17 @@ mod tests {
Claims::mint_claim(Origin::signed(42), eth(&bob()), 200, None), Claims::mint_claim(Origin::signed(42), eth(&bob()), 200, None),
sp_runtime::traits::BadOrigin, sp_runtime::traits::BadOrigin,
); );
assert_eq!(Balances::free_balance(&42), 0); assert_eq!(Balances::free_balance(42), 0);
assert_noop!( assert_noop!(
Claims::claim(Origin::NONE, 69, sig(&bob(), &69u64.encode())), Claims::claim(Origin::NONE, 69, sig(&bob(), &69u64.encode())),
Error::<Test>::SignerHasNoClaim Error::<Test>::SignerHasNoClaim
); );
assert_ok!(Claims::mint_claim(Origin::ROOT, eth(&bob()), 200, None)); assert_ok!(Claims::mint_claim(Origin::ROOT, eth(&bob()), 200, None));
assert_eq!(Claims::total(), 300);
assert_ok!(Claims::claim(Origin::NONE, 69, sig(&bob(), &69u64.encode()))); assert_ok!(Claims::claim(Origin::NONE, 69, sig(&bob(), &69u64.encode())));
assert_eq!(Balances::free_balance(69), 200); assert_eq!(Balances::free_balance(&69), 200);
assert_eq!(Vesting::vesting_balance(&69), 0); assert_eq!(Vesting::vesting_balance(&69), 0);
assert_eq!(Claims::total(), 100);
}); });
} }
...@@ -471,7 +461,7 @@ mod tests { ...@@ -471,7 +461,7 @@ mod tests {
); );
assert_ok!(Claims::mint_claim(Origin::ROOT, eth(&bob()), 200, Some((50, 10, 1)))); assert_ok!(Claims::mint_claim(Origin::ROOT, eth(&bob()), 200, Some((50, 10, 1))));
assert_ok!(Claims::claim(Origin::NONE, 69, sig(&bob(), &69u64.encode()))); assert_ok!(Claims::claim(Origin::NONE, 69, sig(&bob(), &69u64.encode())));
assert_eq!(Balances::free_balance(69), 200); assert_eq!(Balances::free_balance(&69), 200);
assert_eq!(Vesting::vesting_balance(&69), 50); assert_eq!(Vesting::vesting_balance(&69), 50);
}); });
} }
...@@ -499,6 +489,30 @@ mod tests { ...@@ -499,6 +489,30 @@ mod tests {
}); });
} }
#[test]
fn claiming_while_vested_doesnt_work() {
new_test_ext().execute_with(|| {
assert_eq!(Claims::total(), 100);
// A user is already vested
assert_ok!(<Test as Trait>::VestingSchedule::add_vesting_schedule(&69, 1000, 100, 10));
CurrencyOf::<Test>::make_free_balance_be(&69, 1000);
assert_eq!(Balances::free_balance(69), 1000);
assert_ok!(Claims::mint_claim(Origin::ROOT, eth(&bob()), 200, Some((50, 10, 1))));
// New total
assert_eq!(Claims::total(), 300);
// They should not be able to claim
assert_noop!(
Claims::claim(Origin::NONE, 69, sig(&bob(), &69u64.encode())),
Error::<Test>::DestinationVesting
);
// Everything should be unchanged
assert_eq!(Claims::total(), 300);
assert_eq!(Balances::free_balance(69), 1000);
assert_eq!(Vesting::vesting_balance(&69), 1000);
});
}
#[test] #[test]
fn non_sender_sig_doesnt_work() { fn non_sender_sig_doesnt_work() {
new_test_ext().execute_with(|| { new_test_ext().execute_with(|| {
......
...@@ -614,20 +614,19 @@ mod tests { ...@@ -614,20 +614,19 @@ mod tests {
type AvailableBlockRatio = AvailableBlockRatio; type AvailableBlockRatio = AvailableBlockRatio;
type Version = (); type Version = ();
type ModuleToIndex = (); type ModuleToIndex = ();
type AccountData = balances::AccountData<u64>;
type OnNewAccount = ();
type OnReapAccount = Balances;
} }
parameter_types! { parameter_types! {
pub const ExistentialDeposit: u64 = 1; pub const ExistentialDeposit: u64 = 1;
pub const CreationFee: u64 = 0;
} }
impl balances::Trait for Test { impl balances::Trait for Test {
type Balance = u64; type Balance = u64;
type OnReapAccount = System;
type OnNewAccount = ();
type TransferPayment = ();
type DustRemoval = ();
type Event = (); type Event = ();
type DustRemoval = ();
type ExistentialDeposit = ExistentialDeposit; type ExistentialDeposit = ExistentialDeposit;
type CreationFee = CreationFee; type AccountStore = System;
} }
parameter_types! { parameter_types! {
......
...@@ -274,7 +274,7 @@ decl_module! { ...@@ -274,7 +274,7 @@ decl_module! {
Self::update_routing( Self::update_routing(
&heads, &heads,
); );
Self::dispatch_upward_messages( Self::dispatch_upward_messages(
MAX_QUEUE_COUNT, MAX_QUEUE_COUNT,
WATERMARK_QUEUE_SIZE, WATERMARK_QUEUE_SIZE,
...@@ -889,6 +889,9 @@ mod tests { ...@@ -889,6 +889,9 @@ mod tests {
type AvailableBlockRatio = AvailableBlockRatio; type AvailableBlockRatio = AvailableBlockRatio;
type Version = (); type Version = ();
type ModuleToIndex = (); type ModuleToIndex = ();
type AccountData = balances::AccountData<u128>;
type OnNewAccount = ();
type OnReapAccount = ();
} }
parameter_types! { parameter_types! {
...@@ -945,18 +948,14 @@ mod tests { ...@@ -945,18 +948,14 @@ mod tests {
parameter_types! { parameter_types! {
pub const ExistentialDeposit: Balance = 1; pub const ExistentialDeposit: Balance = 1;
pub const CreationFee: Balance = 0;
} }
impl balances::Trait for Test { impl balances::Trait for Test {
type Balance = Balance; type Balance = u128;
type OnReapAccount = System;
type OnNewAccount = ();
type Event = ();
type DustRemoval = (); type DustRemoval = ();
type Event = ();
type ExistentialDeposit = ExistentialDeposit; type ExistentialDeposit = ExistentialDeposit;
type TransferPayment = (); type AccountStore = System;
type CreationFee = CreationFee;
} }
pallet_staking_reward_curve::build! { pallet_staking_reward_curve::build! {
......
...@@ -89,8 +89,7 @@ impl<T: Trait> Registrar<T::AccountId> for Module<T> { ...@@ -89,8 +89,7 @@ impl<T: Trait> Registrar<T::AccountId> for Module<T> {
code: Vec<u8>, code: Vec<u8>,
initial_head_data: Vec<u8>, initial_head_data: Vec<u8>,
) -> DispatchResult { ) -> DispatchResult {
ensure!(!Paras::exists(id), Error::<T>::ParaAlreadyExists); ensure!(!Paras::contains_key(id), Error::<T>::ParaAlreadyExists);
if let Scheduling::Always = info.scheduling { if let Scheduling::Always = info.scheduling {
Parachains::mutate(|parachains| Parachains::mutate(|parachains|
match parachains.binary_search(&id) { match parachains.binary_search(&id) {
...@@ -703,22 +702,21 @@ mod tests { ...@@ -703,22 +702,21 @@ mod tests {
type AvailableBlockRatio = AvailableBlockRatio; type AvailableBlockRatio = AvailableBlockRatio;
type Version = (); type Version = ();
type ModuleToIndex = (); type ModuleToIndex = ();
type AccountData = balances::AccountData<u128>;
type OnNewAccount = ();
type OnReapAccount = Balances;
} }
parameter_types! { parameter_types! {
pub const ExistentialDeposit: Balance = 1; pub const ExistentialDeposit: Balance = 1;
pub const CreationFee: Balance = 0;
} }
impl balances::Trait for Test { impl balances::Trait for Test {
type OnNewAccount = (); type Balance = u128;
type OnReapAccount = System;
type Balance = Balance;
type Event = ();
type DustRemoval = (); type DustRemoval = ();
type Event = ();
type ExistentialDeposit = ExistentialDeposit; type ExistentialDeposit = ExistentialDeposit;
type TransferPayment = (); type AccountStore = System;
type CreationFee = CreationFee;
} }
parameter_types!{ parameter_types!{
......
...@@ -189,7 +189,7 @@ decl_storage! { ...@@ -189,7 +189,7 @@ decl_storage! {
impl<T: Trait> SwapAux for Module<T> { impl<T: Trait> SwapAux for Module<T> {
fn ensure_can_swap(one: ParaId, other: ParaId) -> Result<(), &'static str> { fn ensure_can_swap(one: ParaId, other: ParaId) -> Result<(), &'static str> {
if <Onboarding<T>>::exists(one) || <Onboarding<T>>::exists(other) { if <Onboarding<T>>::contains_key(one) || <Onboarding<T>>::contains_key(other) {
Err("can't swap an undeployed parachain")? Err("can't swap an undeployed parachain")?
} }
Ok(()) Ok(())
...@@ -292,7 +292,7 @@ decl_module! { ...@@ -292,7 +292,7 @@ decl_module! {
// winner information is duplicated from the previous block in case no bids happened // winner information is duplicated from the previous block in case no bids happened
// in this block. // in this block.
if let Some(offset) = Self::is_ending(now) { if let Some(offset) = Self::is_ending(now) {
if !<Winning<T>>::exists(&offset) { if !<Winning<T>>::contains_key(&offset) {
<Winning<T>>::insert(offset, <Winning<T>>::insert(offset,
offset.checked_sub(&One::one()) offset.checked_sub(&One::one())
.and_then(<Winning<T>>::get) .and_then(<Winning<T>>::get)
...@@ -915,22 +915,21 @@ mod tests { ...@@ -915,22 +915,21 @@ mod tests {
type AvailableBlockRatio = AvailableBlockRatio; type AvailableBlockRatio = AvailableBlockRatio;
type Version = (); type Version = ();
type ModuleToIndex = (); type ModuleToIndex = ();
type AccountData = balances::AccountData<u64>;
type OnNewAccount = ();