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
Ş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 görüntüyü yükleyin (veya sadece basmak istediğiniz görüntüyü).
Koleksiyonunuza benzersiz bir isim ve bir sembol/ticker verin.
Bir açıklama verin.
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.
"Deploy Options" içinde Chiliz Chain'i (veya sadece bir testse Chiliz Spicy Testnet'i) seçin 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 onaylayın.

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

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

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

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

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

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.
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.
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.
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.

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 ChainPRIVATE_KEY'inizi asla veya THIRDWEB_SECRET_KEY'i istemci tarafı kodunda ifşa etmeyin!
Bu dosyayı güvenli bir sunucu/CI'de tutun ve herkese açık bir depoya yüklemeyin
Şimdi her şey hazır olduğuna göre, ilham almak için bu betiği kullanabilirsiniz; bu betik şunları yapacaktır:
Medya dosyasını IPFS'e yüklemek
oluşturmak ve yüklemek
metadata.jsondosyayıSözleşmenin mintTo yöntemini kullanarak NFT'yi basmak.
Ortaya çıkan
tokenIdvetokenUrlbilgilerini size göstermek.
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 & 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:
uploaddosyaları (ve JSON'u) IPFS'e depolar veipfs://…URI'lerini döndürür.mintTodoğrudan kullanılacak bir string (olarak) kabul edertokenURI.Standart ERC-721'i ayrıştırıyoruz
Transferetkinliğini okumak için basılantokenId.
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 ChainNAME_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_DIRtek bir görüntü için kullanılan.yerine geçer
EklenenlistMediaFilesbirden çok girdiyi toplamak için.
uploadGörüntüler ve metadata için toplu (sıralamayı korur).Her
mintTometadataUriiçin döngü,herTransferetkinliğini ayrıştırırtokenId.İsimler otomatik numaralandırılır:
NAME #1,NAME #2, … mevcutNAME/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?