This account may not be used to pay transaction fees
use anchor_lang::prelude::*;
use anchor_lang::solana_program::entrypoint::ProgramResult;
declare_id!("CLvLTsZ8seZ6E19b2FSA4B1BrumUatXiSe2RmDvbtG41");
#[program]
pub mod crowdfunding {
use super::*;
pub fn create(ctx: Context, name: String, description: String) -> ProgramResult {
let campaign = &mut ctx.accounts.campaign;
campaign.name = name;
campaign.description = description;
campaign.amount_donated = 0;
campaign.current_balance = 0;
campaign.admin = *ctx.accounts.user.key;
Ok(())
}
pub fn withdraw(ctx: Context, amount: u64) -> ProgramResult {
let campaign = &mut ctx.accounts.campaign;
let user = &mut ctx.accounts.user;
if campaign.admin != *user.key {
return Err(ProgramError::IncorrectProgramId);
}
let rent_balance = Rent::get()?.minimum_balance(campaign.to_account_info().data_len());
if **campaign.to_account_info().lamports.borrow() - rent_balance < amount {
println!("Not enough funds");
return Err(ProgramError::InsufficientFunds);
}
**campaign.to_account_info().try_borrow_mut_lamports()? -= amount;
campaign.current_balance -= amount;
**user.to_account_info().try_borrow_mut_lamports()? += amount;
println!(
"Current balance {}",
**campaign.to_account_info().try_borrow_mut_lamports()?
);
Ok(())
}
pub fn donate(ctx: Context<Donate>, amount: u64) -> ProgramResult {
let ix = anchor_lang::solana_program::system_instruction::transfer(
&ctx.accounts.user.key(),
&ctx.accounts.campaign.key(),
amount,
);
anchor_lang::solana_program::program::invoke(
&ix,
&[
ctx.accounts.user.to_account_info(),
ctx.accounts.campaign.to_account_info(),
],
);
(&mut ctx.accounts.campaign).amount_donated += amount;
(&mut ctx.accounts.campaign).current_balance += amount;
Ok(())
}
}
#[derive(Accounts)]
pub struct Create<'info> {
#[account(
init,
payer=user,
space=9000,
seeds =[b"CAMPAIGN_DEMO".as_ref(), user.key().as_ref()],
bump
)]
pub campaign: Account<'info, Campaign>,
#[account(mut)]
pub user: Signer<'info>,
pub system_program: Program<'info, System>,
}
#[derive(Accounts)]
pub struct Withdraw<'info> {
#[account(mut)]
pub campaign: Account<'info, Campaign>,
#[account(mut)]
pub user: Signer<'info>,
}
#[derive(Accounts)]
pub struct Donate<'info> {
#[account(mut)]
pub campaign: Account<'info, Campaign>,
#[account(mut)]
pub user: Signer<'info>,
pub system_program: Program<'info, System>,
}
#[account]
pub struct Campaign {
pub admin: Pubkey,
pub name: String,
pub description: String,
pub amount_donated: u64,
pub current_balance: u64,
}
//3S9nB8j5Jod3tP74uWXKcyn1UeTSF2qykqsrTpEDNonf
Instruction index: 0
Reason: Cross-program invocation with unauthorized signer or writable account.
test