【Solana】完善 SPL Token 名称和 Logo

  • 0xE
  • 更新于 2024-11-17 10:02
  • 阅读 953

使用 metaplex 来上传代币的名称和 Logo。

本篇文章,我们主要使用 metaplex 来上传代币的名称和 Logo。

创建 SPL Token

根据上篇文章所写的,我们创建一个新的 Token。

➜   spl-token create-token
Creating token AY3xMpzawMJJFepBd8PUKLBX6vDJMQakYTbf5AYq2zkA under program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA

Address:  AY3xMpzawMJJFepBd8PUKLBX6vDJMQakYTbf5AYq2zkA
Decimals:  9

Signature: 5Z2wYXzotC3B9Bq6taEXfGahnX9khq94LDfCJjGh2hYrJAFXCh3W8bx2gMwKF7XFpKZPsE5VXUxVGW6iVMqXURGf

上传代币名称和 Logo

导出私钥

新建项目,并且把私钥放入。

如果使用的是 Solana Playground 则可以在右上角 Wallet 的三个点 Export 私钥。

如果使用的是本地终端,则在 ~/.config/solana/id.json 路径中。

元数据

我们需要一个元数据的 json 文件链接。可以使用 Pinata 进行上传。

首先,把代币的 Logo 图片上传到 Pinata 中,会获得一个 CID: QmYdzQ29LcTvaQEYizfF2EjVbXH4Yxkv3xwPN96ULn5rMM。

拼接上自己的 Gateways 和 ipfs 得到链接:

https://turquoise-immediate-narwhal-125.mypinata.cloud/ipfs/QmYdzQ29LcTvaQEYizfF2EjVbXH4Yxkv3xwPN96ULn5rMM

创建元数据的 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。

https://turquoise-immediate-narwhal-125.mypinata.cloud/ipfs/QmXdgGXeK3i3esffk5qf1tNC4H2TuiqZPtBeAM7QuxQ5KJ

Solana RPC

使用官方的 RPC 往往会出现网络问题,这里推荐使用 Helius 注册使用,获取自己的 RPC。

编写 js 代码

安装相关依赖:

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

点赞 1
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
0xE
0xE
0x59f6...a17e
17年进入币圈,做过FHE,联盟链,现在是智能合约开发者。 刨根问底探链上真相,品味坎坷悟Web3人生。