Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

Logic for the (Core) Fellowship #13503

Merged
merged 97 commits into from
Mar 11, 2023
Merged
Show file tree
Hide file tree
Changes from 57 commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
e3a5bb2
More drafting
gavofyork Oct 7, 2022
3ff9ce8
Merge remote-tracking branch 'origin/master' into gav-paymaster
gavofyork Oct 7, 2022
07ab87a
Paymaster pallet
gavofyork Oct 11, 2022
88e11ce
Merge remote-tracking branch 'origin/master' into gav-paymaster
gavofyork Nov 30, 2022
8200850
Merge remote-tracking branch 'origin/master' into gav-paymaster
gavofyork Feb 12, 2023
958d34f
Fix build
gavofyork Feb 13, 2023
91cb1f5
More tests
gavofyork Feb 13, 2023
c53d372
Rename
gavofyork Feb 13, 2023
0806559
Rename
gavofyork Feb 13, 2023
5cadabf
Renaming
gavofyork Feb 13, 2023
712118b
Revert old changes
gavofyork Feb 13, 2023
07b785c
Multi-phase payouts to avoid bank-runs
gavofyork Feb 15, 2023
7fb95d0
Tests
gavofyork Feb 15, 2023
5c38814
Tests
gavofyork Feb 16, 2023
bfdf333
Allow payment to be targeted elsewhere
gavofyork Feb 16, 2023
807a3c9
Proper ssync payment failure handling
gavofyork Feb 16, 2023
cf1f365
Test for repayment
gavofyork Feb 22, 2023
d829078
Docs
gavofyork Feb 22, 2023
7162964
Impl RankedMembers for RankedCollective
gavofyork Feb 26, 2023
2e299f4
Implement Pay for Pot (i.e. basic account).
gavofyork Feb 26, 2023
5995eeb
Benchmarks
gavofyork Feb 26, 2023
c9c2ce8
Weights
gavofyork Feb 26, 2023
16bc55a
Introduce Salary benchmark into node
gavofyork Feb 26, 2023
2fc7fab
Fix warning
gavofyork Feb 26, 2023
575f426
Merge branch 'master' of https://github.com/paritytech/substrate into…
Feb 26, 2023
42a7927
".git/.scripts/commands/bench/bench.sh" pallet dev pallet_salary
Feb 26, 2023
7dc1529
Update primitives/arithmetic/src/traits.rs
gavofyork Feb 27, 2023
366267c
Update frame/salary/src/lib.rs
gavofyork Feb 27, 2023
26f1ab0
Update lib.rs
gavofyork Feb 27, 2023
872a047
Update frame/salary/src/lib.rs
gavofyork Feb 27, 2023
e2fd134
Docs
gavofyork Feb 27, 2023
8d8a5bf
Update frame/salary/src/lib.rs
gavofyork Feb 27, 2023
9849a65
Update frame/salary/src/lib.rs
gavofyork Feb 27, 2023
0b4aafa
Fix
gavofyork Feb 27, 2023
03199ae
Merge branch 'gav-paymaster' of github.com:paritytech/substrate into …
gavofyork Feb 27, 2023
a21b1bc
Fixes
gavofyork Feb 27, 2023
4c85f02
Fixes
gavofyork Feb 27, 2023
d5696c1
Move some salary traits stuff to a shared location
gavofyork Mar 1, 2023
199b1fe
Merge branch 'gav-paymaster' into gav-core-fellowship
gavofyork Mar 1, 2023
caaf99e
Initial draft
gavofyork Mar 1, 2023
3d70833
Comment out bits
gavofyork Mar 2, 2023
ddd4d3e
Fix
gavofyork Mar 2, 2023
26aa188
Merge branch 'gav-paymaster' into gav-core-fellowship
gavofyork Mar 2, 2023
3fcc590
First couple of tests
gavofyork Mar 2, 2023
f60ed83
One more test
gavofyork Mar 2, 2023
3704efe
Update frame/salary/src/lib.rs
gavofyork Mar 3, 2023
93a845d
Update frame/salary/src/lib.rs
gavofyork Mar 3, 2023
2ef3e14
Mul floor
gavofyork Mar 3, 2023
d992c0d
Tests
gavofyork Mar 3, 2023
e5c0733
Mul floor
gavofyork Mar 3, 2023
5d24050
Merge branch 'gav-paymaster' of github.com:paritytech/substrate into …
gavofyork Mar 3, 2023
b3d160e
Fix warnings
gavofyork Mar 3, 2023
b9623a4
Fix test
gavofyork Mar 3, 2023
b051049
Merge branch 'gav-paymaster' into gav-core-fellowship
gavofyork Mar 3, 2023
3580ea2
Tests
gavofyork Mar 3, 2023
31bf7b6
Last tests
gavofyork Mar 3, 2023
c08c010
Docs
gavofyork Mar 3, 2023
8782190
Merge branch 'gav-paymaster' into gav-core-fellowship
gavofyork Mar 3, 2023
a3f2026
Merge branch 'master' into gav-core-fellowship
gavofyork Mar 4, 2023
392c74d
Merge branch 'gav-core-fellowship' of github.com:paritytech/substrate…
gavofyork Mar 4, 2023
6c15f61
Fix warnings
gavofyork Mar 4, 2023
6fec0d2
Merge branch 'master' into gav-core-fellowship
gavofyork Mar 4, 2023
9d947a5
Benchmarks
gavofyork Mar 4, 2023
65f3570
Merge branch 'gav-core-fellowship' of github.com:paritytech/substrate…
gavofyork Mar 4, 2023
10e30b3
Weights
gavofyork Mar 4, 2023
bda6348
Integrate benchmark
gavofyork Mar 4, 2023
47ad52c
Fixes
gavofyork Mar 4, 2023
6752c18
Fix
gavofyork Mar 5, 2023
5b8e221
Merge branch 'master' of https://github.com/paritytech/substrate into…
Mar 5, 2023
3116351
".git/.scripts/commands/bench/bench.sh" pallet dev pallet_core_fellow…
Mar 5, 2023
032f7c1
Better process flow
gavofyork Mar 5, 2023
1f69d45
Fix benchmarks & tests
gavofyork Mar 5, 2023
b1868e0
Docs
gavofyork Mar 5, 2023
ec0f7db
Fixes
gavofyork Mar 5, 2023
59d70c9
Fixes
gavofyork Mar 5, 2023
cdb8022
docs
gavofyork Mar 5, 2023
308510a
".git/.scripts/commands/bench/bench.sh" pallet dev pallet_core_fellow…
Mar 5, 2023
8c60756
Docs and allow custom evidence size
gavofyork Mar 5, 2023
958edf6
Merge branch 'gav-core-fellowship' of github.com:paritytech/substrate…
gavofyork Mar 5, 2023
dd07d0c
".git/.scripts/commands/bench/bench.sh" pallet dev pallet_core_fellow…
Mar 5, 2023
8233b71
Update frame/core-fellowship/src/lib.rs
gavofyork Mar 6, 2023
1261201
Update frame/core-fellowship/src/tests.rs
gavofyork Mar 6, 2023
8e524e9
Update frame/core-fellowship/src/benchmarking.rs
gavofyork Mar 6, 2023
063f1d7
Update frame/core-fellowship/src/benchmarking.rs
gavofyork Mar 6, 2023
76e521b
Apply suggestions from code review
gavofyork Mar 6, 2023
a86c095
Rename
gavofyork Mar 6, 2023
c9de385
Update primitives/arithmetic/src/traits.rs
gavofyork Mar 7, 2023
8684952
Reduce magic numbers
gavofyork Mar 7, 2023
4fc96dd
Merge branch 'gav-core-fellowship' of github.com:paritytech/substrate…
gavofyork Mar 7, 2023
091c6af
Update frame/core-fellowship/src/lib.rs
gavofyork Mar 7, 2023
ecd0c46
Update frame/core-fellowship/src/lib.rs
gavofyork Mar 7, 2023
749f9ac
Benchmark result
gavofyork Mar 7, 2023
122df7c
Merge branch 'gav-core-fellowship' of github.com:paritytech/substrate…
gavofyork Mar 7, 2023
04da40e
Remove dependency
gavofyork Mar 8, 2023
ae5a5e2
set_params should pay
gavofyork Mar 8, 2023
554ac7d
induct should pay
gavofyork Mar 8, 2023
cc9f07c
Remove some other free calls
gavofyork Mar 8, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ members = [
"frame/contracts/proc-macro",
"frame/contracts/primitives",
"frame/conviction-voting",
"frame/core-fellowship",
"frame/democracy",
"frame/fast-unstake",
"frame/try-runtime",
Expand Down
53 changes: 53 additions & 0 deletions frame/core-fellowship/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
[package]
name = "pallet-core-fellowship"
version = "4.0.0-dev"
authors = ["Parity Technologies <admin@parity.io>"]
edition = "2021"
license = "Apache-2.0"
homepage = "https://substrate.io"
repository = "https://github.com/paritytech/substrate/"
description = "Paymaster"
readme = "README.md"

[package.metadata.docs.rs]
targets = ["x86_64-unknown-linux-gnu"]

[dependencies]
codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] }
log = { version = "0.4.16", default-features = false }
scale-info = { version = "2.0.1", default-features = false, features = ["derive"] }
frame-benchmarking = { version = "4.0.0-dev", default-features = false, optional = true, path = "../benchmarking" }
frame-support = { version = "4.0.0-dev", default-features = false, path = "../support" }
frame-system = { version = "4.0.0-dev", default-features = false, path = "../system" }
sp-arithmetic = { version = "6.0.0", default-features = false, path = "../../primitives/arithmetic" }
sp-core = { version = "7.0.0", default-features = false, path = "../../primitives/core" }
sp-io = { version = "7.0.0", default-features = false, path = "../../primitives/io" }
sp-runtime = { version = "7.0.0", default-features = false, path = "../../primitives/runtime" }
sp-std = { version = "5.0.0", default-features = false, path = "../../primitives/std" }

[dev-dependencies]
pallet-ranked-collective = { version = "4.0.0-dev", default-features = false, path = "../ranked-collective" }
pallet-salary = { version = "4.0.0-dev", default-features = false, path = "../salary" }

[features]
default = ["std"]
std = [
"codec/std",
"frame-benchmarking?/std",
"frame-support/std",
"frame-system/std",
"log/std",
"scale-info/std",
"sp-arithmetic/std",
"sp-core/std",
"sp-io/std",
"sp-runtime/std",
"sp-std/std",
]
runtime-benchmarks = [
"frame-benchmarking/runtime-benchmarks",
"frame-support/runtime-benchmarks",
"frame-system/runtime-benchmarks",
"sp-runtime/runtime-benchmarks",
]
try-runtime = ["frame-support/try-runtime"]
3 changes: 3 additions & 0 deletions frame/core-fellowship/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Core Fellowship

Logic specific to the core Polkadot Fellowship.
200 changes: 200 additions & 0 deletions frame/core-fellowship/src/benchmarking.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,200 @@
// This file is part of Substrate.

// Copyright (C) 2020-2022 Parity Technologies (UK) Ltd.
// SPDX-License-Identifier: Apache-2.0

// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

//! Salary pallet benchmarking.

#![cfg(feature = "runtime-benchmarks")]

use super::*;
use crate::Pallet as Salary;

use frame_benchmarking::v2::*;
use frame_system::{Pallet as System, RawOrigin};
use sp_core::Get;

const SEED: u32 = 0;
gavofyork marked this conversation as resolved.
Show resolved Hide resolved

fn ensure_member_with_salary<T: Config<I>, I: 'static>(who: &T::AccountId) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just an FYI in case this wasn't clear (will prob add an additional doc comment clarifying this), but with benchmarking v2, it is completely valid to define a helper function like this, or really any other random code that isn't a benchmark, inside of the benchmarks module i.e. the module that has #[benchmarks] or #[instance_benchmarks] attached to it. It is in every respect a normal module, that just happens to also have some #[benchmark]-marked functions in it.

// induct if not a member.
if T::Members::rank_of(who).is_none() {
T::Members::induct(who).unwrap();
}
// promote until they have a salary.
for _ in 0..255 {
let r = T::Members::rank_of(who).expect("prior guard ensures `who` is a member; qed");
if !T::Salary::get_salary(r, &who).is_zero() {
break
}
T::Members::promote(who).unwrap();
}
}

/*
// move to benchmark code. No need for it here.
impl<
Balance: BalanceTrait,
BlockNumber: AtLeast32BitUnsigned + Copy,
> Default for ParamsType<Balance, BlockNumber> {
fn default() -> Self {
Self {
active_salary: [100u32.into(); 9],
passive_salary: [10u32.into(); 9],
demotion_period: [100u32.into(); 9],
min_promotion_period: [100u32.into(); 9],
}
}
}
*/

#[instance_benchmarks]
mod benchmarks {
use super::*;

#[benchmark]
fn init() {
let caller: T::AccountId = whitelisted_caller();

#[extrinsic_call]
_(RawOrigin::Signed(caller.clone()));

assert!(Salary::<T, I>::status().is_some());
}

#[benchmark]
fn bump() {
let caller: T::AccountId = whitelisted_caller();
Salary::<T, I>::init(RawOrigin::Signed(caller.clone()).into()).unwrap();
System::<T>::set_block_number(System::<T>::block_number() + Salary::<T, I>::cycle_period());

#[extrinsic_call]
_(RawOrigin::Signed(caller.clone()));

assert_eq!(Salary::<T, I>::status().unwrap().cycle_index, 1u32.into());
}

#[benchmark]
fn induct() {
let caller = whitelisted_caller();
ensure_member_with_salary::<T, I>(&caller);
Salary::<T, I>::init(RawOrigin::Signed(caller.clone()).into()).unwrap();

#[extrinsic_call]
_(RawOrigin::Signed(caller.clone()));

assert!(Salary::<T, I>::last_active(&caller).is_ok());
}

#[benchmark]
fn register() {
let caller = whitelisted_caller();
ensure_member_with_salary::<T, I>(&caller);
Salary::<T, I>::init(RawOrigin::Signed(caller.clone()).into()).unwrap();
Salary::<T, I>::induct(RawOrigin::Signed(caller.clone()).into()).unwrap();
System::<T>::set_block_number(System::<T>::block_number() + Salary::<T, I>::cycle_period());
Salary::<T, I>::bump(RawOrigin::Signed(caller.clone()).into()).unwrap();

#[extrinsic_call]
_(RawOrigin::Signed(caller.clone()));

assert_eq!(Salary::<T, I>::last_active(&caller).unwrap(), 1u32.into());
}

#[benchmark]
fn payout() {
let caller = whitelisted_caller();
ensure_member_with_salary::<T, I>(&caller);
Salary::<T, I>::init(RawOrigin::Signed(caller.clone()).into()).unwrap();
Salary::<T, I>::induct(RawOrigin::Signed(caller.clone()).into()).unwrap();
System::<T>::set_block_number(System::<T>::block_number() + Salary::<T, I>::cycle_period());
Salary::<T, I>::bump(RawOrigin::Signed(caller.clone()).into()).unwrap();
System::<T>::set_block_number(System::<T>::block_number() + T::RegistrationPeriod::get());

let salary = T::Salary::get_salary(T::Members::rank_of(&caller).unwrap(), &caller);
T::Paymaster::ensure_successful(&caller, salary);

#[extrinsic_call]
_(RawOrigin::Signed(caller.clone()));

match Claimant::<T, I>::get(&caller) {
Some(ClaimantStatus { last_active, status: Attempted { id, .. } }) => {
assert_eq!(last_active, 1u32.into());
assert_ne!(T::Paymaster::check_payment(id), PaymentStatus::Failure);
},
_ => panic!("No claim made"),
}
assert!(Salary::<T, I>::payout(RawOrigin::Signed(caller.clone()).into()).is_err());
}

#[benchmark]
fn payout_other() {
let caller = whitelisted_caller();
ensure_member_with_salary::<T, I>(&caller);
Salary::<T, I>::init(RawOrigin::Signed(caller.clone()).into()).unwrap();
Salary::<T, I>::induct(RawOrigin::Signed(caller.clone()).into()).unwrap();
System::<T>::set_block_number(System::<T>::block_number() + Salary::<T, I>::cycle_period());
Salary::<T, I>::bump(RawOrigin::Signed(caller.clone()).into()).unwrap();
System::<T>::set_block_number(System::<T>::block_number() + T::RegistrationPeriod::get());

let salary = T::Salary::get_salary(T::Members::rank_of(&caller).unwrap(), &caller);
let recipient: T::AccountId = account("recipient", 0, SEED);
T::Paymaster::ensure_successful(&recipient, salary);

#[extrinsic_call]
_(RawOrigin::Signed(caller.clone()), recipient.clone());

match Claimant::<T, I>::get(&caller) {
Some(ClaimantStatus { last_active, status: Attempted { id, .. } }) => {
assert_eq!(last_active, 1u32.into());
assert_ne!(T::Paymaster::check_payment(id), PaymentStatus::Failure);
},
_ => panic!("No claim made"),
}
assert!(Salary::<T, I>::payout(RawOrigin::Signed(caller.clone()).into()).is_err());
}

#[benchmark]
fn check_payment() {
let caller = whitelisted_caller();
ensure_member_with_salary::<T, I>(&caller);
Salary::<T, I>::init(RawOrigin::Signed(caller.clone()).into()).unwrap();
Salary::<T, I>::induct(RawOrigin::Signed(caller.clone()).into()).unwrap();
System::<T>::set_block_number(System::<T>::block_number() + Salary::<T, I>::cycle_period());
Salary::<T, I>::bump(RawOrigin::Signed(caller.clone()).into()).unwrap();
System::<T>::set_block_number(System::<T>::block_number() + T::RegistrationPeriod::get());

let salary = T::Salary::get_salary(T::Members::rank_of(&caller).unwrap(), &caller);
let recipient: T::AccountId = account("recipient", 0, SEED);
T::Paymaster::ensure_successful(&recipient, salary);
Salary::<T, I>::payout(RawOrigin::Signed(caller.clone()).into()).unwrap();
let id = match Claimant::<T, I>::get(&caller).unwrap().status {
Attempted { id, .. } => id,
_ => panic!("No claim made"),
};
T::Paymaster::ensure_concluded(id);

#[extrinsic_call]
_(RawOrigin::Signed(caller.clone()));

assert!(!matches!(Claimant::<T, I>::get(&caller).unwrap().status, Attempted { .. }));
}

impl_benchmark_test_suite! {
Salary,
crate::tests::new_test_ext(),
crate::tests::Test,
}
}
Loading