خلاصه
کوییک لاتاری TON یک قرارداد هوشمند ساده روی بلاکچین TON است. شرکتکنندگان با ارسال دستور enter و پرداخت ۱ یا چند TON (مقادیر صحیح، بدون اعشار) وارد قرعهکشی میشوند.
پس از اینکه ۱۰+ نفر وارد شدند و ۲۴ ساعت گذشت، هر شرکتکنندهای میتواند دستور draw را اجرا کند. حدود ۱۰٪ از شرکتکنندگان به طور تصادفی انتخاب شده و پاداش بین آنها تقسیم میشود.
تمام!
کد منبع را میتوانید در پایین مشاهده کنید (مشاهده کد).
نحوه ورود
برای ورود به قرعهکشی کافی است ۱ TON (یا ۲، ۳، ۴ و ...) به آدرس قرارداد
EQCsihC1Z6fHRsFbz9N3sCHC6sUfvnlz4RbelethC-6Q34y6
کپی شد!
با کامنت enter ارسال کنید (دقیقاً همین کلمه، بدون فاصله و با حروف کوچک).

پاسخها
اگر مقداری شامل اعشار ارسال کنید (مثلاً ۱.۰۰۲ 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!
قرعهکشی
در هر دور تنها یک نفر باید قرعهکشی را اجرا کند. معمولاً نیازی به این کار نیست و خودکار انجام میشود. فقط کافیست وارد شوید و ۲۴ ساعت منتظر نتایج بمانید!
اگر میخواهید قرعهکشی را انجام دهید، حداقل ۰.۰۵ TON (بسته به تعداد شرکتکنندگان، برای هزینه گس کافی) به آدرس قرارداد
EQCsihC1Z6fHRsFbz9N3sCHC6sUfvnlz4RbelethC-6Q34y6
کپی شد!
با کامنت draw ارسال کنید.
اگر قرعهکشی قبلی کمتر از ۲۴ ساعت پیش بوده باشد، پول بازگردانده میشود با پیام Cannot draw yet, X seconds remaining until next draw.
اگر کمتر از ۱۰ نفر وارد شده باشند، پول بازگردانده میشود با پیام Not enough participants for draw.
در غیر این صورت، حدود ۱۰٪ از شرکتکنندگان به طور تصادفی انتخاب و جایزه بین آنها تقسیم میشود. ۱٪ کارمزد به عنوان هزینه گس نگه داشته میشود.
برنده پیام زیر را همراه با جایزه دریافت میکند: Congratulations! You won 10000000000 nanoTON in the lottery draw!
متدها
در Verifier یا TonViewer میتوانید متدهای خواندن قرارداد را فراخوانی کنید. متدهای موجود:
getBetPool(): مجموع nanoTONهای موجود در استخر فعلی را باز میگرداند.getParticipantCount(): تعداد کل شرکتکنندگان دور جاری را باز میگرداند.
خروجی به صورت هگز است و باید به دهدهی تبدیل شود.
کد منبع
این کد همچنین در 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();}}





