thirdweb ile mintleme

thirdweb çoklu blok zinciri ağlarında merkeziyetsiz uygulamalar oluşturmak için araçlar ve altyapı sunan bir platformdur. SDK'lar, API'ler ve önceden oluşturulmuş bileşenlerle blok zinciri entegrasyonunu basitleştirir.

NFT basımı durumunda, thirdweb denetlenmiş sözleşmeleri ve kapsamlı SDK'ları ile birlikte düzgün bir pano ve IPFS yükleme sunar.

Tek bir NFT'yi manuel olarak basma

Sadece tek bir görüntü yükleyip onu basmak istiyorsanız, thirdweb tıklamayla dağıtım arayüzü sunar.

Önce, sahibi olarak Web3 cüzdanınızı kullanarak bir thirdweb hesabı oluşturun. Bu size thirdweb panonuza erişim sağlar.

Oradan iki yol arasında seçim yapabilirsiniz:

  • Onların TokenERC721 sayfasını ve onun "Deploy Now" butonunu kullanın.

  • Veya panolarındaki "Create Token" arayüzünü kullanın.

Hadi her birini hızlıca keşfedelim — thirdweb Geliştirici Portalı ihtiyacınız olursa size daha fazla bilgi verecektir.

TokenERC721 sayfasını kullanma

  1. şuraya gidin: TokenERC721 Bu, bir NFT Koleksiyonu oluşturmak için onların sözleşmesine dayanır.

  2. Sözleşme dağıtım sayfasına erişmek için "Deploy Now"a tıklayın.

  1. "Contract metadata" bölümünü doldurun:

    1. NFT koleksiyonunuzu temsil etmesini istediğiniz resmi (veya sadece basmak istediğiniz resmi) yükleyin.

    2. Koleksiyonunuza benzersiz bir isim ve bir sembol/ticker verin.

    3. Buna bir açıklama verin.

  2. thirdweb "Primary Sales" ve "Royalties" için alıcı adreslerini otomatik doldurur; Web3 adreslerinin gerçekten sizin cüzdanınıza ait olduğundan emin olun.

  3. "Deploy Options"ta Chiliz Chain'i seçin (veya sadece testse Chiliz Spicy Testnet'i) ve "Deploy Now"a tıklayın:

  1. thirdweb sözleşmeyi dağıtmaya başlayacak ve Web3 cüzdanınızdan bir onay modalı tetiklenecektir. Dağıtımı tamamlamak için bunu onaylayın.

  2. Tamamlandığında "View Contract" butonuna tıklayın. thirdweb panonuzda sözleşmenin sayfasına götürüleceksiniz; burada bir kontrol listesi/progres çubuğu olacaktır:

  3. Kontrol listesinden görebileceğiniz gibi, şu ana kadar sadece bir sözleşme dağıttınız; hâlâ NFT'yi gerçekten basmanız gerekiyor. Sol sütunda, yeni bir sayfa açmak için "NFTs" menü öğesine tıklayın; şimdilik burası boş:

  4. "Mint" butonuna tıklayın ve bir yan panel açılır; burada NFT'nizin her özniteliği için alanlar bulunur. İşte NFT'niz için metadata'yı oluşturacağınız yer:

  5. Çeşitli alanları doldurun. "Artist_name" veya "Type_of_work" gibi koleksiyonunuza özgü alanlar oluşturabilirsiniz ve gelişmiş seçenekleri keşfedebilirsiniz; fakat bu test için minimumda tutabilirsiniz: isim, medya dosyası, açıklama.

  6. Yan panelin altındaki "Mint NFT" butonuna tıklayın ve işlemi cüzdanınızdan onaylayın.

  7. thirdweb sonra "NFTs" sayfasını gösterecek; NFT'niz şimdi görünür olacak ve NFT sözleşmenize bağlı olacaktır.

TAMAMLANDI! NFT'nizi bastınız!

Gerçekte Chiliz Chain üzerinde olduğunu kontrol etmek için Chiliscan'i (veya Testnet varyantını eğer Spicy Testnet kullanıyorsanız) açın ve NFT'nin hash'ini arama alanına yapıştırın. Bu hemen sözleşmenizin zincirde olduğunu doğrulamalı ve "Inventory" sekmesi NFT'nizi (veya en azından cüzdanınızın ID'sini) sahip olarak listelemelidir.

NFT'nizi Chiliz Chain Mainnet'te bastıysanız, hesabınızda şu tür pazaryerlerinde görünmesini görmelisiniz: Rarible veya OpenSea — ve buradan onu satmaya başlayabilirsiniz!

"Create Token" butonunu kullanma

Aslında bu yukarıdakinden daha doğrudan bir yoldur ve thirdweb'e yakın zamanda eklenmiştir.

  1. thirdweb panonuzdaki herhangi bir proje klasöründen, sol kenar çubuğunda "Tokens" seçeneğine tıklayın:

  2. Açılan "Tokens" sayfasında, sağ taraftaki "Create Token" butonuna tıklayın. Bir modal pencere 2 seçenekle açılacak; "Create NFT Collection"u seçin.

  3. Bu sizi adım adım bir sürüme götürecektir: TokenERC721 (aslında bir ERC-721 Drop sözleşmesi dağıtır). Bu sözleşme için gerekli tüm alanları doldurun, ardından "Next" butonuna basın.

  4. Sonraki ekran NFT'nin kendisiyle ilgilidir: resmi yükleyin ve resminizi tanımlayan alanları doldurun, ardından "Next" butonuna basın.

  5. thirdweb şimdi başlatmak üzere olduğunuz NFT koleksiyonunun bir özetini gösterir. Her şeyin doğru olduğunu kontrol edin ve sonra "Launch NFT Collection" butonuna tıklayın.

  6. thirdweb sözleşmeyi dağıtma, NFT'yi basma ve koşulları ayarlama işlerini tek seferde üstlenir. Web3 cüzdanınız üzerinden üç işlemi onaylamanız gerekecektir.

  7. Bu tamamlandığında "View NFT" butonuna tıklayın; thirdweb panonuza geri götürüleceksiniz ve bu sözleşmeye özgü sayfa — ve buna bağlı NFT'ler — gösterilecektir.

Oradan, bir blok gezgini aracılığıyla gerçekten zincirde olduğunu kontrol edebilir veya pazaryerleri üzerinden NFT'nizi satmaya başlayabilirsiniz.

Tek bir NFT'yi programatik olarak basma

İşte şu kullanılan bir kod örneği: thirdweb v5 SDK, medya dosyasını IPFS'e yükler, metadata.json dosyasını oluşturur ve sonra onu da IPFS'e yükler.

Bunun için şunlara sahip olmanız gerekecek:

  • Chiliz Chain üzerinde zaten dağıtılmış bir ERC-721 sözleşmesi. Bu durumda bunu thirdweb kullanarak yapmalısınız, başka bir araçla değil.

  • thirdweb aracılığıyla dağıttığınız ERC-721 sözleşmesine bağlı bir thirdweb API anahtarı. Bunu akıllı sözleşmenin proje sayfasında "Client ID" adı altında bulabilirsiniz.

  • thirdweb SDK'sının lokal kurulumu. Bunu kullanarak yapabilirsiniz: npm:

npm install thirdweb dotenv

dotenv parametresi bir .env dosyası oluşturur; bu, gizli değerleri saklamak için gereklidir: THIRDWEB_SECRET_KEY=YOUR_TW_SECRET_KEY # thirdweb projenizin sayfasından.

PRIVATE_KEY=0xabc...                   # İşlemi gönderecek Web3 cüzdanı.
CONTRACT_ADDRESS=0xYour721Address      # Dağıtılmış TokenERC721 sözleşmeniz.
CHAIN_ID=88882                         # 88888=Mainnet, 88882=Spicy
IMAGE_PATH=./art/image.png             # Medya dosyanızın yerel yolu.
NAME=My Chiliz NFT
DESCRIPTION=Minted on Chiliz Chain
PRIVATE_KEY'inizi

ve

  1. dosyasını oluşturup yükleyecek

  2. Sözleşmenin mintTo yöntemi kullanılarak NFT'yi basacak. metadata.json Ortaya çıkan

  3. tokenId

  4. ve tokenUrl değerlerini size gösterecek. Bu sadece örnek bir koddur; kendi proje kodunuza uyarlamanız gerekecektir! import 'dotenv/config';

import path from 'path';
import { createThirdwebClient, getContract, sendTransaction, waitForReceipt, parseEventLogs } from "thirdweb";
import { defineChain } from "thirdweb/chains";

import { privateKeyToAccount } from "thirdweb/wallets";
import { mintTo, transferEvent, getNFT } from "thirdweb/extensions/erc721";
import { upload } from "thirdweb/storage";
function guessMime(p: string) {
const ext = path.extname(p).toLowerCase();

if (ext === ".png") return "image/png";
  if (ext === ".jpg" || ext === ".jpeg") return "image/jpeg";
  if (ext === ".webp") return "image/webp";
  if (ext === ".gif") return "image/gif";
  if (ext === ".mp4") return "video/mp4";
  if (ext === ".webm") return "video/webm";
  return "application/octet-stream";
  async function main() {
  const client = createThirdwebClient({ secretKey: process.env.THIRDWEB_SECRET_KEY! });
}

const chain = defineChain(Number(process.env.CHAIN_ID)); // 88888 veya 88882
  const account = privateKeyToAccount({ client, privateKey: process.env.PRIVATE_KEY! });
  const contract = getContract({
  client,

  chain,
    address: process.env.CONTRACT_ADDRESS as `0x${string}`,
    // Medya dosyasını IPFS'e yükle
    const filePath = process.env.IMAGE_PATH!;
  });

  const buffer = fs.readFileSync(filePath);
  const file = new File([buffer], path.basename(filePath), { type: guessMime(filePath) });
  const [imageUri] = await upload({ client, files: [file] }); // ipfs://... döner
  // console.log("imageUri:", imageUri);

  // IPFS imageUri'ye referans veren metadata.json oluştur ve yükle 
  const metadata = {

  name: process.env.NAME!,
  description: process.env.DESCRIPTION!,
    image: imageUri
    const metaBlob = new Blob([JSON.stringify(metadata, null, 2)], { type: "application/json" });
    const metaFile = new File([metaBlob], "metadata.json", { type: "application/json" });
  };
  const [metadataUri] = await upload({ client, files: [metaFile] });
  // console.log("metadataUri:", metadataUri);

  // metadata URI'si kullanılarak mintTo işlemini hazırla ve gönder
  // mintTo doğrudan tokenURI olarak kullanılacak bir string kabul eder.

  const tx = mintTo({
  contract,
  to: account.address,
    nft: metadataUri, // TokenURI
    const { transactionHash } = await sendTransaction({ transaction: tx, account });
    //console.log("tx:", transactionHash);
  });

  const receipt = await waitForReceipt({ client, chain, transactionHash });
  // TokenId'yi göstermek için Transfer event'ini ayrıştır

  const events = parseEventLogs({ logs: receipt.logs, events: [transferEvent()] });

  const minted = events.find(e => e.eventName === "Transfer" && e.args.from === "0x0000000000000000000000000000000000000000");
  const tokenId = minted ? (minted.args.tokenId as bigint) : undefined;
  //console.log("tokenId:", tokenId?.toString() ?? "(not found)");
  if (tokenId !== undefined) {
  const nft = await getNFT({ contract, tokenId });

  //console.log("tokenURI (read back):", nft.tokenURI);
    main().catch((err) => (console.error(err), process.exit(1)));
    İlham alınması gereken önemli kısımlar şunlardır:
  }
}

upload

dosyaları (ve JSON'u) IPFS'e depolar ve

  • ipfs://… URI'ler döndürür. mintTo doğrudan

  • tokenURI olarak kullanılmak üzere bir string kabul eder. Basılanı okumak için standart ERC-721.

  • Transfer event'ini ayrıştırıyoruz. Programmatik olarak bir NFT koleksiyonu basma tokenUrl.

Bir NFT koleksiyonu basmak, tek bir NFT basmaktan çok farklı değildir. En belirgin fark,

dosyanızın tüm görüntüleri içeren klasöre işaret etmesidir; tek bir görüntüye işaret etmek yerine dosyası oluşturur; bu, gizli değerleri saklamak için gereklidir: IMAGE_DIR kullanılır,tek bir görüntü için kullanılan IMAGE_PATH.

PRIVATE_KEY=0xabc...                   # İşlemi gönderecek Web3 cüzdanı.
CONTRACT_ADDRESS=0xYour721Address      # Dağıtılmış TokenERC721 sözleşmeniz.
CHAIN_ID=88882                         # 88888=Mainnet, 88882=Spicy
IMAGE_PATH=./art/image.png             # Medya dosyanızın yerel yolu.
yerine.
IMAGE_PATH=./art                       # Medya dosyalarınızın yerel yolu.
PRIVATE_KEY'inizi

NAME_PREFIX=My Chiliz NFT # Bu şuna dönüşecek: "My Chiliz NFT <n>"

import path from 'path';
import { createThirdwebClient, getContract, sendTransaction, waitForReceipt, parseEventLogs } from "thirdweb";
import { defineChain } from "thirdweb/chains";

import { privateKeyToAccount } from "thirdweb/wallets";
import { mintTo, transferEvent, getNFT } from "thirdweb/extensions/erc721";
import { upload } from "thirdweb/storage";
function guessMime(p: string) {
const ext = path.extname(p).toLowerCase();

if (ext === ".png") return "image/png";
  if (ext === ".jpg" || ext === ".jpeg") return "image/jpeg";
  if (ext === ".webp") return "image/webp";
  if (ext === ".gif") return "image/gif";
  if (ext === ".mp4") return "video/mp4";
  if (ext === ".webm") return "video/webm";
  return "application/octet-stream";
  async function main() {
  const client = createThirdwebClient({ secretKey: process.env.THIRDWEB_SECRET_KEY! });
}

Burada gösterdiğimiz örnek kod buna göre bunu göz önünde bulundurur:
// Tüm dosyaları toplamanın bir yolu
  function listMediaFiles(dir: string) {
  const allow = new Set([".png", ".jpg", ".jpeg", ".webp", ".gif", ".mp4", ".webm", ".svg"]);
    return fs
    .readdirSync(dir)
    .filter((f) => allow.has(path.extname(f).toLowerCase()))
}

const chain = defineChain(Number(process.env.CHAIN_ID)); // 88888 veya 88882
  const account = privateKeyToAccount({ client, privateKey: process.env.PRIVATE_KEY! });
  const contract = getContract({
  client, 

  chain,
    address: process.env.CONTRACT_ADDRESS as `0x${string}`,
    // Medya dosyasını IPFS'e yükle
    const filePath = process.env.IMAGE_PATH!;
  });

  .map((f) => path.join(dir, f));
  // Bir klasördeki medya dosyalarını IPFS'e yükle
  const dirPath = process.env.IMAGES_DIR!;
  const filePaths = listMediaFiles(dirPath);
    if (!filePaths.length) {
  }

  throw new Error(`No media files found in ${dirPath}`);
    const fileObjs = filePaths.map((p) => {
    const buffer = fs.readFileSync(p);
  });

  return new File([buffer], path.basename(p), { type: guessMime(p) });
  const imageUris = await upload({ client, files: fileObjs }); // ["ipfs://...", ...] döner

  //console.log("Uploaded images to IPFS:", imageUris.length, "files");
  // Her imageUri'ye referans veren metadata.json dosyalarını oluştur ve yükle
  // NAME ve DESCRIPTION env'lerini kullanır; isimler "<NAME> #<index>" olur
  const namePrefix = process.env.NAME!;

  const description = process.env.DESCRIPTION!;
  // metadata JSON'ları için File objelerinden bir dizi oluştur
    description: process.env.DESCRIPTION!,
      const metaFiles = imageUris.map((imageUri, i) => {
      name: `${namePrefix} #${i + 1}`,
      const metaFile = new File([metaBlob], "metadata.json", { type: "application/json" });
    };
    const [metadataUri] = await upload({ client, files: [metaFile] });
    description,
  });

  return new File([metaBlob], `metadata-${i + 1}.json`, { type: "application/json" });
  const metadataUris = await upload({ client, files: metaFiles }); // ["ipfs://.../metadata-1.json", ...]

  //console.log("Uploaded metadata files to IPFS:", metadataUris.length);
  // Metadata URI'leri kullanılarak mintTo işlemlerini hazırla ve sırayla gönder

  const ZERO = "0x0000000000000000000000000000000000000000";
    for (let i = 0; i < metadataUris.length; i++) {

    to: account.address,
      nft: metadataUri, // TokenURI
      const { transactionHash } = await sendTransaction({ transaction: tx, account });
      //console.log("tx:", transactionHash);
    });

    const receipt = await waitForReceipt({ client, chain, transactionHash });
    const metadataUri = metadataUris[i];

    const events = parseEventLogs({ logs: receipt.logs, events: [transferEvent()] });

    console.log(`[${i + 1}/${metadataUris.length}] tx:`, transactionHash);
    const tokenId = minted ? (minted.args.tokenId as bigint) : undefined;
    // Bu mint için tokenId almak üzere Transfer event'ini ayrıştır
      const minted = events.find(
    );
    if (tokenId !== undefined) {

    (e) => e.eventName === "Transfer" && typeof e.args.from === "string" && e.args.from.toLowerCase() === ZERO
    //console.log("tokenURI (read back):", nft.tokenURI);
      main().catch((err) => (console.error(err), process.exit(1)));
      // console.log(`[${i + 1}/${metadataUris.length}] tokenId:`, tokenId?.toString() ?? "(not found)");
    }
  }
}

upload

// console.log(`[${i + 1}/${metadataUris.length}] tokenURI (read back):`, nft.tokenURI);

  • Detaylı değişiklikler şunlardır: IMAGES_DIR IMAGE_PATH.

  • yerine geçer Eklendi listMediaFiles

  • birden fazla girdiyi toplamak için. ipfs://… Görüntüler ve metadata için toplu (sıralamayı korur).

  • Her tokenURI metadataUri için döngü, her bir event'ini ayrıştırıyoruz. event'i onun için ayrıştırır. tokenUrl.

  • İsimler otomatik numaralandırılır: NAME #1, NAME #2, … mevcut NAME/DESCRIPTION.

Yine, lütfen bunu kendi kodunuz için ilham olarak kullanın; olduğu gibi kullanmayın!

Not: Lazy minting yapmayı tercih ediyorsanız, thirdweb'ün ERC-721 sözleşmesi şuna sahip lazyMint metoduna.

Last updated

Was this helpful?