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
şuraya gidin: TokenERC721 Bu, bir NFT Koleksiyonu oluşturmak için onların sözleşmesine dayanır.
Sözleşme dağıtım sayfasına erişmek için "Deploy Now"a tıklayın.

"Contract metadata" bölümünü doldurun:
NFT koleksiyonunuzu temsil etmesini istediğiniz resmi (veya sadece basmak istediğiniz resmi) yükleyin.
Koleksiyonunuza benzersiz bir isim ve bir sembol/ticker verin.
Buna bir açıklama verin.
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.
"Deploy Options"ta Chiliz Chain'i seçin (veya sadece testse Chiliz Spicy Testnet'i) ve "Deploy Now"a tıklayın:

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.

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:

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ş:

"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:

Ç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.
Yan panelin altındaki "Mint NFT" butonuna tıklayın ve işlemi cüzdanınızdan onaylayın.

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.
thirdweb panonuzdaki herhangi bir proje klasöründen, sol kenar çubuğunda "Tokens" seçeneğine tıklayın:

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.

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.
Sonraki ekran NFT'nin kendisiyle ilgilidir: resmi yükleyin ve resminizi tanımlayan alanları doldurun, ardından "Next" butonuna basın.
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.
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.

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 dotenvdotenv 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'inizive THIRDWEB_SECRET_KEY'i asla istemci tarafı kodunda açığa vurmayın!
Bu dosyayı güvenli bir sunucu/CI'da tutun ve herkese açık bir depoya yüklemeyin. Şimdi her şey hazır olduğuna göre, ilham alabileceğiniz bu betikten yararlanabilirsiniz; bu betik şunları yapacaktır: Medya dosyasını IPFS'e yükleyecek
ve
dosyasını oluşturup yükleyecek
Sözleşmenin mintTo yöntemi kullanılarak NFT'yi basacak.
metadata.jsonOrtaya çıkantokenId
ve
tokenUrldeğerlerini size gösterecek.Bu sadece örnek bir koddur; kendi proje kodunuza uyarlamanız gerekecektir!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 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:
}
}
uploaddosyaları (ve JSON'u) IPFS'e depolar ve
ipfs://…URI'ler döndürür.mintTodoğrudantokenURIolarak 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 basmatokenUrl.
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'iniziNAME_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_DIRIMAGE_PATH.yerine geçer
EklendilistMediaFilesbirden fazla girdiyi toplamak için.
ipfs://…Görüntüler ve metadata için toplu (sıralamayı korur).Her
tokenURImetadataUriiçin döngü, her birevent'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, … mevcutNAME/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?