Check CPI program is executable
This commit is contained in:
60
programs/bpf/Cargo.lock
generated
60
programs/bpf/Cargo.lock
generated
@ -1627,7 +1627,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-bpf-loader-program"
|
name = "solana-bpf-loader-program"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bincode",
|
"bincode",
|
||||||
"byteorder 1.3.4",
|
"byteorder 1.3.4",
|
||||||
@ -1642,7 +1642,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-bpf-programs"
|
name = "solana-bpf-programs"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bincode",
|
"bincode",
|
||||||
"byteorder 1.3.4",
|
"byteorder 1.3.4",
|
||||||
@ -1657,7 +1657,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-bpf-rust-128bit"
|
name = "solana-bpf-rust-128bit"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"solana-bpf-rust-128bit-dep",
|
"solana-bpf-rust-128bit-dep",
|
||||||
"solana-sdk",
|
"solana-sdk",
|
||||||
@ -1665,21 +1665,21 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-bpf-rust-128bit-dep"
|
name = "solana-bpf-rust-128bit-dep"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"solana-sdk",
|
"solana-sdk",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-bpf-rust-alloc"
|
name = "solana-bpf-rust-alloc"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"solana-sdk",
|
"solana-sdk",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-bpf-rust-dep-crate"
|
name = "solana-bpf-rust-dep-crate"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"byteorder 1.3.4",
|
"byteorder 1.3.4",
|
||||||
"solana-sdk",
|
"solana-sdk",
|
||||||
@ -1687,14 +1687,14 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-bpf-rust-dup-accounts"
|
name = "solana-bpf-rust-dup-accounts"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"solana-sdk",
|
"solana-sdk",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-bpf-rust-error-handling"
|
name = "solana-bpf-rust-error-handling"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"num-derive 0.2.5",
|
"num-derive 0.2.5",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
@ -1704,14 +1704,14 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-bpf-rust-external-spend"
|
name = "solana-bpf-rust-external-spend"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"solana-sdk",
|
"solana-sdk",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-bpf-rust-invoke"
|
name = "solana-bpf-rust-invoke"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"solana-bpf-rust-invoked",
|
"solana-bpf-rust-invoked",
|
||||||
"solana-sdk",
|
"solana-sdk",
|
||||||
@ -1719,21 +1719,21 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-bpf-rust-invoked"
|
name = "solana-bpf-rust-invoked"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"solana-sdk",
|
"solana-sdk",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-bpf-rust-iter"
|
name = "solana-bpf-rust-iter"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"solana-sdk",
|
"solana-sdk",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-bpf-rust-many-args"
|
name = "solana-bpf-rust-many-args"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"solana-bpf-rust-many-args-dep",
|
"solana-bpf-rust-many-args-dep",
|
||||||
"solana-sdk",
|
"solana-sdk",
|
||||||
@ -1741,28 +1741,28 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-bpf-rust-many-args-dep"
|
name = "solana-bpf-rust-many-args-dep"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"solana-sdk",
|
"solana-sdk",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-bpf-rust-noop"
|
name = "solana-bpf-rust-noop"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"solana-sdk",
|
"solana-sdk",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-bpf-rust-panic"
|
name = "solana-bpf-rust-panic"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"solana-sdk",
|
"solana-sdk",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-bpf-rust-param-passing"
|
name = "solana-bpf-rust-param-passing"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"solana-bpf-rust-param-passing-dep",
|
"solana-bpf-rust-param-passing-dep",
|
||||||
"solana-sdk",
|
"solana-sdk",
|
||||||
@ -1770,21 +1770,21 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-bpf-rust-param-passing-dep"
|
name = "solana-bpf-rust-param-passing-dep"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"solana-sdk",
|
"solana-sdk",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-bpf-rust-sysval"
|
name = "solana-bpf-rust-sysval"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"solana-sdk",
|
"solana-sdk",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-config-program"
|
name = "solana-config-program"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bincode",
|
"bincode",
|
||||||
"chrono",
|
"chrono",
|
||||||
@ -1796,7 +1796,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-crate-features"
|
name = "solana-crate-features"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"backtrace",
|
"backtrace",
|
||||||
"bytes 0.4.12",
|
"bytes 0.4.12",
|
||||||
@ -1819,7 +1819,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-logger"
|
name = "solana-logger"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"env_logger",
|
"env_logger",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
@ -1828,7 +1828,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-measure"
|
name = "solana-measure"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"jemalloc-ctl",
|
"jemalloc-ctl",
|
||||||
"jemallocator",
|
"jemallocator",
|
||||||
@ -1839,7 +1839,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-metrics"
|
name = "solana-metrics"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"env_logger",
|
"env_logger",
|
||||||
"gethostname",
|
"gethostname",
|
||||||
@ -1851,7 +1851,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-rayon-threadlimit"
|
name = "solana-rayon-threadlimit"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"num_cpus",
|
"num_cpus",
|
||||||
@ -1859,7 +1859,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-runtime"
|
name = "solana-runtime"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bincode",
|
"bincode",
|
||||||
"blake3",
|
"blake3",
|
||||||
@ -1894,7 +1894,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-sdk"
|
name = "solana-sdk"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"assert_matches",
|
"assert_matches",
|
||||||
"bincode",
|
"bincode",
|
||||||
@ -1930,7 +1930,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-sdk-macro"
|
name = "solana-sdk-macro"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bs58",
|
"bs58",
|
||||||
"proc-macro2 1.0.18",
|
"proc-macro2 1.0.18",
|
||||||
@ -1941,7 +1941,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-stake-program"
|
name = "solana-stake-program"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bincode",
|
"bincode",
|
||||||
"log",
|
"log",
|
||||||
@ -1958,7 +1958,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-vote-program"
|
name = "solana-vote-program"
|
||||||
version = "1.2.30"
|
version = "1.2.32"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bincode",
|
"bincode",
|
||||||
"log",
|
"log",
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
static const uint8_t TEST_SUCCESS = 1;
|
static const uint8_t TEST_SUCCESS = 1;
|
||||||
static const uint8_t TEST_PRIVILEGE_ESCALATION_SIGNER = 2;
|
static const uint8_t TEST_PRIVILEGE_ESCALATION_SIGNER = 2;
|
||||||
static const uint8_t TEST_PRIVILEGE_ESCALATION_WRITABLE = 3;
|
static const uint8_t TEST_PRIVILEGE_ESCALATION_WRITABLE = 3;
|
||||||
|
static const uint8_t TEST_PPROGRAM_NOT_EXECUTABLE = 4;
|
||||||
|
|
||||||
static const int MINT_INDEX = 0;
|
static const int MINT_INDEX = 0;
|
||||||
static const int ARGUMENT_INDEX = 1;
|
static const int ARGUMENT_INDEX = 1;
|
||||||
@ -92,7 +93,8 @@ extern uint64_t entrypoint(const uint8_t *input) {
|
|||||||
const SolSignerSeed seeds1[] = {{seed1, SOL_ARRAY_SIZE(seed1)},
|
const SolSignerSeed seeds1[] = {{seed1, SOL_ARRAY_SIZE(seed1)},
|
||||||
{&nonce1, 1}};
|
{&nonce1, 1}};
|
||||||
SolPubkey address;
|
SolPubkey address;
|
||||||
sol_assert(SUCCESS == sol_create_program_address(seeds1, SOL_ARRAY_SIZE(seeds1),
|
sol_assert(SUCCESS ==
|
||||||
|
sol_create_program_address(seeds1, SOL_ARRAY_SIZE(seeds1),
|
||||||
params.program_id, &address));
|
params.program_id, &address));
|
||||||
sol_assert(SolPubkey_same(&address, accounts[DERIVED_KEY1_INDEX].key));
|
sol_assert(SolPubkey_same(&address, accounts[DERIVED_KEY1_INDEX].key));
|
||||||
}
|
}
|
||||||
@ -203,6 +205,16 @@ extern uint64_t entrypoint(const uint8_t *input) {
|
|||||||
sol_invoke(&instruction, accounts, SOL_ARRAY_SIZE(accounts)));
|
sol_invoke(&instruction, accounts, SOL_ARRAY_SIZE(accounts)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case TEST_PPROGRAM_NOT_EXECUTABLE: {
|
||||||
|
sol_log("Test program not executable");
|
||||||
|
SolAccountMeta arguments[] = {
|
||||||
|
{accounts[DERIVED_KEY3_INDEX].key, false, false}};
|
||||||
|
uint8_t data[] = {TEST_VERIFY_PRIVILEGE_ESCALATION};
|
||||||
|
const SolInstruction instruction = {accounts[ARGUMENT_INDEX].key, arguments,
|
||||||
|
SOL_ARRAY_SIZE(arguments), data,
|
||||||
|
SOL_ARRAY_SIZE(data)};
|
||||||
|
return sol_invoke(&instruction, accounts, SOL_ARRAY_SIZE(accounts));
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
sol_panic();
|
sol_panic();
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,10 @@ extern uint64_t entrypoint(const uint8_t *input) {
|
|||||||
return ERROR_INVALID_ARGUMENT;
|
return ERROR_INVALID_ARGUMENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (params.data_len == 0) {
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
switch (params.data[0]) {
|
switch (params.data[0]) {
|
||||||
case TEST_VERIFY_TRANSLATIONS: {
|
case TEST_VERIFY_TRANSLATIONS: {
|
||||||
sol_log("verify data translations");
|
sol_log("verify data translations");
|
||||||
|
@ -19,6 +19,7 @@ use solana_sdk::{
|
|||||||
const TEST_SUCCESS: u8 = 1;
|
const TEST_SUCCESS: u8 = 1;
|
||||||
const TEST_PRIVILEGE_ESCALATION_SIGNER: u8 = 2;
|
const TEST_PRIVILEGE_ESCALATION_SIGNER: u8 = 2;
|
||||||
const TEST_PRIVILEGE_ESCALATION_WRITABLE: u8 = 3;
|
const TEST_PRIVILEGE_ESCALATION_WRITABLE: u8 = 3;
|
||||||
|
const TEST_PPROGRAM_NOT_EXECUTABLE: u8 = 4;
|
||||||
|
|
||||||
// const MINT_INDEX: usize = 0;
|
// const MINT_INDEX: usize = 0;
|
||||||
const ARGUMENT_INDEX: usize = 1;
|
const ARGUMENT_INDEX: usize = 1;
|
||||||
@ -192,10 +193,7 @@ fn process_instruction(
|
|||||||
invoke(&invoked_instruction, accounts)?;
|
invoke(&invoked_instruction, accounts)?;
|
||||||
|
|
||||||
invoked_instruction.accounts[0].is_signer = true;
|
invoked_instruction.accounts[0].is_signer = true;
|
||||||
assert_eq!(
|
invoke(&invoked_instruction, accounts)?;
|
||||||
invoke(&invoked_instruction, accounts),
|
|
||||||
Err(ProgramError::Custom(0x0b9f_0002))
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
TEST_PRIVILEGE_ESCALATION_WRITABLE => {
|
TEST_PRIVILEGE_ESCALATION_WRITABLE => {
|
||||||
info!("Test privilege escalation writable");
|
info!("Test privilege escalation writable");
|
||||||
@ -207,10 +205,17 @@ fn process_instruction(
|
|||||||
invoke(&invoked_instruction, accounts)?;
|
invoke(&invoked_instruction, accounts)?;
|
||||||
|
|
||||||
invoked_instruction.accounts[0].is_writable = true;
|
invoked_instruction.accounts[0].is_writable = true;
|
||||||
assert_eq!(
|
|
||||||
invoke(&invoked_instruction, accounts),
|
invoke(&invoked_instruction, accounts)?;
|
||||||
Err(ProgramError::Custom(0x0b9f_0002))
|
}
|
||||||
|
TEST_PPROGRAM_NOT_EXECUTABLE => {
|
||||||
|
info!("Test program not executable");
|
||||||
|
let instruction = create_instruction(
|
||||||
|
*accounts[ARGUMENT_INDEX].key,
|
||||||
|
&[(accounts[ARGUMENT_INDEX].key, true, true)],
|
||||||
|
vec![TEST_RETURN_ERROR],
|
||||||
);
|
);
|
||||||
|
invoke(&instruction, accounts)?;
|
||||||
}
|
}
|
||||||
_ => panic!(),
|
_ => panic!(),
|
||||||
}
|
}
|
||||||
|
@ -311,6 +311,7 @@ mod bpf {
|
|||||||
const TEST_SUCCESS: u8 = 1;
|
const TEST_SUCCESS: u8 = 1;
|
||||||
const TEST_PRIVILEGE_ESCALATION_SIGNER: u8 = 2;
|
const TEST_PRIVILEGE_ESCALATION_SIGNER: u8 = 2;
|
||||||
const TEST_PRIVILEGE_ESCALATION_WRITABLE: u8 = 3;
|
const TEST_PRIVILEGE_ESCALATION_WRITABLE: u8 = 3;
|
||||||
|
const TEST_PPROGRAM_NOT_EXECUTABLE: u8 = 4;
|
||||||
|
|
||||||
let mut programs = Vec::new();
|
let mut programs = Vec::new();
|
||||||
#[cfg(feature = "bpf_c")]
|
#[cfg(feature = "bpf_c")]
|
||||||
@ -397,7 +398,7 @@ mod bpf {
|
|||||||
|
|
||||||
let instruction = Instruction::new(
|
let instruction = Instruction::new(
|
||||||
invoke_program_id,
|
invoke_program_id,
|
||||||
&TEST_PRIVILEGE_ESCALATION_SIGNER,
|
&[TEST_PRIVILEGE_ESCALATION_SIGNER, nonce1, nonce2, nonce3],
|
||||||
account_metas.clone(),
|
account_metas.clone(),
|
||||||
);
|
);
|
||||||
let message = Message::new(&[instruction], Some(&mint_pubkey));
|
let message = Message::new(&[instruction], Some(&mint_pubkey));
|
||||||
@ -419,7 +420,7 @@ mod bpf {
|
|||||||
|
|
||||||
let instruction = Instruction::new(
|
let instruction = Instruction::new(
|
||||||
invoke_program_id,
|
invoke_program_id,
|
||||||
&TEST_PRIVILEGE_ESCALATION_WRITABLE,
|
&[TEST_PRIVILEGE_ESCALATION_WRITABLE, nonce1, nonce2, nonce3],
|
||||||
account_metas.clone(),
|
account_metas.clone(),
|
||||||
);
|
);
|
||||||
let message = Message::new(&[instruction], Some(&mint_pubkey));
|
let message = Message::new(&[instruction], Some(&mint_pubkey));
|
||||||
@ -438,6 +439,28 @@ mod bpf {
|
|||||||
.unwrap(),
|
.unwrap(),
|
||||||
TransactionError::InstructionError(0, InstructionError::Custom(194969602))
|
TransactionError::InstructionError(0, InstructionError::Custom(194969602))
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let instruction = Instruction::new(
|
||||||
|
invoke_program_id,
|
||||||
|
&[TEST_PPROGRAM_NOT_EXECUTABLE, nonce1, nonce2, nonce3],
|
||||||
|
account_metas.clone(),
|
||||||
|
);
|
||||||
|
let message = Message::new(&[instruction], Some(&mint_pubkey));
|
||||||
|
assert_eq!(
|
||||||
|
bank_client
|
||||||
|
.send_and_confirm_message(
|
||||||
|
&[
|
||||||
|
&mint_keypair,
|
||||||
|
&argument_keypair,
|
||||||
|
&invoked_argument_keypair,
|
||||||
|
&from_keypair
|
||||||
|
],
|
||||||
|
message,
|
||||||
|
)
|
||||||
|
.unwrap_err()
|
||||||
|
.unwrap(),
|
||||||
|
TransactionError::InstructionError(0, InstructionError::AccountNotExecutable)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -823,6 +823,9 @@ fn call<'a>(
|
|||||||
// Process instruction
|
// Process instruction
|
||||||
|
|
||||||
let program_account = (*accounts[callee_program_id_index]).clone();
|
let program_account = (*accounts[callee_program_id_index]).clone();
|
||||||
|
if !program_account.borrow().executable {
|
||||||
|
return Err(SyscallError::InstructionError(InstructionError::AccountNotExecutable).into());
|
||||||
|
}
|
||||||
let executable_accounts = vec![(callee_program_id, program_account)];
|
let executable_accounts = vec![(callee_program_id, program_account)];
|
||||||
let mut message_processor = MessageProcessor::default();
|
let mut message_processor = MessageProcessor::default();
|
||||||
for (program_id, process_instruction) in invoke_context.get_programs().iter() {
|
for (program_id, process_instruction) in invoke_context.get_programs().iter() {
|
||||||
|
@ -329,7 +329,6 @@ impl MessageProcessor {
|
|||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
keyed_accounts.append(&mut keyed_accounts2);
|
keyed_accounts.append(&mut keyed_accounts2);
|
||||||
assert!(keyed_accounts[0].executable()?, "account not executable");
|
|
||||||
Ok(keyed_accounts)
|
Ok(keyed_accounts)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user