Minted tokens
تسكّ كل من الـ microsales وMelt Pools توكن ERC20 جديدًا عند الإنشاء. أما الـ pools القياسية — البيوع المسبقة (presales)، والإطلاقات العادلة (fair launches)، والاشتراكات (subscriptions) — فتُدرج توكنًا يوفّره المُنشئ ولا تُغطّى هنا.
عقود التوكن
CheeseToken | CheeseTaxTokenV2 | |
|---|---|---|
TOKEN_TYPE() | 0 | 4 |
| ضريبة الشراء/البيع | لا يوجد | معدّلات مستقلة، كلٌّ منها على الأكثر 10% |
| مسكوك بواسطة | createMicroSaleNoTaxToken، createBondingCurveNoTaxToken* | createMicroSaleTaxTokenV2، createMicroSaleTaxTokenWithVaultV2، createBondingCurveTaxTokenV2*، createBondingCurveTaxTokenWithVaultV2 |
| توجيه الإيرادات | — | مستلم الرسوم، وأرباح الحائزين، والحرق، والسيولة |
تُحدِّد TOKEN_TYPE() == 3 توكن CheeseTaxToken. استخدم ملف ABI المخصص له عند قراءة توكن من
النوع 3؛ مسارات الإنشاء في الجدول أعلاه تسكّ النوعين 0 و4.
لكلا التوكنين:
- عرض ثابت قدره
1,000,000,000توكن بـ 18 خانة عشرية. - قراءات ERC20 القياسية والموافقات والتحويلات وحدثا
Transfer/Approval. owner() == address(0)بعد الإطلاق. يُتنازَل عن الملكية أثناء التهيئة.fundManagerمرتبط بالـ microsale أو Melt Pool الذي سكّ التوكن.- حماية منافذ التداول قبل الإدراج. التحويلات من محفظة إلى محفظة مسموح بها، بينما لا يمكن زرع منافذ التداول المُعدّة قبل الإدراج الرسمي.
configurator هو عنوان الـ launchpad الذي يهيّئ التوكن. بالنسبة لـ CheeseToken، يربط مدير الأموال
مرة واحدة. وبالنسبة لـ CheeseTaxTokenV2، يربط أيضًا مستلم الرسوم وعقود الإيرادات ويمكنه تسجيل
pools ضريبية إضافية. وهو ليس محفظة مالك للتوكن.
ملفات ABI
import { ethers } from "ethers";
import CheeseTokenABI from "./abi/CheeseToken.json";
import CheeseTaxTokenABI from "./abi/CheeseTaxToken.json";
import CheeseTaxTokenV2ABI from "./abi/CheeseTaxTokenV2.json";
const tokenType = await new ethers.Contract(
TOKEN_ADDRESS,
["function TOKEN_TYPE() view returns (uint8)"],
provider,
).TOKEN_TYPE();
const abi =
tokenType === 0n
? CheeseTokenABI
: tokenType === 3n
? CheeseTaxTokenABI
: tokenType === 4n
? CheeseTaxTokenV2ABI
: undefined;
if (!abi) throw new Error(`Unsupported CheesePad token type: ${tokenType}`);
const token = new ethers.Contract(TOKEN_ADDRESS, abi, provider);
للتنزيل: CheeseToken.json · CheeseTaxToken.json · CheeseTaxTokenV2.json.
ملف Launchpad ABI متوفر في Launchpad.json. الكود المصدري الحالي للتوكن
منشور في
cheesepad-ai/cheesepad-contracts.
قراءات التوكن الشائعة
const [name, symbol, decimals, totalSupply, tokenType, listed, manager] = await Promise.all([
token.name(),
token.symbol(),
token.decimals(),
token.totalSupply(),
token.TOKEN_TYPE(),
token.tradingStarted(),
token.fundManager(),
]);
| دالة القراءة | النوع | المعنى |
|---|---|---|
name / symbol | string | القيم المختارة عند الإطلاق |
decimals | uint8 | دائمًا 18 |
totalSupply / TOTAL_SUPPLY | uint256 | دائمًا 1_000_000_000e18 |
TOKEN_TYPE | uint8 | 0 لـ CheeseToken، و3 لـ CheeseTaxToken، و4 لـ CheeseTaxTokenV2 |
owner | address | العنوان الصفري بعد التهيئة |
configurator | address | الـ launchpad الذي هيّأ التوكن ووصّله |
fundManager | address | مقبض الـ microsale أو Melt Pool |
tradingStarted | bool | ما إذا كان الإدراج الرسمي على DEX قد بدأ |
pair (CheeseToken) / PAIR (CheeseTaxTokenV2) | address | زوج token/quote الرئيسي |
استخدم TOKEN_TYPE() كمُميِّز لاختيار ملف ABI. إنها بيانات وصفية مفيدة، لكنها ليست دليلًا على أن
التوكن مسكوك بواسطة CheesePad؛ استخدم أحداث الـ launchpad الموصوفة أدناه لإثبات المصدر.
CheeseToken
CheeseToken هو التوكن بلا ضريبة. قراءاته الخاصة به صغيرة عمدًا:
| دالة القراءة | المعنى |
|---|---|
DECIMALS | عدد الخانات العشرية الثابت، 18 |
pair | زوج token/quote المعتمد |
tradingStarted | false حتى أول زرع سيولة رسمي |
isPreListingBlockedVenue(address) | ما إذا كان العنوان محظورًا كمنفذ تداول قبل الإدراج |
قبل الإدراج، تعمل التحويلات العادية بين المحافظ وتحويلات حفظ الـ launchpad، لكن التحويلات التي تشمل
منفذ تداول محظورًا تفشل. زرع السيولة الرسمي يضبط tradingStarted على true؛ وعندها يُطبَّق سلوك
ERC20 العادي في كل مكان.
CheeseTaxTokenV2
لـ CheeseTaxTokenV2 دورة حياة من أربع مراحل:
| الحالة | القيمة | المعنى |
|---|---|---|
BondingCurve | 0 | قبل الإدراج؛ لا ضريبة DEX على مستوى التوكن |
TaxEnforcedAntiFarmer | 1 | يفرض ضريبة على عمليات الشراء والبيع عبر كل pool مسجَّل |
TaxEnforced | 2 | يفرض ضريبة على عمليات الشراء والبيع عبر mainPool |
TaxFree | 3 | انتهت نافذة الضريبة |
يبدأ التوكن في الحالة 0 لكلٍّ من الـ microsales وMelt Pools. الإدراج الرسمي على DEX يضبط
tradingStarted وtradingStartedAt وكلا طابعي وقت الانتهاء. بالنسبة لـ Melt Pool، يحتجز الـ
launchpad نفسه ضريبة المُنشئ من صفقات المنحنى بعملة التسعير (راجع نموذج الرسوم)؛
يبقى التوكن في الحالة 0 حتى التخرج.
قراءات الضريبة ودورة الحياة
const [
buyBps,
sellBps,
duration,
antiFarmerDuration,
poolState,
allocation,
feeReceiver,
quoteToken,
] = await Promise.all([
token.BUY_TAX_BPS(),
token.SELL_TAX_BPS(),
token.TAX_DURATION(),
token.antiFarmerDuration(),
token.poolState(),
token.allocation(),
token.FEE_RECEIVER(),
token.QUOTE_TOKEN(),
]);
const now = BigInt(Math.floor(Date.now() / 1000));
const taxWindowOpen =
(await token.tradingStarted()) && now < poolState.taxExpirationTime;
const allRegisteredPoolsTaxed =
taxWindowOpen && now < poolState.antiFarmerExpirationTime;
| دالة القراءة | المعنى |
|---|---|
BUY_TAX_BPS / SELL_TAX_BPS | المعدّلات الحالية لكل جانب بوحدة BPS؛ كلٌّ منها يبدأ بما لا يزيد عن 1000 |
TAX_BPS | القيمة القصوى الحالية بين معدّلي الشراء والبيع |
TAX_DURATION | نافذة الضريبة المُعدّة بالثواني بعد الإدراج |
antiFarmerDuration | نافذة الضريبة الأولية متعددة الـ pools بالثواني |
state() | حالة دورة الحياة المُخزَّنة الحالية، 0–3 |
poolState() | الحالة، والمعدّلات الحالية، وعتبة التسييل، وطوابع وقت الانتهاء |
allocation() | قيم feeReceiver وholders وburn وliquidity بوحدة BPS؛ مجموعها 10000 |
FEE_RECEIVER | المحفظة أو vault التي تستلم حصتها من التخصيص |
QUOTE_TOKEN | الأصل المستخدم لتسوية إيرادات الضريبة |
PAIR / mainPool | pool الإدراج الرئيسي |
isPool(address) | ما إذا كان العنوان pool ضريبيًا مسجَّلًا |
isPreListingGuardedVenue(address) | ما إذا كان منفذ تداول محظورًا قبل الإدراج |
taxProcessor | العقد الذي يبادل ويوجّه الضريبة المُجمّعة |
dividendTracker | دفتر أرباح الحائزين؛ صفر عندما تكون حصة الحائزين صفرًا |
liquidationThreshold | مقدار التوكن الحالي الذي يمكن أن يُطلق معالجة الضريبة على دفعات |
تتحدث state() عند التحويلات، لذا قد يحتفظ توكن خامل بحالته المُخزَّنة السابقة بعد طابع وقت الانتهاء.
استخدم الطوابع الزمنية في poolState() عند عرض ما إذا كانت النافذة مفتوحة. التحويل التالي يقدّم
الحالة المُخزَّنة ويضبط معدّلات الضريبة الحالية على صفر عند انتهاء نافذة الضريبة.
توزيع الإيرادات
تُعالَج الضريبة المُجمّعة على دفعات وتُقسَّم حسب allocation():
- تُسوَّى
feeReceiverإلى المحفظة أو الـ vault المُعدّ. - تُوزَّع
holdersعبرdividendTrackerبتوكن التسعير. - تُرسَل
burnإلى العنوان الميت. - تُزوَّج
liquidityوتُضاف كـ LP.
عندما لا يكون للتوكن حصص حائزين مؤهَّلة، تعيد المعالجة توزيع حصة الحائزين على الوجهات المُعدّة
الأخرى. يضبط التوكن عتبة التسييل الخاصة به بين MIN_LIQ_THRESHOLD() وSTART_LIQ_THRESHOLD() بناءً
على نتائج المعالجة.
نموذج الرسوم
لـ CheeseTaxTokenV2 طبقتا رسوم يجدر فصلهما: ضريبة المُنشئ التي يضبطها المُطلِق، ورسوم المنصة
التي تفرضها CheesePad فوقها.
ضريبة المُنشئ. أنت تضبط BUY_TAX_BPS / SELL_TAX_BPS وallocation() عبر
feeReceiver / holders / burn / liquidity. هذه هي إيراداتك واقتصاديات توكنك — أنت تختار المعدّلات
والتقسيم.
رسوم المنصة. فوق ضريبة المُنشئ، تفرض CheesePad:
| المرحلة | رسوم الصفقة | رسوم المنصة على ضريبة المُنشئ |
|---|---|---|
| مرحلة المنحنى (Melt Pool، قبل التخرج) | 1% من كل عملية شراء وبيع | رسوم منصة إضافية بنسبة 10% على ضريبة المُنشئ |
| بعد التخرج / الإدراج | لا يوجد | رسوم منصة إضافية بنسبة 10% على ضريبة المُنشئ |
أثناء وجود Melt Pool على المنحنى، تدفع كل صفقة رسوم الصفقة الثابتة البالغة 1%، وتأخذ CheesePad رسوم
منصة إضافية بنسبة 10% على ضريبة المُنشئ التي يجمعها المنحنى. بمجرد تخرّج التوكن وإدراجه (أو، بالنسبة
لـ microsale، من لحظة إدراجه)، لم تعد رسوم الصفقة البالغة 1% تنطبق، لكن رسوم المنصة البالغة 10% على
ضريبة المُنشئ تستمر ما دامت الضريبة سارية. التوكن CheeseToken بلا ضريبة ليس له ضريبة مُنشئ، لذا فهو
يدفع رسوم الـ 1% فقط أثناء وجوده على المنحنى ولا شيء بعد الإدراج.
يُقرأ معدّل رسوم المنصة من إعدادات الـ launchpad على السلسلة (تُرجع getPlatformCutBps() معدّلي
مرحلة المنحنى وما بعد الإدراج بوحدة BPS)، لذا تعامل مع أرقام الـ 10% على أنها الجدول الحالي وليست
ثابتًا مُضمَّنًا في الكود.
اكتشاف توكن CheesePad
يكون التوكن مسكوكًا بواسطة المنصة عندما يظهر في حدث MicroSaleCreated أو
BondingCurvePoolCreated صادر عن عنوان launchpad الخاص بـ CheesePad. يصف PoolCreated pool
قياسيًا وُفّر توكنه من قِبل المُنشئ، لذا استبعده عند بناء قائمة بالتوكنات المسكوكة.
import LaunchpadABI from "./abi/Launchpad.json";
const launchpad = new ethers.Contract(LAUNCHPAD, LaunchpadABI, provider);
const [microsales, meltPools] = await Promise.all([
launchpad.queryFilter(launchpad.filters.MicroSaleCreated(), fromBlock, toBlock),
launchpad.queryFilter(launchpad.filters.BondingCurvePoolCreated(), fromBlock, toBlock),
]);
for (const event of [...microsales, ...meltPools]) {
const { token, fundManager } = event.args;
const launchStyle =
event.eventName === "MicroSaleCreated" ? "microsale" : "melt-pool";
// Persist token, fundManager, launchStyle, block number, and transaction hash.
}
لعمليات البحث المفردة، يوفّر الـ launchpad أيضًا getMicroSaleByToken(token) و
getBondingCurvePoolByToken(token). كلاهما يُرجع سجل الإطلاق الكامل ويرفض توكنًا غير معروف.