import { PublicKey } from "@solana/web3.js"; import { Tool } from "langchain/tools"; import { SolanaAgentKit } from "../../agent"; export class SolanaMintNFTTool extends Tool { name = "solana_mint_nft"; description = `Mint a new NFT in a collection on Solana blockchain. Inputs (input is a JSON string): collectionMint: string, eg "J1S9H3QjnRtBbbuD4HjPV6RpRhwuk4zKbxsnCHuTgh9w" (required) - The address of the collection to mint into name: string, eg "My NFT" (required) uri: string, eg "https://example.com/nft.json" (required) recipient?: string, eg "9aUn5swQzUTRanaaTwmszxiv89cvFwUCjEBv1vZCoT1u" (optional) - The wallet to receive the NFT, defaults to agent's wallet which is ${this.solanaKit.wallet_address.toString()}`; constructor(private solanaKit: SolanaAgentKit) { super(); } protected async _call(input: string): Promise { try { const parsedInput = JSON.parse(input); const result = await this.solanaKit.mintNFT( new PublicKey(parsedInput.collectionMint), { name: parsedInput.name, uri: parsedInput.uri, }, parsedInput.recipient ? new PublicKey(parsedInput.recipient) : this.solanaKit.wallet_address, ); return JSON.stringify({ status: "success", message: "NFT minted successfully", mintAddress: result.mint.toString(), metadata: { name: parsedInput.name, symbol: parsedInput.symbol, uri: parsedInput.uri, }, recipient: parsedInput.recipient || result.mint.toString(), }); } catch (error: any) { return JSON.stringify({ status: "error", message: error.message, code: error.code || "UNKNOWN_ERROR", }); } } }