| @@ -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, | ||||||
|         ); |         ); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user