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

Transaction failing while calling a Solana program with PDA

$
0
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


Viewing all articles
Browse latest Browse all 7894

Trending Articles