0
use crate::state::*;
use crate::error::*;
use std::str::FromStr;
use anchor_lang::prelude::*;
use switchboard_v2::AggregatorAccountData;


 
pub fn withdraw_handler(ctx: Context<Withdraw>) -> Result<()> {
    let feed: &! = &ctx.accounts.feed_aggregator.load()?;
    let escrow_state: &Account<EscrowState> = &ctx.accounts.escrow_account;
 
    // get result
    let val: f64 = feed.get_result()?.try_into()?;
 
    // check whether the feed has been updated in the last 300 seconds
    feed.check_staleness(Clock::get().unwrap().unix_timestamp, 300)
    .map_err(|_| error!(EscrowErrorCode::StaleFeed))?;
 
    msg!("Current feed result is {}!", val);
    msg!("Unlock price is {}", escrow_state.unlock_price);
 
    if val < escrow_state.unlock_price as f64 {
        return Err(EscrowErrorCode::SolPriceAboveUnlockPrice.into())
    }
 
    // 'Transfer: `from` must not carry data'
    **escrow_state.to_account_info().try_borrow_mut_lamports()? = escrow_state
        .to_account_info()
        .lamports()
        .checked_sub(escrow_state.escrow_amount)
        .ok_or(ProgramError::InvalidArgument)?;
 
    **ctx.accounts.user.to_account_info().try_borrow_mut_lamports()? = ctx.accounts.user
        .to_account_info()
        .lamports()
        .checked_add(escrow_state.escrow_amount)
        .ok_or(ProgramError::InvalidArgument)?;
 
    Ok(())
}
 
[derive(Accounts)]
pub struct Withdraw<'info> {
    // user accounts
    [account(mut)]
    pub user: Signer<'info>,
    // escrow account
    [account(
        mut,
        seeds = [ESCROW_SEED, user.key().as_ref()],
        bump,
        close = user
    )]
    pub escrow_account: Account<'info, EscrowState>,
    // Switchboard SOL feed aggregator
    [account(
        address = Pubkey::from_str(SOL_USDC_FEED).unwrap(),
        zero,
    )]
    pub feed_aggregator: AccountLoader<'info, AggregatorAccountData>,
    pub system_program: Program<'info, System>,
}

I am working through the Oracles and the oracle networks course, and after completing all the code, I'm getting the error below:

the trait bound `AggregatorAccountData: ZeroCopy` is not satisfied.

I have tried adding the zero property to enable ZeroCopy but that does not seem to work:

  #[account(
        address = Pubkey::from_str(SOL_USDC_FEED).unwrap(),
        zero,
    )]

Any ideas? thanks..

1
  • Unfortunately, we need to see AggregatorAccountData to be able to help -- there might be some fields in that type that don't support zero-copy, like a Vec or String or HashMap or BTreeMap
    – Jon C
    Commented Aug 20 at 22:29

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.