Minta dal tuo sito
Usa il tuo connettore di wallet EVM e l’ABI pubblica. Il mint di KurvDrop è un’operazione ERC-20, non un mint payable in ETH. L’ETH copre il gas della rete. Le fasi di mint gratuito possono comunque addebitare la commissione di servizio della collezione, quindi usa la quotazione invece di dare per scontato un costo pari a zero.
Questo esempio gestisce una fase pubblica senza modulo d’asta e limita il pagamento alla quotazione esatta. Usa un wallet del browser fornito dal visitatore, mai una chiave privata del server. Mostra all’acquirente il totale, il costo dei token aggiuntivi e la chain, e ottieni la sua conferma prima di eseguire le scritture di autorizzazione e di 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.');Per una fase con allowlist, ottieni il limite del wallet dell’acquirente e la prova di Merkle dal flusso di prove già esistente di KURV, e passali come terzo e quarto argomento del mint. Non sostituire mai una prova vuota a quella di una fase privata. I limiti per wallet, la supply della fase, la pausa, le trattenute delle aste e il costo totale sono imposti dal contratto; la simulazione deve riuscire prima dell’invio. Le aste a prezzo decrescente e le aste per pezzo usano i propri moduli di vendita e non sono normali fasi mint integrate; usa la pagina ufficiale finché non integri e verifichi l’ABI e il flusso di regolamento di quel modulo.
L’ultimo argomento del mint è un indirizzo di wallet del referrer, non una stringa di tracciamento. Usa zeroAddress come valore predefinito finché non integri di proposito le condizioni di referral della collezione pubblicata. È il contratto a decidere l’effettiva ripartizione delle commissioni; aggiungere un codice in un link non crea da solo una commissione. Le rivendite nel marketplace usano i contratti del marketplace e ordini firmati, non la chiamata di mint primario mostrata qui.
Per lo schema della risposta sulle collezioni, vedi API pubbliche. Per un widget già pronto, usa Collezioni da incorporare. I permessi del contratto, le commissioni e le condizioni della collezione sottostante restano valide; vedi Commissioni e Rischi e avvertenze.
Niente di quanto scritto qui è una consulenza finanziaria. Leggi Rischi e avvertenze prima di mintare, comprare o rivendere al Vault. Torna a kurv.fun. Informativa sulla privacy. Termini di utilizzo. .