使用 metaplex 来上传代币的名称和 Logo。
本篇文章,我们主要使用 metaplex 来上传代币的名称和 Logo。
根据上篇文章所写的,我们创建一个新的 Token。
➜ spl-token create-token
Creating token AY3xMpzawMJJFepBd8PUKLBX6vDJMQakYTbf5AYq2zkA under program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
Address: AY3xMpzawMJJFepBd8PUKLBX6vDJMQakYTbf5AYq2zkA
Decimals: 9
Signature: 5Z2wYXzotC3B9Bq6taEXfGahnX9khq94LDfCJjGh2hYrJAFXCh3W8bx2gMwKF7XFpKZPsE5VXUxVGW6iVMqXURGf
新建项目,并且把私钥放入。
如果使用的是 Solana Playground 则可以在右上角 Wallet
的三个点 Export
私钥。
如果使用的是本地终端,则在 ~/.config/solana/id.json
路径中。
我们需要一个元数据的 json 文件链接。可以使用 Pinata 进行上传。
首先,把代币的 Logo 图片上传到 Pinata 中,会获得一个 CID: QmYdzQ29LcTvaQEYizfF2EjVbXH4Yxkv3xwPN96ULn5rMM。
拼接上自己的 Gateways 和 ipfs 得到链接:
创建元数据的 json 文件,tokenTest.json
{
"name": "To Da Moon",
"symbol": "TDM",
"description": "A token that will moon as soon as you buy it",
"image": "https://turquoise-immediate-narwhal-125.mypinata.cloud/ipfs/QmYdzQ29LcTvaQEYizfF2EjVbXH4Yxkv3xwPN96ULn5rMM",
"attributes": []
}
并且把这个 json 文件也上传到 Pinata 上,得到 uri。
使用官方的 RPC 往往会出现网络问题,这里推荐使用 Helius 注册使用,获取自己的 RPC。
安装相关依赖:
yarn add @solana/web3.js @metaplex-foundation/mpl-token-metadata @metaplex-foundation/umi @metaplex-foundation/umi-bundle-defaults @metaplex-foundation/umi-web3js-adapters
代码如下:
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("AY3xMpzawMJJFepBd8PUKLBX6vDJMQakYTbf5AYq2zkA");
// 使用自定义 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", // 代币名称
symbol: "TDM", // 代币符号
uri: "https://turquoise-immediate-narwhal-125.mypinata.cloud/ipfs/QmXdgGXeK3i3esffk5qf1tNC4H2TuiqZPtBeAM7QuxQ5KJ", // 元数据 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();
运行后,结果如下:
RUN...
{
signature: Uint8Array(64) [
43, 244, 8, 63, 23, 241, 114, 233, 213, 61, 189,
104, 6, 97, 200, 175, 212, 198, 107, 24, 43, 159,
146, 181, 3, 207, 90, 16, 14, 173, 232, 175, 226,
197, 56, 33, 84, 169, 104, 231, 126, 195, 239, 214,
114, 229, 90, 136, 139, 6, 106, 59, 156, 59, 199,
160, 7, 240, 208, 107, 106, 139, 244, 3
],
result: {
context: { apiVersion: '1.18.22', slot: 339971402 },
value: {
confirmationStatus: 'confirmed',
confirmations: 3,
err: null,
slot: 339971399,
status: [Object]
}
}
}
并且可以在浏览器上看到代币已经有名称和图标了: https://explorer.solana.com/address/AY3xMpzawMJJFepBd8PUKLBX6vDJMQakYTbf5AYq2zkA?cluster=devnet
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!