إنتقل إلى المحتوى الرئيسي

Minted tokens

تسكّ كل من الـ microsales وMelt Pools توكن ERC20 جديدًا عند الإنشاء. أما الـ pools القياسية — البيوع المسبقة (presales)، والإطلاقات العادلة (fair launches)، والاشتراكات (subscriptions) — فتُدرج توكنًا يوفّره المُنشئ ولا تُغطّى هنا.

عقود التوكن​

CheeseTokenCheeseTaxTokenV2
TOKEN_TYPE()04
ضريبة الشراء/البيعلا يوجدمعدّلات مستقلة، كلٌّ منها على الأكثر 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 / symbolstringالقيم المختارة عند الإطلاق
decimalsuint8دائمًا 18
totalSupply / TOTAL_SUPPLYuint256دائمًا 1_000_000_000e18
TOKEN_TYPEuint80 لـ CheeseToken، و3 لـ CheeseTaxToken، و4 لـ CheeseTaxTokenV2
owneraddressالعنوان الصفري بعد التهيئة
configuratoraddressالـ launchpad الذي هيّأ التوكن ووصّله
fundManageraddressمقبض الـ microsale أو Melt Pool
tradingStartedboolما إذا كان الإدراج الرسمي على DEX قد بدأ
pair (CheeseToken) / PAIR (CheeseTaxTokenV2)addressزوج token/quote الرئيسي

استخدم TOKEN_TYPE() كمُميِّز لاختيار ملف ABI. إنها بيانات وصفية مفيدة، لكنها ليست دليلًا على أن التوكن مسكوك بواسطة CheesePad؛ استخدم أحداث الـ launchpad الموصوفة أدناه لإثبات المصدر.

CheeseToken​

CheeseToken هو التوكن بلا ضريبة. قراءاته الخاصة به صغيرة عمدًا:

دالة القراءةالمعنى
DECIMALSعدد الخانات العشرية الثابت، 18
pairزوج token/quote المعتمد
tradingStartedfalse حتى أول زرع سيولة رسمي
isPreListingBlockedVenue(address)ما إذا كان العنوان محظورًا كمنفذ تداول قبل الإدراج

قبل الإدراج، تعمل التحويلات العادية بين المحافظ وتحويلات حفظ الـ launchpad، لكن التحويلات التي تشمل منفذ تداول محظورًا تفشل. زرع السيولة الرسمي يضبط tradingStarted على true؛ وعندها يُطبَّق سلوك ERC20 العادي في كل مكان.

CheeseTaxTokenV2​

لـ CheeseTaxTokenV2 دورة حياة من أربع مراحل:

الحالةالقيمةالمعنى
BondingCurve0قبل الإدراج؛ لا ضريبة DEX على مستوى التوكن
TaxEnforcedAntiFarmer1يفرض ضريبة على عمليات الشراء والبيع عبر كل pool مسجَّل
TaxEnforced2يفرض ضريبة على عمليات الشراء والبيع عبر mainPool
TaxFree3انتهت نافذة الضريبة

يبدأ التوكن في الحالة 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 / mainPoolpool الإدراج الرئيسي
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). كلاهما يُرجع سجل الإطلاق الكامل ويرفض توكنًا غير معروف.

ذات صلة​