Lewati ke konten

Mint dari situsmu

Pakai konektor dompet EVM milikmu sendiri dan ABI publik. Mint di KurvDrop adalah operasi ERC-20, bukan mint ETH yang bisa dibayar langsung. ETH menutup gas jaringan. Fase mint gratis tetap bisa memungut biaya layanan koleksi, jadi pakai kuotasinya alih-alih menganggap biayanya nol.

Contoh ini menangani fase publik tanpa modul lelang dan membatasi pembayaran tepat pada kuotasi. Contoh ini memakai dompet peramban milik pengunjung, tidak pernah kunci privat server. Tampilkan total, biaya token tambahan, dan chain kepada pembelimu, lalu dapatkan konfirmasi mereka sebelum menjalankan penulisan persetujuan dan mint.

import {
createPublicClient, createWalletClient, custom, erc20Abi,
http, zeroAddress, zeroHash,
} from 'viem';
import { baseSepolia } from 'viem/chains';
const api = 'https://testnet.kurv.fun';
const { abi } = await fetch(`${api}/api/v1/contracts/kurvdrop`).then(r => r.json());
const publicClient = createPublicClient({ chain: baseSepolia, transport: http() });
const walletClient = createWalletClient({ chain: baseSepolia, transport: custom(window.ethereum) });
const [account] = await walletClient.requestAddresses();
await walletClient.switchChain({ id: baseSepolia.id });
// Woof Pack, verified in KURV's Base Sepolia catalog.
const address = '0x8354d02d8022f455db9acb235c6f6655c8adabd3';
const { collection: live } = await fetch(
`${api}/api/v1/collections/84532/${address}`
).then(r => r.json());
if (live.contract_type !== 'KurvDrop' || live.mint.active_phase_id === null) {
throw new Error('No public mint phase is available.');
}
const phaseId = BigInt(live.mint.active_phase_id);
const quantity = 1n;
const phase = await publicClient.readContract({ address, abi, functionName: 'getPhase', args: [phaseId] });
if (phase.module !== zeroAddress || phase.merkleRoot !== zeroHash) {
throw new Error('This example supports only public phases without an auction module.');
}
const paymentToken = await publicClient.readContract({ address, abi, functionName: 'paymentToken' });
const [maxTotalCost] = await publicClient.readContract({ address, abi, functionName: 'quoteMint', args: [phaseId, quantity] });
// Display these amounts using each token's on-chain decimals and symbol.
const required = new Map([[paymentToken.toLowerCase(), maxTotalCost]]);
if (phase.token !== zeroAddress && phase.tokenPrice > 0n) {
const token = phase.token.toLowerCase();
required.set(token, (required.get(token) ?? 0n) + phase.tokenPrice * quantity);
}
// Run only after the buyer reviews and confirms the displayed amounts.
for (const [token, amount] of required) {
const allowance = await publicClient.readContract({ address: token, abi: erc20Abi, functionName: 'allowance', args: [account, address] });
if (allowance >= amount) continue;
// Reset an existing allowance for tokens requiring zero before a new approval.
if (allowance > 0n) {
const reset = await walletClient.writeContract({ account, address: token, abi: erc20Abi, functionName: 'approve', args: [address, 0n] });
await publicClient.waitForTransactionReceipt({ hash: reset });
}
const approved = await walletClient.writeContract({ account, address: token, abi: erc20Abi, functionName: 'approve', args: [address, amount] });
await publicClient.waitForTransactionReceipt({ hash: approved });
}
// Exact quote ceiling: if the required price increased, simulation/mint refuses.
const { request } = await publicClient.simulateContract({
account, address, abi, functionName: 'mint',
args: [phaseId, quantity, 0n, [], maxTotalCost, zeroAddress],
});
const hash = await walletClient.writeContract(request);
const receipt = await publicClient.waitForTransactionReceipt({ hash });
if (receipt.status !== 'success') throw new Error('Mint did not complete.');

Untuk fase daftar izin, ambil jatah dan Merkle proof dompet pembeli dari alur proof KURV yang sudah ada, lalu teruskan keduanya sebagai argumen mint ketiga dan keempat. Jangan pernah mengganti proof dengan proof kosong untuk fase privat. Batas dompet, suplai fase, jeda, penahanan lelang, dan total biaya ditegakkan oleh kontrak; simulasi harus berhasil sebelum mengirim. Lelang harga turun dan lelang per karya memakai modul penjualannya sendiri dan bukan fase mint langsung biasa; pakai halaman resmi sampai kamu mengintegrasikan dan memverifikasi ABI dan alur penyelesaian modul itu.

Argumen mint terakhir adalah alamat dompet perujuk, bukan string pelacak. Pakai zeroAddress sebagai bawaan sampai kamu dengan sengaja mengintegrasikan ketentuan rujukan koleksi yang sudah di-deploy. Kontrak yang menentukan pembagian biaya sebenarnya; menambahkan kode tautan tidak dengan sendirinya menghasilkan komisi. Penjualan ulang di pasar memakai kontrak pasar dan order yang ditandatangani, bukan pemanggilan mint primer yang ditampilkan di sini.

Untuk skema respons koleksi, lihat API publik. Untuk widget siap pakai, pakai Embed koleksi. Izin kontrak, biaya, dan ketentuan koleksi yang mendasarinya tetap berlaku; lihat Biaya dan Risiko dan penafian.

Tidak ada isi di sini yang merupakan saran keuangan. Baca Risiko dan penafian sebelum kamu mint, membeli, atau menjual kembali. Kembali ke kurv.fun. Kebijakan Privasi. Ketentuan Penggunaan. .