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ı söz konusu olduğunda, thirdweb denetlenmiş sözleşmeleri ve kapsamlı SDK'larıyla birlikte şık bir kontrol paneli ve IPFS yükleme sunar.

Tek bir NFT'yi manuel olarak basma

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

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

Oradan iki yol arasından seçim yapabilirsiniz:

  • Onların TokenERC721 sayfasını ve "Deploy Now" düğmesini kullanın.

  • Ya da kontrol panelindeki "Create Token" arayüzünü kullanın.

Her birini bu sayfada hızlıca keşfedelim. The thirdweb Developer Portal ihtiyacınız olursa 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 görüntüyü yükleyin (veya sadece basmak istediğiniz görüntüyü).

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

    3. Bir açıklama verin.

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

  3. "Deploy Options" içinde Chiliz Chain'i (veya sadece bir testse Chiliz Spicy Testnet'i) seçin 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 onaylayın.

  2. İşlem tamamlandığında "View Contract" butonuna tıklayın. thirdweb kontrol panelinizde sözleşmenin sayfasına yönlendirileceksiniz; bir kontrol listesi/ilerleme çubuğu olacaktır:

  3. Kontrol listesinden görebileceğiniz gibi, şu ana kadar yaptığınız tek şey bir sözleşme dağıtmak; hala NFT'yi gerçekten basmanız gerekiyor. Sol sütunda, yeni bir sayfa açmak için "NFTs" menü öğesine tıklayın; şu anda boş:

  4. "Mint" düğmesine tıklayın; bir yan panel açılır ve NFT'nizin her bir niteliği için alanlar sunar. İşte burada NFT'nizin metadata'sını oluşturursunuz:

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

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

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

TAMAMLANDI! NFT'nizi bastınız!

Gerçekten Chiliz Chain üzerinde olduğundan emin olmak için şunu açın: Chiliscan (veya eğer Spicy Testnet kullanıyorsanız onun Testnet varyantı ) ve NFT'nin hash'ini arama alanına yapıştırın. Bu, sözleşmenizin zincirde olduğunu doğrulayacak ve "Inventory" sekmesi NFT'nizi siz (veya en azından cüzdan kimliğiniz) sahibi olarak listelemelidir.

NFT'nizi Chiliz Chain Mainnet'te bastıysanız, hesabınızda Rarible veya OKXgibi pazar yerlerinde görünmesini görmelisiniz; oradan satışa başlayabilirsiniz!

"Create Token" butonunu kullanma

Bu aslında yukarıdakinden daha doğrudan bir yol olup thirdweb'e yakın zamanda eklenmiştir.

  1. thirdweb kontrol panelinizde 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" düğmesine tıklayın. Bir modal pencere 2 seçenekle açılacak; "Create NFT Collection"ı seçin.

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

  4. Sonraki ekran NFT'nin kendisi ile ilgilidir: görüntüyü yükleyin ve görüntünüzü tanımlayan alanları doldurun, ardından "Next" düğmesine basın.

  5. thirdweb şimdi başlatmak üzere olduğunuz NFT koleksiyonunun bir özetini gösterir. Her şeyin doğru olduğundan emin olun ve ardından "Launch NFT Collection" düğmesine 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 aracılığıyla üç işlemi onaylamanız gerekecek.

  7. Bu tamamlandığında "View NFT" düğmesine tıklayın; thirdweb kontrol panelinize geri yönlendirileceksiniz ve bu sözleşmeye özgü sayfa — ve iliştirilmiş NFT'leri — gösterilecektir.

Oradan, gerçekten zincirde olup olmadığını bir blok gezgini aracılığıyla kontrol edebilir veya NFT'nizi bir pazar yeri üzerinden satmaya başlayabilirsiniz.

Tek bir NFT'yi programatik olarak basma

İşte thirdweb v5 SDKkullanan bir kod örneği; bu örnek medya dosyasını IPFS'e yükler, metadata.json dosyasını oluşturur, ardından onu da IPFS'e yükler.

Bunun için şunlara ihtiyacınız olacak:

  • 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'nın yerel bir kurulumu. Bunu kullanarak yapabilirsiniz: npm:

npm install thirdweb dotenv

"dotenv" parametresi bir .env dosyası oluşturur; bu özel 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ğıttığınız 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

Şimdi her şey hazır olduğuna göre, ilham almak için bu betiği kullanabilirsiniz; bu betik şunları yapacaktır:

  1. Medya dosyasını IPFS'e yüklemek

  2. oluşturmak ve yüklemek metadata.json dosyayı

  3. Sözleşmenin mintTo yöntemini kullanarak NFT'yi basmak.

  4. Ortaya çıkan tokenId ve tokenUrl bilgilerini size göstermek.

import 'dotenv/config';
import fs from 'fs';
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 & 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'sini kullanarak 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 göstermek için Transfer etkinliğ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 almanız gereken önemli parçalar şunlardır:

  • upload dosyaları (ve JSON'u) IPFS'e depolar ve ipfs://… URI'lerini döndürür.

  • mintTo doğrudan kullanılacak bir string (olarak) kabul eder tokenURI.

  • Standart ERC-721'i ayrıştırıyoruz Transfer etkinliğini okumak için basılan tokenId.

programlı olarak bir NFT koleksiyonu basma

Bir NFT koleksiyonu basmak, tek bir NFT basmaktan çok farklı değildir. En belirgin fark, sizin .env 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 IMAGE_DIRkullanın, tek bir görüntü için kullanılan.

THIRDWEB_SECRET_KEY=YOUR_TW_SECRET_KEY # thirdweb projenizin sayfasından.
PRIVATE_KEY=0xabc...                   # İşlemi gönderecek Web3 cüzdanı.
CONTRACT_ADDRESS=0xYour721Address      # Dağıttığınız TokenERC721 sözleşmeniz.
CHAIN_ID=88882                         # 88888=Mainnet, 88882=Spicy
IMAGE_PATH
IMAGE_PATH=./art                       # Medya dosyalarınızın yerel yolu.
DESCRIPTION=Minted on Chiliz Chain

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

import 'dotenv/config';
import fs from 'fs';
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";
}

Burada gösterdiğimiz örnek kod bu durumu dikkate alır:
// 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()))
}

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}`,
  });

  .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 oluştur & yükle
  // NAME ve DESCRIPTION ortam değişkenlerini kullanır; isimler "<NAME> #<index>" olur
  const namePrefix = process.env.NAME!;

  const description = process.env.DESCRIPTION!;
  // Metadata JSON'ları için File nesnelerinden bir dizi oluştur
    const metadata = {
      const metaFiles = imageUris.map((imageUri, i) => {
      name: `${namePrefix} #${i + 1}`,
      image: imageUri
    };
    const metaBlob = new Blob([JSON.stringify(metadata, null, 2)], { type: "application/json" });
    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'lerini kullanarak mintTo işlemlerini hazırla ve gönder (sıralı)

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

    const tx = mintTo({
      contract,
      to: account.address,
      nft: metadataUri, // TokenURI
    });

    const { transactionHash } = await sendTransaction({ transaction: tx, account });
    const metadataUri = metadataUris[i];

    const receipt = await waitForReceipt({ client, chain, transactionHash });

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

    (e) => e.eventName === "Transfer" && typeof e.args.from === "string" && e.args.from.toLowerCase() === ZERO
    if (tokenId !== undefined) {
      const nft = await getNFT({ contract, tokenId });
      // console.log(`[${i + 1}/${metadataUris.length}] tokenId:`, tokenId?.toString() ?? "(not found)");
    }
  }
}

main().catch((err) => (console.error(err), process.exit(1)));

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

  • Detaylı değişiklikler şunlardır: IMAGES_DIR tek bir görüntü için kullanılan.

  • yerine geçer Eklenen listMediaFiles

  • birden çok girdiyi toplamak için. upload Görüntüler ve metadata için toplu (sıralamayı korur).

  • Her mintTo metadataUri için döngü,her Transfer etkinliğini ayrıştırır tokenId.

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

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

Not: Lazy minting yapmayı tercih ederseniz, thirdweb'ün ERC-721 sözleşmesi şuna sahiptir: a lazyMint.

Last updated

Was this helpful?