Attaching metadata
Ref -
- https://github.com/100xdevs-cohort-3/week-6-web3-token-launchpad/tree/main/4-token-launchpage-with-metadata
- https://solana.com/developers/guides/token-extensions/metadata-pointer
- Convert the mint to use
token 2022 program
- After creating the token, create the metadata
Ref - https://spl.solana.com/token-2022/extensions#example-create-a-mint-with-metadata
Using the token22 program, let’s create the mint with some metadata
import { Keypair, SystemProgram, Transaction } from "@solana/web3.js";import { useConnection, useWallet } from '@solana/wallet-adapter-react';import { TOKEN_2022_PROGRAM_ID, getMintLen, createInitializeMetadataPointerInstruction, createInitializeMintInstruction, TYPE_SIZE, LENGTH_SIZE, ExtensionType } from "@solana/spl-token"import { createInitializeInstruction, pack } from '@solana/spl-token-metadata';
export function TokenLaunchpad() { const { connection } = useConnection(); const wallet = useWallet();
async function createToken() { const mintKeypair = Keypair.generate(); const metadata = { mint: mintKeypair.publicKey, name: 'KIRA', symbol: 'KIR ', uri: 'https://cdn.100xdevs.com/metadata.json', additionalMetadata: [], };
const mintLen = getMintLen([ExtensionType.MetadataPointer]); const metadataLen = TYPE_SIZE + LENGTH_SIZE + pack(metadata).length;
const lamports = await connection.getMinimumBalanceForRentExemption(mintLen + metadataLen);
const transaction = new Transaction().add( SystemProgram.createAccount({ fromPubkey: wallet.publicKey, newAccountPubkey: mintKeypair.publicKey, space: mintLen, lamports, programId: TOKEN_2022_PROGRAM_ID, }), createInitializeMetadataPointerInstruction(mintKeypair.publicKey, wallet.publicKey, mintKeypair.publicKey, TOKEN_2022_PROGRAM_ID), createInitializeMintInstruction(mintKeypair.publicKey, 9, wallet.publicKey, null, TOKEN_2022_PROGRAM_ID), createInitializeInstruction({ programId: TOKEN_2022_PROGRAM_ID, mint: mintKeypair.publicKey, metadata: mintKeypair.publicKey, name: metadata.name, symbol: metadata.symbol, uri: metadata.uri, mintAuthority: wallet.publicKey, updateAuthority: wallet.publicKey, }), );
transaction.feePayer = wallet.publicKey; transaction.recentBlockhash = (await connection.getLatestBlockhash()).blockhash; transaction.partialSign(mintKeypair);
await wallet.sendTransaction(transaction, connection); }
return <div style={{ height: '100vh', display: 'flex', justifyContent: 'center', alignItems: 'center', flexDirection: 'column' }}> <h1>Solana Token Launchpad</h1> <input className='inputText' type='text' placeholder='Name'></input> <br /> <input className='inputText' type='text' placeholder='Symbol'></input> <br /> <input className='inputText' type='text' placeholder='Image URL'></input> <br /> <input className='inputText' type='text' placeholder='Initial Supply'></input> <br /> <button onClick={createToken} className='btn'>Create a token</button> </div>}