0

I'm calling a function of anchor_movie_review_program program on devnet CLA5Pk8tpcsA3RPmCYPaRNBdU6xBknRnqshsT1bKT7if. I cloned the following GitHub https://github.com/Unboxed-Software/anchor-movie-review-program project. The test is running well but when I call it from my vue app it fails. The function name is add_movie_review. If anyone has any idea about what am I doing wrong and how can I fix it please let me know. Thank you in advance.

I'm forming the Tx in 2 ways but I am failing to add a movie.

First way :

        const wallet = useWallet();
        const programId = new PublicKey("CLA5Pk8tpcsA3RPmCYPaRNBdU6xBknRnqshsT1bKT7if");
        const provider = new anchor.AnchorProvider(
                            connection,
                            wallet,
                            anchor.AnchorProvider.defaultOptions()
                         );                
        // Generate the program client from IDL. Where MyRaffle is the idl generated by program
        const program = new anchor.Program(MyRaffle, programId, provider);
        const movie = {
                title: "Just a test movie",
                description: "Wow what a good movie it was real great",
                rating: 5,
            };
        const [moviePda] = anchor.web3.PublicKey.findProgramAddressSync(
                [Buffer.from(movie.title), wallet.publicKey.value.toBuffer()],
                program.programId
            );
    
        const tx = await program.methods.addMovieReview(movie.title,  
                            movie.description, movie.rating ).accounts({
                            movieReview: moviePda,
                            initializer: wallet.publicKey.value,
                            systemProgram: anchor.web3.SystemProgram.programId,
                        }).rpc();

Here is the IDL:

{
    "version": "0.1.0",
    "name": "anchor_movie_review_program",
    "instructions": [
      {
        "name": "addMovieReview",
        "accounts": [
          {
            "name": "movieReview",
            "isMut": true,
            "isSigner": false,
            "pda": {
              "seeds": [
                {
                  "kind": "arg",
                  "type": "string",
                  "path": "title"
                },
                {
                  "kind": "account",
                  "type": "publicKey",
                  "path": "initializer"
                }
              ]
            }
          },
          {
            "name": "initializer",
            "isMut": true,
            "isSigner": true
          },
          {
            "name": "systemProgram",
            "isMut": false,
            "isSigner": false
          }
        ],
        "args": [
          {
            "name": "title",
            "type": "string"
          },
          {
            "name": "description",
            "type": "string"
          },
          {
            "name": "rating",
            "type": "u8"
          }
        ]
      },
      {
        "name": "updateMovieReview",
        "accounts": [
          {
            "name": "movieReview",
            "isMut": true,
            "isSigner": false,
            "pda": {
              "seeds": [
                {
                  "kind": "arg",
                  "type": "string",
                  "path": "title"
                },
                {
                  "kind": "account",
                  "type": "publicKey",
                  "path": "initializer"
                }
              ]
            }
          },
          {
            "name": "initializer",
            "isMut": true,
            "isSigner": true
          },
          {
            "name": "systemProgram",
            "isMut": false,
            "isSigner": false
          }
        ],
        "args": [
          {
            "name": "title",
            "type": "string"
          },
          {
            "name": "description",
            "type": "string"
          },
          {
            "name": "rating",
            "type": "u8"
          }
        ]
      },
      {
        "name": "deleteMovieReview",
        "accounts": [
          {
            "name": "movieReview",
            "isMut": true,
            "isSigner": false,
            "pda": {
              "seeds": [
                {
                  "kind": "arg",
                  "type": "string",
                  "path": "title"
                },
                {
                  "kind": "account",
                  "type": "publicKey",
                  "path": "initializer"
                }
              ]
            }
          },
          {
            "name": "initializer",
            "isMut": true,
            "isSigner": true
          }
        ],
        "args": [
          {
            "name": "title",
            "type": "string"
          }
        ]
      }
    ],
    "accounts": [
      {
        "name": "MovieAccountState",
        "type": {
          "kind": "struct",
          "fields": [
            {
              "name": "reviewer",
              "type": "publicKey"
            },
            {
              "name": "rating",
              "type": "u8"
            },
            {
              "name": "title",
              "type": "string"
            },
            {
              "name": "description",
              "type": "string"
            }
          ]
        }
      }
    ],
    "metadata": {
      "address": "CLA5Pk8tpcsA3RPmCYPaRNBdU6xBknRnqshsT1bKT7if"
    }
  }

With the above code I get the following error: enter image description here

Second Way I try to call it:

  const MOVIE_REVIEW_PROGRAM_ID = 'CLA5Pk8tpcsA3RPmCYPaRNBdU6xBknRnqshsT1bKT7if';` 
  const movie = new Movie(
                "Just a test movie",
                 "Wow what a good movie it was real great",
                 5,
               );
  const wallet = useWallet();
  const connection = new Connection(clusterApiUrl('devnet'));
  const buffer = movie.serialize();
  const transaction = new Transaction();

  const [pda] = await PublicKey.findProgramAddressSync(
        [Buffer.from(movie.title), wallet.publicKey.value.toBuffer()],
        new PublicKey(MOVIE_REVIEW_PROGRAM_ID)
       );
  
  const instruction = new TransactionInstruction({
                keys: [
                    {
                        pubkey: pda,
                        isSigner: false,
                        isWritable: true,
                    },     
                    {
                        pubkey: publicKey.value,
                        isSigner: true,
                        isWritable: true
                    },   
                    {
                        pubkey: SystemProgram.programId,
                        isSigner: false,
                        isWritable: false
                    }
                ],
                data: buffer,
                programId: new PublicKey(MOVIE_REVIEW_PROGRAM_ID)
        });

        transaction.add(instruction);
 
        try {
            let txid = await sendTransaction(transaction, connection)
        } catch (e) {
            alert(JSON.stringify(e))
        }

Here is the movie class:

import * as borsh from "@project-serum/borsh"

export class Movie {
  constructor(title, description, rating) {
    this.title = title
    this.description = description
    this.rating = rating
  }

  borshInstructionSchema = borsh.struct([
    borsh.u8("variant"),
    borsh.str("title"),
    borsh.str("description"),
    borsh.u8("rating")
  ])

  static borshAccountSchema = borsh.struct([
    borsh.bool("initialized"),
    borsh.str("title"),
    borsh.str("description"),
    borsh.u8("rating")
  ])

  serialize() {
    const buffer = Buffer.alloc(1000)
    this.borshInstructionSchema.encode({ ...this, variant: 0 }, buffer)
    return buffer.slice(0, this.borshInstructionSchema.getSpan(buffer))
  }

  static deserialize(buffer) {
    if (!buffer) {
      return null
    }

    try {
      const { title, description , rating} = this.borshAccountSchema.decode(
        buffer
      )
      return new Movie(title, description, rating)
    } catch (e) {
      console.log("Deserialization error:", e)
      console.log(buffer)
      return null
    }
  }
}

With the second approach, I get the following :

enter image description here

1 Answer 1

0

You could try -

const [moviePda] = PublicKey.findProgramAddressSync([Buffer.from(movie.title, 'utf-8'), wallet.publicKey.toBuffer()], programId)

also don't forget to sign the transaction in #2 example:

let txid = await sendTransaction(connection, transaction, [signers])

1
  • Hi man, thank you for your answer. I tried it as you said but I still get the same errors. In the second example, I am already signing the transaction, at least trying to as shown in the image attached. Anyway, I tried it as you said too and still getting the same result.
    – kc.sol
    Oct 24, 2023 at 10:17

Your Answer

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

Not the answer you're looking for? Browse other questions tagged or ask your own question.