123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326 |
- use anchor_lang::prelude::*;
- use some_external_program;
- use std::str::FromStr;
- declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
- #[constant]
- pub const FOO_CONST: u128 = 1_000_000;
- #[constant]
- pub const BAR_CONST: u8 = 6;
- /// This is an example program used for testing
- #[program]
- pub mod example_program {
- use super::*;
- pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
- ctx.accounts.state.set_inner(State::default());
- Ok(())
- }
- /// Initializes an account with specified values
- pub fn initialize_with_values(
- ctx: Context<Initialize>,
- bool_field: bool,
- u8_field: u8,
- i8_field: i8,
- u16_field: u16,
- i16_field: i16,
- u32_field: u32,
- i32_field: i32,
- f32_field: f32,
- u64_field: u64,
- i64_field: i64,
- f64_field: f64,
- u128_field: u128,
- i128_field: i128,
- bytes_field: Vec<u8>,
- string_field: String,
- pubkey_field: Pubkey,
- vec_field: Vec<u64>,
- vec_struct_field: Vec<FooStruct>,
- option_field: Option<bool>,
- option_struct_field: Option<FooStruct>,
- struct_field: FooStruct,
- array_field: [bool; 3],
- enum_field_1: FooEnum,
- enum_field_2: FooEnum,
- enum_field_3: FooEnum,
- enum_field_4: FooEnum,
- ) -> Result<()> {
- ctx.accounts.state.set_inner(State {
- bool_field,
- u8_field,
- i8_field,
- u16_field,
- i16_field,
- u32_field,
- i32_field,
- f32_field,
- u64_field,
- i64_field,
- f64_field,
- u128_field,
- i128_field,
- bytes_field,
- string_field,
- pubkey_field,
- vec_field,
- vec_struct_field,
- option_field,
- option_struct_field,
- struct_field,
- array_field,
- enum_field_1,
- enum_field_2,
- enum_field_3,
- enum_field_4,
- });
- Ok(())
- }
- /// a separate instruction due to initialize_with_values having too many arguments
- /// https://github.com/solana-labs/solana/issues/23978
- pub fn initialize_with_values2(
- ctx: Context<Initialize2>,
- vec_of_option: Vec<Option<u64>>,
- box_field: Box<bool>,
- ) -> Result<SomeRetStruct> {
- ctx.accounts.state.set_inner(State2 { vec_of_option, box_field });
- Ok(SomeRetStruct { some_field: 3})
- }
- pub fn cause_error(_ctx: Context<CauseError>) -> Result<()> {
- return Err(error!(ErrorCode::SomeError));
- }
- }
- /// Enum type
- #[derive(AnchorSerialize, AnchorDeserialize, Clone)]
- pub enum FooEnum {
- /// Tuple kind
- Unnamed(bool, u8, BarStruct),
- UnnamedSingle(BarStruct),
- Named {
- /// A bool field inside a struct tuple kind
- bool_field: bool,
- u8_field: u8,
- nested: BarStruct,
- },
- Struct(BarStruct),
- OptionStruct(Option<BarStruct>),
- VecStruct(Vec<BarStruct>),
- NoFields,
- }
- /// Bar struct type
- #[derive(AnchorSerialize, AnchorDeserialize, Clone)]
- pub struct BarStruct {
- /// Some field
- some_field: bool,
- other_field: u8,
- }
- impl Default for BarStruct {
- fn default() -> Self {
- return BarStruct {
- some_field: true,
- other_field: 10,
- };
- }
- }
- #[derive(AnchorSerialize, AnchorDeserialize, Clone)]
- pub struct FooStruct {
- field1: u8,
- field2: u16,
- nested: BarStruct,
- vec_nested: Vec<BarStruct>,
- option_nested: Option<BarStruct>,
- enum_field: FooEnum,
- }
- impl Default for FooStruct {
- fn default() -> Self {
- return FooStruct {
- field1: 123,
- field2: 999,
- nested: BarStruct::default(),
- vec_nested: vec![BarStruct::default()],
- option_nested: Some(BarStruct::default()),
- enum_field: FooEnum::Named {
- bool_field: true,
- u8_field: 15,
- nested: BarStruct::default(),
- },
- };
- }
- }
- /// An account containing various fields
- #[account]
- pub struct State {
- /// A boolean field
- bool_field: bool,
- u8_field: u8,
- i8_field: i8,
- u16_field: u16,
- i16_field: i16,
- u32_field: u32,
- i32_field: i32,
- f32_field: f32,
- u64_field: u64,
- i64_field: i64,
- f64_field: f64,
- u128_field: u128,
- i128_field: i128,
- bytes_field: Vec<u8>,
- string_field: String,
- pubkey_field: Pubkey,
- vec_field: Vec<u64>,
- vec_struct_field: Vec<FooStruct>,
- option_field: Option<bool>,
- option_struct_field: Option<FooStruct>,
- struct_field: FooStruct,
- array_field: [bool; 3],
- enum_field_1: FooEnum,
- enum_field_2: FooEnum,
- enum_field_3: FooEnum,
- enum_field_4: FooEnum,
- }
- impl Default for State {
- fn default() -> Self {
- // some arbitrary default values
- return State {
- bool_field: true,
- u8_field: 234,
- i8_field: -123,
- u16_field: 62345,
- i16_field: -31234,
- u32_field: 1234567891,
- i32_field: -1234567891,
- f32_field: 123456.5,
- u64_field: u64::MAX / 2 + 10,
- i64_field: i64::MIN / 2 - 10,
- f64_field: 1234567891.345,
- u128_field: u128::MAX / 2 + 10,
- i128_field: i128::MIN / 2 - 10,
- bytes_field: vec![1, 2, 255, 254],
- string_field: String::from("hello"),
- pubkey_field: Pubkey::from_str("EPZP2wrcRtMxrAPJCXVEQaYD9eH7fH7h12YqKDcd4aS7").unwrap(),
- vec_field: vec![1, 2, 100, 1000, u64::MAX],
- vec_struct_field: vec![FooStruct::default()],
- option_field: None,
- option_struct_field: Some(FooStruct::default()),
- struct_field: FooStruct::default(),
- array_field: [true, false, true],
- enum_field_1: FooEnum::Unnamed(false, 10, BarStruct::default()),
- enum_field_2: FooEnum::Named {
- bool_field: true,
- u8_field: 20,
- nested: BarStruct::default(),
- },
- enum_field_3: FooEnum::Struct(BarStruct::default()),
- enum_field_4: FooEnum::NoFields,
- };
- }
- }
- #[account]
- pub struct State2 {
- vec_of_option: Vec<Option<u64>>,
- box_field: Box<bool>,
- }
- impl Default for State2 {
- fn default() -> Self {
- return State2 {
- vec_of_option: vec![None, Some(10)],
- box_field: Box::new(true),
- };
- }
- }
- #[derive(Accounts)]
- pub struct NestedAccounts<'info> {
- /// Sysvar clock
- clock: Sysvar<'info, Clock>,
- rent: Sysvar<'info, Rent>,
- }
- #[derive(Accounts)]
- pub struct Initialize<'info> {
- /// State account
- #[account(
- init,
- space = 8 + 1000, // TODO: use exact space required
- payer = payer,
- )]
- state: Account<'info, State>,
- nested: NestedAccounts<'info>,
- zc_account: AccountLoader<'info, SomeZcAccount>,
- #[account(mut)]
- payer: Signer<'info>,
- system_program: Program<'info, System>,
- }
- #[derive(Accounts)]
- pub struct Initialize2<'info> {
- #[account(
- init,
- space = 8 + 1000, // TODO: use exact space required
- payer = payer,
- )]
- state: Account<'info, State2>,
- #[account(mut)]
- payer: Signer<'info>,
- system_program: Program<'info, System>,
- }
- #[derive(Accounts)]
- pub struct CauseError {}
- #[error_code]
- pub enum ErrorCode {
- #[msg("Example error.")]
- SomeError,
- #[msg("Another error.")]
- OtherError,
- ErrorWithoutMsg,
- }
- mod some_other_module {
- use super::*;
- #[derive(AnchorSerialize, AnchorDeserialize, Clone)]
- pub struct Baz {
- some_u8: u8,
- }
- }
- #[event]
- pub struct SomeEvent {
- bool_field: bool,
- external_baz: some_external_program::Baz,
- other_module_baz: some_other_module::Baz,
- }
- #[zero_copy]
- pub struct ZcStruct {
- pub some_field: u16,
- }
- #[account(zero_copy)]
- pub struct SomeZcAccount {
- field: ZcStruct,
- }
- #[derive(AnchorSerialize, AnchorDeserialize, Clone)]
- pub struct SomeRetStruct {
- pub some_field: u8,
- }
|