機能
アセットのミント
Token Metadata概要で説明したように、Solanaのデジタルアセットはいくつかのオンチェーンアカウントとトークンを説明するオフチェーンデータで構成されています。このページでは、これらのアセットをミントするプロセスについて説明します。
ミントプロセス
Fungible、半Fungible、または非Fungibleアセットをミントしたい場合でも、全体的なプロセスは同じです:
- オフチェーンデータのアップロード。 まず、オフチェーンデータの準備ができていることを確認する必要があります。つまり、アセットを説明するJSONファイルがどこかに保存されている必要があります。URI経由でアクセス可能である限り、そのJSONファイルがどのように、どこに保存されているかは関係ありません。
- オンチェーンアカウントの作成。 次に、アセットのデータを保持するオンチェーンアカウントを作成する必要があります。作成される正確なアカウントは、アセットのトークン標準によって異なりますが、すべての場合でメタデータアカウントが作成され、オフチェーンデータのURIが保存されます。
- トークンのミント。 最後に、これらすべてのアカウントに関連付けられたトークンをミントする必要があります。非Fungibleアセットの場合、非Fungibility性により供給量を1より大きくすることは禁止されているため、これは単に0から1へのミントを意味します。FungibleまたはSemi-Fungibleアセットの場合、必要な数だけトークンをミントできます。
具体的なコード例を提供しながら、これらのステップをより詳細に掘り下げましょう。
オフチェーンデータのアップロード
オフチェーンデータをアップロードするために任意のサービスを使用したり、単に独自のサーバーに保存したりできますが、Umi SDKがそれを支援できることは注目に値します。それはプラグインシステムを使用して、選択したアップローダーを選択し、データをアップロードするための統一されたインターフェースを提供します。
アセットとJSONデータをアップロード
const [imageUri] = await umi.uploader.upload([imageFile])
const uri = await umi.uploader.uploadJson({
name: 'My NFT',
description: 'This is my NFT',
image: imageUri,
// ...
})
これでURIができたので、次のステップに進むことができます。
次のステップでは、アカウントの作成とトークンのミントを2つのステップで行う方法を示します。ページの下部には、これらのステップを組み合わせて異なるトークンタイプの作成をより簡単にするヘルパーのコード例があります。
ミントアカウントとメタデータアカウントの作成
選択したトークン標準で必要なすべてのオンチェーンアカウントを作成するには、Create V1命令を使用するだけです。リクエストされたトークン標準に適応し、それに応じて適切なアカウントを作成します。
例えば、NonFungibleアセットはMetadataアカウントとMasterEditionアカウントが作成され、FungibleアセットはMetadataアカウントのみが作成されます。
さらに、提供されたMintアカウントが存在しない場合、私たちのために作成されます。そうすることで、メタデータを追加する前にトークンを準備するために基盤となるTokenプログラムを呼び出す必要さえありません。
この命令は様々なパラメータを受け入れ、私たちのSDKは毎回すべてを入力する必要がないようにデフォルト値を提供するよう最善を尽くします。とは言え、興味を持つ可能性のあるパラメータのリストは次のとおりです:
- Mint: アセットのMintアカウント。存在しない場合は、初期化されるため署名者として提供する必要があります。通常、この目的で新しいキーペアを生成します。
- Authority: Mintアカウントの権限。これは、Mintアカウントからトークンをミントすることが許可されている、または許可されるアカウントです。SDKでサポートされている場合、「Identity」ウォレット—つまり接続されたウォレット—がデフォルトになります。
- Name、URI、Seller Fee Basis Points、Creatorsなど:Metadataアカウントに保存するアセットのデータ。
- Token Standard: アセットのトークン標準。
createV1は、Mintアカウントを初期化し、Metadataアカウントを作成できるヘルパー関数です。mintが既に存在する場合は、metadataアカウントのみを作成します。createMetadataAccountV3の使用方法をお探しの場合は、代わりにこの関数を使用してください。
1import { generateSigner, percentAmount } from '@metaplex-foundation/umi';
2import {
3 createV1,
4 TokenStandard,
5} from '@metaplex-foundation/mpl-token-metadata';
6
7// Assuming umi is set up with mplTokenMetadata plugin
8// See getting-started for full setup
9
10const mint = generateSigner(umi);
11
12// Create the onchain accounts (Mint + Metadata + MasterEdition for NFTs)
13await createV1(umi, {
14 mint,
15 authority: umi.identity,
16 name: 'My NFT',
17 uri: 'https://example.com/my-nft.json',
18 sellerFeeBasisPoints: percentAmount(5.5),
19 tokenStandard: TokenStandard.NonFungible,
20}).sendAndConfirm(umi);
21
22console.log('Created NFT accounts');
23console.log('Mint:', mint.publicKey);
1import { generateKeyPairSigner } from '@solana/kit';
2import {
3 getCreateV1InstructionAsync,
4 TokenStandard,
5} from '@metaplex-foundation/mpl-token-metadata-kit';
6
7// Assuming rpc, rpcSubscriptions, and sendAndConfirm are set up
8// See getting-started for full setup
9
10const mint = await generateKeyPairSigner();
11const authority = await generateKeyPairSigner(); // Your wallet
12
13// Create the onchain accounts (Mint + Metadata + MasterEdition for NFTs)
14const createIx = await getCreateV1InstructionAsync({
15 mint,
16 authority,
17 payer: authority,
18 name: 'My NFT',
19 uri: 'https://example.com/my-nft.json',
20 sellerFeeBasisPoints: 550, // 5.5%
21 tokenStandard: TokenStandard.NonFungible,
22});
23
24// Send the transaction
25await sendAndConfirm({
26 instructions: [createIx],
27 payer: authority,
28});
29
30console.log('Created NFT accounts');
31console.log('Mint:', mint.address);
1use mpl_token_metadata::{
2 accounts::Metadata,
3 instructions::CreateV1CpiBuilder,
4 types::{PrintSupply, TokenStandard},
5};
6
7// 1. every account is specified by a reference to their AccountInfo
8
9let create_cpi = CreateV1CpiBuilder::new(token_metadata_program_info)
10 .metadata(metadata_info)
11 .mint(mint_info, true)
12 .authority(payer_info)
13 .payer(payer_info)
14 .update_authority(update_authority_info, false)
15 .master_edition(Some(master_edition_info))
16 .system_program(system_program_info)
17 .sysvar_instructions(sysvar_instructions_info)
18 .spl_token_program(spl_token_program_info)
19 .token_standard(TokenStandard::NonFungible)
20 .name(String::from("My NFT"))
21 .uri(uri)
22 .seller_fee_basis_points(550)
23 .token_standard(TokenStandard::NonFungible)
24 .print_supply(PrintSupply::Zero);
25
26create_cpi.invoke();
Rustでmintアカウントを設定する際、アカウントが署名者かどうかを示すboolフラグを指定する必要があることに注意してください – mintアカウントが存在しない場合、署名者である必要があります。
トークンのミント
アセット用のすべてのオンチェーンアカウントが作成されたら、そのためにトークンをミントできます。アセットが非Fungibleの場合は、その唯一のトークンをミントするだけで、そうでなければ必要な数だけトークンをミントできます。非Fungibleアセットは、そのユニークなトークンがミントされて初めて有効になることに注意してください。したがって、そのトークン標準では必須のステップです。
これを実現するには、Token MetadataプログラムのMint V1命令を使用できます。以下のパラメータが必要です:
- Mint: アセットのMintアカウントのアドレス。
- Authority: この命令を承認できる権限。非Fungibleアセットの場合、これはMetadataアカウントの更新権限で、そうでなければMintアカウントのMint Authorityを指します。
- Token Owner: トークンを受け取るウォレットのアドレス。
- Amount: ミントするトークン数。非Fungibleアセットの場合、これは1のみです。
- Token Standard: アセットのトークン標準(JavaScriptSDKで必要)。プログラムはこの引数を必要としませんが、私たちのSDKは他のほとんどのパラメータに適切なデフォルト値を提供できるようにするためにそれを行います。
1import { mintV1, TokenStandard } from '@metaplex-foundation/mpl-token-metadata';
2
3// Assuming umi is set up with mplTokenMetadata plugin
4// mint from createV1
5
6const mintPublicKey = mint.publicKey; // From the created mint
7const tokenOwner = umi.identity.publicKey; // Wallet to receive the token
8
9// Mint the NFT token
10await mintV1(umi, {
11 mint: mintPublicKey,
12 authority: umi.identity,
13 amount: 1,
14 tokenOwner,
15 tokenStandard: TokenStandard.NonFungible,
16}).sendAndConfirm(umi);
17
18console.log('Minted NFT to:', tokenOwner);
1import {
2 getMintV1InstructionAsync,
3 TokenStandard,
4} from '@metaplex-foundation/mpl-token-metadata-kit';
5
6// Assuming rpc, rpcSubscriptions, and sendAndConfirm are set up
7// mint and authority from createV1
8
9const mintAddress = mint.address; // From the created mint
10const tokenOwner = authority.address; // Wallet to receive the token
11
12// Mint the NFT token
13const mintIx = await getMintV1InstructionAsync({
14 mint: mintAddress,
15 authority,
16 payer: authority,
17 amount: 1,
18 tokenOwner,
19 tokenStandard: TokenStandard.NonFungible,
20});
21
22await sendAndConfirm({
23 instructions: [mintIx],
24 payer: authority,
25});
26
27console.log('Minted NFT to:', tokenOwner);
1use mpl_token_metadata::instructions::MintV1CpiBuilder;
2
3// 1. every account is specified by a reference to their AccountInfo
4
5let mint_cpi = MintV1CpiBuilder::new(token_metadata_program_info)
6 .token(token_info)
7 .token_owner(Some(token_owner_info))
8 .metadata(metadata_info)
9 .master_edition(Some(master_edition_info))
10 .mint(mint_info)
11 .payer(payer_info)
12 .authority(update_authority_info)
13 .system_program(system_program_info)
14 .sysvar_instructions(sysvar_instructions_info)
15 .spl_token_program(spl_token_program_info)
16 .spl_ata_program(spl_ata_program_info)
17 .amount(1);
18
19mint_cpi.invoke();
NonFungibleをミントするために必要なため、master_editionを設定しています;tokenアカウントが存在せず、初期化される場合はtoken_ownerが必要です。
作成ヘルパー
デジタルアセットの作成はToken Metadataの非常に重要な部分であるため、私たちのSDKはプロセスをより簡単にするヘルパーメソッドを提供します。具体的には、これらのヘルパーメソッドは、作成したいトークン標準に応じて、Create V1命令とMint V1命令を異なる方法で組み合わせます。
作成ヘルパー
