تخطَّ إلى المحتوى
فتح التطبيق

السكّ من موقعك

تُستخدم أداة ربط محفظة 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 من مسار الإثبات القائم في KURV، ويُمرَّران بوصفهما الوسيطين الثالث والرابع للسكّ. ويجب عدم استبدال إثبات فارغ بالإثبات في مرحلة خاصة أبدًا. ويفرض العقد حدود المحافظ، ومعروض المرحلة، والإيقاف المؤقت، وحجوزات المزاد، والتكلفة الإجمالية؛ ويجب أن تنجح المحاكاة قبل الإرسال. أما مزادات السعر المتناقص ومزادات القطع فتستخدم وحدات بيع خاصة بها وليست مراحل mint مضمّنة عادية؛ لذا تُستخدم الصفحة الرسمية إلى أن يتم دمج ABI تلك الوحدة ومسار تسويتها والتحقق منهما.

الوسيط الأخير للسكّ هو عنوان محفظة المُحيل، لا نص تتبّع. ويُستخدم zeroAddress افتراضيًا إلى أن يتم الدمج المقصود لشروط الإحالة الخاصة بالمجموعة المنشورة. والعقد هو الذي يقرر التوزيع الفعلي للرسوم؛ وإضافة رمز رابط لا تنشئ عمولة بحد ذاتها. وتستخدم عمليات إعادة البيع في السوق عقود السوق والأوامر الموقّعة، لا استدعاء السكّ الأولي المعروض هنا.

لمخطط استجابة المجموعة، التفاصيل في واجهات API العامة. ولأداة عرض جاهزة، تُستخدم تضمين المجموعات. وتبقى أذونات العقد والرسوم وشروط المجموعة الأساسية سارية؛ التفاصيل في الرسوم والمخاطر وإخلاء المسؤولية.

لا شيء هنا نصيحة مالية. يُرجى قراءة المخاطر وإخلاء المسؤولية قبل السكّ أو الشراء أو البيع إلى Vault. العودة إلى kurv.fun. سياسة الخصوصية. شروط الاستخدام. .