和之前创建 Token 是类似的。
和创建 Token 一样,不过小数位数设置为 0。
$ spl-token create-token --decimals 0
Creating token HfTiWccJVzGqsDCcZpCm7UjmEBuXYxLbCdtHSGUgzDQD
Address: HfTiWccJVzGqsDCcZpCm7UjmEBuXYxLbCdtHSGUgzDQD
Decimals: 0
Signature: 4kaPVMGnDGa2TiGnoFvmjnunkNCy3HUCjVghzZnJgdixHDzwBWcVg2AgiPPzwZiXLoALPgnd9WxjMC3iZEMYbz9x
创建出的 NFT 代币地址为: HfTiWccJVzGqsDCcZpCm7UjmEBuXYxLbCdtHSGUgzDQD
创建 token account
创建我们账户对应的 token account
,如果这块地方不知道的,可以看之前的文章。
$ spl-token create-account HfTiWccJVzGqsDCcZpCm7UjmEBuXYxLbCdtHSGUgzDQD
Creating account HfK3AZww3ehQBXc4zoFBiHVRvHpLEmZSSERjbGmUJ1WD
Signature: 67SC66xrK72S4hJd8esKdf7VWBJo6uShyAhFSirEPEfyuriJo2f1ReUt3GKcabpNQCofinm996B7xGARNSMVGxuq
创建出的 token account
为 HfK3AZww3ehQBXc4zoFBiHVRvHpLEmZSSERjbGmUJ1WD
mint NFT
按照以下的格式:
spl-token mint <TOKEN_MINT_ADDRESS> <TOKEN_AMOUNT> [RECIPIENT_TOKEN_ACCOUNT_ADDRESS]
$ spl-token mint HfTiWccJVzGqsDCcZpCm7UjmEBuXYxLbCdtHSGUgzDQD 1 HfK3AZww3ehQBXc4zoFBiHVRvHpLEmZSSERjbGmUJ1WD
Minting 1 tokens
Token: HfTiWccJVzGqsDCcZpCm7UjmEBuXYxLbCdtHSGUgzDQD
Recipient: HfK3AZww3ehQBXc4zoFBiHVRvHpLEmZSSERjbGmUJ1WD
Signature: 2TV9kDSzM3TCK2iKpn1fLRJTkUBicLjEQkfzkemPs4MhW8kUb4hWymgkyxFoWNTpuWaYsSvQ2M1u1AhLLcQzhJAb```
和上篇文章一样,我们创建 metadata 的 json 文件,并且上传到 Pinata 中。
json 内容如下:
{
"name": "To Da Moon NFT",
"symbol": "TDMNFT",
"description": "A NFT that will moon as soon as you buy it",
"seller_fee_basis_points": 500,
"image": "https://turquoise-immediate-narwhal-125.mypinata.cloud/ipfs/QmYdzQ29LcTvaQEYizfF2EjVbXH4Yxkv3xwPN96ULn5rMM",
"external_url": "https://example.com/path/to/nft",
"attributes": [
{
"trait_type": "Rarity",
"value": "Legendary"
},
{
"trait_type": "Element",
"value": "Fire"
}
],
"properties": {
"files": [
{
"uri": "https://example.com/path/to/image.png",
"type": "image/png"
}
],
"category": "image",
"creators": [
{
"address": "5NhLjdFKocoRMqic9sqAe5TxLagJCoCBunzg51ioMYot",
"share": 100
}
]
}
}
其中:
`seller_fee_basis_points` 为版税比例。此值为 500,意味着每次NFT的二次交易,创作者将收到 5% 的销售金额作为版税。
`external_url` 可以是项目网站、白皮书、特定信息页面,或者NFT的使用场景介绍。
`attributes` 描述 NFT 的具体特性或属性,用于区分 NFT 之间的独特性。
`properties` 定义与NFT相关的资源文件和其他元信息。
`share` 定义创作者在版税中的分配比例。总和需为 100。
复用之前文章的代码,替换代币地址和 json 链接:
const {
createMetadataAccountV3,
findMetadataPda
} = require("@metaplex-foundation/mpl-token-metadata");
const web3 = require("@solana/web3.js");
const { createSignerFromKeypair, none, signerIdentity } = require("@metaplex-foundation/umi");
const { createUmi } = require('@metaplex-foundation/umi-bundle-defaults');
const { fromWeb3JsKeypair, fromWeb3JsPublicKey } = require('@metaplex-foundation/umi-web3js-adapters');
// 从文件加载钱包密钥
function loadWalletKey(keypairFile) {
const fs = require("fs");
return web3.Keypair.fromSecretKey(
new Uint8Array(JSON.parse(fs.readFileSync(keypairFile).toString()))
);
}
async function main() {
console.log("RUN...");
// 加载钱包密钥对并设置铸币地址
const myKeypair = loadWalletKey("id.json");
const mint = new web3.PublicKey("HfTiWccJVzGqsDCcZpCm7UjmEBuXYxLbCdtHSGUgzDQD");
// 使用自定义 RPC 连接到 Solana 开发网络
const umi = createUmi("https://devnet.helius-rpc.com/?api-key=YourAPIKey");
// const umi = createUmi("https://api.devnet.solana.com");
// const umi = createUmi("https://api.mainnet-beta.solana.com");
// 设置签名者身份
const signer = createSignerFromKeypair(umi, fromWeb3JsKeypair(myKeypair));
umi.use(signerIdentity(signer, true));
// 定义代币的元数据
const onChainData = {
name: "To Da Moon NFT", // 代币名称
symbol: "TDMNFT", // 代币符号
uri: "https://turquoise-immediate-narwhal-125.mypinata.cloud/ipfs/bafkreihf2e6dpgtjkllwx4vxu5ugx6n2r4h255xeef45xh56ok3rnyfhni", // 元数据 JSON 文件链接
sellerFeeBasisPoints: 0, // 设置销售费用为0
creators: none(),
collection: none(),
uses: none(),
};
// 设置铸币授权和铸币地址
const accounts = {
mint: fromWeb3JsPublicKey(mint),
mintAuthority: signer,
};
// 创建元数据账户
const txid = await createMetadataAccountV3(umi, {
...accounts,
isMutable: true, // 设置元数据可修改
collectionDetails: null,
data: onChainData,
}).sendAndConfirm(umi);
console.log(txid);
}
main();
运行成功后,可以在浏览器上查看 NFT 信息: https://explorer.solana.com/address/HfTiWccJVzGqsDCcZpCm7UjmEBuXYxLbCdtHSGUgzDQD?cluster=devnet
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!