الملخص
كويك لوتاري TON هو عقد ذكي بسيط على بلوكتشين TON. يدخل المشاركون عبر استدعاء enter وإرسال 1 أو أكثر TON (أعداد صحيحة فقط، بدون كسور).
بعد أن يشارك 10+ أشخاص ويمر 24 ساعة، يمكن لأي مشارك تنفيذ draw. سيختار العقد عشوائياً حوالي 10٪ من المشاركين ويوزع الجائزة بينهم.
هذا كل شيء!
يمكنك رؤية الكود المصدري بالأسفل (الانتقال إلى الكود).
كيفية الدخول
للدخول إلى اليانصيب، أرسل ببساطة 1 TON (أو 2، 3، 4 ...) إلى عنوان العقد
EQCsihC1Z6fHRsFbz9N3sCHC6sUfvnlz4RbelethC-6Q34y6
تم النسخ!
مع التعليق enter (استخدم الكلمة بالضبط، بدون فراغات وبأحرف صغيرة).

الاستجابات
إذا أرسلت مبلغًا يحتوي على كسور (مثل 1.002 TON)، سيتم إعادة أموالك مع رسالة Can only enter with 1 TON or multiples of 1 TON.
إذا كنت قد شاركت بالفعل في هذه الجولة، ستُعاد أموالك مع الرسالة You have already entered this draw.
إذا نجح دخولك، ستحصل على الرسالة Successfully entered the lottery draw with 1 TON!
السحب
يجب على مشارك واحد فقط إجراء السحب في كل جولة. عادةً لست بحاجة لفعل ذلك، حيث سيتم تلقائيًا بواسطة مشارك آخر. فقط ادخل وانتظر النتائج بعد 24 ساعة!
إذا أردت تنفيذ السحب، أرسل 0.05 TON أو أكثر (حسب عدد المشاركين، لتغطية الغاز) إلى عنوان العقد
EQCsihC1Z6fHRsFbz9N3sCHC6sUfvnlz4RbelethC-6Q34y6
تم النسخ!
مع التعليق draw.
إذا كان السحب السابق قبل أقل من 24 ساعة، ستُعاد أموالك مع رسالة Cannot draw yet, X seconds remaining until next draw.
إذا كان عدد المشاركين أقل من 10، ستُعاد أموالك مع رسالة Not enough participants for draw.
وإلا سيختار الكود حوالي 10٪ من المشاركين عشوائيًا ويوزع عليهم الجائزة! 1٪ يُحتجز كرسوم غاز.
الفائزون يتلقون أموالهم مع رسالة Congratulations! You won 10000000000 nanoTON in the lottery draw!
الطرق
في Verifier أو TonViewer يمكنك أيضًا استدعاء دوال العقد. الدوال المتاحة:
getBetPool(): تُرجع إجمالي nanoTON في مجمع الرهانات الحالي.getParticipantCount(): تُرجع إجمالي عدد المشاركين في الجولة الحالية.
النتائج تكون بنظام hex ويجب تحويلها إلى عشري.
الكود المصدري
يمكن أيضاً التحقق من الكود عبر TON Verifier:
/**QuickLotteryTON contractExplorers:- Tonviewer: https://tonviewer.com/EQCsihC1Z6fHRsFbz9N3sCHC6sUfvnlz4RbelethC-6Q34y6- Verifier: https://verifier.ton.org/EQCsihC1Z6fHRsFbz9N3sCHC6sUfvnlz4RbelethC-6Q34y6Usage:- Enter lottery:• Send ≥ 1 TON (multiples of 1 TON) with comment "enter".• Each address may enter once per draw.- Getters:• balance() → current contract balance (nanoTON).• betPool() → total TON in the current lottery pool (nanoTON).• participantCount() → number of unique participants.- Draw:• Anyone can trigger via sending any amount of TON with comment "draw".• At most once every 24h.• Requires ≥ 10 participants before allowing draw.- Payout:• 1% fee to deployer for transaction fees.• Remaining pool distributed proportionally among ~10% of participants, chosen randomly.*/import "@stdlib/deploy";const NANO_COUNT: Int = 1_000_000_000;message TransferEvent {amount: Int as int64;recipient: Address;}message EntryEvent {sender: Address;amount: Int as int64;}contract QuickLotteryTON with Deployable {const DRAW_EVERY: Int = 24 * 60 * 60; // Once every day at most.const MIN_PARTICIPANTS: Int = 10;lastDrawTime: Int;participants: map<Address, Int>;participantCount: Int;betPool: Int;deployer: Address;init() {nativeReserve(ton("1.0"), ReserveAtMost | ReserveBounceIfActionFail);self.deployer = sender();self.participantCount = 0;self.betPool = 0;self.participants = emptyMap();self.lastDrawTime = now();}receive("enter") {let amount: Int = context().value;if (amount < NANO_COUNT || amount % NANO_COUNT != 0) {self.reply("Can only enter with 1 TON or multiples of 1 TON.".asComment());return;}let sender: Address = sender();if (self.participants.exists(sender)) {self.reply("You have already entered this draw.".asComment());return;}self.participants.set(sender, amount);self.participantCount += 1;self.betPool += amount;// Emit entry eventemit(EntryEvent{sender: sender, amount: amount}.toCell());// Send confirmation message to participant with bet amountlet sb: StringBuilder = beginString();sb.append("Successfully entered the lottery draw with ");sb.append((amount / NANO_COUNT).toString());sb.append(" TON!");send(SendParameters{to: sender,bounce: false,value: 0, // No TON refundedmode: SendIgnoreErrors | SendPayFwdFeesSeparately,body: sb.toString().asComment()});}receive("draw") {// Check time since last drawlet remaining: Int = self.DRAW_EVERY - (now() - self.lastDrawTime);if (remaining > 0) {let sb: StringBuilder = beginString();sb.append("Cannot draw yet, ");sb.append(remaining.toString());sb.append(" seconds remaining until next draw.");self.reply(sb.toString().asComment());return;}if (self.participantCount < self.MIN_PARTICIPANTS) {self.reply("Not enough participants for draw.".asComment());return;}// Send 1% fee to ownerlet ownerFee: Int = self.betPool / 100;if (ownerFee > 0) {emit(TransferEvent{amount: ownerFee, recipient: self.deployer}.toCell());send(SendParameters{to: self.deployer,bounce: true,value: ownerFee,mode: SendIgnoreErrors});}// Determine prize pool and winner countlet pool: Int = self.betPool - ownerFee;let targetWinners: Int = self.participantCount / 10; // 10% winners// Select winnerslet winners: map<Address, Int> = emptyMap();let winnerCount: Int = 0;let totalWinnerWeight: Int = 0;// First pass: try to select winners with 10% chancewhile (winnerCount == 0) {foreach (adr, winnerWeight in self.participants) {if (random(1, 100) <= 10 && winnerCount < targetWinners) {winners.set(adr, winnerWeight);totalWinnerWeight += winnerWeight;winnerCount += 1;}}}// Distribute prizes proportionally to bet amountsforeach (winnerAddress, winnerWeight in winners) {let prize: Int = pool * winnerWeight / totalWinnerWeight;if (prize > 0) {// Create notification message with prize amountlet sb: StringBuilder = beginString();sb.append("Congratulations! You won ");sb.append((prize).toString());sb.append(" nanoTON in the lottery draw!");// Emit transfer eventemit(TransferEvent{amount: prize, recipient: winnerAddress}.toCell());// Send prize with notification message in a single transactionsend(SendParameters{to: winnerAddress,bounce: true,value: prize,mode: SendIgnoreErrors,body: sb.toString().asComment()});}}// Reset lotteryself.participantCount = 0;self.betPool = 0;self.participants = emptyMap();self.lastDrawTime = now();}get fun participantCount(): Int {return self.participantCount;}get fun betPool(): Int {return self.betPool;}get fun balance(): Int {return myBalance();}}





