Estoy tratando de hacer una transferencia de spl-token desde la billetera de un usuario. El siguiente código funciona perfectamente en la red de desarrollo, pero arroja un error en la Transaction simulation failed: Error processing Instruction 0: incorrect program id for instruction . Crea una cuenta de token asociada pero falla en la instrucción. ¿Cómo sería incorrecta la identificación del programa si la identificación del programa token de solana nunca cambia? Cualquier ayuda sería apreciada.
let mint = new web3.PublicKey(mintAccount) let toWallet = new web3.PublicKey("ADDRESS") let owner = new web3.PublicKey(fromWallet.publicKey) const createTransaction = async (mint, minerWallet, owner) => { const transaction = new web3.Transaction() const destinationAccount = await splToken.Token.getAssociatedTokenAddress( splToken.ASSOCIATED_TOKEN_PROGRAM_ID, splToken.TOKEN_PROGRAM_ID, mint, toWallet, false ) const sourceAccount = await splToken.Token.getAssociatedTokenAddress( splToken.ASSOCIATED_TOKEN_PROGRAM_ID, splToken.TOKEN_PROGRAM_ID, mint, owner, false ) console.log("sending from " + sourceAccount.toBase58() + "to " + destinationAccount.toBase58()) transaction.feePayer = fromWallet.publicKey let blockhashObj = await connection.getRecentBlockhash(); transaction.recentBlockhash = blockhashObj.blockhash; let signature = ''; try { const destinationAccountInfo = await connection.getAccountInfo(destinationAccount) const destTokenAccountMissing = !destinationAccountInfo if (destTokenAccountMissing) { console.log("creating token account cuz it needs one") transaction.add( splToken.Token.createAssociatedTokenAccountInstruction( splToken.ASSOCIATED_TOKEN_PROGRAM_ID, // always associated token program id splToken.TOKEN_PROGRAM_ID, // always token program id mint, // mint (which we used to calculate ata) destinationAccount, // the ata we calcualted early toWallet, // token account owner (which we used to calculate ata) fromWallet.publicKey // payer, fund account, like SystemProgram.createAccount's from ) ); } transaction.add( splToken.Token.createTransferInstruction( splToken.TOKEN_PROGRAM_ID, sourceAccount, destinationAccount, fromWallet.publicKey, [], 1 ) ) signature = await sendTransaction(transaction, connection); console.log('info', 'Transaction sent:', signature) await connection.confirmTransaction(signature, 'processed'); console.log('success', 'Transaction successful!', signature); return true } catch (error) { console.log('error', `Transaction failed! ${error?.message}`, signature); return false }}
IncorrectProgramId del programa token significa que el propietario de la cuenta no era el programa spl-token esperado.
En su caso, es posible que sourceAccount aún no se haya creado en la red principal.
Asegúrese de que la identificación del programa en su lib.rs (si está utilizando Anchor) sea correcta y que esta identificación del programa coincida con la proporcionada en Anchor.toml.
También imprima la identificación del programa en su proveedor para verificar que su interfaz TypeScript realmente use el programa correcto.
Si usa el marco de anclaje, puede obtener la idea del programa (¡para insertarla en todos los lugares mencionados anteriormente!), ejecutando solana-address -k target/deploy/program-keypair.json desde el directorio donde se encuentra su Anchor.toml . Anchor.toml se almacena.