pub fn harvest_burn(ctx: Context<HarvestBurn>, burn_amount: u64, zcash_address: Option<[u8; 64]>) -> Result<()> {
let herd = &mut ctx.accounts.herd;
let supply_before = ctx.accounts.coin_mint.supply;
let payout = (herd.total_zec_deposited as u128)
.checked_mul(burn_amount as u128).unwrap()
.checked_div(supply_before as u128).unwrap() as u64;
require!(payout > 0, ErrorCode::DustPayout);
token::burn_checked(ctx.accounts.burn_ctx(), burn_amount, ctx.accounts.coin_mint.decimals)?;
token::transfer(ctx.accounts.payout_ctx(), payout)?;
herd.total_zec_deposited = herd.total_zec_deposited.checked_sub(payout).unwrap();
if let Some(addr) = zcash_address {
memo::stamp(ctx.accounts.memo_ctx(), &herd.coin_mint, burn_amount, payout, &addr)?;
}
Ok(())
}
pub struct Herd {
pub coin_mint: Pubkey,
pub zec_vault: Pubkey,
pub total_zec_deposited: u64,
pub cap: u64,
pub payee_mode: PayeeMode,
pub paused: bool,
pub bump: u8,
}
require!(herd_bps >= HERD_BPS_MIN, ErrorCode::HerdFloorViolated);
require!(treasury_bps <= TREASURY_BPS_MAX, ErrorCode::TreasuryCeilingViolated);
pub fn harvest_burn(ctx: Context<HarvestBurn>, burn_amount: u64, zcash_address: Option<[u8; 64]>) -> Result<()> {
let herd = &mut ctx.accounts.herd;
let supply_before = ctx.accounts.coin_mint.supply;
let payout = (herd.total_zec_deposited as u128)
.checked_mul(burn_amount as u128).unwrap()
.checked_div(supply_before as u128).unwrap() as u64;
require!(payout > 0, ErrorCode::DustPayout);
token::burn_checked(ctx.accounts.burn_ctx(), burn_amount, ctx.accounts.coin_mint.decimals)?;
token::transfer(ctx.accounts.payout_ctx(), payout)?;
herd.total_zec_deposited = herd.total_zec_deposited.checked_sub(payout).unwrap();
if let Some(addr) = zcash_address {
memo::stamp(ctx.accounts.memo_ctx(), &herd.coin_mint, burn_amount, payout, &addr)?;
}
Ok(())
}
pub struct Herd {
pub coin_mint: Pubkey,
pub zec_vault: Pubkey,
pub total_zec_deposited: u64,
pub cap: u64,
pub payee_mode: PayeeMode,
pub paused: bool,
pub bump: u8,
}
require!(herd_bps >= HERD_BPS_MIN, ErrorCode::HerdFloorViolated);
require!(treasury_bps <= TREASURY_BPS_MAX, ErrorCode::TreasuryCeilingViolated);
pub fn harvest_burn(ctx: Context<HarvestBurn>, burn_amount: u64, zcash_address: Option<[u8; 64]>) -> Result<()> {
let herd = &mut ctx.accounts.herd;
let supply_before = ctx.accounts.coin_mint.supply;
let payout = (herd.total_zec_deposited as u128)
.checked_mul(burn_amount as u128).unwrap()
.checked_div(supply_before as u128).unwrap() as u64;
require!(payout > 0, ErrorCode::DustPayout);
token::burn_checked(ctx.accounts.burn_ctx(), burn_amount, ctx.accounts.coin_mint.decimals)?;
token::transfer(ctx.accounts.payout_ctx(), payout)?;
herd.total_zec_deposited = herd.total_zec_deposited.checked_sub(payout).unwrap();
if let Some(addr) = zcash_address {
memo::stamp(ctx.accounts.memo_ctx(), &herd.coin_mint, burn_amount, payout, &addr)?;
}
Ok(())
}
pub struct Herd {
pub coin_mint: Pubkey,
pub zec_vault: Pubkey,
pub total_zec_deposited: u64,
pub cap: u64,
pub payee_mode: PayeeMode,
pub paused: bool,
pub bump: u8,
}
require!(herd_bps >= HERD_BPS_MIN, ErrorCode::HerdFloorViolated);
require!(treasury_bps <= TREASURY_BPS_MAX, ErrorCode::TreasuryCeilingViolated);
pub fn harvest_burn(ctx: Context<HarvestBurn>, burn_amount: u64, zcash_address: Option<[u8; 64]>) -> Result<()> {
let herd = &mut ctx.accounts.herd;
let supply_before = ctx.accounts.coin_mint.supply;
let payout = (herd.total_zec_deposited as u128)
.checked_mul(burn_amount as u128).unwrap()
.checked_div(supply_before as u128).unwrap() as u64;
require!(payout > 0, ErrorCode::DustPayout);
token::burn_checked(ctx.accounts.burn_ctx(), burn_amount, ctx.accounts.coin_mint.decimals)?;
token::transfer(ctx.accounts.payout_ctx(), payout)?;
herd.total_zec_deposited = herd.total_zec_deposited.checked_sub(payout).unwrap();
if let Some(addr) = zcash_address {
memo::stamp(ctx.accounts.memo_ctx(), &herd.coin_mint, burn_amount, payout, &addr)?;
}
Ok(())
}
pub struct Herd {
pub coin_mint: Pubkey,
pub zec_vault: Pubkey,
pub total_zec_deposited: u64,
pub cap: u64,
pub payee_mode: PayeeMode,
pub paused: bool,
pub bump: u8,
}
require!(herd_bps >= HERD_BPS_MIN, ErrorCode::HerdFloorViolated);
require!(treasury_bps <= TREASURY_BPS_MAX, ErrorCode::TreasuryCeilingViolated);
pub fn harvest_burn(ctx: Context<HarvestBurn>, burn_amount: u64, zcash_address: Option<[u8; 64]>) -> Result<()> {
let herd = &mut ctx.accounts.herd;
let supply_before = ctx.accounts.coin_mint.supply;
let payout = (herd.total_zec_deposited as u128)
.checked_mul(burn_amount as u128).unwrap()
.checked_div(supply_before as u128).unwrap() as u64;
require!(payout > 0, ErrorCode::DustPayout);
token::burn_checked(ctx.accounts.burn_ctx(), burn_amount, ctx.accounts.coin_mint.decimals)?;
token::transfer(ctx.accounts.payout_ctx(), payout)?;
herd.total_zec_deposited = herd.total_zec_deposited.checked_sub(payout).unwrap();
if let Some(addr) = zcash_address {
memo::stamp(ctx.accounts.memo_ctx(), &herd.coin_mint, burn_amount, payout, &addr)?;
}
Ok(())
}
pub struct Herd {
pub coin_mint: Pubkey,
pub zec_vault: Pubkey,
pub total_zec_deposited: u64,
pub cap: u64,
pub payee_mode: PayeeMode,
pub paused: bool,
pub bump: u8,
}
require!(herd_bps >= HERD_BPS_MIN, ErrorCode::HerdFloorViolated);
require!(treasury_bps <= TREASURY_BPS_MAX, ErrorCode::TreasuryCeilingViolated);
pub fn harvest_burn(ctx: Context<HarvestBurn>, burn_amount: u64, zcash_address: Option<[u8; 64]>) -> Result<()> {
let herd = &mut ctx.accounts.herd;
let supply_before = ctx.accounts.coin_mint.supply;
let payout = (herd.total_zec_deposited as u128)
.checked_mul(burn_amount as u128).unwrap()
.checked_div(supply_before as u128).unwrap() as u64;
require!(payout > 0, ErrorCode::DustPayout);
token::burn_checked(ctx.accounts.burn_ctx(), burn_amount, ctx.accounts.coin_mint.decimals)?;
token::transfer(ctx.accounts.payout_ctx(), payout)?;
herd.total_zec_deposited = herd.total_zec_deposited.checked_sub(payout).unwrap();
if let Some(addr) = zcash_address {
memo::stamp(ctx.accounts.memo_ctx(), &herd.coin_mint, burn_amount, payout, &addr)?;
}
Ok(())
}
pub struct Herd {
pub coin_mint: Pubkey,
pub zec_vault: Pubkey,
pub total_zec_deposited: u64,
pub cap: u64,
pub payee_mode: PayeeMode,
pub paused: bool,
pub bump: u8,
}
require!(herd_bps >= HERD_BPS_MIN, ErrorCode::HerdFloorViolated);
require!(treasury_bps <= TREASURY_BPS_MAX, ErrorCode::TreasuryCeilingViolated);
THE MECHANISM
Burn to earn.
Every payout traces back to a formula, not a dashboard. What you see above is the actual shape of the instruction that would run on mainnet.