This repository was archived by the owner on Jan 22, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 4.8k
/
Copy pathloader_upgradeable_instruction.rs
128 lines (122 loc) · 5.23 KB
/
loader_upgradeable_instruction.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
//! Upgradeable loader instruction definitions
#[repr(u8)]
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
pub enum UpgradeableLoaderInstruction {
/// Initialize a Buffer account.
///
/// A Buffer account is an intermediary that once fully populated is used
/// with the `DeployWithMaxDataLen` instruction to populate the program's
/// ProgramData account.
///
/// The `InitializeBuffer` instruction requires no signers and MUST be
/// included within the same Transaction as the system program's
/// `CreateAccount` instruction that creates the account being initialized.
/// Otherwise another party may initialize the account.
///
/// # Account references
/// 0. `[writable]` source account to initialize.
/// 1. `[]` Buffer authority, optional, if omitted then the buffer will be
/// immutable.
InitializeBuffer,
/// Write program data into a Buffer account.
///
/// # Account references
/// 0. `[writable]` Buffer account to write program data to.
/// 1. `[signer]` Buffer authority
Write {
/// Offset at which to write the given bytes.
offset: u32,
/// Serialized program data
#[serde(with = "serde_bytes")]
bytes: Vec<u8>,
},
/// Deploy an executable program.
///
/// A program consists of a Program and ProgramData account pair.
/// - The Program account's address will serve as the program id for any
/// instructions that execute this program.
/// - The ProgramData account will remain mutable by the loader only and
/// holds the program data and authority information. The ProgramData
/// account's address is derived from the Program account's address and
/// created by the DeployWithMaxDataLen instruction.
///
/// The ProgramData address is derived from the Program account's address as
/// follows:
///
/// ```
/// # use solana_program::pubkey::Pubkey;
/// # use solana_program::bpf_loader_upgradeable;
/// # let program_address = &[];
/// let (program_data_address, _) = Pubkey::find_program_address(
/// &[program_address],
/// &bpf_loader_upgradeable::id()
/// );
/// ```
///
/// The `DeployWithMaxDataLen` instruction does not require the ProgramData
/// account be a signer and therefore MUST be included within the same
/// Transaction as the system program's `CreateAccount` instruction that
/// creates the Program account. Otherwise another party may initialize the
/// account.
///
/// # Account references
/// 0. `[signer]` The payer account that will pay to create the ProgramData
/// account.
/// 1. `[writable]` The uninitialized ProgramData account.
/// 2. `[writable]` The uninitialized Program account.
/// 3. `[writable]` The Buffer account where the program data has been
/// written. The buffer account's authority must match the program's
/// authority
/// 4. `[]` Rent sysvar.
/// 5. `[]` Clock sysvar.
/// 6. `[]` System program (`solana_sdk::system_program::id()`).
/// 7. `[signer]` The program's authority
DeployWithMaxDataLen {
/// Maximum length that the program can be upgraded to.
max_data_len: usize,
},
/// Upgrade a program.
///
/// A program can be updated as long as the program's authority has not been
/// set to `None`.
///
/// The Buffer account must contain sufficient lamports to fund the
/// ProgramData account to be rent-exempt, any additional lamports left over
/// will be transferred to the spill account, leaving the Buffer account
/// balance at zero.
///
/// # Account references
/// 0. `[writable]` The ProgramData account.
/// 1. `[writable]` The Program account.
/// 2. `[writable]` The Buffer account where the program data has been
/// written. The buffer account's authority must match the program's
/// authority
/// 3. `[writable]` The spill account.
/// 4. `[]` Rent sysvar.
/// 5. `[]` Clock sysvar.
/// 6. `[signer]` The program's authority.
Upgrade,
/// Set a new authority that is allowed to write the buffer or upgrade the
/// program. To permanently make the buffer immutable or disable program
/// updates omit the new authority.
///
/// # Account references
/// 0. `[writable]` The Buffer or ProgramData account to change the
/// authority of.
/// 1. `[signer]` The current authority.
/// 2. `[]` The new authority, optional, if omitted then the program will
/// not be upgradeable.
SetAuthority,
/// Closes an account owned by the upgradeable loader of all lamports and
/// withdraws all the lamports
///
/// # Account references
/// 0. `[writable]` The account to close, if closing a program must be the
/// ProgramData account.
/// 1. `[writable]` The account to deposit the closed account's lamports.
/// 2. `[signer]` The account's authority, Optional, required for
/// initialized accounts.
/// 3. `[writable]` The associated Program account if the account to close
/// is a ProgramData account.
Close,
}