1pub(crate) mod core_bpf_migration;
2pub mod prototypes;
3
4pub use prototypes::{BuiltinPrototype, StatelessBuiltinPrototype};
5use {
6 core_bpf_migration::CoreBpfMigrationConfig,
7 solana_feature_set as feature_set,
8 solana_sdk::{bpf_loader, bpf_loader_deprecated, bpf_loader_upgradeable},
9};
10
11macro_rules! testable_prototype {
12 ($prototype:ident {
13 core_bpf_migration_config: $core_bpf_migration_config:expr,
14 name: $name:ident,
15 $($field:ident : $value:expr),* $(,)?
16 }) => {
17 $prototype {
18 core_bpf_migration_config: {
19 #[cfg(not(test))]
20 {
21 $core_bpf_migration_config
22 }
23 #[cfg(test)]
24 {
25 Some( test_only::$name::CONFIG )
26 }
27 },
28 name: stringify!($name),
29 $($field: $value),*
30 }
31 };
32}
33
34pub static BUILTINS: &[BuiltinPrototype] = &[
40 testable_prototype!(BuiltinPrototype {
41 core_bpf_migration_config: None,
42 name: system_program,
43 enable_feature_id: None,
44 program_id: solana_system_program::id(),
45 entrypoint: solana_system_program::system_processor::Entrypoint::vm,
46 }),
47 testable_prototype!(BuiltinPrototype {
48 core_bpf_migration_config: None,
49 name: vote_program,
50 enable_feature_id: None,
51 program_id: solana_vote_program::id(),
52 entrypoint: solana_vote_program::vote_processor::Entrypoint::vm,
53 }),
54 BuiltinPrototype {
55 core_bpf_migration_config: Some(CoreBpfMigrationConfig {
56 source_buffer_address: buffer_accounts::stake_program::id(),
57 upgrade_authority_address: None,
58 feature_id: solana_feature_set::migrate_stake_program_to_core_bpf::id(),
59 migration_target: core_bpf_migration::CoreBpfMigrationTargetType::Builtin,
60 datapoint_name: "migrate_builtin_to_core_bpf_stake_program",
61 }),
62 name: "stake_program",
63 enable_feature_id: None,
64 program_id: solana_stake_program::id(),
65 entrypoint: solana_stake_program::stake_instruction::Entrypoint::vm,
66 },
67 BuiltinPrototype {
68 core_bpf_migration_config: Some(CoreBpfMigrationConfig {
69 source_buffer_address: buffer_accounts::config_program::id(),
70 upgrade_authority_address: None,
71 feature_id: solana_feature_set::migrate_config_program_to_core_bpf::id(),
72 migration_target: core_bpf_migration::CoreBpfMigrationTargetType::Builtin,
73 datapoint_name: "migrate_builtin_to_core_bpf_config_program",
74 }),
75 name: "config_program",
76 enable_feature_id: None,
77 program_id: solana_config_program::id(),
78 entrypoint: solana_config_program::config_processor::Entrypoint::vm,
79 },
80 testable_prototype!(BuiltinPrototype {
81 core_bpf_migration_config: None,
82 name: solana_bpf_loader_deprecated_program,
83 enable_feature_id: None,
84 program_id: bpf_loader_deprecated::id(),
85 entrypoint: solana_bpf_loader_program::Entrypoint::vm,
86 }),
87 testable_prototype!(BuiltinPrototype {
88 core_bpf_migration_config: None,
89 name: solana_bpf_loader_program,
90 enable_feature_id: None,
91 program_id: bpf_loader::id(),
92 entrypoint: solana_bpf_loader_program::Entrypoint::vm,
93 }),
94 testable_prototype!(BuiltinPrototype {
95 core_bpf_migration_config: None,
96 name: solana_bpf_loader_upgradeable_program,
97 enable_feature_id: None,
98 program_id: bpf_loader_upgradeable::id(),
99 entrypoint: solana_bpf_loader_program::Entrypoint::vm,
100 }),
101 testable_prototype!(BuiltinPrototype {
102 core_bpf_migration_config: None,
103 name: compute_budget_program,
104 enable_feature_id: None,
105 program_id: solana_sdk::compute_budget::id(),
106 entrypoint: solana_compute_budget_program::Entrypoint::vm,
107 }),
108 BuiltinPrototype {
109 core_bpf_migration_config: Some(CoreBpfMigrationConfig {
110 source_buffer_address: buffer_accounts::address_lookup_table_program::id(),
111 upgrade_authority_address: None,
112 feature_id: solana_feature_set::migrate_address_lookup_table_program_to_core_bpf::id(),
113 migration_target: core_bpf_migration::CoreBpfMigrationTargetType::Builtin,
114 datapoint_name: "migrate_builtin_to_core_bpf_address_lookup_table_program",
115 }),
116 name: "address_lookup_table_program",
117 enable_feature_id: None,
118 program_id: solana_sdk::address_lookup_table::program::id(),
119 entrypoint: solana_address_lookup_table_program::processor::Entrypoint::vm,
120 },
121 testable_prototype!(BuiltinPrototype {
122 core_bpf_migration_config: None,
123 name: zk_token_proof_program,
124 enable_feature_id: Some(feature_set::zk_token_sdk_enabled::id()),
125 program_id: solana_zk_token_sdk::zk_token_proof_program::id(),
126 entrypoint: solana_zk_token_proof_program::Entrypoint::vm,
127 }),
128 testable_prototype!(BuiltinPrototype {
129 core_bpf_migration_config: None,
130 name: loader_v4,
131 enable_feature_id: Some(feature_set::enable_program_runtime_v2_and_loader_v4::id()),
132 program_id: solana_sdk::loader_v4::id(),
133 entrypoint: solana_loader_v4_program::Entrypoint::vm,
134 }),
135 testable_prototype!(BuiltinPrototype {
136 core_bpf_migration_config: None,
137 name: zk_elgamal_proof_program,
138 enable_feature_id: Some(feature_set::zk_elgamal_proof_program_enabled::id()),
139 program_id: solana_zk_sdk::zk_elgamal_proof_program::id(),
140 entrypoint: solana_zk_elgamal_proof_program::Entrypoint::vm,
141 }),
142];
143
144pub static STATELESS_BUILTINS: &[StatelessBuiltinPrototype] = &[StatelessBuiltinPrototype {
145 core_bpf_migration_config: Some(CoreBpfMigrationConfig {
146 source_buffer_address: buffer_accounts::feature_gate_program::id(),
147 upgrade_authority_address: None,
148 feature_id: solana_feature_set::migrate_feature_gate_program_to_core_bpf::id(),
149 migration_target: core_bpf_migration::CoreBpfMigrationTargetType::Stateless,
150 datapoint_name: "migrate_stateless_to_core_bpf_feature_gate_program",
151 }),
152 name: "feature_gate_program",
153 program_id: solana_sdk::feature::id(),
154}];
155
156mod buffer_accounts {
158 pub mod address_lookup_table_program {
159 solana_sdk::declare_id!("AhXWrD9BBUYcKjtpA3zuiiZG4ysbo6C6wjHo1QhERk6A");
160 }
161 pub mod config_program {
162 solana_sdk::declare_id!("BuafH9fBv62u6XjzrzS4ZjAE8963ejqF5rt1f8Uga4Q3");
163 }
164 pub mod feature_gate_program {
165 solana_sdk::declare_id!("3D3ydPWvmEszrSjrickCtnyRSJm1rzbbSsZog8Ub6vLh");
166 }
167 pub mod stake_program {
168 solana_sdk::declare_id!("8t3vv6v99tQA6Gp7fVdsBH66hQMaswH5qsJVqJqo8xvG");
169 }
170}
171
172#[cfg(test)]
180mod test_only {
181 use super::core_bpf_migration::{CoreBpfMigrationConfig, CoreBpfMigrationTargetType};
182 pub mod system_program {
183 pub mod feature {
184 solana_sdk::declare_id!("AnjsdWg7LXFbjDdy78wncCJs9PyTdWpKkFmHAwQU1mQ6");
185 }
186 pub mod source_buffer {
187 solana_sdk::declare_id!("EDEhzg1Jk79Wrk4mwpRa7txjgRxcE6igXwd6egFDVhuz");
188 }
189 pub mod upgrade_authority {
190 solana_sdk::declare_id!("4d14UK2o1FKKoecEBWhVDZrBBbRuhug75G1j9XYCawC2");
191 }
192 pub const CONFIG: super::CoreBpfMigrationConfig = super::CoreBpfMigrationConfig {
193 source_buffer_address: source_buffer::id(),
194 upgrade_authority_address: Some(upgrade_authority::id()),
195 feature_id: feature::id(),
196 migration_target: super::CoreBpfMigrationTargetType::Builtin,
197 datapoint_name: "migrate_builtin_to_core_bpf_system_program",
198 };
199 }
200
201 pub mod vote_program {
202 pub mod feature {
203 solana_sdk::declare_id!("5wDLHMasPmtrcpfRZX67RVkBXBbSTQ9S4C8EJomD3yAk");
204 }
205 pub mod source_buffer {
206 solana_sdk::declare_id!("6T9s4PTcHnpq2AVAqoCbJd4FuHsdD99MjSUEbS7qb1tT");
207 }
208 pub mod upgrade_authority {
209 solana_sdk::declare_id!("2N4JfyYub6cWUP9R4JrsFHv6FYKT7JnoRX8GQUH9MdT3");
210 }
211 pub const CONFIG: super::CoreBpfMigrationConfig = super::CoreBpfMigrationConfig {
212 source_buffer_address: source_buffer::id(),
213 upgrade_authority_address: Some(upgrade_authority::id()),
214 feature_id: feature::id(),
215 migration_target: super::CoreBpfMigrationTargetType::Builtin,
216 datapoint_name: "migrate_builtin_to_core_bpf_vote_program",
217 };
218 }
219
220 pub mod solana_bpf_loader_deprecated_program {
221 pub mod feature {
222 solana_sdk::declare_id!("8gpakCv5Pk5PZGv9RUjzdkk2GVQPGx12cNRUDMQ3bP86");
223 }
224 pub mod source_buffer {
225 solana_sdk::declare_id!("DveUYB5m9G3ce4zpV3fxg9pCNkvH1wDsyd8XberZ47JL");
226 }
227 pub mod upgrade_authority {
228 solana_sdk::declare_id!("8Y5VTHdadnz4rZZWdUA4Qq2m2zWoCwwtb38spPZCXuGU");
229 }
230 pub const CONFIG: super::CoreBpfMigrationConfig = super::CoreBpfMigrationConfig {
231 source_buffer_address: source_buffer::id(),
232 upgrade_authority_address: Some(upgrade_authority::id()),
233 feature_id: feature::id(),
234 migration_target: super::CoreBpfMigrationTargetType::Builtin,
235 datapoint_name: "migrate_builtin_to_core_bpf_bpf_loader_deprecated_program",
236 };
237 }
238
239 pub mod solana_bpf_loader_program {
240 pub mod feature {
241 solana_sdk::declare_id!("8yEdUm4SaP1yNq2MczEVdrM48SucvZCTDSqjcAKfYfL6");
242 }
243 pub mod source_buffer {
244 solana_sdk::declare_id!("2EWMYGJPuGLW4TexLLEMeXP2BkB1PXEKBFb698yw6LhT");
245 }
246 pub mod upgrade_authority {
247 solana_sdk::declare_id!("3sQ9VZ1Lvuvs6NpFXFV3ByFAf52ajPPdXwuhYERJR3iJ");
248 }
249 pub const CONFIG: super::CoreBpfMigrationConfig = super::CoreBpfMigrationConfig {
250 source_buffer_address: source_buffer::id(),
251 upgrade_authority_address: Some(upgrade_authority::id()),
252 feature_id: feature::id(),
253 migration_target: super::CoreBpfMigrationTargetType::Builtin,
254 datapoint_name: "migrate_builtin_to_core_bpf_bpf_loader_program",
255 };
256 }
257
258 pub mod solana_bpf_loader_upgradeable_program {
259 pub mod feature {
260 solana_sdk::declare_id!("oPQbVjgoQ7SaQmzZiiHW4xqHbh4BJqqrFhxEJZiMiwY");
261 }
262 pub mod source_buffer {
263 solana_sdk::declare_id!("6bTmA9iefD57GDoQ9wUjG8SeYkSpRw3EkKzxZCbhkavq");
264 }
265 pub mod upgrade_authority {
266 solana_sdk::declare_id!("CuJvJY1K2wx82oLrQGSSWtw4AF7nVifEHupzSC2KEcq5");
267 }
268 pub const CONFIG: super::CoreBpfMigrationConfig = super::CoreBpfMigrationConfig {
269 source_buffer_address: source_buffer::id(),
270 upgrade_authority_address: Some(upgrade_authority::id()),
271 feature_id: feature::id(),
272 migration_target: super::CoreBpfMigrationTargetType::Builtin,
273 datapoint_name: "migrate_builtin_to_core_bpf_bpf_loader_upgradeable_program",
274 };
275 }
276
277 pub mod compute_budget_program {
278 pub mod feature {
279 solana_sdk::declare_id!("D39vUspVfhjPVD7EtMJZrA5j1TSMp4LXfb43nxumGdHT");
280 }
281 pub mod source_buffer {
282 solana_sdk::declare_id!("KfX1oLpFC5CwmFeSgXrNcXaouKjFkPuSJ4UsKb3zKMX");
283 }
284 pub mod upgrade_authority {
285 solana_sdk::declare_id!("HGTbQhaCXNTbpgpLb2KNjqWSwpJyb2dqDB66Lc3Ph4aN");
286 }
287 pub const CONFIG: super::CoreBpfMigrationConfig = super::CoreBpfMigrationConfig {
288 source_buffer_address: source_buffer::id(),
289 upgrade_authority_address: Some(upgrade_authority::id()),
290 feature_id: feature::id(),
291 migration_target: super::CoreBpfMigrationTargetType::Builtin,
292 datapoint_name: "migrate_builtin_to_core_bpf_compute_budget_program",
293 };
294 }
295
296 pub mod zk_token_proof_program {
297 pub mod feature {
298 solana_sdk::declare_id!("GfeFwUzKP9NmaP5u4VfnFgEvQoeQc2wPgnBFrUZhpib5");
299 }
300 pub mod source_buffer {
301 solana_sdk::declare_id!("Ffe9gL8vXraBkiv3HqbLvBqY7i9V4qtZxjH83jYYDe1V");
302 }
303 pub mod upgrade_authority {
304 solana_sdk::declare_id!("6zkXWHR8YeCvfMqHwyiz2n7g6hMUKCFhrVccZZTDk4ei");
305 }
306 pub const CONFIG: super::CoreBpfMigrationConfig = super::CoreBpfMigrationConfig {
307 source_buffer_address: source_buffer::id(),
308 upgrade_authority_address: Some(upgrade_authority::id()),
309 feature_id: feature::id(),
310 migration_target: super::CoreBpfMigrationTargetType::Builtin,
311 datapoint_name: "migrate_builtin_to_core_bpf_zk_token_proof_program",
312 };
313 }
314
315 pub mod loader_v4 {
316 pub mod feature {
317 solana_sdk::declare_id!("Cz5JthYp27KR3rwTCtVJhbRgwHCurbwcYX46D8setL22");
318 }
319 pub mod source_buffer {
320 solana_sdk::declare_id!("EH45pKy1kzjifB93wEJi91js3S4HETdsteywR7ZCNPn5");
321 }
322 pub mod upgrade_authority {
323 solana_sdk::declare_id!("AWbiYRbFts9GVX5uwUkwV46hTFP85PxCAM8e8ir8Hqtq");
324 }
325 pub const CONFIG: super::CoreBpfMigrationConfig = super::CoreBpfMigrationConfig {
326 source_buffer_address: source_buffer::id(),
327 upgrade_authority_address: Some(upgrade_authority::id()),
328 feature_id: feature::id(),
329 migration_target: super::CoreBpfMigrationTargetType::Builtin,
330 datapoint_name: "migrate_builtin_to_core_bpf_loader_v4_program",
331 };
332 }
333
334 pub mod zk_elgamal_proof_program {
335 pub mod feature {
336 solana_sdk::declare_id!("EYtuxScWqGWmcPEDmeUsEt3iPkvWE26EWLfSxUvWP2WN");
337 }
338 pub mod source_buffer {
339 solana_sdk::declare_id!("AaVrLPurAUmjw6XRNGr6ezQfHaJWpBGHhcRSJmNjoVpQ");
340 }
341 pub mod upgrade_authority {
342 solana_sdk::declare_id!("EyGkQYHgynUdvdNPNiWbJQk9roFCexgdJQMNcWbuvp78");
343 }
344 pub const CONFIG: super::CoreBpfMigrationConfig = super::CoreBpfMigrationConfig {
345 source_buffer_address: source_buffer::id(),
346 upgrade_authority_address: Some(upgrade_authority::id()),
347 feature_id: feature::id(),
348 migration_target: super::CoreBpfMigrationTargetType::Builtin,
349 datapoint_name: "migrate_builtin_to_core_bpf_zk_elgamal_proof_program",
350 };
351 }
352}
353
354#[cfg(test)]
355mod tests {
356 #[test]
360 fn test_testable_prototypes() {
361 assert_eq!(
362 &super::BUILTINS[0].core_bpf_migration_config,
363 &Some(super::test_only::system_program::CONFIG)
364 );
365 assert_eq!(
366 &super::BUILTINS[1].core_bpf_migration_config,
367 &Some(super::test_only::vote_program::CONFIG)
368 );
369 assert_eq!(
374 &super::BUILTINS[4].core_bpf_migration_config,
375 &Some(super::test_only::solana_bpf_loader_deprecated_program::CONFIG)
376 );
377 assert_eq!(
378 &super::BUILTINS[5].core_bpf_migration_config,
379 &Some(super::test_only::solana_bpf_loader_program::CONFIG)
380 );
381 assert_eq!(
382 &super::BUILTINS[6].core_bpf_migration_config,
383 &Some(super::test_only::solana_bpf_loader_upgradeable_program::CONFIG)
384 );
385 assert_eq!(
386 &super::BUILTINS[7].core_bpf_migration_config,
387 &Some(super::test_only::compute_budget_program::CONFIG)
388 );
389 assert_eq!(
392 &super::BUILTINS[9].core_bpf_migration_config,
393 &Some(super::test_only::zk_token_proof_program::CONFIG)
394 );
395 assert_eq!(
396 &super::BUILTINS[10].core_bpf_migration_config,
397 &Some(super::test_only::loader_v4::CONFIG)
398 );
399 assert_eq!(
400 &super::BUILTINS[11].core_bpf_migration_config,
401 &Some(super::test_only::zk_elgamal_proof_program::CONFIG)
402 );
403 }
406}