Skip to main content

solana_runtime/
non_circulating_supply.rs

1use {
2    crate::bank::Bank,
3    log::*,
4    solana_account::ReadableAccount,
5    solana_accounts_db::{
6        accounts_index::{AccountIndex, IndexKey},
7        accounts_scan::ScanResult,
8    },
9    solana_pubkey::Pubkey,
10    solana_stake_interface::{self as stake, state::StakeStateV2},
11    std::collections::HashSet,
12};
13
14pub struct NonCirculatingSupply {
15    pub lamports: u64,
16    pub accounts: Vec<Pubkey>,
17}
18
19pub fn calculate_non_circulating_supply(bank: &Bank) -> ScanResult<NonCirculatingSupply> {
20    debug!("Updating Bank supply, epoch: {}", bank.epoch());
21    let mut non_circulating_accounts_set: HashSet<Pubkey> = HashSet::new();
22
23    for key in non_circulating_accounts() {
24        non_circulating_accounts_set.insert(key);
25    }
26    let withdraw_authority_list = withdraw_authority();
27
28    let clock = bank.clock();
29    let stake_accounts = if bank
30        .rc
31        .accounts
32        .accounts_db
33        .account_indexes
34        .contains(&AccountIndex::ProgramId)
35    {
36        bank.get_filtered_indexed_accounts(
37            &IndexKey::ProgramId(stake::program::id()),
38            // The program-id account index checks for Account owner on inclusion. However, due to
39            // the current AccountsDb implementation, an account may remain in storage as a
40            // zero-lamport Account::Default() after being wiped and reinitialized in later
41            // updates. We include the redundant filter here to avoid returning these accounts.
42            |account| account.owner() == &stake::program::id(),
43            None,
44        )?
45    } else {
46        bank.get_program_accounts(&stake::program::id())?
47    };
48
49    for (pubkey, account) in stake_accounts.iter() {
50        let stake_account = account
51            .deserialize_data::<StakeStateV2>()
52            .unwrap_or_default();
53        match stake_account {
54            StakeStateV2::Initialized(meta)
55                if (meta.lockup.is_in_force(&clock, None)
56                    || withdraw_authority_list.contains(&meta.authorized.withdrawer)) =>
57            {
58                non_circulating_accounts_set.insert(*pubkey);
59            }
60            StakeStateV2::Stake(meta, _stake, _stake_flags)
61                if (meta.lockup.is_in_force(&clock, None)
62                    || withdraw_authority_list.contains(&meta.authorized.withdrawer)) =>
63            {
64                non_circulating_accounts_set.insert(*pubkey);
65            }
66            _ => {}
67        }
68    }
69
70    let lamports = non_circulating_accounts_set
71        .iter()
72        .map(|pubkey| bank.get_balance(pubkey))
73        .sum();
74
75    Ok(NonCirculatingSupply {
76        lamports,
77        accounts: non_circulating_accounts_set.into_iter().collect(),
78    })
79}
80
81// Mainnet-beta accounts that should be considered non-circulating
82pub fn non_circulating_accounts() -> Vec<Pubkey> {
83    [
84        solana_pubkey::pubkey!("9huDUZfxoJ7wGMTffUE7vh1xePqef7gyrLJu9NApncqA"),
85        solana_pubkey::pubkey!("GK2zqSsXLA2rwVZk347RYhh6jJpRsCA69FjLW93ZGi3B"),
86        solana_pubkey::pubkey!("CWeRmXme7LmbaUWTZWFLt6FMnpzLCHaQLuR2TdgFn4Lq"),
87        solana_pubkey::pubkey!("HCV5dGFJXRrJ3jhDYA4DCeb9TEDTwGGYXtT3wHksu2Zr"),
88        solana_pubkey::pubkey!("14FUT96s9swbmH7ZjpDvfEDywnAYy9zaNhv4xvezySGu"),
89        solana_pubkey::pubkey!("HbZ5FfmKWNHC7uwk6TF1hVi6TCs7dtYfdjEcuPGgzFAg"),
90        solana_pubkey::pubkey!("C7C8odR8oashR5Feyrq2tJKaXL18id1dSj2zbkDGL2C2"),
91        solana_pubkey::pubkey!("Eyr9P5XsjK2NUKNCnfu39eqpGoiLFgVAv1LSQgMZCwiQ"),
92        solana_pubkey::pubkey!("DE1bawNcRJB9rVm3buyMVfr8mBEoyyu73NBovf2oXJsJ"),
93        solana_pubkey::pubkey!("CakcnaRDHka2gXyfbEd2d3xsvkJkqsLw2akB3zsN1D2S"),
94        solana_pubkey::pubkey!("7Np41oeYqPefeNQEHSv1UDhYrehxin3NStELsSKCT4K2"),
95        solana_pubkey::pubkey!("GdnSyH3YtwcxFvQrVVJMm1JhTS4QVX7MFsX56uJLUfiZ"),
96        solana_pubkey::pubkey!("Mc5XB47H3DKJHym5RLa9mPzWv5snERsF3KNv5AauXK8"),
97        solana_pubkey::pubkey!("7cvkjYAkUYs4W8XcXsca7cBrEGFeSUjeZmKoNBvEwyri"),
98        solana_pubkey::pubkey!("AG3m2bAibcY8raMt4oXEGqRHwX4FWKPPJVjZxn1LySDX"),
99        solana_pubkey::pubkey!("5XdtyEDREHJXXW1CTtCsVjJRjBapAwK78ZquzvnNVRrV"),
100        solana_pubkey::pubkey!("6yKHERk8rsbmJxvMpPuwPs1ct3hRiP7xaJF2tvnGU6nK"),
101        solana_pubkey::pubkey!("CHmdL15akDcJgBkY6BP3hzs98Dqr6wbdDC5p8odvtSbq"),
102        solana_pubkey::pubkey!("FR84wZQy3Y3j2gWz6pgETUiUoJtreMEuWfbg6573UCj9"),
103        solana_pubkey::pubkey!("5q54XjQ7vDx4y6KphPeE97LUNiYGtP55spjvXAWPGBuf"),
104        solana_pubkey::pubkey!("3o6xgkJ9sTmDeQWyfj3sxwon18fXJB9PV5LDc8sfgR4a"),
105        solana_pubkey::pubkey!("GumSE5HsMV5HCwBTv2D2D81yy9x17aDkvobkqAfTRgmo"),
106        solana_pubkey::pubkey!("AzVV9ZZDxTgW4wWfJmsG6ytaHpQGSe1yz76Nyy84VbQF"),
107        solana_pubkey::pubkey!("8CUUMKYNGxdgYio5CLHRHyzMEhhVRMcqefgE6dLqnVRK"),
108        solana_pubkey::pubkey!("CQDYc4ET2mbFhVpgj41gXahL6Exn5ZoPcGAzSHuYxwmE"),
109        solana_pubkey::pubkey!("5PLJZLJiRR9vf7d1JCCg7UuWjtyN9nkab9uok6TqSyuP"),
110        solana_pubkey::pubkey!("7xJ9CLtEAcEShw9kW2gSoZkRWL566Dg12cvgzANJwbTr"),
111        solana_pubkey::pubkey!("BuCEvc9ze8UoAQwwsQLy8d447C8sA4zeVtVpc6m5wQeS"),
112        solana_pubkey::pubkey!("8ndGYFjav6NDXvzYcxs449Aub3AxYv4vYpk89zRDwgj7"),
113        solana_pubkey::pubkey!("8W58E8JVJjH1jCy5CeHJQgvwFXTyAVyesuXRZGbcSUGG"),
114        solana_pubkey::pubkey!("GNiz4Mq886bTNDT3pijGsu2gbw6it7sqrwncro45USeB"),
115        solana_pubkey::pubkey!("GhsotwFMH6XUrRLJCxcx62h7748N2Uq8mf87hUGkmPhg"),
116        solana_pubkey::pubkey!("Fgyh8EeYGZtbW8sS33YmNQnzx54WXPrJ5KWNPkCfWPot"),
117        solana_pubkey::pubkey!("8UVjvYyoqP6sqcctTso3xpCdCfgTMiv3VRh7vraC2eJk"),
118        solana_pubkey::pubkey!("BhvLngiqqKeZ8rpxch2uGjeCiC88zzewoWPRuoxpp1aS"),
119        solana_pubkey::pubkey!("63DtkW7zuARcd185EmHAkfF44bDcC2SiTSEj2spLP3iA"),
120        solana_pubkey::pubkey!("GvpCiTgq9dmEeojCDBivoLoZqc4AkbUDACpqPMwYLWKh"),
121        solana_pubkey::pubkey!("7Y8smnoUrYKGGuDq2uaFKVxJYhojgg7DVixHyAtGTYEV"),
122        solana_pubkey::pubkey!("DUS1KxwUhUyDKB4A81E8vdnTe3hSahd92Abtn9CXsEcj"),
123        solana_pubkey::pubkey!("F9MWFw8cnYVwsRq8Am1PGfFL3cQUZV37mbGoxZftzLjN"),
124        solana_pubkey::pubkey!("8vqrX3H2BYLaXVintse3gorPEM4TgTwTFZNN1Fm9TdYs"),
125        solana_pubkey::pubkey!("CUageMFi49kzoDqtdU8NvQ4Bq3sbtJygjKDAXJ45nmAi"),
126        solana_pubkey::pubkey!("5smrYwb1Hr2T8XMnvsqccTgXxuqQs14iuE8RbHFYf2Cf"),
127        solana_pubkey::pubkey!("xQadXQiUTCCFhfHjvQx1hyJK6KVWr1w2fD6DT3cdwj7"),
128        solana_pubkey::pubkey!("8DE8fqPfv1fp9DHyGyDFFaMjpopMgDeXspzoi9jpBJjC"),
129        solana_pubkey::pubkey!("3itU5ME8L6FDqtMiRoUiT1F7PwbkTtHBbW51YWD5jtjm"),
130        solana_pubkey::pubkey!("AsrYX4FeLXnZcrjcZmrASY2Eq1jvEeQfwxtNTxS5zojA"),
131        solana_pubkey::pubkey!("8rT45mqpuDBR1vcnDc9kwP9DrZAXDR4ZeuKWw3u1gTGa"),
132        solana_pubkey::pubkey!("nGME7HgBT6tAJN1f6YuCCngpqT5cvSTndZUVLjQ4jwA"),
133        solana_pubkey::pubkey!("CzAHrrrHKx9Lxf6wdCMrsZkLvk74c7J2vGv8VYPUmY6v"),
134        solana_pubkey::pubkey!("AzHQ8Bia1grVVbcGyci7wzueSWkgvu7YZVZ4B9rkL5P6"),
135        solana_pubkey::pubkey!("FiWYY85b58zEEcPtxe3PuqzWPjqBJXqdwgZeqSBmT9Cn"),
136        solana_pubkey::pubkey!("GpxpMVhrBBBEYbEJxdR62w3daWz444V7m6dxYDZKH77D"),
137        solana_pubkey::pubkey!("3bTGcGB9F98XxnrBNftmmm48JGfPgi5sYxDEKiCjQYk3"),
138        solana_pubkey::pubkey!("8pNBEppa1VcFAsx4Hzq9CpdXUXZjUXbvQwLX2K7QsCwb"),
139        solana_pubkey::pubkey!("HKJgYGTTYYR2ZkfJKHbn58w676fKueQXmvbtpyvrSM3N"),
140        solana_pubkey::pubkey!("3jnknRabs7G2V9dKhxd2KP85pNWXKXiedYnYxtySnQMs"),
141        solana_pubkey::pubkey!("4sxwau4mdqZ8zEJsfryXq4QFYnMJSCp3HWuZQod8WU5k"),
142        solana_pubkey::pubkey!("Fg12tB1tz8w6zJSQ4ZAGotWoCztdMJF9hqK8R11pakog"),
143        solana_pubkey::pubkey!("GEWSkfWgHkpiLbeKaAnwvqnECGdRNf49at5nFccVey7c"),
144        solana_pubkey::pubkey!("CND6ZjRTzaCFVdX7pSSWgjTfHZuhxqFDoUBqWBJguNoA"),
145        solana_pubkey::pubkey!("2WWb1gRzuXDd5viZLQF7pNRR6Y7UiyeaPpaL35X6j3ve"),
146        solana_pubkey::pubkey!("BUnRE27mYXN9p8H1Ay24GXhJC88q2CuwLoNU2v2CrW4W"),
147        solana_pubkey::pubkey!("CsUqV42gVQLJwQsKyjWHqGkfHarxn9hcY4YeSjgaaeTd"),
148        solana_pubkey::pubkey!("5khMKAcvmsFaAhoKkdg3u5abvKsmjUQNmhTNP624WB1F"),
149        solana_pubkey::pubkey!("GpYnVDgB7dzvwSgsjQFeHznjG6Kt1DLBFYrKxjGU1LuD"),
150        solana_pubkey::pubkey!("DQQGPtj7pphPHCLzzBuEyDDQByUcKGrsJdsH7SP3hAug"),
151        solana_pubkey::pubkey!("FwfaykN7ACnsEUDHANzGHqTGQZMcGnUSsahAHUqbdPrz"),
152        solana_pubkey::pubkey!("JCwT5Ygmq3VeBEbDjL8s8E82Ra2rP9bq45QfZE7Xyaq7"),
153        solana_pubkey::pubkey!("H3Ni7vG1CsmJZdTvxF7RkAf9UM5qk4RsohJsmPvtZNnu"),
154        solana_pubkey::pubkey!("CVgyXrbEd1ctEuvq11QdpnCQVnPit8NLdhyqXQHLprM2"),
155        solana_pubkey::pubkey!("EAJJD6nDqtXcZ4DnQb19F9XEz8y8bRDHxbWbahatZNbL"),
156        solana_pubkey::pubkey!("6o5v1HC7WhBnLfRHp8mQTtCP2khdXXjhuyGyYEoy2Suy"),
157        solana_pubkey::pubkey!("3ZrsTmNM6AkMcqFfv3ryfhQ2jMfqP64RQbqVyAaxqhrQ"),
158        solana_pubkey::pubkey!("6zw7em7uQdmMpuS9fGz8Nq9TLHa5YQhEKKwPjo5PwDK4"),
159        solana_pubkey::pubkey!("CuatS6njAcfkFHnvai7zXCs7syA9bykXWsDCJEWfhjHG"),
160        solana_pubkey::pubkey!("Hz9nydgN1k15wnwffKX7CSmZp4VFTnTwLXAEdomFGNXy"),
161        solana_pubkey::pubkey!("Ep5Y58PaSyALPrdFxDVAdfKtVdP55vApvsWjb3jSmXsG"),
162        solana_pubkey::pubkey!("EziVYi3Sv5kJWxmU77PnbrT8jmkVuqwdiFLLzZpLVEn7"),
163        solana_pubkey::pubkey!("H1rt8KvXkNhQExTRfkY8r9wjZbZ8yCih6J4wQ5Fz9HGP"),
164        solana_pubkey::pubkey!("6nN69B4uZuESZYxr9nrLDjmKRtjDZQXrehwkfQTKw62U"),
165        solana_pubkey::pubkey!("Hm9JW7of5i9dnrboS8pCUCSeoQUPh7JsP1rkbJnW7An4"),
166        solana_pubkey::pubkey!("5D5NxsNVTgXHyVziwV7mDFwVDS6voaBsyyGxUbhQrhNW"),
167        solana_pubkey::pubkey!("EMAY24PrS6rWfvpqffFCsTsFJypeeYYmtUc26wdh3Wup"),
168        solana_pubkey::pubkey!("Br3aeVGapRb2xTq17RU2pYZCoJpWA7bq6TKBCcYtMSmt"),
169        solana_pubkey::pubkey!("BUjkdqUuH5Lz9XzcMcR4DdEMnFG6r8QzUMBm16Rfau96"),
170        solana_pubkey::pubkey!("Es13uD2p64UVPFpEWfDtd6SERdoNR2XVgqBQBZcZSLqW"),
171        solana_pubkey::pubkey!("AVYpwVou2BhdLivAwLxKPALZQsY7aZNkNmGbP2fZw7RU"),
172        solana_pubkey::pubkey!("DrKzW5koKSZp4mg4BdHLwr72MMXscd2kTiWgckCvvPXz"),
173        solana_pubkey::pubkey!("9hknftBZAQL4f48tWfk3bUEV5YSLcYYtDRqNmpNnhCWG"),
174        solana_pubkey::pubkey!("GLUmCeJpXB8veNcchPwibkRYwCwvQbKodex5mEjrgToi"),
175        solana_pubkey::pubkey!("9S2M3UYPpnPZTBtbcUvehYmiWFK3kBhwfzV2iWuwvaVy"),
176        solana_pubkey::pubkey!("HUAkU5psJXZuw54Lrg1ksbXzHv2fzczQ9sNbmisVMeJU"),
177        solana_pubkey::pubkey!("GK8R4uUmrawcREZ5xJy5dAzVV5V7aFvYg77id37pVTK"),
178        solana_pubkey::pubkey!("4vuWt1oHRqLMhf8Nv1zyEXZsYaeK7dipwrfKLoYU9Riq"),
179        solana_pubkey::pubkey!("EMhn1U3TMimW3bvWYbPUvN2eZnCfsuBN4LGWhzzYhiWR"),
180        solana_pubkey::pubkey!("BsKsunvENxAraBrL77UfAn1Gi7unVEmQAdCbhsjUN6tU"),
181        solana_pubkey::pubkey!("CTvhdUVf8KNyMbyEdnvRrBCHJjBKtQwkbj6zwoqcEssG"),
182        solana_pubkey::pubkey!("3fV2GaDKa3pZxyDcpMh5Vrh2FVAMUiWUKbYmnBFv8As3"),
183        solana_pubkey::pubkey!("4pV47TiPzZ7SSBPHmgUvSLmH9mMSe8tjyPhQZGbi1zPC"),
184        solana_pubkey::pubkey!("P8aKfWQPeRnsZtpBrwWTYzyAoRk74KMz56xc6NEpC4J"),
185        solana_pubkey::pubkey!("HuqDWJodFhAEWh6aWdsDVUqsjRket5DYXMYyDYtD8hdN"),
186        solana_pubkey::pubkey!("Ab1UcdsFXZVnkSt1Z3vcYU65GQk5MvCbs54SviaiaqHb"),
187        solana_pubkey::pubkey!("Dc2oHxFXQaC2QfLStuU7txtD3U5HZ82MrCSGDooWjbsv"),
188        solana_pubkey::pubkey!("3iPvAS4xdhYr6SkhVDHCLr7tJjMAFK4wvvHWJxFQVg15"),
189        solana_pubkey::pubkey!("GmyW1nqYcrw7P7JqrcyP9ivU9hYNbrgZ1r5SYJJH41Fs"),
190        solana_pubkey::pubkey!("E8jcgWvrvV7rwYHJThwfiBeQ8VAH4FgNEEMG9aAuCMAq"),
191        solana_pubkey::pubkey!("CY7X5o3Wi2eQhTocLmUS6JSWyx1NinBfW7AXRrkRCpi8"),
192        solana_pubkey::pubkey!("HQJtLqvEGGxgNYfRXUurfxV8E1swvCnsbC3456ik27HY"),
193        solana_pubkey::pubkey!("9xbcBZoGYFnfJZe81EDuDYKUm8xGkjzW8z4EgnVhNvsv"),
194        solana_pubkey::pubkey!("4sNBQyPbJCQyUimBueZkGWnLVqds4rWkm7eXyi9WskGU"),
195        solana_pubkey::pubkey!("AZWdNvnZxJnbcT8ZzonpN19AZJadxPdUxSiCEDTJzu8L"),
196        solana_pubkey::pubkey!("5kFTzLuM2VgFdb6x16smnY3JWoVdPxNZVFAqeVgjSTUP"),
197        solana_pubkey::pubkey!("Gbz6wkNFus8SNEkWGNNENLv9NFwVvF1pWVDpaVKUWcMh"),
198        solana_pubkey::pubkey!("AksPzoA9DKCipgdhHjhUzQJe4iEniCvBoEfvayuFA3BN"),
199        solana_pubkey::pubkey!("DVhs8YHWrvhhGxoefDNY9KotqtEEnjnSAK8MYGL2Q7X"),
200        solana_pubkey::pubkey!("2bvGnYAPSV8pa1H3vRYr5tPAXktP4DkFACHfAgqyyfhd"),
201        solana_pubkey::pubkey!("2xP8YQ3sVmfNPtGM17tZi7Lr4vsPUiN6mHLx42roazG5"),
202        solana_pubkey::pubkey!("3p9ZxnrSFTkXVrT3KnYg2tT6asnysDApEFB5DRkdeAhB"),
203        solana_pubkey::pubkey!("wRVP5MYuqP8HJ1Q8RCJ5NzUraL3DxCKPGMKSBd5iQH1"),
204        solana_pubkey::pubkey!("513qFSVgmAQFBDsnyFCM1MrVKBrWiDgb4nXrdGsqa7Z4"),
205        solana_pubkey::pubkey!("619qLS85ieR4qh7MGNLLZyLefN7hMi2FDVb5cmX1nisb"),
206        solana_pubkey::pubkey!("768NcPfBJpFBtjDAbYZLFkej6ca1W5jeArsW5MtdF8S9"),
207        solana_pubkey::pubkey!("EWAjC8a9VPbALSM3D6tGsbRfgDV48kRuHZPu8qtYSNDv"),
208        solana_pubkey::pubkey!("H8wurbnaaXsgtrjqkNH1HhncUPUhTLAmKUHkwMeyqmfN"),
209        solana_pubkey::pubkey!("HBfi37TwD4kMa1WrAWwXp3ZaFbZQ1g3XxWwNZs8QsCpY"),
210        solana_pubkey::pubkey!("6B7mXMM6BixHvDpPAPLSKweLyCXcbtprkfsw3HfMUSjZ"),
211        solana_pubkey::pubkey!("5TuV9WpmESXNfTNqasXVehoXpQy65WUHBbzgKPXPLwWx"),
212        solana_pubkey::pubkey!("FB6VmiYFnVGp1uKXA3WbNsqg9neGYVpwYYiB9q8bFRrQ"),
213        solana_pubkey::pubkey!("7Anoa4ZRiq8qaaiEnhmdpXyTEmBjZASXGfnQqVDynNie"),
214        solana_pubkey::pubkey!("6dXeE5hS8bQKeqZsc18ewCyqHimnhCBAvVJBusnRqa2F"),
215        solana_pubkey::pubkey!("Ds69ZQPb3D3aVPXdN5REyzALBrzJLdruJZ1cwyfyoEEx"),
216        solana_pubkey::pubkey!("5HA8QV7tp59iNpfjs8f84LGUGX4imaynMFSKWHUcTrMT"),
217        solana_pubkey::pubkey!("EPfiDzgbdgXdyqqwbYFMqU6Qvfx2J9Zf2J9noXBYYbbx"),
218        solana_pubkey::pubkey!("DEGyTHFXmYuyANRDYRoEcShBXLonWNdBRpNzbFZBuzhY"),
219        solana_pubkey::pubkey!("9xz1vZSWgY6TFPLZgPM2WJjDM1KiPXcALnjYFHRTkYiK"),
220        solana_pubkey::pubkey!("6n1mSmsdGFCkEyyHe4wtgEigbwhiwYRszrerMW9YRyYF"),
221        solana_pubkey::pubkey!("8rp9vcJG1Uwk25g9XfQNHysfGBYcHizVEJvavqiffB6P"),
222        solana_pubkey::pubkey!("BVsJuJbhXmxPB9XPZrYMXs1SfuZuo998u1jQ9emVp8YD"),
223        solana_pubkey::pubkey!("Fas9FrnngyVjdMZ6r8p8SsfyFDtHLMmrw1dyBxRWWVTF"),
224        solana_pubkey::pubkey!("6Lfk4e6yxXGcFNMHue5u8KQM9hWYKjbdMFZ2n7SHHd6L"),
225        solana_pubkey::pubkey!("6WuU6DWoM7ZpgUVL5TR97Fgose7vLgrv4Qvg1Yhqv8Xw"),
226        solana_pubkey::pubkey!("6mXiGJbQbX726ZhrMSmbLCF81E8rkSfo1pvBWyn1asG5"),
227        solana_pubkey::pubkey!("2UdDthRdtZKMjEx9oQYnzuLdWy3sa4XKeaqihdXkXFza"),
228        solana_pubkey::pubkey!("33XwSCq2Ft5tTCsGK7kTyMCJ4hqufDZT2REFAWXmsia8"),
229        solana_pubkey::pubkey!("B5tRZWRCTCLANkY5zLnxEXAn8S2exJD9EkH3cacEYqmE"),
230        solana_pubkey::pubkey!("CfCvwXZk1sLSqzuoFx1K7KG1puMofgwHA3tSpcArVysX"),
231        solana_pubkey::pubkey!("C4fATCN93YL5iYS3c2MrHeDmkMD6waHuBXLqsri5q5AF"),
232        solana_pubkey::pubkey!("HbJUXNHXLzpucDr9wgjuoqAwK6XNKEcqi5h29MkkuSBQ"),
233        solana_pubkey::pubkey!("G8EBx1Qo5W8731nmaBSGYyvU96onpEP5adrVSjt4vnLF"),
234        solana_pubkey::pubkey!("4dc5ty7TNod2EQfx4bPnDofPbQk5cELcn3it47qnLizL"),
235        solana_pubkey::pubkey!("4VCET97mE8ixxAPRYabM7S7dvkiAFZ8ZzEoH6kbmfYus"),
236        solana_pubkey::pubkey!("DwqBsPgtAHqQUmRN3WF5YTuLKhK7dqzrb9eRJ4UVRNLf"),
237        solana_pubkey::pubkey!("26FqcAbTLvr6cVXk2ktPu9hpeMYWukY7uUwNCtTwu7Wb"),
238        solana_pubkey::pubkey!("B22zqCsZL6PDsi4fftmcjj5k7hFjhH1BM8Dcz4fXfFXK"),
239        solana_pubkey::pubkey!("9ahLw5LFpeTuBykK3A5aiFZ1CidTY7z4YxG2kmQdSGon"),
240        solana_pubkey::pubkey!("8M731ZthMdeVoMFGRaPnUBzR7Ze6qY4zEcQ7WALEAn5i"),
241        solana_pubkey::pubkey!("A3aaVsuX7BfNCUQbuepQSaLs9KNB7c6djG6u4UuJzwwP"),
242        solana_pubkey::pubkey!("DeXE7LTUqsC3B9kSACfFdW5TPG1eT9n1Z6gVB9dJNxqz"),
243        solana_pubkey::pubkey!("BtvSeDfZNfA3VEH6baFprfx6JcS6JX8jdt6NffCxoJGV"),
244        solana_pubkey::pubkey!("8o8trB6XdG8o4qo29De2mcooY5E3pW2rvMMkeBwJHkUD"),
245        solana_pubkey::pubkey!("CSSxN8vQYqSjg5GV6ZUGSM65dXqhytLzANLpMrBZjLKP"),
246        solana_pubkey::pubkey!("5A2yoxdGdC3B3QC39pkXpjx2ZPH4WGgie9exHQnhNz4J"),
247        solana_pubkey::pubkey!("DFaHYDcuLmxx3vrJGCgw8sPehzBNjvbvZTjz7PgvYLcb"),
248        solana_pubkey::pubkey!("43Cwv866ActL11JqVQXoFPiytUYA3tFXUaNg1zPsarn9"),
249        solana_pubkey::pubkey!("3wzw3L4wd3B7DHocbQxHosQXEfqEz5AnkQHKBisGKLzY"),
250        solana_pubkey::pubkey!("EnX9MvycxMGKFpMPJHgNo6kD2proVaorKQcSaMmguMEZ"),
251        solana_pubkey::pubkey!("GLz4zxemfHJy3BnK7PjZ4uUgJoHtycpT3JrmTDYduVpg"),
252        solana_pubkey::pubkey!("362rDzQwChHJ9ToZgLdv8wzFHTTsxsxzFLTZPwKY3CYg"),
253        solana_pubkey::pubkey!("3FKwgoQWCz4i43Pbo3jdfsjzkgrkjnk44rDWh7A9J9Ee"),
254        solana_pubkey::pubkey!("Cj53e3n1WX9dAUNX5PZpsc9xG9e7hXGnuJkKLJkNaf6v"),
255        solana_pubkey::pubkey!("Amn9KQZY5kJj932b49pxwqZuuKfNWewrmNQtdMrRfdvf"),
256        solana_pubkey::pubkey!("6spvvQJzFCcw5fVVdF1zKxCeq8Gj2yRFGgFuG16fYSMo"),
257        solana_pubkey::pubkey!("H5PutDz8EgAoznaX7Bc8qSB6sPxD2Xho145H6MH6AcbV"),
258        solana_pubkey::pubkey!("HNCooAiRiVeqGK9VSjxsvRsfr4weTcx14XhkvM7zDMgx"),
259        solana_pubkey::pubkey!("AUqLkd6bR54NtXY9Zt4J2zZ7CJbhVHuDR95YFk5qahaX"),
260        solana_pubkey::pubkey!("H35YRuMGE6WDPBLu3fDYLxV7tEcL2yJ7C97jDkw6NrBf"),
261        solana_pubkey::pubkey!("EhN8bv8LCXnNAVju9ERGsCccmdBNmNTAESAHXE8PyBLR"),
262        solana_pubkey::pubkey!("Ht5roME7Fjzt3dcEyf7UxYpPPAAdyTrnJ6rgEwQrNAFg"),
263        solana_pubkey::pubkey!("5zHRch6mowPiobRQHYXZ1siRcthw4dYkFPuaNDQkK3EE"),
264        solana_pubkey::pubkey!("AZkdkkHzSEbaZXpr7xBmt71AHj9c8iWE2oWYELm3nns5"),
265        solana_pubkey::pubkey!("FThHNjNQYi7FLvP4KjeYf3LXjcN2LhyYHmza35ucqtDT"),
266        solana_pubkey::pubkey!("6vHscAGjgbTfi1ooRVWGjSiUhHcUnLBceJyuKjpKrCYy"),
267        solana_pubkey::pubkey!("AnbszMCtjEVZTquG3FQ68x1f1WK5B1Z6E7gtN2J6vD5a"),
268        solana_pubkey::pubkey!("5aUknZidNKmAPxLMHoUeWsEdmXX8sGKvj8s71pHTDC7H"),
269        solana_pubkey::pubkey!("7Xgby7EgwoRkhbQSdNJL9sXwpo3jddUhqB4zv3WuJB4m"),
270        solana_pubkey::pubkey!("43KdfhYK6LUXX4LmyxfZ1KLaQrfpRe8vNwopNS7wXsUC"),
271        solana_pubkey::pubkey!("FG6UGgT4VpCQxjwQsVy6woHeemwb5jP5u9kR5ry3twcK"),
272        solana_pubkey::pubkey!("BDvLyqobZFubd7ESEJde6KqjbNoChkdj5aEiBdCqcN5r"),
273        solana_pubkey::pubkey!("BtF4msVoQYJPrQUMwNtEXw58LVjux18ddVhC4XjbsdwX"),
274        solana_pubkey::pubkey!("GbPK6cgUKso2ZGNV6GRwbp3hkdUzTVjsybYQMGDBvMFa"),
275        solana_pubkey::pubkey!("4bWjzNek2m6P3Q8rKkq11C47TaoAwpj3ykk5yDCYLWr1"),
276        solana_pubkey::pubkey!("FPzPT7YV5BHSTjYjqycXbwBsD4E5WsrZNPcCgcHhPkUx"),
277        solana_pubkey::pubkey!("EbitXxcwjC1dzrGJ7sa3Y6RBzSM3wxvrxMaBncNBKEf2"),
278        solana_pubkey::pubkey!("HMmHHmCmC3oo4G4QCjKvNxctSBQzRFDp2WQHZoXyrW6Q"),
279        solana_pubkey::pubkey!("145FLxWrDG9gKifyJKSnkKNAUPhG6hxUMEiZWw6XeSMW"),
280        solana_pubkey::pubkey!("FnXgwJZT7RMhpYEJFCXGLHp63bhVLfVn5d4aSVQDe19n"),
281        solana_pubkey::pubkey!("5tDptzMGG79DLp9XV4fdcmiRNPQGCkfBJeo8EVCSYKw7"),
282        solana_pubkey::pubkey!("9oBNYSARUMuH2swnxzbxCi827YfUnYWyWSAkrHz93h5y"),
283        solana_pubkey::pubkey!("DWfXRxmUXKdSTji4S1nXncviTmrhWQwxHAQCcvjRLeWm"),
284        solana_pubkey::pubkey!("EHUv6Hc9XGAb57C8iNCUuoE9xnJnRTFr9LaP7zbu8LNB"),
285        solana_pubkey::pubkey!("CTqnGTKHrcg8AVK5pSwVzpA3mmSxz7Js9y7rEqCbjryH"),
286        solana_pubkey::pubkey!("7PzsZ3ApLcfQosSr2B1C9YV1GNNgriZVFyqzDpeHoAD"),
287        solana_pubkey::pubkey!("AKXpgmVhedTT49sekGbh6MXfx2kJKBcaFQLpc83NCp6N"),
288        solana_pubkey::pubkey!("3MP45RTcFdLX3HpPD18asXCCxFjsgrZM9V6tEeQxFXd4"),
289        solana_pubkey::pubkey!("88YC29WwpugANLcN7DYkuL3benW79WsdxkQ3KX8zER9s"),
290        solana_pubkey::pubkey!("98j2yMfxrLzQ5YQJU1FMW3CTkoYgZStJirpm4HLAkA3o"),
291        solana_pubkey::pubkey!("56AidDLicyQaLMqbMQeZ7itUmJyd7TAvehVDi8MXDYbx"),
292        solana_pubkey::pubkey!("3yeCpRbBU5gzBaweVRqUXFcZUp7gSXBeknKcbGmjwmjJ"),
293        solana_pubkey::pubkey!("5McU7LcsRw3RHyrjj98qHefx6ehy7MdjF1uKKi6Kp8hV"),
294        solana_pubkey::pubkey!("3CYxk8uTXtANvbU1HW3NHNhKcBEfYesi2BdBFizy3f6s"),
295        solana_pubkey::pubkey!("4bAowZuPRG8jzNwMceqjYjZnrGXQNR5ZCgQJM8s4hF4i"),
296        solana_pubkey::pubkey!("ATWFW8xBGPe6xB8JnjyjZqG5FuEXnfyuhEocmqAqfeJG"),
297        solana_pubkey::pubkey!("73Aa7yCd6AMPqsaLisfgrpjESVFtDrLnHEjfDsXBK3HV"),
298    ]
299    .into()
300}
301
302// Withdraw authority for autostaked accounts on mainnet-beta
303pub fn withdraw_authority() -> Vec<Pubkey> {
304    [
305        solana_pubkey::pubkey!("8CUUMKYNGxdgYio5CLHRHyzMEhhVRMcqefgE6dLqnVRK"),
306        solana_pubkey::pubkey!("3FFaheyqtyAXZSYxDzsr5CVKvJuvZD1WE1VEsBtDbRqB"),
307        solana_pubkey::pubkey!("FdGYQdiRky8NZzN9wZtczTBcWLYYRXrJ3LMDhqDPn5rM"),
308        solana_pubkey::pubkey!("4e6KwQpyzGQPfgVr5Jn3g5jLjbXB4pKPa2jRLohEb1QA"),
309        solana_pubkey::pubkey!("FjiEiVKyMGzSLpqoB27QypukUfyWHrwzPcGNtopzZVdh"),
310        solana_pubkey::pubkey!("DwbVjia1mYeSGoJipzhaf4L5hfer2DJ1Ys681VzQm5YY"),
311        solana_pubkey::pubkey!("GeMGyvsTEsANVvcT5cme65Xq5MVU8fVVzMQ13KAZFNS2"),
312        solana_pubkey::pubkey!("Bj3aQ2oFnZYfNR1njzRjmWizzuhvfcYLckh76cqsbuBM"),
313        solana_pubkey::pubkey!("4ZJhPQAgUseCsWhKvJLTmmRRUV74fdoTpQLNfKoekbPY"),
314        solana_pubkey::pubkey!("HXdYQ5gixrY2H6Y9gqsD8kPM2JQKSaRiohDQtLbZkRWE"),
315        solana_pubkey::pubkey!("4sNBQyPbJCQyUimBueZkGWnLVqds4rWkm7eXyi9WskGU"),
316        solana_pubkey::pubkey!("AZWdNvnZxJnbcT8ZzonpN19AZJadxPdUxSiCEDTJzu8L"),
317        solana_pubkey::pubkey!("5kFTzLuM2VgFdb6x16smnY3JWoVdPxNZVFAqeVgjSTUP"),
318        solana_pubkey::pubkey!("Gbz6wkNFus8SNEkWGNNENLv9NFwVvF1pWVDpaVKUWcMh"),
319        solana_pubkey::pubkey!("AksPzoA9DKCipgdhHjhUzQJe4iEniCvBoEfvayuFA3BN"),
320        solana_pubkey::pubkey!("DVhs8YHWrvhhGxoefDNY9KotqtEEnjnSAK8MYGL2Q7X"),
321        solana_pubkey::pubkey!("2bvGnYAPSV8pa1H3vRYr5tPAXktP4DkFACHfAgqyyfhd"),
322        solana_pubkey::pubkey!("2xP8YQ3sVmfNPtGM17tZi7Lr4vsPUiN6mHLx42roazG5"),
323        solana_pubkey::pubkey!("3p9ZxnrSFTkXVrT3KnYg2tT6asnysDApEFB5DRkdeAhB"),
324        solana_pubkey::pubkey!("wRVP5MYuqP8HJ1Q8RCJ5NzUraL3DxCKPGMKSBd5iQH1"),
325        solana_pubkey::pubkey!("513qFSVgmAQFBDsnyFCM1MrVKBrWiDgb4nXrdGsqa7Z4"),
326        solana_pubkey::pubkey!("619qLS85ieR4qh7MGNLLZyLefN7hMi2FDVb5cmX1nisb"),
327        solana_pubkey::pubkey!("768NcPfBJpFBtjDAbYZLFkej6ca1W5jeArsW5MtdF8S9"),
328        solana_pubkey::pubkey!("EWAjC8a9VPbALSM3D6tGsbRfgDV48kRuHZPu8qtYSNDv"),
329        solana_pubkey::pubkey!("H8wurbnaaXsgtrjqkNH1HhncUPUhTLAmKUHkwMeyqmfN"),
330        solana_pubkey::pubkey!("HBfi37TwD4kMa1WrAWwXp3ZaFbZQ1g3XxWwNZs8QsCpY"),
331        solana_pubkey::pubkey!("6B7mXMM6BixHvDpPAPLSKweLyCXcbtprkfsw3HfMUSjZ"),
332        solana_pubkey::pubkey!("5TuV9WpmESXNfTNqasXVehoXpQy65WUHBbzgKPXPLwWx"),
333        solana_pubkey::pubkey!("FB6VmiYFnVGp1uKXA3WbNsqg9neGYVpwYYiB9q8bFRrQ"),
334        solana_pubkey::pubkey!("7Anoa4ZRiq8qaaiEnhmdpXyTEmBjZASXGfnQqVDynNie"),
335        solana_pubkey::pubkey!("6dXeE5hS8bQKeqZsc18ewCyqHimnhCBAvVJBusnRqa2F"),
336        solana_pubkey::pubkey!("Ds69ZQPb3D3aVPXdN5REyzALBrzJLdruJZ1cwyfyoEEx"),
337        solana_pubkey::pubkey!("5HA8QV7tp59iNpfjs8f84LGUGX4imaynMFSKWHUcTrMT"),
338        solana_pubkey::pubkey!("EPfiDzgbdgXdyqqwbYFMqU6Qvfx2J9Zf2J9noXBYYbbx"),
339        solana_pubkey::pubkey!("DEGyTHFXmYuyANRDYRoEcShBXLonWNdBRpNzbFZBuzhY"),
340        solana_pubkey::pubkey!("9xz1vZSWgY6TFPLZgPM2WJjDM1KiPXcALnjYFHRTkYiK"),
341        solana_pubkey::pubkey!("6n1mSmsdGFCkEyyHe4wtgEigbwhiwYRszrerMW9YRyYF"),
342        solana_pubkey::pubkey!("8rp9vcJG1Uwk25g9XfQNHysfGBYcHizVEJvavqiffB6P"),
343        solana_pubkey::pubkey!("BVsJuJbhXmxPB9XPZrYMXs1SfuZuo998u1jQ9emVp8YD"),
344        solana_pubkey::pubkey!("Fas9FrnngyVjdMZ6r8p8SsfyFDtHLMmrw1dyBxRWWVTF"),
345        solana_pubkey::pubkey!("6Lfk4e6yxXGcFNMHue5u8KQM9hWYKjbdMFZ2n7SHHd6L"),
346        solana_pubkey::pubkey!("6WuU6DWoM7ZpgUVL5TR97Fgose7vLgrv4Qvg1Yhqv8Xw"),
347        solana_pubkey::pubkey!("6mXiGJbQbX726ZhrMSmbLCF81E8rkSfo1pvBWyn1asG5"),
348        solana_pubkey::pubkey!("2UdDthRdtZKMjEx9oQYnzuLdWy3sa4XKeaqihdXkXFza"),
349        solana_pubkey::pubkey!("33XwSCq2Ft5tTCsGK7kTyMCJ4hqufDZT2REFAWXmsia8"),
350        solana_pubkey::pubkey!("B5tRZWRCTCLANkY5zLnxEXAn8S2exJD9EkH3cacEYqmE"),
351        solana_pubkey::pubkey!("CfCvwXZk1sLSqzuoFx1K7KG1puMofgwHA3tSpcArVysX"),
352        solana_pubkey::pubkey!("C4fATCN93YL5iYS3c2MrHeDmkMD6waHuBXLqsri5q5AF"),
353        solana_pubkey::pubkey!("HbJUXNHXLzpucDr9wgjuoqAwK6XNKEcqi5h29MkkuSBQ"),
354        solana_pubkey::pubkey!("G8EBx1Qo5W8731nmaBSGYyvU96onpEP5adrVSjt4vnLF"),
355        solana_pubkey::pubkey!("4dc5ty7TNod2EQfx4bPnDofPbQk5cELcn3it47qnLizL"),
356        solana_pubkey::pubkey!("4VCET97mE8ixxAPRYabM7S7dvkiAFZ8ZzEoH6kbmfYus"),
357        solana_pubkey::pubkey!("DwqBsPgtAHqQUmRN3WF5YTuLKhK7dqzrb9eRJ4UVRNLf"),
358        solana_pubkey::pubkey!("26FqcAbTLvr6cVXk2ktPu9hpeMYWukY7uUwNCtTwu7Wb"),
359        solana_pubkey::pubkey!("B22zqCsZL6PDsi4fftmcjj5k7hFjhH1BM8Dcz4fXfFXK"),
360        solana_pubkey::pubkey!("9ahLw5LFpeTuBykK3A5aiFZ1CidTY7z4YxG2kmQdSGon"),
361        solana_pubkey::pubkey!("8M731ZthMdeVoMFGRaPnUBzR7Ze6qY4zEcQ7WALEAn5i"),
362        solana_pubkey::pubkey!("A3aaVsuX7BfNCUQbuepQSaLs9KNB7c6djG6u4UuJzwwP"),
363        solana_pubkey::pubkey!("DeXE7LTUqsC3B9kSACfFdW5TPG1eT9n1Z6gVB9dJNxqz"),
364        solana_pubkey::pubkey!("BtvSeDfZNfA3VEH6baFprfx6JcS6JX8jdt6NffCxoJGV"),
365        solana_pubkey::pubkey!("8o8trB6XdG8o4qo29De2mcooY5E3pW2rvMMkeBwJHkUD"),
366        solana_pubkey::pubkey!("CSSxN8vQYqSjg5GV6ZUGSM65dXqhytLzANLpMrBZjLKP"),
367        solana_pubkey::pubkey!("5A2yoxdGdC3B3QC39pkXpjx2ZPH4WGgie9exHQnhNz4J"),
368        solana_pubkey::pubkey!("DFaHYDcuLmxx3vrJGCgw8sPehzBNjvbvZTjz7PgvYLcb"),
369        solana_pubkey::pubkey!("43Cwv866ActL11JqVQXoFPiytUYA3tFXUaNg1zPsarn9"),
370        solana_pubkey::pubkey!("3wzw3L4wd3B7DHocbQxHosQXEfqEz5AnkQHKBisGKLzY"),
371        solana_pubkey::pubkey!("EnX9MvycxMGKFpMPJHgNo6kD2proVaorKQcSaMmguMEZ"),
372        solana_pubkey::pubkey!("GLz4zxemfHJy3BnK7PjZ4uUgJoHtycpT3JrmTDYduVpg"),
373        solana_pubkey::pubkey!("362rDzQwChHJ9ToZgLdv8wzFHTTsxsxzFLTZPwKY3CYg"),
374        solana_pubkey::pubkey!("3FKwgoQWCz4i43Pbo3jdfsjzkgrkjnk44rDWh7A9J9Ee"),
375        solana_pubkey::pubkey!("Cj53e3n1WX9dAUNX5PZpsc9xG9e7hXGnuJkKLJkNaf6v"),
376        solana_pubkey::pubkey!("Amn9KQZY5kJj932b49pxwqZuuKfNWewrmNQtdMrRfdvf"),
377        solana_pubkey::pubkey!("6spvvQJzFCcw5fVVdF1zKxCeq8Gj2yRFGgFuG16fYSMo"),
378        solana_pubkey::pubkey!("H5PutDz8EgAoznaX7Bc8qSB6sPxD2Xho145H6MH6AcbV"),
379        solana_pubkey::pubkey!("HNCooAiRiVeqGK9VSjxsvRsfr4weTcx14XhkvM7zDMgx"),
380        solana_pubkey::pubkey!("AUqLkd6bR54NtXY9Zt4J2zZ7CJbhVHuDR95YFk5qahaX"),
381        solana_pubkey::pubkey!("H35YRuMGE6WDPBLu3fDYLxV7tEcL2yJ7C97jDkw6NrBf"),
382        solana_pubkey::pubkey!("EhN8bv8LCXnNAVju9ERGsCccmdBNmNTAESAHXE8PyBLR"),
383        solana_pubkey::pubkey!("Ht5roME7Fjzt3dcEyf7UxYpPPAAdyTrnJ6rgEwQrNAFg"),
384        solana_pubkey::pubkey!("5zHRch6mowPiobRQHYXZ1siRcthw4dYkFPuaNDQkK3EE"),
385        solana_pubkey::pubkey!("AZkdkkHzSEbaZXpr7xBmt71AHj9c8iWE2oWYELm3nns5"),
386        solana_pubkey::pubkey!("FThHNjNQYi7FLvP4KjeYf3LXjcN2LhyYHmza35ucqtDT"),
387        solana_pubkey::pubkey!("6vHscAGjgbTfi1ooRVWGjSiUhHcUnLBceJyuKjpKrCYy"),
388        solana_pubkey::pubkey!("AnbszMCtjEVZTquG3FQ68x1f1WK5B1Z6E7gtN2J6vD5a"),
389        solana_pubkey::pubkey!("5aUknZidNKmAPxLMHoUeWsEdmXX8sGKvj8s71pHTDC7H"),
390        solana_pubkey::pubkey!("7Xgby7EgwoRkhbQSdNJL9sXwpo3jddUhqB4zv3WuJB4m"),
391        solana_pubkey::pubkey!("43KdfhYK6LUXX4LmyxfZ1KLaQrfpRe8vNwopNS7wXsUC"),
392        solana_pubkey::pubkey!("FG6UGgT4VpCQxjwQsVy6woHeemwb5jP5u9kR5ry3twcK"),
393        solana_pubkey::pubkey!("BDvLyqobZFubd7ESEJde6KqjbNoChkdj5aEiBdCqcN5r"),
394        solana_pubkey::pubkey!("BtF4msVoQYJPrQUMwNtEXw58LVjux18ddVhC4XjbsdwX"),
395        solana_pubkey::pubkey!("GbPK6cgUKso2ZGNV6GRwbp3hkdUzTVjsybYQMGDBvMFa"),
396        solana_pubkey::pubkey!("4bWjzNek2m6P3Q8rKkq11C47TaoAwpj3ykk5yDCYLWr1"),
397        solana_pubkey::pubkey!("FPzPT7YV5BHSTjYjqycXbwBsD4E5WsrZNPcCgcHhPkUx"),
398        solana_pubkey::pubkey!("EbitXxcwjC1dzrGJ7sa3Y6RBzSM3wxvrxMaBncNBKEf2"),
399        solana_pubkey::pubkey!("HMmHHmCmC3oo4G4QCjKvNxctSBQzRFDp2WQHZoXyrW6Q"),
400        solana_pubkey::pubkey!("145FLxWrDG9gKifyJKSnkKNAUPhG6hxUMEiZWw6XeSMW"),
401        solana_pubkey::pubkey!("FnXgwJZT7RMhpYEJFCXGLHp63bhVLfVn5d4aSVQDe19n"),
402        solana_pubkey::pubkey!("5tDptzMGG79DLp9XV4fdcmiRNPQGCkfBJeo8EVCSYKw7"),
403        solana_pubkey::pubkey!("9oBNYSARUMuH2swnxzbxCi827YfUnYWyWSAkrHz93h5y"),
404        solana_pubkey::pubkey!("DWfXRxmUXKdSTji4S1nXncviTmrhWQwxHAQCcvjRLeWm"),
405        solana_pubkey::pubkey!("EHUv6Hc9XGAb57C8iNCUuoE9xnJnRTFr9LaP7zbu8LNB"),
406        solana_pubkey::pubkey!("CTqnGTKHrcg8AVK5pSwVzpA3mmSxz7Js9y7rEqCbjryH"),
407        solana_pubkey::pubkey!("7PzsZ3ApLcfQosSr2B1C9YV1GNNgriZVFyqzDpeHoAD"),
408        solana_pubkey::pubkey!("AKXpgmVhedTT49sekGbh6MXfx2kJKBcaFQLpc83NCp6N"),
409        solana_pubkey::pubkey!("3MP45RTcFdLX3HpPD18asXCCxFjsgrZM9V6tEeQxFXd4"),
410        solana_pubkey::pubkey!("88YC29WwpugANLcN7DYkuL3benW79WsdxkQ3KX8zER9s"),
411        solana_pubkey::pubkey!("98j2yMfxrLzQ5YQJU1FMW3CTkoYgZStJirpm4HLAkA3o"),
412        solana_pubkey::pubkey!("56AidDLicyQaLMqbMQeZ7itUmJyd7TAvehVDi8MXDYbx"),
413        solana_pubkey::pubkey!("3yeCpRbBU5gzBaweVRqUXFcZUp7gSXBeknKcbGmjwmjJ"),
414        solana_pubkey::pubkey!("5McU7LcsRw3RHyrjj98qHefx6ehy7MdjF1uKKi6Kp8hV"),
415        solana_pubkey::pubkey!("3CYxk8uTXtANvbU1HW3NHNhKcBEfYesi2BdBFizy3f6s"),
416        solana_pubkey::pubkey!("4bAowZuPRG8jzNwMceqjYjZnrGXQNR5ZCgQJM8s4hF4i"),
417        solana_pubkey::pubkey!("ATWFW8xBGPe6xB8JnjyjZqG5FuEXnfyuhEocmqAqfeJG"),
418        solana_pubkey::pubkey!("73Aa7yCd6AMPqsaLisfgrpjESVFtDrLnHEjfDsXBK3HV"),
419    ]
420    .into()
421}
422
423#[cfg(test)]
424mod tests {
425    use {
426        super::*,
427        crate::genesis_utils::genesis_sysvar_and_builtin_program_lamports,
428        solana_account::{Account, AccountSharedData},
429        solana_cluster_type::ClusterType,
430        solana_epoch_schedule::EpochSchedule,
431        solana_genesis_config::GenesisConfig,
432        solana_leader_schedule::SlotLeader,
433        solana_stake_interface::state::{Authorized, Lockup, Meta},
434        std::{collections::BTreeMap, sync::Arc},
435    };
436
437    fn new_from_parent(
438        parent: Arc<Bank>,
439        bank_forks: &std::sync::Arc<std::sync::RwLock<crate::bank_forks::BankForks>>,
440    ) -> Arc<Bank> {
441        let slot = parent.slot() + 1;
442        Bank::new_from_parent_with_bank_forks(
443            bank_forks.as_ref(),
444            parent,
445            SlotLeader::default(),
446            slot,
447        )
448    }
449
450    #[test]
451    fn test_calculate_non_circulating_supply() {
452        let mut accounts: BTreeMap<Pubkey, Account> = BTreeMap::new();
453        let balance = 10;
454        let num_genesis_accounts = 10;
455        for _ in 0..num_genesis_accounts {
456            accounts.insert(
457                solana_pubkey::new_rand(),
458                Account::new(balance, 0, &Pubkey::default()),
459            );
460        }
461        let non_circulating_accounts = non_circulating_accounts();
462        let num_non_circulating_accounts = non_circulating_accounts.len() as u64;
463        for key in non_circulating_accounts.clone() {
464            accounts.insert(key, Account::new(balance, 0, &Pubkey::default()));
465        }
466
467        let num_stake_accounts = 3;
468        for _ in 0..num_stake_accounts {
469            let pubkey = solana_pubkey::new_rand();
470            let meta = Meta {
471                authorized: Authorized::auto(&pubkey),
472                lockup: Lockup {
473                    epoch: 1,
474                    ..Lockup::default()
475                },
476                ..Meta::default()
477            };
478            let stake_account = Account::new_data_with_space(
479                balance,
480                &StakeStateV2::Initialized(meta),
481                StakeStateV2::size_of(),
482                &stake::program::id(),
483            )
484            .unwrap();
485            accounts.insert(pubkey, stake_account);
486        }
487
488        let slots_per_epoch = 32;
489        let genesis_config = GenesisConfig {
490            accounts,
491            epoch_schedule: EpochSchedule::new(slots_per_epoch),
492            cluster_type: ClusterType::MainnetBeta,
493            ..GenesisConfig::default()
494        };
495        let (bank0, bank_forks) =
496            Bank::new_for_tests(&genesis_config).wrap_with_bank_forks_for_tests();
497        let mut bank = bank0;
498        assert_eq!(
499            bank.capitalization(),
500            (num_genesis_accounts + num_non_circulating_accounts + num_stake_accounts) * balance
501                + genesis_sysvar_and_builtin_program_lamports(),
502        );
503
504        let non_circulating_supply = calculate_non_circulating_supply(&bank).unwrap();
505        assert_eq!(
506            non_circulating_supply.lamports,
507            (num_non_circulating_accounts + num_stake_accounts) * balance
508        );
509        assert_eq!(
510            non_circulating_supply.accounts.len(),
511            num_non_circulating_accounts as usize + num_stake_accounts as usize
512        );
513
514        bank = new_from_parent(bank, &bank_forks);
515        let new_balance = 11;
516        for key in non_circulating_accounts {
517            bank.store_account(
518                &key,
519                &AccountSharedData::new(new_balance, 0, &Pubkey::default()),
520            );
521        }
522        let non_circulating_supply = calculate_non_circulating_supply(&bank).unwrap();
523        assert_eq!(
524            non_circulating_supply.lamports,
525            (num_non_circulating_accounts * new_balance) + (num_stake_accounts * balance)
526        );
527        assert_eq!(
528            non_circulating_supply.accounts.len(),
529            num_non_circulating_accounts as usize + num_stake_accounts as usize
530        );
531
532        // Advance bank an epoch, which should unlock stakes
533        for _ in 0..slots_per_epoch {
534            bank = new_from_parent(bank, &bank_forks);
535        }
536        assert_eq!(bank.epoch(), 1);
537        let non_circulating_supply = calculate_non_circulating_supply(&bank).unwrap();
538        assert_eq!(
539            non_circulating_supply.lamports,
540            num_non_circulating_accounts * new_balance
541        );
542        assert_eq!(
543            non_circulating_supply.accounts.len(),
544            num_non_circulating_accounts as usize
545        );
546    }
547}