Minter depuis votre site
Utilisez votre propre connecteur de portefeuille EVM et l’ABI publique. Le mint KurvDrop est une opération ERC-20, et non un mint payable en ETH. L’ETH couvre le gas du réseau. Les phases de mint gratuit peuvent quand même prélever les frais de service de la collection : utilisez donc le devis au lieu de supposer un coût nul.
Cet exemple gère une phase publique sans module d’enchères et plafonne le paiement au montant exact du devis. Il utilise un portefeuille de navigateur fourni par le visiteur, jamais une clé privée côté serveur. Affichez à votre acheteur le total, le coût en jeton supplémentaire et la chaîne, et obtenez sa confirmation avant de lancer les écritures d’approbation et de 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.');Pour une phase avec liste d’accès, obtenez l’allocation du portefeuille de l’acheteur et sa preuve de Merkle via le parcours de preuve existant de KURV, et passez-les comme troisième et quatrième arguments du mint. Ne remplacez jamais la preuve d’une phase privée par une preuve vide. Les limites par portefeuille, la quantité de la phase, la pause, les retenues d’enchères et le coût total sont imposés par le contrat ; la simulation doit réussir avant l’envoi. Les enchères à prix dégressif et les enchères par pièce utilisent leurs propres modules de vente et ne sont pas des phases mint ordinaires intégrées ; utilisez la page officielle tant que vous n’avez pas intégré et vérifié l’ABI et le parcours de règlement de ce module.
Le dernier argument du mint est une adresse de portefeuille de parrainage, et non une chaîne de suivi. Utilisez zeroAddress par défaut tant que vous n’intégrez pas délibérément les conditions de parrainage de la collection déployée. C’est le contrat qui décide de la répartition réelle des frais ; ajouter un code de lien ne crée pas de commission à lui seul. Les reventes sur le marché utilisent les contrats du marché et des ordres signés, pas l’appel de mint primaire montré ici.
Pour le schéma de réponse des collections, voir API publiques. Pour un widget prêt à l’emploi, utilisez Intégrations de collections. Les autorisations du contrat, les frais et les conditions de la collection sous-jacente s’appliquent toujours ; voir Frais et Risques et avertissement.
Rien ici ne constitue un conseil financier. Lisez Risques et avertissement avant de minter, d’acheter ou de revendre au Vault. Retour à kurv.fun. Politique de confidentialité. Conditions d’utilisation. .