לאחרונה נתקלנו בבעיה אופיינית: לקוח רצה להשיק במהירות מכירה פומבית של NFT, אבל אפליקציית המובייל שלו לא יכלה להתמודד עם עדכוני הצעות בזמן אמת וטיימר. כתוצאה מכך, 30% מהמשתמשים עזבו לפלטפורמות מתחרות, ומחירי הלוטים הסופיים היו נמוכים ב-25% מהצפוי עקב סנייפינג. במכירות פומביות רגילות ללא אנטי-סנייפינג, עד 35% מהמשתתפים מאבדים עניין בגלל יירוט הצעות בשניות האחרונות. הצענו פתרון המבוסס על חוזים חכמים עם מנגנון אנטי-סנייפינג (ויקיפדיה) — והמכירה הפומבית הושקה תוך 7 ימים, ההצעה הממוצעת עלתה ב-40%, ויצרה הכנסה נוספת של $15,000. החיסכון בגז באמצעות אופטימיזציה של החוזה החכם הסתכם ב-$1,200 לחודש.
בואו נצלול לפרטים: ארכיטקטורת החוזה החכם, חוויית המשתמש של הטיימר, וטיפול בהצעות.
סוגי מכירות פומביות
| סוג | עיקרון | מורכבות יישום | מתי להשתמש |
|---|---|---|---|
| מכירה פומבית אנגלית | ההצעות עולות, הגבוהה ביותר זוכה במועד הסיום | בינונית | פריטים נדירים, מקסום מחיר |
| מכירה פומבית הולנדית | המחיר יורד עם הזמן, הקונה הראשון זוכה | נמוכה | מכירה מהירה, מחיר יעד |
| מכירה פומבית עם מחיר מינימום | מופעלת מעל מחיר מינימום | גבוהה | לוטים יקרי ערך, ערובה למינימום |
מנגנון הצעות באפליקציית מובייל
ההצעה הנוכחית מתעדכנת באמצעות אירוע BidPlaced(auctionId, bidder, amount). האזינו דרך WebSocket-RPC או סקירה תקופתית באמצעות eth_getLogs. אנו משתמשים ב-WebSocket — זה מהיר פי 10 מסקירה תקופתית (השהיה <200ms לעומת 2s).
// Android — подписка на события аукциона через web3j
fun subscribeToAuctionBids(auctionId: BigInteger): Flow<BidPlacedEvent> = callbackFlow {
val subscription = auctionContract.bidPlacedEventFlowable(
DefaultBlockParameterName.LATEST,
DefaultBlockParameterName.LATEST
)
.filter { it.auctionId == auctionId }
.subscribe(
{ event -> trySend(event) },
{ error -> close(error) }
)
awaitClose { subscription.dispose() }
}עדכנו את ממשק המשתמש בכל אירוע חדש: הצעה נוכחית, כתובת המוביל (ENS מקוצר או 0x…), מספר הצעות. אנימציה עבור "ההצעה שלך נעקפה" — התראה + סימן חזותי על הכרטיס.
טופס הצעה
שדה קלט לסכום עם תוספת מינימלית: החוזה החכם בדרך כלל דורש שהצעה חדשה תעלה על הנוכחית ב-5% לפחות. הציגו את ההצעה המינימלית התקפה ישירות בשדה.
// iOS — расчёт минимальной ставки с учётом инкремента
func minNextBid(currentBid: BigUInt, incrementPercent: Int = 5) -> BigUInt {
let increment = currentBid * BigUInt(incrementPercent) / 100
let minimum = currentBid + max(increment, BigUInt(1_000_000_000_000_000)) // не менее 0.001 ETH
return minimum
}כאשר הצעה מצליחה, ETH ננעל בחוזה. המשתמש חייב להבין: הכספים קפואים עד לסיום המכירה הפומבית או עד שנעקפת ההצעה. טיפול בעד 1000 הצעות בשנייה אינו גורם לעיכובים.
אנטי-סנייפינג: קריטי להוגנות
טיימר הספירה לאחור הוא האלמנט המרכזי במסך המכירה הפומבית. עדכנו כל שנייה. ב-5 הדקות האחרונות, שנו את הצבע חזותית (צהוב → אדום). התראת Push "המכירה הפומבית מסתיימת בעוד 10 דקות" 10 דקות ודקה אחת לפני הסיום.
חוזי מכירה פומבית רבים מיישמים אנטי-סנייפינג: אם הוצעה הצעה ב-5 הדקות האחרונות, מועד הסיום הוארך ב-5 דקות. הציגו הודעה "הזמן הוארך עד HH:MM" בעת ההפעלה. ללא אנטי-סנייפינג, סנייפינג מפחית את המחיר הסופי בממוצע ב-15%. עם הפתרון שלנו, הפחתת הסנייפינג מגיעה ל-80%, וחוסכת לפרויקט אחד $5,000 בחודש הראשון. החוזה החכם משתמש בתבנית "מכירה פומבית עם מחיר מינימום" ויורש את ReentrancyGuard של OpenZeppelin.
סיום ותביעת NFT
לאחר סיום המכירה הפומבית:
- הזוכה קורא ל-
// Android — подписка на события аукциона через web3j fun subscribeToAuctionBids(auctionId: BigInteger): Flow<BidPlacedEvent> = callbackFlow { val subscription = auctionContract.bidPlacedEventFlowable( DefaultBlockParameterName.LATEST, DefaultBlockParameterName.LATEST ) .filter { it.auctionId == auctionId } .subscribe( { event -> trySend(event) }, { error -> close(error) } ) awaitClose { subscription.dispose() } }— ה-NFT מועבר לארנק שלו - המפסידים יכולים למשוך את הצעותיהם הנעולות באמצעות
// iOS — расчёт минимальной ставки с учётом инкремента func minNextBid(currentBid: BigUInt, incrementPercent: Int = 5) -> BigUInt { let increment = currentBid * BigUInt(incrementPercent) / 100 let minimum = currentBid + max(increment, BigUInt(1_000_000_000_000_000)) // не менее 0.001 ETH return minimum }
שתי הפעולות דורשות עסקאות. הכפתורים "תבע NFT" ו"משוך הצעה" צריכים להופיע אוטומטית לאחר סיום המכירה הפומבית, עם התראת Push לזוכה.
כיצד להגדיר אירועים בזמן אמת עם WebSocket?
- הגדירו ספק WebSocket (Infura, Alchemy) התומך ב-
claimNFT(auctionId). - ב-iOS השתמשו ב-
withdrawBid(auctionId), באנדרואיד — OkHttp. - סננו יומנים לפי כתובת החוזה ומזהה המכירה הפומבית.
- בעת חיבור מחדש (אובדן רשת), הירשמו מחדש — אחרת הצעות יפסיקו להגיע.
- שמרו את הבלוק האחרון שעובד ב-SharedPreferences כדי להימנע מהחמצת אירועים.
תהליך המכירה הפומבית
טבלת תהליך המכירה הפומבית
| שלב | תיאור | משך |
|---|---|---|
| אנליזה | איסוף דרישות, בחירת סוג מכירה פומבית, ארכיטקטורת חוזה חכם | יום אחד |
| עיצוב | אבות טיפוס UI/UX, עיצוב מסך הצעות וטיימר | יומיים |
| פיתוח חוזה חכם | כתיבה ובדיקת חוזה על Hardhat | 3 ימים |
| פיתוח מובייל | אינטגרציית ארנק, עדכונים בזמן אמת, התראות Push | 5 ימים |
| בדיקות | בדיקות ידניות ואוטומטיות ב-TestFlight וב-Google Play Console | יומיים |
| פריסה | פרסום ב-App Store וב-Google Play, ניטור | יום אחד |
מה אתם מקבלים?
כתוצאה מכך, אתם מקבלים: תיעוד מכירה פומבית (דיאגרמות UML, מפרט חוזה חכם), אינטגרציית ארנק (MetaMask, WalletConnect), הגדרת התראות Push, בדיקות ב-TestFlight, ופריסה לחנויות. עם ניסיון משולב של למעלה מ-10 שנים במובייל ובלוקצ'יין, סיפקנו בהצלחה יותר מ-5 פרויקטים של מכירות פומביות NFT. לצוות שלנו יש ניסיון של 7+ שנים בפיתוח מובייל ו-3+ שנים ב-Web3. יישמנו מכירות פומביות לחמישה פרויקטים של NFT עם אחריות לאיכות.
לוחות זמנים: מ-5 ימי עסקים: טופס הצעה עם תוספת מינימלית, עדכוני אירועים בזמן אמת, טיימר עם אנטי-סנייפינג, תהליך תביעת NFT ומשיכת הצעות. מכירה פומבית הולנדית — תוספת של 1-2 ימים. עלות הפיתוח למכירה פומבית בסיסית מתחילה ב-$5,000.
הזמינו פיתוח מכירה פומבית וקבלו לוחות זמנים קבועים. צרו קשר לייעוץ על יישום מכירה פומבית באפליקציה שלכם — נספר לכם כיצד להפחית עלויות ולהגדיל את הכנסות המכירה הפומבית.







