Skip to content

Attaching metadata

Ref -

  1. https://github.com/100xdevs-cohort-3/week-6-web3-token-launchpad/tree/main/4-token-launchpage-with-metadata
  2. https://solana.com/developers/guides/token-extensions/metadata-pointer
  3. Convert the mint to use token 2022 program
  4. 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>
}