anchor_lang/
system_program.rs

1// Avoiding AccountInfo deprecated msg in anchor context
2#![allow(deprecated)]
3use crate::prelude::*;
4use crate::solana_program::pubkey::Pubkey;
5
6pub use crate::solana_program::system_program::ID;
7
8#[derive(Debug, Clone)]
9pub struct System;
10
11impl anchor_lang::Id for System {
12    fn id() -> Pubkey {
13        ID
14    }
15}
16
17pub fn advance_nonce_account<'info>(
18    ctx: CpiContext<'_, '_, '_, 'info, AdvanceNonceAccount<'info>>,
19) -> Result<()> {
20    let ix = crate::solana_program::system_instruction::advance_nonce_account(
21        ctx.accounts.nonce.key,
22        ctx.accounts.authorized.key,
23    );
24    crate::solana_program::program::invoke_signed(
25        &ix,
26        &[
27            ctx.accounts.nonce,
28            ctx.accounts.recent_blockhashes,
29            ctx.accounts.authorized,
30        ],
31        ctx.signer_seeds,
32    )
33    .map_err(Into::into)
34}
35
36#[derive(Accounts)]
37pub struct AdvanceNonceAccount<'info> {
38    pub nonce: AccountInfo<'info>,
39    pub authorized: AccountInfo<'info>,
40    pub recent_blockhashes: AccountInfo<'info>,
41}
42
43pub fn allocate<'info>(
44    ctx: CpiContext<'_, '_, '_, 'info, Allocate<'info>>,
45    space: u64,
46) -> Result<()> {
47    let ix = crate::solana_program::system_instruction::allocate(
48        ctx.accounts.account_to_allocate.key,
49        space,
50    );
51    crate::solana_program::program::invoke_signed(
52        &ix,
53        &[ctx.accounts.account_to_allocate],
54        ctx.signer_seeds,
55    )
56    .map_err(Into::into)
57}
58
59#[derive(Accounts)]
60pub struct Allocate<'info> {
61    pub account_to_allocate: AccountInfo<'info>,
62}
63
64pub fn allocate_with_seed<'info>(
65    ctx: CpiContext<'_, '_, '_, 'info, AllocateWithSeed<'info>>,
66    seed: &str,
67    space: u64,
68    owner: &Pubkey,
69) -> Result<()> {
70    let ix = crate::solana_program::system_instruction::allocate_with_seed(
71        ctx.accounts.account_to_allocate.key,
72        ctx.accounts.base.key,
73        seed,
74        space,
75        owner,
76    );
77    crate::solana_program::program::invoke_signed(
78        &ix,
79        &[ctx.accounts.account_to_allocate, ctx.accounts.base],
80        ctx.signer_seeds,
81    )
82    .map_err(Into::into)
83}
84
85#[derive(Accounts)]
86pub struct AllocateWithSeed<'info> {
87    pub account_to_allocate: AccountInfo<'info>,
88    pub base: AccountInfo<'info>,
89}
90
91pub fn assign<'info>(
92    ctx: CpiContext<'_, '_, '_, 'info, Assign<'info>>,
93    owner: &Pubkey,
94) -> Result<()> {
95    let ix = crate::solana_program::system_instruction::assign(
96        ctx.accounts.account_to_assign.key,
97        owner,
98    );
99    crate::solana_program::program::invoke_signed(
100        &ix,
101        &[ctx.accounts.account_to_assign],
102        ctx.signer_seeds,
103    )
104    .map_err(Into::into)
105}
106
107#[derive(Accounts)]
108pub struct Assign<'info> {
109    pub account_to_assign: AccountInfo<'info>,
110}
111
112pub fn assign_with_seed<'info>(
113    ctx: CpiContext<'_, '_, '_, 'info, AssignWithSeed<'info>>,
114    seed: &str,
115    owner: &Pubkey,
116) -> Result<()> {
117    let ix = crate::solana_program::system_instruction::assign_with_seed(
118        ctx.accounts.account_to_assign.key,
119        ctx.accounts.base.key,
120        seed,
121        owner,
122    );
123    crate::solana_program::program::invoke_signed(
124        &ix,
125        &[ctx.accounts.account_to_assign, ctx.accounts.base],
126        ctx.signer_seeds,
127    )
128    .map_err(Into::into)
129}
130
131#[derive(Accounts)]
132pub struct AssignWithSeed<'info> {
133    pub account_to_assign: AccountInfo<'info>,
134    pub base: AccountInfo<'info>,
135}
136
137pub fn authorize_nonce_account<'info>(
138    ctx: CpiContext<'_, '_, '_, 'info, AuthorizeNonceAccount<'info>>,
139    new_authority: &Pubkey,
140) -> Result<()> {
141    let ix = crate::solana_program::system_instruction::authorize_nonce_account(
142        ctx.accounts.nonce.key,
143        ctx.accounts.authorized.key,
144        new_authority,
145    );
146    crate::solana_program::program::invoke_signed(
147        &ix,
148        &[ctx.accounts.nonce, ctx.accounts.authorized],
149        ctx.signer_seeds,
150    )
151    .map_err(Into::into)
152}
153
154#[derive(Accounts)]
155pub struct AuthorizeNonceAccount<'info> {
156    pub nonce: AccountInfo<'info>,
157    pub authorized: AccountInfo<'info>,
158}
159
160pub fn create_account<'info>(
161    ctx: CpiContext<'_, '_, '_, 'info, CreateAccount<'info>>,
162    lamports: u64,
163    space: u64,
164    owner: &Pubkey,
165) -> Result<()> {
166    let ix = crate::solana_program::system_instruction::create_account(
167        ctx.accounts.from.key,
168        ctx.accounts.to.key,
169        lamports,
170        space,
171        owner,
172    );
173    crate::solana_program::program::invoke_signed(
174        &ix,
175        &[ctx.accounts.from, ctx.accounts.to],
176        ctx.signer_seeds,
177    )
178    .map_err(Into::into)
179}
180
181#[derive(Accounts)]
182pub struct CreateAccount<'info> {
183    pub from: AccountInfo<'info>,
184    pub to: AccountInfo<'info>,
185}
186
187pub fn create_account_with_seed<'info>(
188    ctx: CpiContext<'_, '_, '_, 'info, CreateAccountWithSeed<'info>>,
189    seed: &str,
190    lamports: u64,
191    space: u64,
192    owner: &Pubkey,
193) -> Result<()> {
194    let ix = crate::solana_program::system_instruction::create_account_with_seed(
195        ctx.accounts.from.key,
196        ctx.accounts.to.key,
197        ctx.accounts.base.key,
198        seed,
199        lamports,
200        space,
201        owner,
202    );
203    crate::solana_program::program::invoke_signed(
204        &ix,
205        &[ctx.accounts.from, ctx.accounts.to, ctx.accounts.base],
206        ctx.signer_seeds,
207    )
208    .map_err(Into::into)
209}
210
211#[derive(Accounts)]
212pub struct CreateAccountWithSeed<'info> {
213    pub from: AccountInfo<'info>,
214    pub to: AccountInfo<'info>,
215    pub base: AccountInfo<'info>,
216}
217
218pub fn create_nonce_account<'info>(
219    ctx: CpiContext<'_, '_, '_, 'info, CreateNonceAccount<'info>>,
220    lamports: u64,
221    authority: &Pubkey,
222) -> Result<()> {
223    let ixs = crate::solana_program::system_instruction::create_nonce_account(
224        ctx.accounts.from.key,
225        ctx.accounts.nonce.key,
226        authority,
227        lamports,
228    );
229    crate::solana_program::program::invoke_signed(
230        &ixs[0],
231        &[ctx.accounts.from, ctx.accounts.nonce.clone()],
232        ctx.signer_seeds,
233    )?;
234
235    crate::solana_program::program::invoke_signed(
236        &ixs[1],
237        &[
238            ctx.accounts.nonce,
239            ctx.accounts.recent_blockhashes,
240            ctx.accounts.rent,
241        ],
242        ctx.signer_seeds,
243    )
244    .map_err(Into::into)
245}
246
247#[derive(Accounts)]
248pub struct CreateNonceAccount<'info> {
249    pub from: AccountInfo<'info>,
250    pub nonce: AccountInfo<'info>,
251    pub recent_blockhashes: AccountInfo<'info>,
252    pub rent: AccountInfo<'info>,
253}
254
255pub fn create_nonce_account_with_seed<'info>(
256    ctx: CpiContext<'_, '_, '_, 'info, CreateNonceAccountWithSeed<'info>>,
257    lamports: u64,
258    seed: &str,
259    authority: &Pubkey,
260) -> Result<()> {
261    let ixs = crate::solana_program::system_instruction::create_nonce_account_with_seed(
262        ctx.accounts.from.key,
263        ctx.accounts.nonce.key,
264        ctx.accounts.base.key,
265        seed,
266        authority,
267        lamports,
268    );
269    crate::solana_program::program::invoke_signed(
270        &ixs[0],
271        &[
272            ctx.accounts.from,
273            ctx.accounts.nonce.clone(),
274            ctx.accounts.base,
275        ],
276        ctx.signer_seeds,
277    )?;
278
279    crate::solana_program::program::invoke_signed(
280        &ixs[1],
281        &[
282            ctx.accounts.nonce,
283            ctx.accounts.recent_blockhashes,
284            ctx.accounts.rent,
285        ],
286        ctx.signer_seeds,
287    )
288    .map_err(Into::into)
289}
290
291#[derive(Accounts)]
292pub struct CreateNonceAccountWithSeed<'info> {
293    pub from: AccountInfo<'info>,
294    pub nonce: AccountInfo<'info>,
295    pub base: AccountInfo<'info>,
296    pub recent_blockhashes: AccountInfo<'info>,
297    pub rent: AccountInfo<'info>,
298}
299
300pub fn transfer<'info>(
301    ctx: CpiContext<'_, '_, '_, 'info, Transfer<'info>>,
302    lamports: u64,
303) -> Result<()> {
304    let ix = crate::solana_program::system_instruction::transfer(
305        ctx.accounts.from.key,
306        ctx.accounts.to.key,
307        lamports,
308    );
309    crate::solana_program::program::invoke_signed(
310        &ix,
311        &[ctx.accounts.from, ctx.accounts.to],
312        ctx.signer_seeds,
313    )
314    .map_err(Into::into)
315}
316
317#[derive(Accounts)]
318pub struct Transfer<'info> {
319    pub from: AccountInfo<'info>,
320    pub to: AccountInfo<'info>,
321}
322
323pub fn transfer_with_seed<'info>(
324    ctx: CpiContext<'_, '_, '_, 'info, TransferWithSeed<'info>>,
325    from_seed: String,
326    from_owner: &Pubkey,
327    lamports: u64,
328) -> Result<()> {
329    let ix = crate::solana_program::system_instruction::transfer_with_seed(
330        ctx.accounts.from.key,
331        ctx.accounts.base.key,
332        from_seed,
333        from_owner,
334        ctx.accounts.to.key,
335        lamports,
336    );
337    crate::solana_program::program::invoke_signed(
338        &ix,
339        &[ctx.accounts.from, ctx.accounts.base, ctx.accounts.to],
340        ctx.signer_seeds,
341    )
342    .map_err(Into::into)
343}
344
345#[derive(Accounts)]
346pub struct TransferWithSeed<'info> {
347    pub from: AccountInfo<'info>,
348    pub base: AccountInfo<'info>,
349    pub to: AccountInfo<'info>,
350}
351
352pub fn withdraw_nonce_account<'info>(
353    ctx: CpiContext<'_, '_, '_, 'info, WithdrawNonceAccount<'info>>,
354    lamports: u64,
355) -> Result<()> {
356    let ix = crate::solana_program::system_instruction::withdraw_nonce_account(
357        ctx.accounts.nonce.key,
358        ctx.accounts.authorized.key,
359        ctx.accounts.to.key,
360        lamports,
361    );
362    crate::solana_program::program::invoke_signed(
363        &ix,
364        &[
365            ctx.accounts.nonce,
366            ctx.accounts.to,
367            ctx.accounts.recent_blockhashes,
368            ctx.accounts.rent,
369            ctx.accounts.authorized,
370        ],
371        ctx.signer_seeds,
372    )
373    .map_err(Into::into)
374}
375
376#[derive(Accounts)]
377pub struct WithdrawNonceAccount<'info> {
378    pub nonce: AccountInfo<'info>,
379    pub to: AccountInfo<'info>,
380    pub recent_blockhashes: AccountInfo<'info>,
381    pub rent: AccountInfo<'info>,
382    pub authorized: AccountInfo<'info>,
383}