OREStats

OREStats API v1

نقاط النهاية المدفوعة تحت /api/v1/*. جميعها تتطلب Authorization: Bearer ore_…. اشترك من /pricing.

الاشتراك عبر API

  1. POST /api/v1/subscribe مع { ownerPubkey } — يُعيد الخادم nonce فريداً + مبلغ ORE.
  2. أرسل مبلغ priceOre من ORE من الخطوة 1 إلى عنوان الخزينة (يُعاد في نفس الاستجابة)، مع إرفاق nonce كتعليمة SPL Memo.
  3. PUT /api/v1/subscribe مع { nonce, txSig, ownerPubkey } — يتحقق الخادم على السلسلة، يفعّل الاشتراك، يُعيد مفتاح API.
  4. استخدم Authorization: Bearer ore_… ترويسة في كل استدعاءات /api/v1/*.

تفاصيل الدفع

محفظة الخزينة: A9HLwE6wCm7Hedo7771nwsX8TyArv7rgdVQMo9dgDGZF
ORE mint: oreoU2P8bN6jkk3jbaiVxYnG1dCXcYxwhwyK9jSybcp
الشبكة: Solana mainnet-beta
GET/api/v1/pricingعام

الغرض: السعر الحالي (بـ ORE) لشهر واحد من الوصول. يتصاعد السعر مع انضمام مزيد من المشتركين — تخبرك الاستجابة أيضاً بالعتبة التالية والسعر بعدها.

الاستجابة:
{
  "activeSubs": 17,
  "oreNow": 0.1,
  "nextThreshold": 100,
  "oreAtNextThreshold": 0.2,
  "treasury": "...",
  "oreMint": "..."
}
POST/api/v1/subscribeعام

الغرض: الخطوة 1 من الاشتراك. تُعيد تعليمة تحويل SPL تستخدم مرة واحدة (memo + المبلغ) يجب عليك توقيعها بمحفظة المالك وبثها على Solana.

المعاملات:
  • ownerPubkeySolana pubkey بصيغة base58 سيمتلك مفتاح API
جسم الطلب:
{ "ownerPubkey": "..." }
الاستجابة:
{
  "nonce": "ore-pay-...",
  "priceOre": 0.1,
  "instructions": { "to": "...", "memo": "ore-pay-...", "amountBaseUnits": "10000000000", "mint": "..." },
  "expiresAt": "..."
}
PUT/api/v1/subscribeعام

الغرض: الخطوة 2 من الاشتراك. بعد تأكيد تحويل SPL، أرسل توقيع المعاملة لإصدار مفتاح API. النص الصريح للمفتاح يُعرض مرة واحدة.

المعاملات:
  • nonceالقيمة المُعادة من POST /subscribe
  • txSigتوقيع تحويل SPL المؤكَّد الذي يحمل memo من الخطوة 1
  • ownerPubkeyيجب أن تطابق المحفظة التي دفعت (والمُمررة إلى POST)
جسم الطلب:
{ "nonce": "...", "txSig": "...", "ownerPubkey": "..." }
الاستجابة:
{
  "apiKey": "ore_xxx (shown ONCE)",
  "subscriberId": "sub_...",
  "paidUntil": "..."
}
GET/api/v1/liveمدفوع (Bearer)

الغرض: لقطة الجولة الحالية — ما تحتوي عليه كل خانة الآن، الثواني المتبقية، ونتيجة الجولة الأخيرة. رخيصة؛ آمنة للاستعلام كل 1-2 ث.

الاستجابة:
لقطة الجولة الحالية (deployed, count, secondsLeft, prevRound)
GET/api/v1/streamمدفوع (Bearer)

الغرض: تدفق SSE لـ /live. يدفع لقطة جديدة كلما تغير حساب board أو round على السلسلة. أعد الاتصال في أي وقت — الحدث التالي هو دائماً أحدث حالة.

الاستجابة:
أحداث يرسلها الخادم؛ تدفع لقطة عند كل تغيير في حساب board / round على السلسلة
GET/api/v1/statsمدفوع (Bearer)

الغرض: إحصاءات شبكة مجمَّعة: مربع كاي على الإصابات التراكمية، عدد الإصابات و SOL المنشور لكل خانة، إجمالي SOL المنشور على الإطلاق، حصة البيت الفعلية.

الاستجابة:
مجمَّعة (chi-squared, perGrid, totalDeployedSol, effectiveHouseEdge)
GET/api/v1/rounds?limit=100مدفوع (Bearer)

الغرض: آخر N جولة مفهرسة، الأحدث أولاً. استخدم هذه للاستيعاب المجمَّع؛ ولتنبيهات الجولات الجديدة بزمن استجابة منخفض استخدم /events/stream.

المعاملات:
  • limitعدد الجولات المُعادة؛ الافتراضي 100، الأقصى 10000
الاستجابة:
آخر N جولة مفهرسة (id, deployed[25], count[25], winningSquare, totalDeployed, totalWinnings)
GET/api/v1/rounds/{id}مدفوع (Bearer)

الغرض: تفاصيل جولة واحدة مع معرّفات prev/next للتنقل بمؤشر عبر التاريخ.

المعاملات:
  • idمعرّف الجولة (مقطع المسار)
الاستجابة:
جولة واحدة + معرّفات prev/next
GET/api/v1/grid/{n}?limit=200مدفوع (Bearer)

الغرض: إحصاءات لكل خانة بالإضافة إلى سلسلة الإصابات/الإخفاقات الأخيرة (1 = إصابة، 0 = إخفاق) لرسم المخططات.

المعاملات:
  • nفهرس الخانة 0..24 (مقطع المسار)
  • limitطول السلسلة؛ الافتراضي 200
الاستجابة:
إحصاء لكل خانة + سلسلة الإصابات/الإخفاقات الأخيرة (1 ≤ n ≤ 25)
GET/api/v1/events?since=N&limit=M&kind=Xمدفوع (Bearer)

الغرض: سجل أحداث بالاستعلام الدوري. يشمل drought-broken وbig-round وعبور الدرجات والمعالم وتغيرات الاشتراك. اسحب الأحداث الأحدث من مؤشر `since`.

المعاملات:
  • sinceمؤشر معرّف؛ تُعاد فقط الأحداث ذات id > since
  • limitأقصى عدد للأحداث في الاستدعاء؛ الافتراضي 100
  • kindمرشّح اختياري: drought_broken | big_round | tier | milestone | subscription
الاستجابة:
{
  "count": 12,
  "lastId": 47,
  "events": [
    { "id": 47, "ts": "...", "kind": "drought_broken", "grid": 8, "drought": 91, "roundId": 247101 },
    { "id": 48, "ts": "...", "kind": "big_round", "roundId": 247155, "deployedSol": 8.94, "thresholdSol": 8.15, "multiplier": 1.10, "winningSquare": 12, "totalMiners": 209 },
    ...
  ]
}
GET/api/v1/events/stream?since=N&kind=Xمدفوع (Bearer)

الغرض: تدفق SSE لنفس سجل أحداث /events. يُعيد بث آخر 50 حدثاً (أو الأحداث منذ المؤشر) عند الاتصال، ثم يدفع كل حدث جديد مباشرةً.

المعاملات:
  • sinceمؤشر إعادة بث اختياري؛ إن حُذف، تُعاد آخر 50
  • kindمرشّح اختياري (نفس مجموعة /events)
الاستجابة:
server-sent events; replays last 50 (or events since cursor) on connect, then pushes each new event as it fires (drought / streak / big round / tier / milestone / subscription).
GET/api/v1/dump?from=X&to=Y&limit=10000مدفوع (Bearer)

الغرض: تصدير تاريخي مجمَّع — تصفّح كل الجولات المفهرسة عبر مؤشرات `from` / `nextFrom`. استخدم هذه لبدء قاعدة بياناتك الخاصة، ثم انتقل إلى /events/stream للتحديثات التدريجية.

المعاملات:
  • fromمعرّف الجولة الابتدائية (شامل)
  • toمعرّف الجولة الختامية (اختياري، شامل)
  • limitحجم الصفحة؛ الافتراضي 5000، الأقصى 10000
الاستجابة:
{
  "count": 5000,
  "from": 228237,
  "to": 233236,
  "hasMore": true,
  "nextFrom": 233237,
  "rounds": [ { id, deployed[25], count[25], winningSquare, totalDeployed, totalWinnings }, ... ]
}
POST/api/v1/reissueعام

الغرض: الخطوة 1 من تدوير مفتاح API. تُعيد رسالة يجب عليك توقيعها بالمحفظة التي تملك الاشتراك الفعّال.

المعاملات:
  • ownerPubkeyالمحفظة التي اشتركت أصلاً
جسم الطلب:
{ "ownerPubkey": "..." }
الاستجابة:
{ "nonce": "ore-reissue-...", "message": "OREStats reissue ... @ ...", "expiresAt": "..." }
PUT/api/v1/reissueعام

الغرض: الخطوة 2 من التدوير. أرسل توقيع المحفظة؛ يُلغى المفتاح القديم فوراً ويُعاد مفتاح جديد (يُعرض أيضاً مرة واحدة).

المعاملات:
  • nonceالقيمة المُعادة من POST /reissue
  • ownerPubkeyنفس المحفظة في POST
  • signatureBase64توقيع ed25519 مُرمَّز base64 لنص الرسالة
جسم الطلب:
{ "nonce": "...", "ownerPubkey": "...", "signatureBase64": "..." }
الاستجابة:
{ "apiKey": "ore_xxx (NEW, old key revoked)", "subscriberId": "sub_...", "paidUntil": "..." }

مختبر الاستراتيجيات

ابنِ واختبر رجعياً وأمامياً استراتيجيات معاملاتية. نقاط نهاية create / backtest / analytics تتشارك شكل DSL واحداً — راجع مرجع القيم في أسفل هذا القسم.

POST/api/v1/lab/strategiesمدفوع (Bearer)

الغرض: أنشئ استراتيجية. بمجرد تفعيلها، يسجل OREStats تلقائياً تنبؤاً للتداول الورقي عند كل جولة جديدة ويعرض إحصاءات الاختبار الأمامي.

المعاملات:
  • nameتسمية للعرض، سلسلة غير فارغة
  • dslDSL استراتيجية كامل — base_strategy و params و filters[] اختياري. راجع مرجع القيم أدناه.
جسم الطلب:
{
  "name": "my cold-5",
  "dsl": {
    "base_strategy": "cold",
    "params": {
      "bet_size_lamports": 200000,
      "num_squares": 5,
      "sizing_mode": "flat",
      "max_bet_per_square_lamports": 5000000,
      "tx_fee_lamports": 10000
    },
    "filters": [
      { "metric": "current_drought_min", "op": ">=", "value": 30 }
    ]
  }
}
الاستجابة:
{
  "strategy": {
    "id": "...", "owner": "...", "name": "...",
    "dsl": { "base_strategy": "...", "params": { ... }, "filters": [ ... ] },
    "createdAt": "...", "updatedAt": "...", "active": true
  }
}
GET/api/v1/lab/strategiesمدفوع (Bearer)

الغرض: اعرض قائمة باستراتيجياتك مع إحصاءات اختبار أمامي حية (الجولات المسوّاة، عدد الفوز، ROI على نتائج جولات حقيقية).

الاستجابة:
{
  "count": 3,
  "strategies": [
    {
      "id": "...", "name": "...", "dsl": { ... }, "active": true,
      "stats": { "roundsSettled": 412, "roundsWon": 88, "netProfitSol": 0.123, "roiPercent": 4.7 }
    },
    ...
  ]
}
GET/api/v1/lab/strategies/{id}مدفوع (Bearer)

الغرض: اجلب استراتيجية واحدة تملكها، مع عدد تنبؤاتها.

المعاملات:
  • idمعرّف الاستراتيجية (مقطع المسار)
الاستجابة:
{ "strategy": { ... }, "predictionCount": 412 }
PATCH/api/v1/lab/strategies/{id}مدفوع (Bearer)

الغرض: أعد تسمية استراتيجية أو بدّل علم تفعيلها. الاستراتيجيات غير المفعَّلة تتوقف عن التنبؤ بالجولات الجديدة لكن تاريخها محفوظ.

المعاملات:
  • nameاسم العرض الجديد (اختياري)
  • activetrue لاستئناف التنبؤ، false للإيقاف (اختياري)
جسم الطلب:
{ "name": "renamed", "active": false }
الاستجابة:
{ "strategy": { ... } }
DELETE/api/v1/lab/strategies/{id}مدفوع (Bearer)

الغرض: حذف نهائي لاستراتيجية تملكها. تُحذف كل التنبؤات المرتبطة؛ ويختفي إدخال لوحة المتصدرين (إن وُجد).

المعاملات:
  • idمعرّف الاستراتيجية (مقطع المسار)
الاستجابة:
{ "ok": true }
GET/api/v1/lab/strategies/{id}/forwardمدفوع (Bearer)

الغرض: إحصاءات الاختبار الأمامي لاستراتيجية واحدة: صافي SOL، ROI، معدل الفوز، منحنى الأسهم، أقصى تراجع، أطول سلسلة خسارة، الجولات المعلَّقة.

المعاملات:
  • idمعرّف الاستراتيجية (مقطع المسار)
الاستجابة:
{
  "strategyId": "...",
  "roundsObserved": 432,
  "roundsBet": 412, "roundsWon": 88,
  "squaresBet": 2060, "squaresWon": 92,
  "netProfitSol": 0.12, "totalStakeSol": 2.6,
  "roiPercent": 4.7, "winRate": 0.21, "perSquareWinRate": 0.045,
  "maxDrawdownSol": 0.08, "maxStreak": 12,
  "equityCurve": [{ "round": 247001, "balanceLamports": 0 }, ...],
  "pendingCount": 1
}
POST/api/v1/lab/backtestمدفوع (Bearer)

الغرض: أعد تشغيل DSL على الجولات التاريخية المفهرسة. تُعيد BacktestResult كاملاً يشمل PnL لكل جولة، ومساهمة كل خانة، ومنحنى الأسهم، وسبب الخروج المبكر.

المعاملات:
  • dslDSL الاستراتيجية (نفس شكل create)
  • fromRoundIdحد أدنى شامل اختياري لنافذة الإعادة
  • toRoundIdحد أعلى شامل اختياري
جسم الطلب:
{
  "dsl": { "base_strategy": "...", "params": { ... }, "filters": [ ... ] },
  "fromRoundId": 200000,
  "toRoundId": 247000
}
الاستجابة:
{
  "result": {
    "totalRounds": 47000, "roundsBet": 9200, "roundsWon": 1800,
    "squaresBet": 46000, "squaresWonOn": 1900,
    "netProfitLamports": ..., "netProfitSol": ...,
    "totalStakeLamports": ..., "totalStakeSol": ...,
    "totalRecoveryLamports": ..., "totalRecoverySol": ...,
    "roiPercent": ..., "winRate": ..., "perSquareWinRate": ...,
    "maxStreak": ..., "capHits": ..., "totalCapLossSol": ...,
    "minWalletSol": ..., "maxDrawdownSol": ...,
    "rangeMin": 200000, "rangeMax": 247000,
    "exitedEarly": null,
    "exitRoundId": 0,
    "equityCurve":   [{ "round": ..., "balanceLamports": ... }, ...],
    "perSquare":     [{ "square": 0, "betCount": ..., "winCount": ..., "netLamports": ... }, ...],
    "perRoundPnlLamports": [...],
    "streakRunLengths":    [...]
  }
}
POST/api/v1/lab/analyticsمدفوع (Bearer)

الغرض: حزمة تحليلات ثقيلة — فترات ثقة مونتي كارلو زائد أربعة اختبارات رجعية متداخلة عبر مسوحات للمعاملات. توقّع 3-6 ث في الاستدعاء الأول، أقل من ثانية في الذاكرة المؤقتة الدافئة. مفتاح التخزين هو DSL.

المعاملات:
  • dslDSL الاستراتيجية (نفس شكل backtest)
جسم الطلب:
{ "dsl": { ... } }
الاستجابة:
{ "analytics": { ... } }
GET/api/v1/lab/leaderboardعام

الغرض: قائمة أفضل الاستراتيجيات العامة. يُكشف فقط ROI / حجم العينة؛ يُخفى DSL حتى يعرض المشترك نقطة نهاية التفاصيل.

الاستجابة:
{
  "generatedAt": "...",
  "minRoundsToQualify": 1000,
  "count": 14,
  "entries": [
    { "id": "...", "name": "...", "ownerShort": "abcd...wxyz", "roiPercent": ..., "roundsSettled": ... },
    ...
  ]
}
GET/api/v1/lab/leaderboard/{id}مدفوع (Bearer)

الغرض: DSL كامل لإدخال واحد من لوحة المتصدرين، بالإضافة إلى ملخص اختباره الأمامي ومنحنى أسهمه. مُتاح للمشتركين — المستخدمون العموميون لا يرون سوى ROI الرئيسي.

المعاملات:
  • idمعرّف الاستراتيجية (مقطع المسار)
الاستجابة:
{
  "strategy": {
    "id": "...", "name": "...", "ownerShort": "abcd...wxyz",
    "dsl": { ... },
    "createdAt": "..."
  },
  "forwardTest": {
    "roundsSettled": ...,
    "netProfitSol": ...,
    "equityCurve": [{ "round": ..., "balanceLamports": ... }, ...]
  }
}

DSL الاستراتيجية — القيم المقبولة

base_strategy cold, spread, drought, custom_squares, hot, top_hit_rate, bottom_hit_rate, recent_winners, anti_spread, min_miners, corners, edges, center_block, diagonal_main, diagonal_anti, row, column, checkerboard, all_25

params.sizing_mode flat, martingale, reverse_martingale, fibonacci, dalembert, kelly

filters[].metric rounds_since_last_big, consecutive_losses, current_drought_min, current_drought_max, total_deployed_pctile, total_miners, rounds_since_big_round, chi_square_p_recent

filters[].op < , <= , > , >= , ==

نطاقات params.* العددية (يُقيّد الخادم القيم خارج النطاق):
  bet_size_lamports             required, (0, 1e8]
  num_squares                   1..25
  drought_threshold             1..1000
  custom_squares                int[] in 0..24
  hit_rate_lookback             50..20000
  row_index, column_index       0..4
  martingale_multiplier         1..10
  loss_streak_threshold         1..100
  dalembert_step_lamports       1..1e6
  kelly_fraction                0.0001..1
  kelly_bankroll_lamports       >= 1
  max_bet_per_square_lamports   1..1e8
  tx_fee_lamports               0..1e7
  stop_loss_streak              1..1000
  cooldown_after_loss_rounds    0..500
  take_profit_lamports          >= 0
  session_stop_loss_lamports    >= 0

الحصص:
  max 100 strategies per account

الحدود والاستخدام العادل

  • لكل مفتاح API: 5 طلبات/ث (دفعة 60). 429 مع Retry-After عند التجاوز.
  • مفتاح API في الترويسة نصّ صريح يُستخدم مرة واحدة: احفظه — لا يُحفظ لدينا سوى التجزئة.
  • مشاركة المفاتيح قابلة للكشف (IPs متزامنة) وقد تستدعي الإلغاء.
  • نقاط نهاية لوحة المعلومات (/api/live*) تتطلب جلسة متصفح + تطابق Origin — ليست للاستخدام البرمجي.