Skip to content

The program expected this account to be already initialized. #3

@tungla20

Description

@tungla20

I'm following your code but when I do anchor build, the compiler return this error caused by mint, ownerTokenAccount and buyerTokenAccount. Here is my code:

it("Is initialized!", async () => {
    //create connection to devnet
    const connection = new Connection(
      clusterApiUrl('devnet'),
      'confirmed'
    );
    let minter = await splToken.createMint(connection, wallet.payer, wallet.publicKey, null, 1)
    const tokenAccount = await getOrCreateAssociatedTokenAccount(
      connection,
      wallet.payer,
      minter,
      wallet.publicKey
    )
    await mintTo(
      connection,
      wallet.payer,
      minter,
      tokenAccount.address,
      wallet.publicKey,
      1
    )
    const saleAmount = 1;
    const buyer: anchor.web3.Keypair = await createKeypairFromFile(__dirname + "/keypairs/buyer1.json");
    console.log(`Buyer public key: ${buyer.publicKey}`);
    const buyerTokenAddress = await anchor.utils.token.associatedAddress({
      mint: minter,
      owner: buyer.publicKey,
    });
    console.log(`Request to sell NFT: ${minter} for ${saleAmount} lamports.`);
    console.log(`Owner's Token Address: ${tokenAccount}`);
    console.log(`Buyer's Token Address: ${buyerTokenAddress}`);
    
    await program.methods.buyNft(
      new anchor.BN(saleAmount)
    )
      .accounts({
        mint: minter,
        ownerTokenAccount: tokenAccount.address,
        ownerAuthority: wallet.publicKey,
        buyerTokenAccount: buyerTokenAddress,
        buyerAuthority: buyer.publicKey,
      })
      .signers([buyer])
      .rpc();

and this is the code in my contract:

pub fn buy_nft(
        ctx: Context<BuyNft>,
        // amount: Option<u64>,
        lamports: Option<u64>,
    ) -> Result<()> {
        system_program::transfer(
            CpiContext::new(
                ctx.accounts.system_program.to_account_info(),
                system_program::Transfer {
                    from: ctx.accounts.buyer_authority.to_account_info(),
                    to: ctx.accounts.owner_authority.to_account_info(),
                },
            ),
            lamports.unwrap(),
        )?;

        associated_token::create(CpiContext::new(
            ctx.accounts.owner_token_account.to_account_info(),
            associated_token::Create {
                payer: ctx.accounts.buyer_authority.to_account_info(),
                associated_token: ctx.accounts.buyer_token_account.to_account_info(),
                authority: ctx.accounts.buyer_authority.to_account_info(),
                mint: ctx.accounts.mint.to_account_info(),
                system_program: ctx.accounts.system_program.to_account_info(),
                token_program: ctx.accounts.token_program.to_account_info(),
            },
        ))?;

        token::transfer(
            CpiContext::new(
                ctx.accounts.token_program.to_account_info(),
                token::Transfer {
                    from: ctx.accounts.owner_token_account.to_account_info(),
                    to: ctx.accounts.buyer_token_account.to_account_info(),
                    authority: ctx.accounts.owner_authority.to_account_info(),
                },
            ),
            1,
        )?;

        Ok(())
    }

In my version, the rent param in associated_token::Create is not existed so I remove it. So can you help me fixing this bug? Thanks

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions