|
@@ -26,36 +26,41 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
|
|
|
match ix {
|
|
|
anchor_lang::idl::IdlInstruction::Create { data_len } => {
|
|
|
let mut bumps = std::collections::BTreeMap::new();
|
|
|
+ let mut reallocs = std::collections::BTreeSet::new();
|
|
|
let mut accounts =
|
|
|
- anchor_lang::idl::IdlCreateAccounts::try_accounts(program_id, &mut accounts, &[], &mut bumps)?;
|
|
|
+ anchor_lang::idl::IdlCreateAccounts::try_accounts(program_id, &mut accounts, &[], &mut bumps, &mut reallocs)?;
|
|
|
__idl_create_account(program_id, &mut accounts, data_len)?;
|
|
|
accounts.exit(program_id)?;
|
|
|
},
|
|
|
anchor_lang::idl::IdlInstruction::CreateBuffer => {
|
|
|
let mut bumps = std::collections::BTreeMap::new();
|
|
|
+ let mut reallocs = std::collections::BTreeSet::new();
|
|
|
let mut accounts =
|
|
|
- anchor_lang::idl::IdlCreateBuffer::try_accounts(program_id, &mut accounts, &[], &mut bumps)?;
|
|
|
+ anchor_lang::idl::IdlCreateBuffer::try_accounts(program_id, &mut accounts, &[], &mut bumps, &mut reallocs)?;
|
|
|
__idl_create_buffer(program_id, &mut accounts)?;
|
|
|
accounts.exit(program_id)?;
|
|
|
},
|
|
|
anchor_lang::idl::IdlInstruction::Write { data } => {
|
|
|
let mut bumps = std::collections::BTreeMap::new();
|
|
|
+ let mut reallocs = std::collections::BTreeSet::new();
|
|
|
let mut accounts =
|
|
|
- anchor_lang::idl::IdlAccounts::try_accounts(program_id, &mut accounts, &[], &mut bumps)?;
|
|
|
+ anchor_lang::idl::IdlAccounts::try_accounts(program_id, &mut accounts, &[], &mut bumps, &mut reallocs)?;
|
|
|
__idl_write(program_id, &mut accounts, data)?;
|
|
|
accounts.exit(program_id)?;
|
|
|
},
|
|
|
anchor_lang::idl::IdlInstruction::SetAuthority { new_authority } => {
|
|
|
let mut bumps = std::collections::BTreeMap::new();
|
|
|
+ let mut reallocs = std::collections::BTreeSet::new();
|
|
|
let mut accounts =
|
|
|
- anchor_lang::idl::IdlAccounts::try_accounts(program_id, &mut accounts, &[], &mut bumps)?;
|
|
|
+ anchor_lang::idl::IdlAccounts::try_accounts(program_id, &mut accounts, &[], &mut bumps, &mut reallocs)?;
|
|
|
__idl_set_authority(program_id, &mut accounts, new_authority)?;
|
|
|
accounts.exit(program_id)?;
|
|
|
},
|
|
|
anchor_lang::idl::IdlInstruction::SetBuffer => {
|
|
|
let mut bumps = std::collections::BTreeMap::new();
|
|
|
+ let mut reallocs = std::collections::BTreeSet::new();
|
|
|
let mut accounts =
|
|
|
- anchor_lang::idl::IdlSetBuffer::try_accounts(program_id, &mut accounts, &[], &mut bumps)?;
|
|
|
+ anchor_lang::idl::IdlSetBuffer::try_accounts(program_id, &mut accounts, &[], &mut bumps, &mut reallocs)?;
|
|
|
__idl_set_buffer(program_id, &mut accounts)?;
|
|
|
accounts.exit(program_id)?;
|
|
|
},
|
|
@@ -216,13 +221,14 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
|
|
|
let instruction::state::#variant_arm = ix;
|
|
|
|
|
|
let mut __bumps = std::collections::BTreeMap::new();
|
|
|
+ let mut __reallocs = std::collections::BTreeSet::new();
|
|
|
|
|
|
// Deserialize accounts.
|
|
|
let mut remaining_accounts: &[AccountInfo] = accounts;
|
|
|
let ctor_accounts =
|
|
|
- anchor_lang::__private::Ctor::try_accounts(program_id, &mut remaining_accounts, &[], &mut __bumps)?;
|
|
|
+ anchor_lang::__private::Ctor::try_accounts(program_id, &mut remaining_accounts, &[], &mut __bumps, &mut __reallocs)?;
|
|
|
let mut ctor_user_def_accounts =
|
|
|
- #anchor_ident::try_accounts(program_id, &mut remaining_accounts, ix_data, &mut __bumps)?;
|
|
|
+ #anchor_ident::try_accounts(program_id, &mut remaining_accounts, ix_data, &mut __bumps, &mut __reallocs)?;
|
|
|
|
|
|
// Create the solana account for the ctor data.
|
|
|
let from = ctor_accounts.from.key;
|
|
@@ -295,13 +301,14 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
|
|
|
let instruction::state::#variant_arm = ix;
|
|
|
|
|
|
let mut __bumps = std::collections::BTreeMap::new();
|
|
|
+ let mut __reallocs = std::collections::BTreeSet::new();
|
|
|
|
|
|
// Deserialize accounts.
|
|
|
let mut remaining_accounts: &[AccountInfo] = accounts;
|
|
|
let ctor_accounts =
|
|
|
- anchor_lang::__private::Ctor::try_accounts(program_id, &mut remaining_accounts, &[], &mut __bumps)?;
|
|
|
+ anchor_lang::__private::Ctor::try_accounts(program_id, &mut remaining_accounts, &[], &mut __bumps, &mut __reallocs)?;
|
|
|
let mut ctor_user_def_accounts =
|
|
|
- #anchor_ident::try_accounts(program_id, &mut remaining_accounts, ix_data, &mut __bumps)?;
|
|
|
+ #anchor_ident::try_accounts(program_id, &mut remaining_accounts, ix_data, &mut __bumps, &mut __reallocs)?;
|
|
|
|
|
|
// Invoke the ctor.
|
|
|
let instance = #mod_name::#name::new(
|
|
@@ -405,12 +412,15 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
|
|
|
// Bump collector.
|
|
|
let mut __bumps = std::collections::BTreeMap::new();
|
|
|
|
|
|
+ // Realloc tracker
|
|
|
+ let mut __reallocs= std::collections::BTreeSet::new();
|
|
|
+
|
|
|
// Load state.
|
|
|
let mut remaining_accounts: &[AccountInfo] = accounts;
|
|
|
if remaining_accounts.is_empty() {
|
|
|
return Err(anchor_lang::error::ErrorCode::AccountNotEnoughKeys.into());
|
|
|
}
|
|
|
- let loader: anchor_lang::accounts::loader::Loader<#mod_name::#name> = anchor_lang::accounts::loader::Loader::try_accounts(program_id, &mut remaining_accounts, &[], &mut __bumps)?;
|
|
|
+ let loader: anchor_lang::accounts::loader::Loader<#mod_name::#name> = anchor_lang::accounts::loader::Loader::try_accounts(program_id, &mut remaining_accounts, &[], &mut __bumps, &mut __reallocs)?;
|
|
|
|
|
|
// Deserialize accounts.
|
|
|
let mut accounts = #anchor_ident::try_accounts(
|
|
@@ -418,6 +428,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
|
|
|
&mut remaining_accounts,
|
|
|
ix_data,
|
|
|
&mut __bumps,
|
|
|
+ &mut __reallocs,
|
|
|
)?;
|
|
|
let ctx =
|
|
|
anchor_lang::context::Context::new(
|
|
@@ -461,6 +472,9 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
|
|
|
// Bump collector.
|
|
|
let mut __bumps = std::collections::BTreeMap::new();
|
|
|
|
|
|
+ // Realloc tracker.
|
|
|
+ let mut __reallocs = std::collections::BTreeSet::new();
|
|
|
+
|
|
|
// Load state.
|
|
|
let mut remaining_accounts: &[AccountInfo] = accounts;
|
|
|
if remaining_accounts.is_empty() {
|
|
@@ -471,6 +485,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
|
|
|
&mut remaining_accounts,
|
|
|
&[],
|
|
|
&mut __bumps,
|
|
|
+ &mut __reallocs,
|
|
|
)?;
|
|
|
|
|
|
// Deserialize accounts.
|
|
@@ -479,6 +494,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
|
|
|
&mut remaining_accounts,
|
|
|
ix_data,
|
|
|
&mut __bumps,
|
|
|
+ &mut __reallocs,
|
|
|
)?;
|
|
|
let ctx =
|
|
|
anchor_lang::context::Context::new(
|
|
@@ -589,6 +605,9 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
|
|
|
// Bump collector.
|
|
|
let mut __bumps = std::collections::BTreeMap::new();
|
|
|
|
|
|
+ // Realloc tracker.
|
|
|
+ let mut __reallocs= std::collections::BTreeSet::new();
|
|
|
+
|
|
|
// Deserialize the program state account.
|
|
|
let mut remaining_accounts: &[AccountInfo] = accounts;
|
|
|
if remaining_accounts.is_empty() {
|
|
@@ -599,6 +618,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
|
|
|
&mut remaining_accounts,
|
|
|
&[],
|
|
|
&mut __bumps,
|
|
|
+ &mut __reallocs,
|
|
|
)?;
|
|
|
|
|
|
// Deserialize accounts.
|
|
@@ -607,6 +627,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
|
|
|
&mut remaining_accounts,
|
|
|
ix_data,
|
|
|
&mut __bumps,
|
|
|
+ &mut __reallocs,
|
|
|
)?;
|
|
|
let ctx =
|
|
|
anchor_lang::context::Context::new(
|
|
@@ -651,6 +672,8 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
|
|
|
// Bump collector.
|
|
|
let mut __bumps = std::collections::BTreeMap::new();
|
|
|
|
|
|
+ let mut __reallocs = std::collections::BTreeSet::new();
|
|
|
+
|
|
|
// Deserialize accounts.
|
|
|
let mut remaining_accounts: &[AccountInfo] = accounts;
|
|
|
let mut accounts = #anchor_ident::try_accounts(
|
|
@@ -658,6 +681,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
|
|
|
&mut remaining_accounts,
|
|
|
ix_data,
|
|
|
&mut __bumps,
|
|
|
+ &mut __reallocs,
|
|
|
)?;
|
|
|
|
|
|
// Execute user defined function.
|
|
@@ -719,6 +743,8 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
|
|
|
// Bump collector.
|
|
|
let mut __bumps = std::collections::BTreeMap::new();
|
|
|
|
|
|
+ let mut __reallocs = std::collections::BTreeSet::new();
|
|
|
+
|
|
|
// Deserialize accounts.
|
|
|
let mut remaining_accounts: &[AccountInfo] = accounts;
|
|
|
let mut accounts = #anchor::try_accounts(
|
|
@@ -726,6 +752,7 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
|
|
|
&mut remaining_accounts,
|
|
|
ix_data,
|
|
|
&mut __bumps,
|
|
|
+ &mut __reallocs,
|
|
|
)?;
|
|
|
|
|
|
// Invoke user defined handler.
|