* Add solana-program-sdk boilerplate (cherry picked from commit3718771ffb
) # Conflicts: # sdk/Cargo.toml * Initial population of solana-program-sdk (cherry picked from commit63db324204
) # Conflicts: # Cargo.lock * Port programs to solana-program-sdk (cherry picked from commitfe68f7f786
) # Conflicts: # programs/bpf/Cargo.lock # programs/bpf/rust/128bit/Cargo.toml # programs/bpf/rust/128bit_dep/Cargo.toml # programs/bpf/rust/alloc/Cargo.toml # programs/bpf/rust/call_depth/Cargo.toml # programs/bpf/rust/custom_heap/Cargo.toml # programs/bpf/rust/dep_crate/Cargo.toml # programs/bpf/rust/deprecated_loader/Cargo.toml # programs/bpf/rust/dup_accounts/Cargo.toml # programs/bpf/rust/error_handling/Cargo.toml # programs/bpf/rust/external_spend/Cargo.toml # programs/bpf/rust/instruction_introspection/Cargo.toml # programs/bpf/rust/invoke/Cargo.toml # programs/bpf/rust/invoked/Cargo.toml # programs/bpf/rust/iter/Cargo.toml # programs/bpf/rust/many_args/Cargo.toml # programs/bpf/rust/many_args_dep/Cargo.toml # programs/bpf/rust/noop/Cargo.toml # programs/bpf/rust/panic/Cargo.toml # programs/bpf/rust/param_passing/Cargo.toml # programs/bpf/rust/param_passing_dep/Cargo.toml # programs/bpf/rust/rand/Cargo.toml # programs/bpf/rust/ristretto/Cargo.toml # programs/bpf/rust/sanity/Cargo.toml # programs/bpf/rust/sha256/Cargo.toml # programs/bpf/rust/sysval/Cargo.toml * Only activate legacy program feature for the solana-sdk crate (cherry picked from commit85c51f5787
) * Run serum-dex unit tests (cherry picked from commit92ce381d60
) * Rename solana-program-sdk to solana-program (cherry picked from commitdd711ab5fb
) # Conflicts: # programs/bpf/rust/128bit/Cargo.toml # programs/bpf/rust/128bit_dep/Cargo.toml # programs/bpf/rust/alloc/Cargo.toml # programs/bpf/rust/call_depth/Cargo.toml # programs/bpf/rust/custom_heap/Cargo.toml # programs/bpf/rust/dep_crate/Cargo.toml # programs/bpf/rust/deprecated_loader/Cargo.toml # programs/bpf/rust/dup_accounts/Cargo.toml # programs/bpf/rust/error_handling/Cargo.toml # programs/bpf/rust/external_spend/Cargo.toml # programs/bpf/rust/instruction_introspection/Cargo.toml # programs/bpf/rust/invoke/Cargo.toml # programs/bpf/rust/invoked/Cargo.toml # programs/bpf/rust/iter/Cargo.toml # programs/bpf/rust/many_args/Cargo.toml # programs/bpf/rust/many_args_dep/Cargo.toml # programs/bpf/rust/noop/Cargo.toml # programs/bpf/rust/panic/Cargo.toml # programs/bpf/rust/param_passing/Cargo.toml # programs/bpf/rust/param_passing_dep/Cargo.toml # programs/bpf/rust/rand/Cargo.toml # programs/bpf/rust/ristretto/Cargo.toml # programs/bpf/rust/sanity/Cargo.toml # programs/bpf/rust/sha256/Cargo.toml # programs/bpf/rust/sysval/Cargo.toml * Update frozen_abi hashes The movement of files in sdk/ caused ABI hashes to change (cherry picked from commita4956844bd
) * Resolve merge conflicts Co-authored-by: Michael Vines <mvines@gmail.com>
87 lines
2.9 KiB
Rust
87 lines
2.9 KiB
Rust
use crate::{
|
|
account::Account,
|
|
account_utils::StateMut,
|
|
fee_calculator::FeeCalculator,
|
|
hash::Hash,
|
|
nonce::{state::Versions, State},
|
|
};
|
|
|
|
pub fn verify_nonce_account(acc: &Account, hash: &Hash) -> bool {
|
|
match StateMut::<Versions>::state(acc).map(|v| v.convert_to_current()) {
|
|
Ok(State::Initialized(ref data)) => *hash == data.blockhash,
|
|
_ => false,
|
|
}
|
|
}
|
|
|
|
pub fn fee_calculator_of(account: &Account) -> Option<FeeCalculator> {
|
|
let state = StateMut::<Versions>::state(account)
|
|
.ok()?
|
|
.convert_to_current();
|
|
match state {
|
|
State::Initialized(data) => Some(data.fee_calculator),
|
|
_ => None,
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
use crate::{
|
|
account_utils::State as AccountUtilsState,
|
|
hash::Hash,
|
|
nonce::{account::with_test_keyed_account, Account as NonceAccount, State},
|
|
sysvar::{recent_blockhashes::create_test_recent_blockhashes, rent::Rent},
|
|
};
|
|
use std::collections::HashSet;
|
|
|
|
#[test]
|
|
fn verify_nonce_ok() {
|
|
with_test_keyed_account(42, true, |nonce_account| {
|
|
let mut signers = HashSet::new();
|
|
signers.insert(nonce_account.signer_key().unwrap());
|
|
let state: State = nonce_account.state().unwrap();
|
|
// New is in Uninitialzed state
|
|
assert_eq!(state, State::Uninitialized);
|
|
let recent_blockhashes = create_test_recent_blockhashes(0);
|
|
let authorized = nonce_account.unsigned_key();
|
|
nonce_account
|
|
.initialize_nonce_account(&authorized, &recent_blockhashes, &Rent::free())
|
|
.unwrap();
|
|
assert!(verify_nonce_account(
|
|
&nonce_account.account.borrow(),
|
|
&recent_blockhashes[0].blockhash,
|
|
));
|
|
});
|
|
}
|
|
|
|
#[test]
|
|
fn verify_nonce_bad_acc_state_fail() {
|
|
with_test_keyed_account(42, true, |nonce_account| {
|
|
assert!(!verify_nonce_account(
|
|
&nonce_account.account.borrow(),
|
|
&Hash::default()
|
|
));
|
|
});
|
|
}
|
|
|
|
#[test]
|
|
fn verify_nonce_bad_query_hash_fail() {
|
|
with_test_keyed_account(42, true, |nonce_account| {
|
|
let mut signers = HashSet::new();
|
|
signers.insert(nonce_account.signer_key().unwrap());
|
|
let state: State = nonce_account.state().unwrap();
|
|
// New is in Uninitialzed state
|
|
assert_eq!(state, State::Uninitialized);
|
|
let recent_blockhashes = create_test_recent_blockhashes(0);
|
|
let authorized = nonce_account.unsigned_key();
|
|
nonce_account
|
|
.initialize_nonce_account(&authorized, &recent_blockhashes, &Rent::free())
|
|
.unwrap();
|
|
assert!(!verify_nonce_account(
|
|
&nonce_account.account.borrow(),
|
|
&recent_blockhashes[1].blockhash,
|
|
));
|
|
});
|
|
}
|
|
}
|