How to Develop Programmable Non-Fungible Tokens on Solana
The introduction of Programmable Non-Fungible Tokens (PNFTs) on Solana is what brings in a new dimension to the world of digital ownership, as it allows creators to insert custom rules into their NFTs. Through advanced NFT development services, it becomes possible to ensure that activities like transfers and burns are always done with respect to the creator’s true intentions.
Key Features of PNFTs
Enhanced Security: For any operation, PNFTs demand that such an action must go through the Token Metadata program, ensuring that no set rules by the creator are bypassed as they might be using the SPL token program.
Granular Delegation: Creators can determine precise operations allowed on assets, and assign delegates who have detailed security systems for managing these permissions.
Rule Enforcement: Any operation upon which PNFT is enforced may be subjected to diverse custom rules thus allowing inventors to put various prerequisites regarding actions like transfer and update into effect.
Practical Applications
Royalty Enforcement: These tokens can enforce payments for royalties by using rules such as those that prevent transfers unless they comply with imposed royalty terms. This perspective on NFTs lets artists claim more control over how their digital assets are used or transferred.
Step 1: Project Setup
Initialize Project Directory
Create and navigate into a new project directory:
bash mkdir pnft_project cd pnft_project
Create TypeScript File
Generate the main TypeScript file for your application:
bash touch app.ts
Initialize Package
Use Yarn or npm to initialize your project with default settings:
yarn init -y # or npm init -y
TypeScript Configuration
Setup TypeScript with JSON module resolution and target ES2020:
tsc --init --resolveJsonModule --target ES2020
Paper Wallet Setup
Store your development network Solana keys in a file called guideSecret.json:
Ensure you generate this securely and store safely.
Step 2: Install Dependencies
Install necessary libraries for interacting with Solana’s blockchain:
yarn add @solana/web3.js @metaplex-foundation/js or npm install @solana/web3.js @metaplex-foundation/js
Step 3: Configure Your App
Import Required Modules
At the top of app.ts, include the necessary modules from the installed libraries: typescript
import { Connection, Keypair, PublicKey } from "@solana/web3.js"; import { Metaplex, keypairIdentity, bundlrStorage, toMetaplexFile, toBigNumber } from "@metaplex-foundation/js"; import { TokenStandard } from '@metaplex-foundation/mpl-token-metadata'; import secret from './guideSecret.json';
Setup Connection
Configure the connection to the Solana cluster using an endpoint:
const QUICKNODE_RPC = 'https://example.solana-devnet.quiknode.pro/your_unique_id/'; const SOLANA_CONNECTION = new Connection(QUICKNODE_RPC);
Initialize Metaplex
Set up the Metaplex client with the connection and wallet information:
const WALLET = Keypair.fromSecretKey(new Uint8Array(secret)); const METAPLEX = Metaplex.make(SOLANA_CONNECTION) .use(keypairIdentity(WALLET)) .use(bundlrStorage({ address: 'https://devnet.bundlr.network', providerUrl: QUICKNODE_RPC, timeout: 60000, }));
Step 4: Define NFT Configuration
Configure the metadata and attributes of your NFT: typescript
const NFT_CONFIG = { imgName: 'MyUniqueNFT', symbol: 'UNIQ', sellerFeeBasisPoints: 500, // 5% fee creators: [{ address: WALLET.publicKey, share: 100 }], metadata: 'https://arweave.net/example_URI' };
Step 5: Create the Mint Function
Implement the function to mint your pNFT: typescript
async function mintProgrammableNft( metadataUri: string, name: string, sellerFee: number, symbol: string, creators: { address: PublicKey, share: number }[] ) { console.log("Minting pNFT..."); try { const transactionBuilder = await METAPLEX.nfts().builders().create({ uri: metadataUri, name: name, sellerFeeBasisPoints: sellerFee, symbol: symbol, creators: creators, isMutable: true, isCollection: false, tokenStandard: TokenStandard.ProgrammableNonFungible, ruleSet: null }); let { signature, confirmResponse } = await METAPLEX.rpc().sendAndConfirmTransaction(transactionBuilder); if (confirmResponse.value.err) { throw new Error('Failed to confirm transaction'); } const { mintAddress } = transactionBuilder.getContext(); console.log(` Success!🎉`); console.log(` Minted NFT: https://explorer.solana.com/address/${mintAddress.toString()}?cluster=devnet`); console.log(` Tx: https://explorer.solana.com/tx/${signature}?cluster=devnet`); } catch (err) { console.log(err); } }
Step 6: Mint the NFT
Execute the minting process by calling your function with the configured settings: typescript
mintProgrammableNft( NFT_CONFIG.metadata, NFT_CONFIG.imgName, NFT_CONFIG.sellerFeeBasisPoints, NFT_CONFIG.symbol, NFT_CONFIG.creators ); // Run the script ts-node app.ts
Conclusion
Programmable NFTs on Solana offer NFT developers an innovative, fast, and secure platform to create advanced and customizable decentralized applications, revolutionizing the digital asset landscape. Contact our NFT developers for expert services.
References — Github : https://github.com/
Subscribe to my newsletter
Read articles from Mohd Arslan Siddiqui directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
Mohd Arslan Siddiqui
Mohd Arslan Siddiqui
Expert blockchain writer with a knack for simplicity. Blends technical depth with engaging storytelling.