มินต์จากเว็บไซต์ของคุณ
ใช้ตัวเชื่อมต่อวอลเล็ต EVM ของคุณเองกับ ABI สาธารณะ การมินต์ของ KurvDrop เป็นการดำเนินการแบบ ERC-20 ไม่ใช่การมินต์ที่จ่ายด้วย ETH โดยตรง ETH ใช้จ่ายค่าแก๊สของเครือข่าย เฟสการมินต์ฟรีอาจยังเรียกเก็บค่าบริการของคอลเลกชัน จึงควรใช้ราคาเสนอแทนการคิดเอาเองว่าไม่มีค่าใช้จ่าย
ตัวอย่างนี้จัดการเฟสสาธารณะที่ไม่มีโมดูลการประมูล และจำกัดการชำระเงินไว้ที่ราคาเสนอพอดี ใช้วอลเล็ตในเบราว์เซอร์ที่ผู้เข้าชมนำมาเอง ไม่ใช้คีย์ส่วนตัวบนเซิร์ฟเวอร์เด็ดขาด แสดงยอดรวม ค่าใช้จ่ายโทเคนเพิ่มเติม และเชนให้ผู้ซื้อเห็น และขอการยืนยันจากผู้ซื้อก่อนเรียกการอนุมัติและการมินต์
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.');สำหรับเฟสที่มีไวท์ลิสต์ ให้ขอจำนวนที่วอลเล็ตของผู้ซื้อได้รับอนุญาตและ Merkle proof จากขั้นตอน proof ที่มีอยู่แล้วของ KURV แล้วส่งเป็นอาร์กิวเมนต์ที่สามและที่สี่ของการมินต์ อย่าใช้ proof ว่างแทนในเฟสส่วนตัวเด็ดขาด ขีดจำกัดของวอลเล็ต จำนวนของเฟส การหยุดชั่วคราว การกันไว้สำหรับการประมูล และค่าใช้จ่ายรวม ถูกบังคับใช้โดยสัญญา การจำลองต้องสำเร็จก่อนส่ง การประมูลแบบราคาลดลงและการประมูลรายชิ้นใช้โมดูลการขายของตัวเอง และไม่ใช่เฟส mint แบบในหน้าตามปกติ ให้ใช้หน้าอย่างเป็นทางการจนกว่าคุณจะเชื่อมต่อและตรวจสอบ ABI และขั้นตอนการชำระของโมดูลนั้นแล้ว
อาร์กิวเมนต์สุดท้ายของการมินต์คือ ที่อยู่วอลเล็ตผู้แนะนำ ไม่ใช่สตริงสำหรับติดตาม ใช้ zeroAddress เป็นค่าเริ่มต้นจนกว่าคุณจะตั้งใจเชื่อมต่อกับเงื่อนไขการแนะนำของคอลเลกชันที่ดีพลอยแล้ว สัญญาเป็นผู้ตัดสินการแบ่งค่าธรรมเนียมจริง การเพิ่มโค้ดลิงก์ไม่ได้สร้างค่าคอมมิชชันขึ้นมาเอง การขายต่อในมาร์เก็ตเพลสใช้สัญญาของมาร์เก็ตเพลสและคำสั่งซื้อขายที่ลงนามแล้ว ไม่ใช่การเรียกการมินต์ครั้งแรกที่แสดงไว้ที่นี่
ดูสคีมาของคำตอบคอลเลกชันได้ที่API สาธารณะ ถ้าต้องการวิดเจ็ตสำเร็จรูป ใช้การฝังคอลเลกชัน สิทธิ์ของสัญญา ค่าธรรมเนียม และเงื่อนไขของคอลเลกชันยังคงมีผล ดูค่าธรรมเนียมและความเสี่ยงและข้อจำกัดความรับผิดชอบ
เนื้อหาในที่นี้ไม่ใช่คำแนะนำทางการเงิน โปรดอ่านความเสี่ยงและข้อจำกัดความรับผิดชอบก่อนมินต์ ซื้อ หรือขายคืน กลับไปที่ kurv.fun นโยบายความเป็นส่วนตัว ข้อกำหนดการใช้งาน
