parent
1d01777a13
commit
4f663a2a86
|
@ -1,7 +1,7 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
stakes::{create_and_add_stakes, StakerInfo},
|
stakes::{create_and_add_stakes, StakerInfo},
|
||||||
unlocks::UnlockInfo,
|
unlocks::UnlockInfo,
|
||||||
validators::{create_and_add_validator, ValidatorInfo},
|
validators::create_and_add_validator,
|
||||||
};
|
};
|
||||||
use solana_sdk::{genesis_config::GenesisConfig, native_token::LAMPORTS_PER_SOL};
|
use solana_sdk::{genesis_config::GenesisConfig, native_token::LAMPORTS_PER_SOL};
|
||||||
|
|
||||||
|
@ -198,63 +198,75 @@ fn add_stakes(
|
||||||
.sum::<u64>()
|
.sum::<u64>()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub const VALIDATOR_INFOS: &[ValidatorInfo] = &[
|
pub const VALIDATOR_PUBKEYS: &[&str] = &[
|
||||||
ValidatorInfo {
|
"27SB7d27xvtBJjgsAV8JBDjQroySmZepiNSepeRbRhe9", //
|
||||||
name: "01Node",
|
"2te46rxywMdCNdkvjumiBBPQoVczJFxhxEaxFavQNqe3", // ChainFlow
|
||||||
node: "5n8KCdzqtvTnhkvCrFR7errH6ZUp11kL97r2awXkfzFe",
|
"2tvTYUajoBgeAd66Zhd5Nc2BgKGCgdmasR94fpBokzop", //
|
||||||
node_lamports: 500 * LAMPORTS_PER_SOL,
|
"3QZDKya4AHzsLAuRaMRgejrqW6mETnX88aMSkm7FEE7E", // Syncnode SRL
|
||||||
},
|
"3Z5XVczCTXeYeFABoeFm1LngC9657kZMVGNFzqFXviHb", // stake.fish
|
||||||
ValidatorInfo {
|
"3o43fXxTpndqVsCdMi16WNq6aR9er75P364ZkTHrEQJN", // mintonium
|
||||||
name: "Bison Trails",
|
"44e8VyWoyZSE2oYHxMHMedAiHkGJqJgPd3tdt6iKoAFL", // P2P.ORG - Secure Non-custodial Staking
|
||||||
node: "7suRNpX7bJsXphHJtBv4ZsLjJZ1dTGeX256pLqJZdEAm",
|
"4MHRFcPheQonBf1pUKrBwJAnn2wP9NEZkXYFEFMfFbWV", //
|
||||||
node_lamports: 500 * LAMPORTS_PER_SOL,
|
"4vPqTnfH2ud6hp1yFSFRy9t9xhm8sGDwU4amcZGr2gT7", // Certus One / nexantic GmbH
|
||||||
},
|
"4ydifDThiWuVtzV92eNGiznuQAnTZtGkb9b2XQoMGAUn", // Sikka
|
||||||
ValidatorInfo {
|
"54g6LdVubwthdfMKwPqLraDEDAVWNDpN6a3ZGZm2Sbjz", //
|
||||||
name: "ChainFlow",
|
"592eDka2qrXWcszC3NNvViKfEyxvuoAbBgohVt75dWq1", //
|
||||||
node: "2te46rxywMdCNdkvjumiBBPQoVczJFxhxEaxFavQNqe3",
|
"5JuyDi5HR2CZS39nF43Ws6nhqYWM2fgnZbtf9zRNy52a", // stakewolf
|
||||||
node_lamports: 500 * LAMPORTS_PER_SOL,
|
"5jTcJaq6gLEao1R5rscvfnUhNt6RXg4JFDCegyEhsJG2", //
|
||||||
},
|
"5n8KCdzqtvTnhkvCrFR7errH6ZUp11kL97r2awXkfzFe", // 01Node
|
||||||
ValidatorInfo {
|
"7ntcPwcaCSpH66ftVZU5oSuWSpvQfN3kfTDaGUHWsc1m", // IZO DATA NETWORK
|
||||||
name: "ChorusOne",
|
"7sa8uUnjNPJ2dFwrKG2kd1XEiB4ujsJ4wGEWn7CK629K", // SparkPool
|
||||||
node: "ChorusXqjLC2NbiStKR6k9WoD7wu6TVTtFG8qCL5XBVa",
|
"7suRNpX7bJsXphHJtBv4ZsLjJZ1dTGeX256pLqJZdEAm", // Bison Trails
|
||||||
node_lamports: 500 * LAMPORTS_PER_SOL,
|
"7v5DXDvYzkgTdFYXYB12ZLKD6z8QfzR53N9hg6XgEQJE", // Cryptium Labs GmbH
|
||||||
},
|
"8LSwP5qYbmuUfKLGwi8XaKJnai9HyZAJTnBovyWebRfd", //
|
||||||
ValidatorInfo {
|
"8UPb8LMWyoJJC9Aeq9QmTzKZKV2ssov739bTJ14M4ws1", //
|
||||||
name: "Dokia Capital",
|
"8oRw7qpj6XgLGXYCDuNoTMCqoJnDd6A8LTpNyqApSfkA", //
|
||||||
node: "GeZ5PrJi9muVCJiJAaFBNGoCEdxGEqTp7L2BmT2WTTy1",
|
"8wFK4fCAuDoAH1fsgou9yKZPqDMFtJUVoDdkZAAMuhyA", // LunaNova Technologies Ltd
|
||||||
node_lamports: 500 * LAMPORTS_PER_SOL,
|
"94eWgQm2k8BXKEWbJP2eScHZeKopXpqkuoVrCofQWBhW", // Node A-Team
|
||||||
},
|
"9J8WcnXxo3ArgEwktfk9tsrf4Rp8h5uPUgnQbQHLvtkd", // moonli.me
|
||||||
ValidatorInfo {
|
"AYZS4CFZRi1165mmUqnpDcHbm1NT9zFGPdjG5VDuK79p", // Ubik Capital
|
||||||
name: "Forbole",
|
"Ah5arzkbkHTMkzUaD5DiCAC1rzxqPgyQDFTnw8Krwz1V", // Moonlet
|
||||||
node: "Fe5sLQAAT7RBT8mcH1AAGCbExJQcYxcwXvp1GjrGbvxs",
|
"ArpeD4LKYgza1o6aR5xNTQX3hxeik8URxWNQVpA8wirV", // Staking Fund
|
||||||
node_lamports: 500 * LAMPORTS_PER_SOL,
|
"B21L2hCrdE4SDhRi2fHKohfSUNAhoLeaWfBp1C9HdF6Y", // Everstake
|
||||||
},
|
"Bf6JtoLAg9zxAksgZ9gUsa6zZum1UuPWuirY6qKLXXoW", //
|
||||||
ValidatorInfo {
|
"BrFqUxNY4HstYdiYYZiyDa5KiTrdcfqoBBEky3kqKFgQ", // IRIS Foundation Ltd.
|
||||||
name: "P2P.ORG - Secure Non-custodial Staking",
|
"C8VJytJbZM7KFMXHNUdoF4V7V2QbhkxNs1qYybRoqUEK", //
|
||||||
node: "44e8VyWoyZSE2oYHxMHMedAiHkGJqJgPd3tdt6iKoAFL",
|
"CWfPaZJpy8fc2eU7qe1JNnf4oszQFJU68DZiVJGGy4Z7", //
|
||||||
node_lamports: 500 * LAMPORTS_PER_SOL,
|
"Ccq6zHdtv3DWCP4AccTi4Ya2xPGsEVHSfoPmQ1qffb8H", //
|
||||||
},
|
"ChorusXqjLC2NbiStKR6k9WoD7wu6TVTtFG8qCL5XBVa", // ChorusOne
|
||||||
ValidatorInfo {
|
"DaqUBvjHtKYiZ6exUhqrcpDqu5ffYB6QWKwXSwdvDVBj", //
|
||||||
name: "RockX",
|
"Daxixc1dFxxLDj85t1CWAsvNXdYq51tDAE51nhPqK9yF", //
|
||||||
node: "Ez4iUU87ViJLCnmSy1t1Ti3DLoysFXiBseNfnRfoehyY",
|
"Dh1DRj5mLYMeJVGvaPZN7F4XjpX6u2dCDXVnUXrE8rwW", // POS Bakerz
|
||||||
node_lamports: 500 * LAMPORTS_PER_SOL,
|
"DxLtXrLUrqja3EFjkR4PXNYCuyVtaQnozonCdf3iZk8X", // melea
|
||||||
},
|
"ETVHRnFkZi7PihPDYibp9fmjfR8P5o7pEs92czku62VV", //
|
||||||
ValidatorInfo {
|
"EduAgutprA7Vp94ZmTU6WRAmqq7VZAXBqH1GyxjWn12D", //
|
||||||
name: "Stake Capital",
|
"Ez4iUU87ViJLCnmSy1t1Ti3DLoysFXiBseNfnRfoehyY", // RockX
|
||||||
node: "HavuVVDXXsJqMzPwQ4KcF5kFm2xqjbChhyi1bgGeCQif",
|
"FYbyeGqsx8G5mW4p3MfnNEsHaCQQSAmxESf7ct36moGZ", //
|
||||||
node_lamports: 500 * LAMPORTS_PER_SOL,
|
"Fe5sLQAAT7RBT8mcH1AAGCbExJQcYxcwXvp1GjrGbvxs", // Forbole Limited
|
||||||
},
|
"FhacRVSACfKcZNAbvbKuj1MunBKxQu2nHu9raJaGsZzG", //
|
||||||
ValidatorInfo {
|
"FiF184p8DYxnWkBc7WxUh49PccYwvVepmk3nxAnNgGqW", // Easy 2 Stake
|
||||||
name: "Staking Facilities",
|
"G47WACh32JUcxyiCna7UYw45tyYSFKQ58yFpUmhmMybm", //
|
||||||
node: "pbAxyqHHPMwgEjv8kmjGxysk9rhNtN7q22eAjReq6Hj",
|
"GRi3H2M3HxYGAKhz5VrUQipUrAhWj6jTbtjhxiKXHhRj", //
|
||||||
node_lamports: 500 * LAMPORTS_PER_SOL,
|
"GeZ5PrJi9muVCJiJAaFBNGoCEdxGEqTp7L2BmT2WTTy1", // Dokia Capital
|
||||||
},
|
"GkNQ9hQM1DoTQy9i4HVzhCjtKh9A6uSx7Z5XTAkqRGhu", //
|
||||||
|
"GsEofbB3rzUK78Ee4NRL6AmcPs6FKRCb7JA8tX6LZjHc", //
|
||||||
|
"H279DmgqTkTYnEucPdKbvT8wMTGBAuVh787FX2gRT5Bg", //
|
||||||
|
"Hac7hGYwbve747fGefaFoank1K1rNmvr5MjtsYvzZ37i", //
|
||||||
|
"HavuVVDXXsJqMzPwQ4KcF5kFm2xqjbChhyi1bgGeCQif", // Stake Capital
|
||||||
|
"HpzcHxARoR6HtVuZPXWJMLwgusk2UNCan343u6WSQvm2", //
|
||||||
|
"Luna1VCsPBE4hghuHaL9UFgimBB3V6u6johyd7hGXBL", // LunaNova Technologies Ltd
|
||||||
|
"SPC3m89qwxGbqYdg1GuaoeZtgJD2hYoob6c4aKLG1zu", // Staker Space
|
||||||
|
"Smith4JYx2otuFgT2dR83qJSfW8RjBZHPsXPyfZBYBu", // MCF
|
||||||
|
"pbAxyqHHPMwgEjv8kmjGxysk9rhNtN7q22eAjReq6Hj", // Staking Facilities
|
||||||
|
"qzCAEHbjb7AtpTPKaetY47LWNLCxFeHuFozjeXhj1k1", // Figment Networks, Inc.
|
||||||
];
|
];
|
||||||
|
|
||||||
fn add_validators(genesis_config: &mut GenesisConfig, validator_infos: &[ValidatorInfo]) -> u64 {
|
fn add_validators(genesis_config: &mut GenesisConfig, validator_pubkeys: &[&str]) -> u64 {
|
||||||
validator_infos
|
validator_pubkeys
|
||||||
.iter()
|
.iter()
|
||||||
.map(|validator_info| create_and_add_validator(genesis_config, validator_info))
|
.map(|validator_pubkey| {
|
||||||
|
create_and_add_validator(genesis_config, validator_pubkey, 500 * LAMPORTS_PER_SOL)
|
||||||
|
})
|
||||||
.sum::<u64>()
|
.sum::<u64>()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -282,7 +294,7 @@ pub fn add_genesis_accounts(genesis_config: &mut GenesisConfig, mut issued_lampo
|
||||||
&COMMUNITY_STAKER_INFOS,
|
&COMMUNITY_STAKER_INFOS,
|
||||||
&UNLOCKS_ALL_DAY_ZERO,
|
&UNLOCKS_ALL_DAY_ZERO,
|
||||||
1_000_000 * LAMPORTS_PER_SOL,
|
1_000_000 * LAMPORTS_PER_SOL,
|
||||||
) + add_validators(genesis_config, &VALIDATOR_INFOS);
|
) + add_validators(genesis_config, &VALIDATOR_PUBKEYS);
|
||||||
|
|
||||||
// "one thanks" (community pool) gets 500_000_000SOL (total) - above distributions
|
// "one thanks" (community pool) gets 500_000_000SOL (total) - above distributions
|
||||||
create_and_add_stakes(
|
create_and_add_stakes(
|
||||||
|
@ -315,4 +327,12 @@ mod tests {
|
||||||
|
|
||||||
assert_eq!(500_000_000 * LAMPORTS_PER_SOL, lamports);
|
assert_eq!(500_000_000 * LAMPORTS_PER_SOL, lamports);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_no_duplicate_validator_pubkeys() {
|
||||||
|
let mut v = VALIDATOR_PUBKEYS.to_vec();
|
||||||
|
v.sort();
|
||||||
|
v.dedup();
|
||||||
|
assert_eq!(v.len(), VALIDATOR_PUBKEYS.len());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,13 +4,6 @@ use solana_sdk::{
|
||||||
timing::years_as_slots,
|
timing::years_as_slots,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct ValidatorInfo {
|
|
||||||
pub name: &'static str,
|
|
||||||
pub node: &'static str,
|
|
||||||
pub node_lamports: u64,
|
|
||||||
}
|
|
||||||
|
|
||||||
// the node's account needs carry enough
|
// the node's account needs carry enough
|
||||||
// lamports to cover TX fees for voting for one year,
|
// lamports to cover TX fees for voting for one year,
|
||||||
// validators can vote once per slot
|
// validators can vote once per slot
|
||||||
|
@ -27,15 +20,16 @@ fn calculate_voting_fees(genesis_config: &GenesisConfig, years: f64) -> u64 {
|
||||||
pub fn create_and_add_validator(
|
pub fn create_and_add_validator(
|
||||||
genesis_config: &mut GenesisConfig,
|
genesis_config: &mut GenesisConfig,
|
||||||
// information about this validator
|
// information about this validator
|
||||||
validator_info: &ValidatorInfo,
|
validator_pubkey: &str,
|
||||||
|
validator_lamports: u64,
|
||||||
) -> u64 {
|
) -> u64 {
|
||||||
let node: Pubkey = validator_info.node.parse().expect("invalid node");
|
let node: Pubkey = validator_pubkey.parse().expect("invalid node");
|
||||||
|
|
||||||
// node is the system account from which votes will be issued
|
// node is the system account from which votes will be issued
|
||||||
let node_rent_reserve = genesis_config.rent.minimum_balance(0).max(1);
|
let node_rent_reserve = genesis_config.rent.minimum_balance(0).max(1);
|
||||||
let node_voting_fees = calculate_voting_fees(genesis_config, 1.0);
|
let node_voting_fees = calculate_voting_fees(genesis_config, 1.0);
|
||||||
|
|
||||||
let mut total_lamports = node_voting_fees + validator_info.node_lamports;
|
let mut total_lamports = node_voting_fees + validator_lamports;
|
||||||
|
|
||||||
genesis_config
|
genesis_config
|
||||||
.accounts
|
.accounts
|
||||||
|
@ -44,7 +38,7 @@ pub fn create_and_add_validator(
|
||||||
total_lamports += node_rent_reserve;
|
total_lamports += node_rent_reserve;
|
||||||
Account::new(node_rent_reserve, 0, &system_program::id())
|
Account::new(node_rent_reserve, 0, &system_program::id())
|
||||||
})
|
})
|
||||||
.lamports += node_voting_fees + validator_info.node_lamports;
|
.lamports += node_voting_fees + validator_lamports;
|
||||||
|
|
||||||
total_lamports
|
total_lamports
|
||||||
}
|
}
|
||||||
|
@ -56,14 +50,19 @@ mod tests {
|
||||||
|
|
||||||
fn create_and_check_validators(
|
fn create_and_check_validators(
|
||||||
genesis_config: &mut GenesisConfig,
|
genesis_config: &mut GenesisConfig,
|
||||||
validator_infos: &[ValidatorInfo],
|
validator_pubkeys: &[&str],
|
||||||
|
validator_lamports: u64,
|
||||||
total_lamports: u64,
|
total_lamports: u64,
|
||||||
len: usize,
|
len: usize,
|
||||||
) {
|
) {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
validator_infos
|
validator_pubkeys
|
||||||
.iter()
|
.iter()
|
||||||
.map(|validator_info| create_and_add_validator(genesis_config, validator_info))
|
.map(|validator_pubkey| create_and_add_validator(
|
||||||
|
genesis_config,
|
||||||
|
validator_pubkey,
|
||||||
|
validator_lamports
|
||||||
|
))
|
||||||
.sum::<u64>(),
|
.sum::<u64>(),
|
||||||
total_lamports
|
total_lamports
|
||||||
);
|
);
|
||||||
|
@ -99,11 +98,10 @@ mod tests {
|
||||||
|
|
||||||
create_and_check_validators(
|
create_and_check_validators(
|
||||||
&mut genesis_config,
|
&mut genesis_config,
|
||||||
&[ValidatorInfo {
|
&[
|
||||||
name: "fun",
|
"AiTDdNHW2vNtHt7PqWMHx3B8cMPRDNgc7kMiLPJM25QC", // random pubkey
|
||||||
node: "AiTDdNHW2vNtHt7PqWMHx3B8cMPRDNgc7kMiLPJM25QC", // random pubkey
|
],
|
||||||
node_lamports: 0,
|
0,
|
||||||
}],
|
|
||||||
total_lamports,
|
total_lamports,
|
||||||
1,
|
1,
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in New Issue