2019-03-14 20:42:01 -06:00
|
|
|
use crate::bank::Bank;
|
2019-03-23 21:12:27 -06:00
|
|
|
use solana_sdk::instruction::Instruction;
|
2019-03-27 05:36:01 -06:00
|
|
|
use solana_sdk::message::Message;
|
2019-03-16 14:30:10 -06:00
|
|
|
use solana_sdk::pubkey::Pubkey;
|
|
|
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
|
|
|
use solana_sdk::system_instruction::SystemInstruction;
|
2019-03-23 21:12:27 -06:00
|
|
|
use solana_sdk::transaction::{Transaction, TransactionError};
|
2019-03-14 20:42:01 -06:00
|
|
|
|
|
|
|
pub struct BankClient<'a> {
|
|
|
|
bank: &'a Bank,
|
2019-03-18 15:35:47 -06:00
|
|
|
keypairs: Vec<Keypair>,
|
2019-03-14 20:42:01 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a> BankClient<'a> {
|
2019-03-18 15:35:47 -06:00
|
|
|
pub fn new_with_keypairs(bank: &'a Bank, keypairs: Vec<Keypair>) -> Self {
|
|
|
|
assert!(!keypairs.is_empty());
|
|
|
|
Self { bank, keypairs }
|
|
|
|
}
|
|
|
|
|
2019-03-14 20:42:01 -06:00
|
|
|
pub fn new(bank: &'a Bank, keypair: Keypair) -> Self {
|
2019-03-18 15:35:47 -06:00
|
|
|
Self::new_with_keypairs(bank, vec![keypair])
|
2019-03-14 20:42:01 -06:00
|
|
|
}
|
|
|
|
|
2019-03-16 14:30:10 -06:00
|
|
|
pub fn pubkey(&self) -> Pubkey {
|
2019-03-18 15:35:47 -06:00
|
|
|
self.keypairs[0].pubkey()
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn pubkeys(&self) -> Vec<Pubkey> {
|
|
|
|
self.keypairs.iter().map(|x| x.pubkey()).collect()
|
|
|
|
}
|
|
|
|
|
2019-03-27 05:36:01 -06:00
|
|
|
pub fn process_message(&self, message: Message) -> Result<(), TransactionError> {
|
2019-03-18 15:35:47 -06:00
|
|
|
let keypairs: Vec<_> = self.keypairs.iter().collect();
|
2019-03-27 05:36:01 -06:00
|
|
|
let blockhash = self.bank.last_blockhash();
|
|
|
|
let transaction = Transaction::new(&keypairs, message, blockhash);
|
|
|
|
self.bank.process_transaction(&transaction)
|
2019-03-16 14:30:10 -06:00
|
|
|
}
|
|
|
|
|
2019-03-17 09:55:42 -06:00
|
|
|
/// Create and process a transaction from a list of instructions.
|
|
|
|
pub fn process_instructions(
|
|
|
|
&self,
|
|
|
|
instructions: Vec<Instruction>,
|
|
|
|
) -> Result<(), TransactionError> {
|
2019-03-27 05:36:01 -06:00
|
|
|
self.process_message(Message::new(instructions))
|
2019-03-17 09:55:42 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Create and process a transaction from a single instruction.
|
|
|
|
pub fn process_instruction(&self, instruction: Instruction) -> Result<(), TransactionError> {
|
|
|
|
self.process_instructions(vec![instruction])
|
2019-03-16 14:30:10 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Transfer lamports to pubkey
|
|
|
|
pub fn transfer(&self, lamports: u64, pubkey: &Pubkey) -> Result<(), TransactionError> {
|
|
|
|
let move_instruction = SystemInstruction::new_move(&self.pubkey(), pubkey, lamports);
|
2019-03-17 09:55:42 -06:00
|
|
|
self.process_instruction(move_instruction)
|
2019-03-14 20:42:01 -06:00
|
|
|
}
|
|
|
|
}
|
2019-03-18 15:35:47 -06:00
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
|
|
|
use super::*;
|
|
|
|
use solana_sdk::genesis_block::GenesisBlock;
|
2019-03-23 21:12:27 -06:00
|
|
|
use solana_sdk::instruction::AccountMeta;
|
2019-03-18 15:35:47 -06:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_bank_client_new_with_keypairs() {
|
|
|
|
let (genesis_block, john_doe_keypair) = GenesisBlock::new(10_000);
|
|
|
|
let jane_doe_keypair = Keypair::new();
|
|
|
|
let doe_keypairs = vec![john_doe_keypair, jane_doe_keypair];
|
|
|
|
let bank = Bank::new(&genesis_block);
|
|
|
|
let doe_client = BankClient::new_with_keypairs(&bank, doe_keypairs);
|
|
|
|
let jane_pubkey = doe_client.pubkeys()[1];
|
|
|
|
|
|
|
|
// Create 2-2 Multisig Move instruction.
|
|
|
|
let bob_pubkey = Keypair::new().pubkey();
|
|
|
|
let mut move_instruction =
|
|
|
|
SystemInstruction::new_move(&doe_client.pubkey(), &bob_pubkey, 42);
|
2019-03-19 13:03:20 -06:00
|
|
|
move_instruction
|
|
|
|
.accounts
|
2019-03-19 15:25:48 -06:00
|
|
|
.push(AccountMeta::new(jane_pubkey, true));
|
2019-03-18 15:35:47 -06:00
|
|
|
|
|
|
|
doe_client.process_instruction(move_instruction).unwrap();
|
|
|
|
assert_eq!(bank.get_balance(&bob_pubkey), 42);
|
|
|
|
}
|
|
|
|
}
|