Skip to content
This repository was archived by the owner on Feb 21, 2024. It is now read-only.

Commit 1e3f36d

Browse files
authored
Merge pull request paritytech#104 from subspace/pallet-vesting
Pallet vesting
2 parents a44aa57 + 415a2ae commit 1e3f36d

File tree

5 files changed

+177
-60
lines changed

5 files changed

+177
-60
lines changed

Cargo.lock

Lines changed: 21 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/subspace-node/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ sc-service = { version = "0.10.0-dev", git = "https://github.com/paritytech/subs
3232
sc-telemetry = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", rev = "bf9683eee40f82cc4e01a05cd375b0e8bba3c8ef" }
3333
sc-transaction-pool = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", rev = "bf9683eee40f82cc4e01a05cd375b0e8bba3c8ef" }
3434
sc-transaction-pool-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", rev = "bf9683eee40f82cc4e01a05cd375b0e8bba3c8ef" }
35+
serde_json = "1.0.68"
3536
sp-api = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", rev = "bf9683eee40f82cc4e01a05cd375b0e8bba3c8ef" }
3637
sp-authorship = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", rev = "bf9683eee40f82cc4e01a05cd375b0e8bba3c8ef" }
3738
sp-blockchain = { version = "4.0.0-dev", git = "https://github.com/paritytech/substrate", rev = "bf9683eee40f82cc4e01a05cd375b0e8bba3c8ef" }

crates/subspace-node/src/chain_spec.rs

Lines changed: 124 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,46 @@
1414
// You should have received a copy of the GNU General Public License
1515
// along with this program. If not, see <https://www.gnu.org/licenses/>.
1616

17-
use sc_service::ChainType;
17+
use sc_service::{ChainType, Properties};
1818
use sc_telemetry::TelemetryEndpoints;
19+
use sp_core::crypto::Ss58Codec;
1920
use sp_core::{sr25519, Pair, Public};
2021
use sp_runtime::traits::{IdentifyAccount, Verify};
2122
use subspace_runtime::{
22-
AccountId, BalancesConfig, GenesisConfig, Signature, SubspaceConfig, SudoConfig, SystemConfig,
23-
WASM_BINARY,
23+
AccountId, Balance, BalancesConfig, BlockNumber, GenesisConfig, Signature, SubspaceConfig,
24+
SudoConfig, SystemConfig, VestingConfig, MILLISECS_PER_BLOCK, SSC, WASM_BINARY,
2425
};
2526

2627
// The URL for the telemetry server.
2728
const POLKADOT_TELEMETRY_URL: &str = "wss://telemetry.polkadot.io/submit/";
2829

30+
/// List of accounts which should receive token grants, amounts are specified in SSC.
31+
const TOKEN_GRANTS: &[(&str, u128)] = &[
32+
(
33+
"5Dns1SVEeDqnbSm2fVUqHJPCvQFXHVsgiw28uMBwmuaoKFYi",
34+
3_000_000,
35+
),
36+
(
37+
"5DxtHHQL9JGapWCQARYUAWj4yDcwuhg9Hsk5AjhEzuzonVyE",
38+
1_500_000,
39+
),
40+
("5EHhw9xuQNdwieUkNoucq2YcateoMVJQdN8EZtmRy3roQkVK", 133_333),
41+
("5C5qYYCQBnanGNPGwgmv6jiR2MxNPrGnWYLPFEyV1Xdy2P3x", 178_889),
42+
("5GBWVfJ253YWVPHzWDTos1nzYZpa9TemP7FpQT9RnxaFN6Sz", 350_000),
43+
("5F9tEPid88uAuGbjpyegwkrGdkXXtaQ9sGSWEnYrfVCUCsen", 111_111),
44+
("5DkJFCv3cTBsH5y1eFT94DXMxQ3EmVzYojEA88o56mmTKnMp", 244_444),
45+
("5G23o1yxWgVNQJuL4Y9UaCftAFvLuMPCRe7BCARxCohjoHc9", 311_111),
46+
("5GhHwuJoK1b7uUg5oi8qUXxWHdfgzv6P5CQSdJ3ffrnPRgKM", 317_378),
47+
("5EqBwtqrCV427xCtTsxnb9X2Qay39pYmKNk9wD9Kd62jLS97", 300_000),
48+
("5D9pNnGCiZ9UqhBQn5n71WFVaRLvZ7znsMvcZ7PHno4zsiYa", 600_000),
49+
("5DXfPcXUcP4BG8LBSkJDrfFNApxjWySR6ARfgh3v27hdYr5S", 430_000),
50+
("5CXSdDJgzRTj54f9raHN2Z5BNPSMa2ETjqCTUmpaw3ECmwm4", 330_000),
51+
("5DqKxL7bQregQmUfFgzTMfRKY4DSvA1KgHuurZWYmxYSCmjY", 200_000),
52+
("5CfixiS93yTwHQbzzfn8P2tMxhKXdTx7Jam9htsD7XtiMFtn", 27_800),
53+
("5FZe9YzXeEXe7sK5xLR8yCmbU8bPJDTZpNpNbToKvSJBUiEo", 18_067),
54+
("5FZwEgsvZz1vpeH7UsskmNmTpbfXvAcojjgVfShgbRqgC1nx", 27_800),
55+
];
56+
2957
/// Specialized `ChainSpec`. This is a specialization of the general Substrate ChainSpec type.
3058
pub type ChainSpec = sc_service::GenericChainSpec<GenesisConfig>;
3159

@@ -39,11 +67,8 @@ pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Pu
3967
type AccountPublic = <Signature as Verify>::Signer;
4068

4169
/// Generate an account ID from seed.
42-
pub fn get_account_id_from_seed<TPublic: Public>(seed: &str) -> AccountId
43-
where
44-
AccountPublic: From<<TPublic::Pair as Pair>::Public>,
45-
{
46-
AccountPublic::from(get_from_seed::<TPublic>(seed)).into_account()
70+
pub fn get_account_id_from_seed(seed: &str) -> AccountId {
71+
AccountPublic::from(get_from_seed::<sr25519::Public>(seed)).into_account()
4772
}
4873

4974
pub fn testnet_config() -> Result<ChainSpec, String> {
@@ -53,19 +78,59 @@ pub fn testnet_config() -> Result<ChainSpec, String> {
5378
// ID
5479
"subspace_test",
5580
ChainType::Custom("Subspace testnet".to_string()),
56-
// TODO: Provide a way for farmer to start with these accounts
5781
|| {
58-
testnet_genesis(
82+
let sudo_account =
83+
AccountId::from_ss58check("5CXTmJEusve5ixyJufqHThmy4qUrrm6FyLCR7QfE4bbyMTNC")
84+
.expect("Wrong root account address");
85+
86+
// Pre-funded accounts
87+
// TODO: Remove these later, this is just for testing
88+
let mut balances = vec![
89+
(sudo_account.clone(), 1_000 * SSC),
90+
(get_account_id_from_seed("Alice"), 1_000 * SSC),
91+
(get_account_id_from_seed("Bob"), 1_000 * SSC),
92+
];
93+
let vesting_schedules = TOKEN_GRANTS
94+
.iter()
95+
.flat_map(|&(account_address, amount)| {
96+
let account_id = AccountId::from_ss58check(account_address)
97+
.expect("Wrong vesting account address");
98+
let amount: Balance = amount * SSC;
99+
100+
// TODO: Adjust start block to real value before mainnet launch
101+
let start_block = 100_000_000;
102+
let one_month_in_blocks =
103+
u32::try_from(3600 * 24 * 30 * MILLISECS_PER_BLOCK / 1000)
104+
.expect("One month of blocks always fits in u32; qed");
105+
106+
// Add balance so it can be locked
107+
balances.push((account_id.clone(), amount));
108+
109+
[
110+
// 1/4 of tokens are released after 1 year.
111+
(
112+
account_id.clone(),
113+
start_block,
114+
one_month_in_blocks * 12,
115+
1,
116+
amount / 4,
117+
),
118+
// 1/48 of tokens are released every month after that for 3 more years.
119+
(
120+
account_id,
121+
start_block + one_month_in_blocks * 12,
122+
one_month_in_blocks,
123+
36,
124+
amount / 48,
125+
),
126+
]
127+
})
128+
.collect::<Vec<_>>();
129+
create_genesis_config(
59130
WASM_BINARY.expect("Wasm binary must be built for testnet"),
60-
// Sudo account
61-
get_account_id_from_seed::<sr25519::Public>("Alice"),
62-
// Pre-funded accounts
63-
vec![
64-
get_account_id_from_seed::<sr25519::Public>("Alice"),
65-
get_account_id_from_seed::<sr25519::Public>("Bob"),
66-
get_account_id_from_seed::<sr25519::Public>("Alice//stash"),
67-
get_account_id_from_seed::<sr25519::Public>("Bob//stash"),
68-
],
131+
sudo_account,
132+
balances,
133+
vesting_schedules,
69134
)
70135
},
71136
// Bootnodes
@@ -78,7 +143,16 @@ pub fn testnet_config() -> Result<ChainSpec, String> {
78143
// Protocol ID
79144
Some("subspace"),
80145
// Properties
81-
None,
146+
Some(Properties::from_iter([
147+
(
148+
"tokenDecimals".to_string(),
149+
serde_json::to_value(18_u8).expect("u8 is always serializable; qed"),
150+
),
151+
(
152+
"tokenSymbol".to_string(),
153+
serde_json::to_value("tSSC").expect("&str is always serializable; qed"),
154+
),
155+
])),
82156
// Extensions
83157
None,
84158
))
@@ -95,17 +169,18 @@ pub fn development_config() -> Result<ChainSpec, String> {
95169
ChainType::Development,
96170
// TODO: Provide a way for farmer to start with these accounts
97171
|| {
98-
testnet_genesis(
172+
create_genesis_config(
99173
wasm_binary,
100174
// Sudo account
101-
get_account_id_from_seed::<sr25519::Public>("Alice"),
175+
get_account_id_from_seed("Alice"),
102176
// Pre-funded accounts
103177
vec![
104-
get_account_id_from_seed::<sr25519::Public>("Alice"),
105-
get_account_id_from_seed::<sr25519::Public>("Bob"),
106-
get_account_id_from_seed::<sr25519::Public>("Alice//stash"),
107-
get_account_id_from_seed::<sr25519::Public>("Bob//stash"),
178+
(get_account_id_from_seed("Alice"), 1_000 * SSC),
179+
(get_account_id_from_seed("Bob"), 1_000 * SSC),
180+
(get_account_id_from_seed("Alice//stash"), 1_000 * SSC),
181+
(get_account_id_from_seed("Bob//stash"), 1_000 * SSC),
108182
],
183+
vec![],
109184
)
110185
},
111186
// Bootnodes
@@ -131,25 +206,26 @@ pub fn local_testnet_config() -> Result<ChainSpec, String> {
131206
"local_testnet",
132207
ChainType::Local,
133208
|| {
134-
testnet_genesis(
209+
create_genesis_config(
135210
wasm_binary,
136211
// Sudo account
137-
get_account_id_from_seed::<sr25519::Public>("Alice"),
212+
get_account_id_from_seed("Alice"),
138213
// Pre-funded accounts
139214
vec![
140-
get_account_id_from_seed::<sr25519::Public>("Alice"),
141-
get_account_id_from_seed::<sr25519::Public>("Bob"),
142-
get_account_id_from_seed::<sr25519::Public>("Charlie"),
143-
get_account_id_from_seed::<sr25519::Public>("Dave"),
144-
get_account_id_from_seed::<sr25519::Public>("Eve"),
145-
get_account_id_from_seed::<sr25519::Public>("Ferdie"),
146-
get_account_id_from_seed::<sr25519::Public>("Alice//stash"),
147-
get_account_id_from_seed::<sr25519::Public>("Bob//stash"),
148-
get_account_id_from_seed::<sr25519::Public>("Charlie//stash"),
149-
get_account_id_from_seed::<sr25519::Public>("Dave//stash"),
150-
get_account_id_from_seed::<sr25519::Public>("Eve//stash"),
151-
get_account_id_from_seed::<sr25519::Public>("Ferdie//stash"),
215+
(get_account_id_from_seed("Alice"), 1_000 * SSC),
216+
(get_account_id_from_seed("Bob"), 1_000 * SSC),
217+
(get_account_id_from_seed("Charlie"), 1_000 * SSC),
218+
(get_account_id_from_seed("Dave"), 1_000 * SSC),
219+
(get_account_id_from_seed("Eve"), 1_000 * SSC),
220+
(get_account_id_from_seed("Ferdie"), 1_000 * SSC),
221+
(get_account_id_from_seed("Alice//stash"), 1_000 * SSC),
222+
(get_account_id_from_seed("Bob//stash"), 1_000 * SSC),
223+
(get_account_id_from_seed("Charlie//stash"), 1_000 * SSC),
224+
(get_account_id_from_seed("Dave//stash"), 1_000 * SSC),
225+
(get_account_id_from_seed("Eve//stash"), 1_000 * SSC),
226+
(get_account_id_from_seed("Ferdie//stash"), 1_000 * SSC),
152227
],
228+
vec![],
153229
)
154230
},
155231
// Bootnodes
@@ -166,31 +242,27 @@ pub fn local_testnet_config() -> Result<ChainSpec, String> {
166242
}
167243

168244
/// Configure initial storage state for FRAME modules.
169-
fn testnet_genesis(
245+
fn create_genesis_config(
170246
wasm_binary: &[u8],
171-
root_key: AccountId,
172-
endowed_accounts: Vec<AccountId>,
247+
sudo_account: AccountId,
248+
balances: Vec<(AccountId, Balance)>,
249+
// who, start, period, period_count, per_period
250+
vesting: Vec<(AccountId, BlockNumber, BlockNumber, u32, Balance)>,
173251
) -> GenesisConfig {
174252
GenesisConfig {
175253
system: SystemConfig {
176254
// Add Wasm runtime to storage.
177255
code: wasm_binary.to_vec(),
178256
changes_trie_config: Default::default(),
179257
},
180-
balances: BalancesConfig {
181-
// Configure endowed accounts with initial balance of 1 << 60.
182-
balances: endowed_accounts
183-
.iter()
184-
.cloned()
185-
.map(|k| (k, 1 << 60))
186-
.collect(),
187-
},
258+
balances: BalancesConfig { balances },
188259
subspace: SubspaceConfig {
189260
epoch_config: Some(subspace_runtime::SUBSPACE_GENESIS_EPOCH_CONFIG),
190261
},
191262
sudo: SudoConfig {
192263
// Assign network admin rights.
193-
key: root_key,
264+
key: sudo_account,
194265
},
266+
vesting: VestingConfig { vesting },
195267
}
196268
}

crates/subspace-runtime/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ frame-executive = { version = "4.0.0-dev", default-features = false, git = "http
1616
frame-support = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate", rev = "bf9683eee40f82cc4e01a05cd375b0e8bba3c8ef" }
1717
frame-system = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate", rev = "bf9683eee40f82cc4e01a05cd375b0e8bba3c8ef" }
1818
hex-literal = { version = "0.3.3", optional = true }
19+
orml-vesting = { version = "0.4.1-dev", default-features = false, git = "https://github.com/subspace/open-runtime-module-library", branch = "multiple-genesis-schedules-substrate-monthly-2021-10" }
1920
pallet-balances = { version = "4.0.0-dev", default-features = false, git = "https://github.com/paritytech/substrate", rev = "bf9683eee40f82cc4e01a05cd375b0e8bba3c8ef" }
2021
pallet-feeds = { version = "0.1.0", default-features = false, path = "../pallet-feeds" }
2122
pallet-offences-subspace = { version = "0.1.0", default-features = false, path = "../pallet-offences-subspace" }
@@ -57,6 +58,7 @@ std = [
5758
"frame-support/std",
5859
"frame-system/std",
5960
"frame-system-rpc-runtime-api/std",
61+
"orml-vesting/std",
6062
"pallet-balances/std",
6163
"pallet-feeds/std",
6264
"pallet-offences-subspace/std",
@@ -86,6 +88,7 @@ runtime-benchmarks = [
8688
"frame-system-benchmarking",
8789
"frame-system/runtime-benchmarks",
8890
"hex-literal",
91+
"orml-vesting/runtime-benchmarks",
8992
"pallet-balances/runtime-benchmarks",
9093
"pallet-timestamp/runtime-benchmarks",
9194
"sp-runtime/runtime-benchmarks",

0 commit comments

Comments
 (0)