목차
- Candy Machine에 Item 넣기
- Uploading JSON Metadata
- Inserting Items
- Inserting Items Using Prefixes
- Overriding Existing Items
Candy Machine에 Item 넣기
이전 포스팅들에서 Candy Machine을 생성하고 설정하는 것들을 알아봤습니다. 이번에는 Candy Machine에 향후 NFT로 발행될 Item 들을 넣는 기능을 살펴보겠습니다.
이전에 언급했듯이 Candy Machine에 Item을 넣는 것은 Config Line Settings 모드에만 적용됩니다. Hidden Settings 모드에서는 모든 Item들이 같은 Name과 Uri를 공유합니다.
Uploading JSON Metadata
먼저, Candy Machine에 Item을 넣기 위해서는 두개의 파라미터가 필요합니다.
- Name : 이 Item으로부터 발행될 NFT의 이름
- URI : 이 Item으로부터 발행될 NFT의 JSON Metadata를 가리키고 있는 URI
만약 Item에 대한 URI가 없다면 먼저 JSON metadata를 업로드 해야 합니다. 이때, AWS나 자체 서버와 같은 off-chain 방법을 사용할 수도 있고 Arweave나 IPFS와 같은 on-chain 방법을 사용할 수도 있습니다. 이를 위해 Metaplex SDK는 JSON metadata를 업로드하는 것을 지원하고, Sugar 같은 도구들이 이를 도와줍니다.
JS SDk를 사용해 metadata를 업로드하기 위해서는 먼저 storage provider를 선택해야 하는데, 기본적으로 Arweave로 업로드하는 Bundlr이 선택됩니다.
// NFT.Storage is an external plugin so you must first install it:
// npm install @metaplex-foundation/js-plugin-nft-storage
import { nftStorage } from "@metaplex-foundation/js-plugin-nft-storage";
metaplex.use(nftStorage());
provider를 선택하고 나면 uploadMetadata
메서드를 통해 metadata를 업로드할 수 있습니다.
// Uploading some JSON metadata contains assets already uploaded.
const { uri } = await metaplex.nfts().uploadMetadata({
name: "My NFT #1",
description: "My description",
image: "https://arweave.net/123",
});
metadata와 같은 스토리지에 실제 image와 같은 리소스 또한 업로드하고 싶다면, URI 값 대신 MetaplexFile 객체를 넣을 수 있습니다. 아래는 브라우저에 업로드된 파일과 함께 metadata를 업로드하는 예제 코드입니다.
// Uploading some JSON metadata and its assets (here, in the browser).
const { uri } = await metaplex.nfts().uploadMetadata({
name: "My NFT #1",
description: "My description",
image: await toMetaplexFileFromBrowser(event.target.files[0]),
});
Inserting Items
이제 우리는 모든 Item들의 Name과 URI를 갖고 있고, 이 Item들을 Candy Machine Account에 넣을 차례입니다. 이 과정은 중요하고 Config Line Settings 모드일 때 모든 Item들이 들어오지 않으면 Minting은 시작되지 않습니다. 모든 Item의 Name과 URI 값은 Config Line Settings 의 Name Length와 URI Length 설정에 따라야 합니다.
추가로, Transaction은 특정 사이즈 제한이 있기 때문에 같은 Transaction내에 너무 많은 Item들을 넣을 수는 없습니다. Transaction 당 넣을 수 있는 Item들의 개수는 Name Length와 URI Length 속성에 달려있습니다. 짧을수록 하나의 Transaction에 많은 Item 들을 넣을 수 있습니다.
await metaplex.candyMachines().insertItems({
candyMachine,
items: [
{ name: "My NFT #1", uri: "https://example.com/nft1.json" },
{ name: "My NFT #2", uri: "https://example.com/nft2.json" },
{ name: "My NFT #3", uri: "https://example.com/nft3.json" },
],
});
Item을 특정 위치에 넣고 싶을 수도 있는데, 이때 itemsLoaded
속성을 사용할 수 있습니다. 다만, CandyMachin을 refresh 해야 합니다.
await metaplex.candyMachines().insertItems({
candyMachine,
index: 3,
items: [
{ name: "My NFT #4", uri: "https://example.com/nft4.json" },
{ name: "My NFT #5", uri: "https://example.com/nft5.json" },
{ name: "My NFT #6", uri: "https://example.com/nft6.json" },
],
});
Inserting Items Using Prefixes
Name과 URI Prefix를 사용한다면, 나머지 부분에 대한 내용만 넣으면 됩니다. Prefix 설정을 사용하는 것은 Item을 넣을 때 Transaction 사이즈를 줄일 수 있고, 하나의 Transaction에 더 많은 Item들을 넣을 수 있다는 의미입니다.
import { toBigNumber } from '@metaplex-foundation/js';
const { candyMachine } = await metaplex.candyMachines().create({
candyMachine,
itemsAvailable: toBigNumber(1000),
itemSettings: {
type: 'configLines',
prefixName: 'My NFT #',
nameLength: 4,
prefixUri: 'https://example.com/nft',
uriLength: 9,
isSequential: true,
},
};
await metaplex.candyMachines().insertItems({
candyMachine,
items: [
{ name: '1', uri: '1.json' },
{ name: '2', uri: '2.json' },
{ name: '3', uri: '3.json' },
],
});
Overriding Existing Items
앞서 언급했듯이 Item을 넣을 때 들어갈 위치를 정할 수 있습니다. 이는 Item을 원하는 순서로 넣을 수 있다는 의미기도 하지만 이미 들어간 Item을 업데이트할 수 있다는 의미기도 합니다.
await metaplex.candyMachines().insertItems({
candyMachine,
items: [
{ name: "My NFT #1", uri: "https://example.com/nft1.json" },
{ name: "My NFT #2", uri: "https://example.com/nft2.json" },
{ name: "My NFT #3", uri: "https://example.com/nft3.json" },
],
});
await metaplex.candyMachines().insertItems({
candyMachine,
index: 1,
items: [{ name: "My NFT #X", uri: "https://example.com/nftX.json" }],
});
candyMachine = await metaplex.candyMachines().refresh(candyMachine);
candyMachine.items[0].name; // "My NFT #1"
candyMachine.items[1].name; // "My NFT #X"
candyMachine.items[2].name; // "My NFT #3"
References
'Dev > Blockchain' 카테고리의 다른 글
[Metaplex Candy Machine] #5. Minting 하기 (0) | 2023.04.14 |
---|---|
[Metaplex Candy Machine] #4. Candy Guard 이해하기 (0) | 2023.04.14 |
[Metaplex Candy Machine] #2. Candy Machine 관리하기 (0) | 2023.04.13 |
[Metaplex Candy Machine] #1. Candy Machine 설정 이해하기 (0) | 2023.04.12 |
[Solana - Native vs Anchor] #3. Account 생성하기 (0) | 2022.10.21 |