Ir al contenido
Abrir la app

Acuña desde tu sitio

Usa tu propio conector de carteras EVM y la ABI pública. Acuñar en KurvDrop es una operación ERC-20, no una acuñación payable en ETH. El ETH cubre el gas de la red. Las fases de acuñación gratuita pueden cobrar igualmente la comisión de servicio de la colección, así que usa la cotización en lugar de dar por hecho que el coste es cero.

Este ejemplo maneja una fase pública sin módulo de subasta y limita el pago a la cotización exacta. Usa una cartera del navegador que aporta el visitante, nunca una clave privada del servidor. Muestra a tu comprador el total, el coste del token adicional y la cadena, y obtén su confirmación antes de ejecutar las escrituras de aprobación y de acuñación.

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

En una fase con lista de acceso, obtén el permiso de la cartera del comprador y su Merkle proof con el flujo que ya tiene KURV para generarlas, y pásalos como tercer y cuarto argumento de la acuñación. Nunca uses una Merkle proof vacía en una fase privada. El contrato hace cumplir los límites por cartera, el suministro de la fase, la pausa, las retenciones de las subastas y el coste total; la simulación tiene que salir bien antes de enviar. Las subastas de precio descendente y las subastas de piezas usan sus propios módulos de venta y no son fases mint normales dentro del sitio; usa la página oficial hasta que integres y verifiques la ABI y el flujo de liquidación de ese módulo.

El último argumento de la acuñación es una dirección de cartera de quien te recomendó, no una cadena de seguimiento. Usa por defecto zeroAddress hasta que integres a propósito las condiciones de recomendación de la colección desplegada. El contrato decide el reparto real de las comisiones; añadir un código en un enlace no crea por sí solo ninguna comisión. Las reventas en marketplaces usan contratos de marketplace y órdenes firmadas, no la llamada de acuñación primaria que se muestra aquí.

Para el esquema de la respuesta de una colección, consulta API públicas. Para un widget ya hecho, usa Colecciones incrustadas. Los permisos del contrato, las comisiones y las condiciones de la colección siguen aplicándose; consulta Comisiones y Riesgos y aviso legal.

Nada de lo que hay aquí es asesoramiento financiero. Lee Riesgos y aviso legal antes de acuñar, comprar o vender al Vault. Volver a kurv.fun. Política de privacidad. Términos de uso. .