Ga naar inhoud
App openen

Minten vanaf je eigen site

Gebruik je eigen EVM-walletconnector en de openbare ABI. Minten bij KurvDrop is een ERC-20-handeling, geen mint die je in ETH betaalt. ETH dekt het gas van het netwerk. Gratis mintfases kunnen toch de servicevergoeding van de collectie rekenen, dus gebruik de prijsopgave in plaats van aan te nemen dat het niets kost.

Dit voorbeeld behandelt een openbare fase zonder veilingmodule en beperkt de betaling tot precies de prijsopgave. Het gebruikt een browserwallet van de bezoeker, nooit een privésleutel op een server. Toon de koper het totaal, de extra tokenkosten en de chain, en vraag zijn bevestiging voordat je de goedkeuring en de mint uitvoert.

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

Bij een fase met een allowlist haal je het tegoed en het Merkle-bewijs van de wallet van de koper op via de bestaande bewijsroute van KURV, en geef je ze door als derde en vierde argument van de mint. Vervang het bewijs bij een privéfase nooit door een leeg bewijs. Walletlimieten, de omvang van de fase, pauzeren, veilingreserveringen en de totale kosten worden door het contract afgedwongen; de simulatie moet slagen voordat je verstuurt. Veilingen met een dalende prijs en veilingen per stuk gebruiken hun eigen verkoopmodules en zijn geen gewone inline mint-fases; gebruik de officiële pagina totdat je de ABI en de afwikkeling van die module hebt gekoppeld en geverifieerd.

Het laatste argument van de mint is een walletadres van een doorverwijzer, geen trackingtekst. Gebruik standaard zeroAddress totdat je bewust de doorverwijsvoorwaarden van de geïmplementeerde collectie koppelt. Het contract bepaalt de echte verdeling van de vergoedingen; een linkcode toevoegen levert op zichzelf geen commissie op. Doorverkopen op de marktplaats gebruiken marktplaatscontracten en ondertekende orders, niet de aanroep voor de eerste mint die hier staat.

Zie Openbare API’s voor het schema van het collectieantwoord. Gebruik Collectie-embeds voor een kant-en-klare widget. De rechten van het contract, de vergoedingen en de onderliggende voorwaarden van de collectie gelden nog steeds; zie Kosten en Risico’s en disclaimer.

Niets hier is financieel advies. Lees Risico’s en disclaimer voordat je mint, koopt of terugverkoopt aan de Vault. Terug naar kurv.fun. Privacybeleid. Gebruiksvoorwaarden. .