Cunhar a partir do seu site
Use o seu próprio conector de carteira EVM e a ABI pública. A cunhagem no KurvDrop é uma operação ERC-20, e não uma cunhagem payable em ETH. O ETH cobre o gas da rede. As fases de cunhagem gratuita podem ainda assim cobrar a comissão de serviço da coleção, por isso use a cotação em vez de partir do princípio de que o custo é zero.
Este exemplo trata de uma fase pública sem módulo de leilão e limita o pagamento ao valor exato da cotação. Usa uma carteira de navegador fornecida pelo visitante, nunca uma chave privada de servidor. Mostre ao comprador o total, o custo adicional em tokens e a cadeia, e obtenha a sua confirmação antes de executar as escritas de aprovação e de cunhagem.
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.');Numa fase com lista de acesso, obtenha a autorização e a prova Merkle da carteira do comprador através do fluxo de provas já existente do KURV e passe-as como terceiro e quarto argumentos da cunhagem. Nunca substitua a prova por uma prova vazia numa fase privada. Os limites por carteira, a oferta da fase, a pausa, as retenções de leilão e o custo total são impostos pelo contrato; a simulação tem de ter êxito antes do envio. Os leilões de preço decrescente e os leilões de peças usam os seus próprios módulos de venda e não são fases mint integradas comuns; use a página oficial até integrar e verificar a ABI e o fluxo de liquidação desse módulo.
O último argumento da cunhagem é um endereço de carteira de quem fez a recomendação, e não uma cadeia de rastreio. Use zeroAddress por predefinição até integrar deliberadamente as condições de recomendação da coleção implementada. É o contrato que decide a divisão real das comissões; acrescentar um código de ligação não cria, por si só, uma comissão. As revendas no mercado usam contratos de mercado e ordens assinadas, e não a chamada de cunhagem primária aqui mostrada.
Para o esquema da resposta de uma coleção, consulte APIs públicas. Para um widget já feito, use Coleções incorporadas. As permissões do contrato, as comissões e as condições da coleção continuam a aplicar-se; consulte Comissões e Riscos e aviso legal.
Nada do que aqui está constitui aconselhamento financeiro. Leia Riscos e aviso legal antes de cunhar, comprar ou vender ao Vault. Voltar a kurv.fun. Política de privacidade. Termos de utilização. .