Assignment: Audit a Smart Contract
Objective:
Starter Code
use solana_sdk::{
account::Account,
entrypoint::{entrypoint, Entrypoint},
program_error::ProgramError,
pubkey::Pubkey,
};
struct Token {
owner: Pubkey,
balance: u64,
}
impl Token {
fn new(owner: Pubkey) -> Self {
Self { owner, balance: 0 }
}
fn deposit(&mut self, amount: u64) {
self.balance += amount;
}
fn transfer(&mut self, to: Pubkey, amount: u64) -> Result<(), ProgramError> {
if self.balance < amount {
return Err(ProgramError::InsufficientFunds);
}
if self.owner == to {
return Err(ProgramError::InvalidAccount);
}
self.balance -= amount;
Ok(())
}
}
#[entrypoint]
// Don't worry about this
pub fn process_instruction(
program_id: &Pubkey,
accounts: &[Account],
instruction_data: &[u8],
) -> Result<(), ProgramError> {
let account_metas = &accounts[0..2];
let source_account = &account_metas[0];
let destination_account = &account_metas[1];
let source_data = &source_account.data;
let destination_data = &destination_account.data;
let source_token = Token::deserialize(source_data).unwrap();
let mut destination_token = Token::deserialize(destination_data).unwrap();
match instruction_data[0] {
0 => source_token.transfer(destination_account.key, 1)?,
1 => destination_token.deposit(1),
2 => destination_token.transfer(source_account.key, 1)?,
_ => return Err(ProgramError::InvalidInstructionData),
}
source_account.data = source_token.serialize();
destination_account.data = destination_token.serialize();
Ok(())
}Instructions:
Report Requirements:
New Implementation Requirements:
Submission:
Last updated