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

Minting a token with Transferhook

$
0
0

I'm not sure if something has updated recently, but code I am using has stopped working.

// Prepare metadata      const metaData: TokenMetadata = {        updateAuthority: mintAuthority,        mint: mint,        name: tokenMetadata.tokenName,        symbol: tokenMetadata.symbol,        uri: uri,        additionalMetadata: [["description", tokenMetadata.description]],      };      const mintExtensions = [ExtensionType.MetadataPointer];      if (isSupplyLimiterOn) mintExtensions.push(ExtensionType.TransferHook);      if (isTaxOn) mintExtensions.push(ExtensionType.TransferFeeConfig);      const metadataExtension = TYPE_SIZE + LENGTH_SIZE;      const metadataLen = pack(metaData).length;      const mintLen = getMintLen(mintExtensions);      const lamports = await connection.getMinimumBalanceForRentExemption(        mintLen + metadataExtension + metadataLen      );      // Create instructions      const instructions = [        ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 3.33 * 1e6 }),        ComputeBudgetProgram.setComputeUnitLimit({          units: isSupplyLimiterOn ? 250_000 : 200_000,        }),        SystemProgram.createAccount({          fromPubkey: mintAuthority,          newAccountPubkey: mint,          space: mintLen,          lamports,          programId: TOKEN_2022_PROGRAM_ID,        }),      ];      if (isTaxOn) {        const withdrawWithheldAuthority = new PublicKey(          taxWallet || mintAuthority        );        const feeBasisPoints = Number(taxPercent) * 100;        const maxFee = BigInt(tokenMetadata.supply * 10 ** decimals);        instructions.push(          createInitializeTransferFeeConfigInstruction(            mint,            mintAuthority,            withdrawWithheldAuthority,            feeBasisPoints,            maxFee,            TOKEN_2022_PROGRAM_ID          )        );      }      instructions.push(        createInitializeMetadataPointerInstruction(          mint,          mintAuthority,          mint,          TOKEN_2022_PROGRAM_ID        ),        createInitializeMintInstruction(          mint,          decimals,          mintAuthority,          mintAuthority,          TOKEN_2022_PROGRAM_ID        ),        createInitializeInstruction({          programId: TOKEN_2022_PROGRAM_ID,          metadata: mint,          updateAuthority: mintAuthority,          mint: mint,          mintAuthority: mintAuthority,          name: metaData.name,          symbol: metaData.symbol,          uri: metaData.uri,        }),        createUpdateFieldInstruction({          programId: TOKEN_2022_PROGRAM_ID,          metadata: mint,          updateAuthority: mintAuthority,          field: metaData.additionalMetadata[0][0],          value: metaData.additionalMetadata[0][1],        })      );      if (isSupplyLimiterOn) {        const [extraAccountMetaListPDA] = PublicKey.findProgramAddressSync(          [            Buffer.from("extra-account-metas"),            mintKeypair.publicKey.toBuffer(),          ],          supplyProgramId        );        const [configPDA] = PublicKey.findProgramAddressSync(          [Buffer.from("config"), mintKeypair.publicKey.toBuffer()],          supplyProgramId        );        instructions.push(          createInitializeTransferHookInstruction(            mintKeypair.publicKey,            wallet.publicKey,            supplyProgramId,            TOKEN_2022_PROGRAM_ID          )        );        const maxWallet = Math.min(          Math.max(Number(maxWalletPercent) || 100, 0),          100        );        const maxTax = Math.min(          Math.max(Number(maxTransactionPercent) || 100, 0),          100        );        const supplyHookIx = await createSupplyHook(          wallet.publicKey,          mint,          extraAccountMetaListPDA,          configPDA,          maxWallet * 10000,          maxTax * 10000        );        instructions.push(supplyHookIx);      }      const userATAKey = getAssociatedTokenAddressSync(        mint,        mintAuthority,        true,        TOKEN_2022_PROGRAM_ID      );      instructions.push(        createAssociatedTokenAccountIdempotentInstruction(          mintAuthority,          userATAKey,          mintAuthority,          mint,          TOKEN_2022_PROGRAM_ID        ),        createMintToInstruction(          mint,          userATAKey,          mintAuthority,          BigInt(tokenMetadata.supply * 10 ** tokenMetadata.decimals),          undefined,          TOKEN_2022_PROGRAM_ID        )      );      const globalAddressLookupTableAddress = new PublicKey("HXymiEoZzgb5emVa1NLexeMqmwx1wQegTB3dN6Yh8x1i"      );      const lookupTableAccount = (        await connection.getAddressLookupTable(globalAddressLookupTableAddress)      ).value;      const blockhash = await connection.getLatestBlockhash();      const messageV0 = new TransactionMessage({        payerKey: wallet.publicKey,        recentBlockhash: blockhash.blockhash,        instructions,      }).compileToV0Message([lookupTableAccount!]);      const transaction = new VersionedTransaction(messageV0);      transaction.sign([mintKeypair]);      const signedTransaction = await wallet.signTransaction!(transaction);      const signature = await connection.sendRawTransaction(        signedTransaction.serialize(),        { skipPreflight: true }      );      await connection.confirmTransaction({        signature,        blockhash: blockhash.blockhash,        lastValidBlockHeight: blockhash.lastValidBlockHeight,      });

This exact code worked for a long time but noticed recently I receive this error when attempting to deploy if I enable "supply limiter" to utilize my transferhook.

#5 - Token 2022 Program: initializeMint(Program Error: "invalid account data for instruction")


Viewing all articles
Browse latest Browse all 7925

Trending Articles



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