system_program.rs 9.6 KB

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