Quantcast
Channel: Recent Questions - Solana Stack Exchange
Viewing all articles
Browse latest Browse all 7906

How to manipulate a list of PDA in anchor

$
0
0

I have a smart contract i am working with, in the acceptOffer function, i need to invalidate all previous Offer, by using isAccepted(boolean) back to false,I have search online looking for a way to get it working, and also tried

#[derive(Accounts)]#[instruction()]pub struct AcceptOffer<'info> {    #[account(        mut,        seeds = [USER_TAG,authority.key().as_ref()],        bump,        has_one = authority    )]    pub user: Box<Account<'info, User>>,    #[account(mut)]    pub authority: Signer<'info>,    #[account(mut)]    pub offer: Box<Account<'info, Offer>>,    #[account(mut)]    pub previous_offers: Box<Account<'info, Offer>>, // added this line    #[account(mut)]    pub request: Box<Account<'info, Request>>,    pub system_program: Program<'info, System>,}

but i get error proc-macro panicked: Invariant violation: composite constraints can only be raw or literals

this are my code snippet,the commented section is what I am trying to achieve

#[derive(Accounts)]#[instruction()]pub struct AcceptOffer<'info> {    #[account(        mut,        seeds = [USER_TAG,authority.key().as_ref()],        bump,        has_one = authority    )]    pub user: Box<Account<'info, User>>,    #[account(mut)]    pub authority: Signer<'info>,    #[account(mut)]    pub offer: Box<Account<'info, Offer>>,    #[account(mut)]    pub request: Box<Account<'info, Request>>,    pub system_program: Program<'info, System>,}    pub fn accept_offer(ctx: Context<AcceptOffer>) -> Result<()> {        let user = &mut ctx.accounts.user;        let offer = &mut ctx.accounts.offer;        let request = &mut ctx.accounts.request;        if user.account_type != AccountType::Buyer {            return err!(MarketplaceError::OnlyBuyersAllowed);        }        if request.buyer_id != user.id {            return err!(MarketplaceError::UnauthorizedBuyer);        }        if offer.is_accepted {            return err!(MarketplaceError::OfferAlreadyAccepted);        }        if Clock::get().unwrap().unix_timestamp as u64 > request.updated_at + TIME_TO_LOCK&& request.lifecycle == RequestLifecycle::AcceptedByBuyer        {            return err!(MarketplaceError::RequestLocked);        }        //TODO: fix this reset        // for prev_offer_id in request.offer_ids.iter() {        //     // let previous_offer = &mut ctx.accounts.offers[*prev_offer_id as usize];        //     // previous_offer.is_accepted = false;        //     // emit!(OfferAccepted {        //     //     offer_id: previous_offer.id,        //     //     buyer_address: *ctx.accounts.user.to_account_info().key,        //     //     is_accepted: false,        //     // });        // }        offer.is_accepted = true;        offer.updated_at = Clock::get().unwrap().unix_timestamp as u64;        request.offer_ids.push(offer.id);        request.locked_seller_id = offer.seller_id;        request.sellers_price_quote = offer.price;        request.lifecycle = RequestLifecycle::AcceptedByBuyer;        request.updated_at = Clock::get().unwrap().unix_timestamp as u64;        emit!(RequestAccepted {            request_id: request.id,            offer_id: offer.id,            seller_id: offer.seller_id,            updated_at: request.updated_at,            sellers_price_quote: request.sellers_price_quote,        });        emit!(OfferAccepted {            offer_id: offer.id,            buyer_address: *ctx.accounts.user.to_account_info().key,            is_accepted: true,        });        Ok(())    }#[account]pub struct Offer {    pub authority: Pubkey,    pub id: u64,    pub request_id: u64,    pub price: i64,    pub images: Vec<String>,    pub store_name: String,    pub seller_id: u64,    pub is_accepted: bool,    pub created_at: u64,    pub updated_at: u64,}#[account]pub struct Request {    pub authority: Pubkey,    pub id: u64,    pub name: String,    pub buyer_id: u64,    pub description: String,    pub images: Vec<String>,    pub sellers_price_quote: i64,    pub seller_ids: Vec<u64>,    pub offer_ids: Vec<u64>,    pub locked_seller_id: u64,    pub location: Location,    pub created_at: u64,    pub updated_at: u64,    pub lifecycle: RequestLifecycle,}#[account]#[derive(Debug)]pub struct User {    pub id: u64,    pub username: String,    pub phone: String,    pub location: Location,    pub created_at: i64,    pub updated_at: i64,    pub account_type: AccountType,    pub authority: Pubkey,}

Viewing all articles
Browse latest Browse all 7906

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>