|
|
|
@ -20,7 +20,7 @@ use solana_sdk::hash::{extend_and_hash, Hash};
|
|
|
|
|
use solana_sdk::native_loader;
|
|
|
|
|
use solana_sdk::pubkey::Pubkey;
|
|
|
|
|
use solana_sdk::signature::{Keypair, Signature};
|
|
|
|
|
use solana_sdk::system_transaction::SystemTransaction;
|
|
|
|
|
use solana_sdk::system_transaction;
|
|
|
|
|
use solana_sdk::timing::{duration_as_ms, duration_as_us, MAX_RECENT_BLOCKHASHES};
|
|
|
|
|
use solana_sdk::transaction::{Transaction, TransactionError};
|
|
|
|
|
use solana_vote_api::vote_instruction::Vote;
|
|
|
|
@ -777,7 +777,7 @@ impl Bank {
|
|
|
|
|
/// `n` lamports where `blockhash` is the last Entry ID observed by the client.
|
|
|
|
|
pub fn transfer(&self, n: u64, keypair: &Keypair, to: &Pubkey) -> Result<Signature> {
|
|
|
|
|
let blockhash = self.last_blockhash();
|
|
|
|
|
let tx = SystemTransaction::new_user_account(keypair, to, n, blockhash, 0);
|
|
|
|
|
let tx = system_transaction::create_user_account(keypair, to, n, blockhash, 0);
|
|
|
|
|
let signature = tx.signatures[0];
|
|
|
|
|
self.process_transaction(&tx).map(|_| signature)
|
|
|
|
|
}
|
|
|
|
@ -973,8 +973,8 @@ mod tests {
|
|
|
|
|
use solana_sdk::hash;
|
|
|
|
|
use solana_sdk::instruction::InstructionError;
|
|
|
|
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
|
|
|
|
use solana_sdk::system_instruction::SystemInstruction;
|
|
|
|
|
use solana_sdk::system_transaction::SystemTransaction;
|
|
|
|
|
use solana_sdk::system_instruction;
|
|
|
|
|
use solana_sdk::system_transaction;
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn test_bank_new() {
|
|
|
|
@ -1027,8 +1027,8 @@ mod tests {
|
|
|
|
|
let bank = Bank::new(&genesis_block);
|
|
|
|
|
assert_eq!(bank.last_blockhash(), genesis_block.hash());
|
|
|
|
|
|
|
|
|
|
let t1 = SystemTransaction::new_transfer(&mint_keypair, &key1, 1, genesis_block.hash(), 0);
|
|
|
|
|
let t2 = SystemTransaction::new_transfer(&mint_keypair, &key2, 1, genesis_block.hash(), 0);
|
|
|
|
|
let t1 = system_transaction::transfer(&mint_keypair, &key1, 1, genesis_block.hash(), 0);
|
|
|
|
|
let t2 = system_transaction::transfer(&mint_keypair, &key2, 1, genesis_block.hash(), 0);
|
|
|
|
|
let res = bank.process_transactions(&vec![t1.clone(), t2.clone()]);
|
|
|
|
|
assert_eq!(res.len(), 2);
|
|
|
|
|
assert_eq!(res[0], Ok(()));
|
|
|
|
@ -1051,7 +1051,7 @@ mod tests {
|
|
|
|
|
let key2 = Pubkey::new_rand();
|
|
|
|
|
let bank = Bank::new(&genesis_block);
|
|
|
|
|
let instructions =
|
|
|
|
|
SystemInstruction::new_transfer_many(&mint_keypair.pubkey(), &[(key1, 1), (key2, 1)]);
|
|
|
|
|
system_instruction::transfer_many(&mint_keypair.pubkey(), &[(key1, 1), (key2, 1)]);
|
|
|
|
|
let tx = Transaction::new_signed_instructions(
|
|
|
|
|
&[&mint_keypair],
|
|
|
|
|
instructions,
|
|
|
|
@ -1076,7 +1076,7 @@ mod tests {
|
|
|
|
|
let key2 = Pubkey::new_rand();
|
|
|
|
|
let bank = Bank::new(&genesis_block);
|
|
|
|
|
let instructions =
|
|
|
|
|
SystemInstruction::new_transfer_many(&mint_keypair.pubkey(), &[(key1, 1), (key2, 1)]);
|
|
|
|
|
system_instruction::transfer_many(&mint_keypair.pubkey(), &[(key1, 1), (key2, 1)]);
|
|
|
|
|
let tx = Transaction::new_signed_instructions(
|
|
|
|
|
&[&mint_keypair],
|
|
|
|
|
instructions,
|
|
|
|
@ -1098,7 +1098,7 @@ mod tests {
|
|
|
|
|
let dest = Keypair::new();
|
|
|
|
|
|
|
|
|
|
// source with 0 program context
|
|
|
|
|
let tx = SystemTransaction::new_user_account(
|
|
|
|
|
let tx = system_transaction::create_user_account(
|
|
|
|
|
&mint_keypair,
|
|
|
|
|
&dest.pubkey(),
|
|
|
|
|
2,
|
|
|
|
@ -1217,13 +1217,8 @@ mod tests {
|
|
|
|
|
let key1 = Keypair::new();
|
|
|
|
|
let key2 = Keypair::new();
|
|
|
|
|
|
|
|
|
|
let tx = SystemTransaction::new_transfer(
|
|
|
|
|
&mint_keypair,
|
|
|
|
|
&key1.pubkey(),
|
|
|
|
|
2,
|
|
|
|
|
genesis_block.hash(),
|
|
|
|
|
0,
|
|
|
|
|
);
|
|
|
|
|
let tx =
|
|
|
|
|
system_transaction::transfer(&mint_keypair, &key1.pubkey(), 2, genesis_block.hash(), 0);
|
|
|
|
|
let initial_balance = bank.get_balance(&leader);
|
|
|
|
|
assert_eq!(bank.process_transaction(&tx), Ok(()));
|
|
|
|
|
assert_eq!(bank.get_balance(&leader), initial_balance + 3);
|
|
|
|
@ -1231,7 +1226,7 @@ mod tests {
|
|
|
|
|
assert_eq!(bank.get_balance(&mint_keypair.pubkey()), 100 - 5 - 3);
|
|
|
|
|
|
|
|
|
|
bank.fee_calculator.lamports_per_signature = 1;
|
|
|
|
|
let tx = SystemTransaction::new_transfer(&key1, &key2.pubkey(), 1, genesis_block.hash(), 0);
|
|
|
|
|
let tx = system_transaction::transfer(&key1, &key2.pubkey(), 1, genesis_block.hash(), 0);
|
|
|
|
|
assert_eq!(bank.process_transaction(&tx), Ok(()));
|
|
|
|
|
assert_eq!(bank.get_balance(&leader), initial_balance + 4);
|
|
|
|
|
assert_eq!(bank.get_balance(&key1.pubkey()), 0);
|
|
|
|
@ -1246,20 +1241,10 @@ mod tests {
|
|
|
|
|
let mut bank = Bank::new(&genesis_block);
|
|
|
|
|
|
|
|
|
|
let key = Keypair::new();
|
|
|
|
|
let tx1 = SystemTransaction::new_transfer(
|
|
|
|
|
&mint_keypair,
|
|
|
|
|
&key.pubkey(),
|
|
|
|
|
2,
|
|
|
|
|
genesis_block.hash(),
|
|
|
|
|
0,
|
|
|
|
|
);
|
|
|
|
|
let tx2 = SystemTransaction::new_transfer(
|
|
|
|
|
&mint_keypair,
|
|
|
|
|
&key.pubkey(),
|
|
|
|
|
5,
|
|
|
|
|
genesis_block.hash(),
|
|
|
|
|
0,
|
|
|
|
|
);
|
|
|
|
|
let tx1 =
|
|
|
|
|
system_transaction::transfer(&mint_keypair, &key.pubkey(), 2, genesis_block.hash(), 0);
|
|
|
|
|
let tx2 =
|
|
|
|
|
system_transaction::transfer(&mint_keypair, &key.pubkey(), 5, genesis_block.hash(), 0);
|
|
|
|
|
|
|
|
|
|
let results = vec![
|
|
|
|
|
Ok(()),
|
|
|
|
@ -1282,14 +1267,14 @@ mod tests {
|
|
|
|
|
let (genesis_block, mint_keypair) = GenesisBlock::new(2);
|
|
|
|
|
let bank = Bank::new(&genesis_block);
|
|
|
|
|
let keypair = Keypair::new();
|
|
|
|
|
let tx0 = SystemTransaction::new_user_account(
|
|
|
|
|
let tx0 = system_transaction::create_user_account(
|
|
|
|
|
&mint_keypair,
|
|
|
|
|
&keypair.pubkey(),
|
|
|
|
|
2,
|
|
|
|
|
genesis_block.hash(),
|
|
|
|
|
0,
|
|
|
|
|
);
|
|
|
|
|
let tx1 = SystemTransaction::new_user_account(
|
|
|
|
|
let tx1 = system_transaction::create_user_account(
|
|
|
|
|
&keypair,
|
|
|
|
|
&mint_keypair.pubkey(),
|
|
|
|
|
1,
|
|
|
|
@ -1322,7 +1307,7 @@ mod tests {
|
|
|
|
|
let alice = Keypair::new();
|
|
|
|
|
let bob = Keypair::new();
|
|
|
|
|
|
|
|
|
|
let tx1 = SystemTransaction::new_user_account(
|
|
|
|
|
let tx1 = system_transaction::create_user_account(
|
|
|
|
|
&mint_keypair,
|
|
|
|
|
&alice.pubkey(),
|
|
|
|
|
1,
|
|
|
|
@ -1362,7 +1347,7 @@ mod tests {
|
|
|
|
|
let keypair = Keypair::new();
|
|
|
|
|
let bank = Bank::new(&genesis_block);
|
|
|
|
|
|
|
|
|
|
let tx = SystemTransaction::new_transfer(
|
|
|
|
|
let tx = system_transaction::transfer(
|
|
|
|
|
&mint_keypair,
|
|
|
|
|
&keypair.pubkey(),
|
|
|
|
|
1,
|
|
|
|
@ -1393,7 +1378,7 @@ mod tests {
|
|
|
|
|
|
|
|
|
|
bank.transfer(1, &mint_keypair, &key1.pubkey()).unwrap();
|
|
|
|
|
assert_eq!(bank.get_balance(&key1.pubkey()), 1);
|
|
|
|
|
let tx = SystemTransaction::new_transfer(&key1, &key1.pubkey(), 1, genesis_block.hash(), 0);
|
|
|
|
|
let tx = system_transaction::transfer(&key1, &key1.pubkey(), 1, genesis_block.hash(), 0);
|
|
|
|
|
let res = bank.process_transactions(&vec![tx.clone()]);
|
|
|
|
|
assert_eq!(res.len(), 1);
|
|
|
|
|
assert_eq!(bank.get_balance(&key1.pubkey()), 1);
|
|
|
|
@ -1427,13 +1412,8 @@ mod tests {
|
|
|
|
|
let key1 = Keypair::new();
|
|
|
|
|
let parent = Arc::new(Bank::new(&genesis_block));
|
|
|
|
|
|
|
|
|
|
let tx = SystemTransaction::new_transfer(
|
|
|
|
|
&mint_keypair,
|
|
|
|
|
&key1.pubkey(),
|
|
|
|
|
1,
|
|
|
|
|
genesis_block.hash(),
|
|
|
|
|
0,
|
|
|
|
|
);
|
|
|
|
|
let tx =
|
|
|
|
|
system_transaction::transfer(&mint_keypair, &key1.pubkey(), 1, genesis_block.hash(), 0);
|
|
|
|
|
assert_eq!(parent.process_transaction(&tx), Ok(()));
|
|
|
|
|
let bank = new_from_parent(&parent);
|
|
|
|
|
assert_eq!(
|
|
|
|
@ -1450,16 +1430,11 @@ mod tests {
|
|
|
|
|
let key2 = Keypair::new();
|
|
|
|
|
let parent = Arc::new(Bank::new(&genesis_block));
|
|
|
|
|
|
|
|
|
|
let tx = SystemTransaction::new_transfer(
|
|
|
|
|
&mint_keypair,
|
|
|
|
|
&key1.pubkey(),
|
|
|
|
|
1,
|
|
|
|
|
genesis_block.hash(),
|
|
|
|
|
0,
|
|
|
|
|
);
|
|
|
|
|
let tx =
|
|
|
|
|
system_transaction::transfer(&mint_keypair, &key1.pubkey(), 1, genesis_block.hash(), 0);
|
|
|
|
|
assert_eq!(parent.process_transaction(&tx), Ok(()));
|
|
|
|
|
let bank = new_from_parent(&parent);
|
|
|
|
|
let tx = SystemTransaction::new_transfer(&key1, &key2.pubkey(), 1, genesis_block.hash(), 0);
|
|
|
|
|
let tx = system_transaction::transfer(&key1, &key2.pubkey(), 1, genesis_block.hash(), 0);
|
|
|
|
|
assert_eq!(bank.process_transaction(&tx), Ok(()));
|
|
|
|
|
assert_eq!(parent.get_signature_status(&tx.signatures[0]), None);
|
|
|
|
|
}
|
|
|
|
@ -1516,13 +1491,8 @@ mod tests {
|
|
|
|
|
let key2 = Keypair::new();
|
|
|
|
|
let parent = Arc::new(Bank::new(&genesis_block));
|
|
|
|
|
|
|
|
|
|
let tx_move_mint_to_1 = SystemTransaction::new_transfer(
|
|
|
|
|
&mint_keypair,
|
|
|
|
|
&key1.pubkey(),
|
|
|
|
|
1,
|
|
|
|
|
genesis_block.hash(),
|
|
|
|
|
0,
|
|
|
|
|
);
|
|
|
|
|
let tx_move_mint_to_1 =
|
|
|
|
|
system_transaction::transfer(&mint_keypair, &key1.pubkey(), 1, genesis_block.hash(), 0);
|
|
|
|
|
trace!("parent process tx ");
|
|
|
|
|
assert_eq!(parent.process_transaction(&tx_move_mint_to_1), Ok(()));
|
|
|
|
|
trace!("done parent process tx ");
|
|
|
|
@ -1542,7 +1512,7 @@ mod tests {
|
|
|
|
|
|
|
|
|
|
assert_eq!(bank.transaction_count(), parent.transaction_count());
|
|
|
|
|
let tx_move_1_to_2 =
|
|
|
|
|
SystemTransaction::new_transfer(&key1, &key2.pubkey(), 1, genesis_block.hash(), 0);
|
|
|
|
|
system_transaction::transfer(&key1, &key2.pubkey(), 1, genesis_block.hash(), 0);
|
|
|
|
|
assert_eq!(bank.process_transaction(&tx_move_1_to_2), Ok(()));
|
|
|
|
|
assert_eq!(bank.transaction_count(), 2);
|
|
|
|
|
assert_eq!(parent.transaction_count(), 1);
|
|
|
|
@ -1660,7 +1630,7 @@ mod tests {
|
|
|
|
|
let key = Keypair::new();
|
|
|
|
|
|
|
|
|
|
let mut move_instruction =
|
|
|
|
|
SystemInstruction::new_transfer(&mint_keypair.pubkey(), &key.pubkey(), 0);
|
|
|
|
|
system_instruction::transfer(&mint_keypair.pubkey(), &key.pubkey(), 0);
|
|
|
|
|
move_instruction.accounts[0].is_signer = false;
|
|
|
|
|
|
|
|
|
|
let tx = Transaction::new_signed_instructions(
|
|
|
|
@ -1741,13 +1711,8 @@ mod tests {
|
|
|
|
|
let (genesis_block, mint_keypair) = GenesisBlock::new(500);
|
|
|
|
|
let bank = Arc::new(Bank::new(&genesis_block));
|
|
|
|
|
let key1 = Keypair::new();
|
|
|
|
|
let tx_move_mint_to_1 = SystemTransaction::new_transfer(
|
|
|
|
|
&mint_keypair,
|
|
|
|
|
&key1.pubkey(),
|
|
|
|
|
1,
|
|
|
|
|
genesis_block.hash(),
|
|
|
|
|
0,
|
|
|
|
|
);
|
|
|
|
|
let tx_move_mint_to_1 =
|
|
|
|
|
system_transaction::transfer(&mint_keypair, &key1.pubkey(), 1, genesis_block.hash(), 0);
|
|
|
|
|
assert_eq!(bank.process_transaction(&tx_move_mint_to_1), Ok(()));
|
|
|
|
|
assert_eq!(bank.is_delta.load(Ordering::Relaxed), true);
|
|
|
|
|
}
|
|
|
|
@ -1760,13 +1725,8 @@ mod tests {
|
|
|
|
|
assert_eq!(bank.is_votable(), false);
|
|
|
|
|
|
|
|
|
|
// Set is_delta to true
|
|
|
|
|
let tx_move_mint_to_1 = SystemTransaction::new_transfer(
|
|
|
|
|
&mint_keypair,
|
|
|
|
|
&key1.pubkey(),
|
|
|
|
|
1,
|
|
|
|
|
genesis_block.hash(),
|
|
|
|
|
0,
|
|
|
|
|
);
|
|
|
|
|
let tx_move_mint_to_1 =
|
|
|
|
|
system_transaction::transfer(&mint_keypair, &key1.pubkey(), 1, genesis_block.hash(), 0);
|
|
|
|
|
assert_eq!(bank.process_transaction(&tx_move_mint_to_1), Ok(()));
|
|
|
|
|
assert_eq!(bank.is_votable(), false);
|
|
|
|
|
|
|
|
|
|