From 51390aa459ce8e2ab8147574443fc8f5415785ac Mon Sep 17 00:00:00 2001 From: Michael Huang Date: Sun, 29 Aug 2021 20:51:17 -0400 Subject: [PATCH] token-utils: Add helper to mint a NFT (#217) * token-utils: Add helper to mint a NFT * mintAuthority -> tempMintAuthority --- packages/token-utils/src/instructions/nft.ts | 55 ++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 packages/token-utils/src/instructions/nft.ts diff --git a/packages/token-utils/src/instructions/nft.ts b/packages/token-utils/src/instructions/nft.ts new file mode 100644 index 000000000..774bf4947 --- /dev/null +++ b/packages/token-utils/src/instructions/nft.ts @@ -0,0 +1,55 @@ +import type { Provider, TransactionEnvelope } from "@saberhq/solana-contrib"; +import { Token as SPLToken, TOKEN_PROGRAM_ID, u64 } from "@solana/spl-token"; +import type { PublicKey, Signer } from "@solana/web3.js"; + +import { createInitMintInstructions, getOrCreateATA } from "."; + +export const mintNFT = async ( + provider: Provider, + mintKP: Signer, + owner: PublicKey = provider.wallet.publicKey +): Promise => { + // Temporary mint authority + const tempMintAuthority = provider.wallet.publicKey; + // Mint for the NFT + const tx = await createInitMintInstructions({ + provider, + mintKP, + decimals: 0, + mintAuthority: tempMintAuthority, + }); + // Token account for the NFT + const { address, instruction } = await getOrCreateATA({ + provider, + mint: mintKP.publicKey, + owner: owner, + payer: provider.wallet.publicKey, + }); + if (instruction) { + tx.instructions.push(instruction); + } + // Mint to owner's ATA + tx.instructions.push( + SPLToken.createMintToInstruction( + TOKEN_PROGRAM_ID, + mintKP.publicKey, + address, + tempMintAuthority, + [], + new u64(1) + ) + ); + // Set mint authority of the NFT to NULL + tx.instructions.push( + SPLToken.createSetAuthorityInstruction( + TOKEN_PROGRAM_ID, + mintKP.publicKey, + null, + "MintTokens", + tempMintAuthority, + [] + ) + ); + + return tx; +};