Zum Inhalt springen
App öffnen

Auf deiner Website minten

Nutze deinen eigenen EVM-Wallet-Connector und die öffentliche ABI. Das Minten bei KurvDrop ist ein ERC-20-Vorgang, kein payable Mint mit ETH. ETH deckt das Gas des Netzwerks. Kostenlose Mint-Phasen können trotzdem die Servicegebühr der Kollektion berechnen, also nutze das Angebot, statt null Kosten anzunehmen.

Dieses Beispiel behandelt eine öffentliche Phase ohne Auktionsmodul und begrenzt die Zahlung auf genau das Angebot. Es nutzt eine Browser-Wallet, die der Besucher mitbringt, nie einen privaten Schlüssel auf dem Server. Zeig deinem Käufer die Summe, die zusätzlichen Token-Kosten und die Chain und hol seine Bestätigung ein, bevor du die Schreibvorgänge für Freigabe und Mint ausführst.

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.');

Hol dir für eine Phase mit Allowlist die Freigabemenge und den Merkle-Proof der Wallet des Käufers aus dem bestehenden Proof-Ablauf von KURV und übergib sie als drittes und viertes Argument des Mints. Ersetze bei einer privaten Phase nie einen Proof durch einen leeren. Wallet-Limits, die Menge der Phase, Pausen, Auktionssperren und die Gesamtkosten setzt der Vertrag durch; die Simulation muss erfolgreich sein, bevor du sendest. Auktionen mit fallendem Preis und Stückauktionen nutzen ihre eigenen Verkaufsmodule und sind keine gewöhnlichen mint-Phasen direkt auf der Seite; nutze die offizielle Seite, bis du die ABI und den Abwicklungsablauf dieses Moduls integriert und verifiziert hast.

Das letzte Argument des Mints ist eine Wallet-Adresse des Empfehlenden, kein Tracking-String. Nutze standardmäßig zeroAddress, bis du die Empfehlungsbedingungen der bereitgestellten Kollektion bewusst integrierst. Der Vertrag entscheidet über die tatsächliche Gebührenaufteilung; ein Link-Code allein erzeugt keine Provision. Wiederverkäufe auf dem Marktplatz nutzen Marktplatzverträge und signierte Aufträge, nicht den hier gezeigten Aufruf für den Erst-Mint.

Das Antwortschema einer Kollektion findest du unter Öffentliche APIs. Für ein fertiges Widget nutze Kollektions-Einbettungen. Vertragsberechtigungen, Gebühren und die zugrunde liegenden Bedingungen der Kollektion gelten weiterhin; siehe Gebühren und Risiken und Haftungsausschluss.

Nichts hier ist eine Finanzberatung. Lies Risiken und Haftungsausschluss, bevor du mintest, kaufst oder an den Vault zurückverkaufst. Zurück zu kurv.fun. Datenschutzerklärung. Nutzungsbedingungen. .