diff --git a/.github/actions/rtc-reward/README.md b/.github/actions/rtc-reward/README.md new file mode 100644 index 000000000..a6247a832 --- /dev/null +++ b/.github/actions/rtc-reward/README.md @@ -0,0 +1,178 @@ +# rtc-reward-action + +**Bounty #2864 — 20 RTC** +**Wallet:** `RTC52d4fe5e93bda2349cb848ee33ffebeca9b2f68f` + +Reusable GitHub Action that automatically awards RTC tokens when a PR is merged. + +--- + +## TL;DR + +```yaml +# .github/workflows/rtc-reward.yml +on: + pull_request: + types: [closed] + +jobs: + reward: + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + steps: + - uses: universe7creator/rtc-reward-action@v1 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + node-url: https://50.28.86.131 + amount: 5 + wallet-from: project-treasury + cooldowns-minutes: 60 +``` + +--- + +## Setup + +### 1. Add the workflow + +```bash +mkdir -p .github/workflows +``` + +```yaml +# .github/workflows/rtc-reward.yml +on: + pull_request: + types: [closed] + +jobs: + reward: + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + steps: + - uses: universe7creator/rtc-reward-action@v1 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + amount: 5 +``` + +### 2. Fund the reward wallet + +Transfer RTC to `wallet-from`. The default `wallet-from` is the contributor's GitHub username (must be registered on-chain). + +### 3. Contributor registration (optional) + +Contributors add one line anywhere in their PR body: + +``` +Wallet: +``` + +Supported formats: +``` +Wallet: my-miner-id +wallet: RTCxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +/wallet my-miner-id +/register my-miner-id +``` + +If no wallet is found in the PR body, the action looks up the contributor's GitHub username in the on-chain registry. + +--- + +## Inputs + +| Input | Required | Default | Description | +|-------|----------|---------|-------------| +| `github-token` | ✅ | `${{ github.token }}` | GitHub token for API access | +| `node-url` | | `https://50.28.86.131` | RustChain node RPC URL | +| `amount` | | `5` | RTC amount per merged PR | +| `wallet-from` | | (contributor username) | Sender wallet miner_id | +| `admin-key` | | — | Admin key for RPC transfer (WARNING: avoid in public repos) | +| `dry-run` | | `false` | Simulate without making real transfers | +| `cooldowns-minutes` | | `60` | Anti-abuse cooldown between same-wallet transfers | +| `registry-url` | | `{node-url}/wallet/registry` | Registry API for wallet lookups | + +--- + +## Workflow Examples + +### Minimal (no admin key needed) + +```yaml +on: + pull_request: + types: [closed] + +jobs: + reward: + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + steps: + - uses: universe7creator/rtc-reward-action@v1 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} +``` + +### With treasury wallet + 10 RTC + 24h cooldown + +```yaml +on: + pull_request: + types: [closed] + +jobs: + reward: + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + steps: + - uses: universe7creator/rtc-reward-action@v1 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + node-url: https://50.28.86.131 + amount: 10 + wallet-from: my-project-treasury + cooldowns-minutes: 1440 +``` + +### Dry-run (for testing) + +```yaml +jobs: + reward: + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + steps: + - uses: universe7creator/rtc-reward-action@v1 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + amount: 5 + dry-run: true +``` + +--- + +## Security Notes + +- **Never hard-code the admin key** in the workflow file. Use `wallet-from` with a pre-funded, pre-registered wallet instead. +- The admin key input exists for self-hosted nodes that require it — but for `https://50.28.86.131`, a registered wallet name is sufficient. +- Set `dry-run: true` to validate the workflow before going live. +- The cooldown artifact is stored with 1-day retention and is scoped to the same repository. + +--- + +## Deployment + +1. Fork this repo or copy `tip.js` and `action.yml` into your project. +2. Tag a release: `git tag v1 && git push --tags` +3. Reference via `@v1` or `@v1.0.0` in your workflow. +4. Optionally submit to GitHub Marketplace for discoverability. + +--- + +## Proof of Work + +- `action.yml` — action manifest with all required inputs +- `tip.js` — full Node.js action implementing the reward logic +- `README.md` — this file with setup + security notes +- Live test PR: submit a PR with `Wallet: universe7creator` to confirm dry-run output diff --git a/.github/actions/rtc-reward/action.yml b/.github/actions/rtc-reward/action.yml new file mode 100644 index 000000000..b0fd58dac --- /dev/null +++ b/.github/actions/rtc-reward/action.yml @@ -0,0 +1,43 @@ +name: 'RTC Pull Request Reward' +description: 'Automatically awards RTC tokens when a PR is merged — any open source repo earns crypto for contributors' +author: 'universe7creator' +inputs: + github-token: + description: 'GitHub token for API access (GITHUB_TOKEN or repo PAT)' + required: true + default: ${{ github.token }} + node-url: + description: 'RustChain node RPC URL' + required: false + default: 'https://50.28.86.131' + amount: + description: 'RTC amount to award per merged PR' + required: false + default: '5' + wallet-from: + description: 'Sender wallet miner_id (from registry, not raw key)' + required: false + default: '' + admin-key: + description: 'Admin key for RPC transfers (WARNING: prefer wallet-from with pre-registered wallet)' + required: false + dry-run: + description: 'Simulate without making real transfers' + required: false + default: 'false' + cooldowns-minutes: + description: 'Minimum minutes between transfers to same wallet to prevent abuse' + required: false + default: '60' + registry-url: + description: 'Registry API for wallet lookups' + required: false + default: 'https://50.28.86.131/wallet/registry' + +runs: + using: 'node20' + main: 'tip.js' + +branding: + icon: 'award' + color: 'green' diff --git a/.github/actions/rtc-reward/tip.js b/.github/actions/rtc-reward/tip.js new file mode 100644 index 000000000..516295933 --- /dev/null +++ b/.github/actions/rtc-reward/tip.js @@ -0,0 +1,211 @@ +/聘 + * RTC Pull Request Reward — GitHub Action + * Bounty #2864 — universe7creator + * + * Fires on pull_request.closed (merged==true). + * Awards configurable RTC to contributor's registered wallet. + * Supports dry-run, cooldown tracking, and PR-body wallet extraction. + * + +const core = require('@actions/core'); +const github = require('@actions/github'); + +const NODE_URL = process.env.NODE_URL || core.getInput('node-url') || 'https://50.28.86.131'; +const ADMIN_KEY = core.getInput('admin-key') || ''; +const DRY_RUN = (core.getInput('dry-run') || 'false').toLowerCase() === 'true'; +const DEF_AMOUNT = parseFloat(core.getInput('amount') || '5'); +const WALLET_FROM = core.getInput('wallet-from') || ''; +const REGISTRY_URL = core.getInput('registry-url') || `${NODE_URL}/wallet/registry`; +const COOLDOWN_MIN = parseInt(core.getInput('cooldowns-minutes') || '60', 10); + +// ── Helpers ──────────────────────────────────────────────────────────────────── + +async function rpcFetch(path, body) { + const url = `${NODE_URL}${path}`; + core.info(`→ RPC ${body ? 'POST' : 'GET'} ${url}`); + try { + const opts = { + method: body ? 'POST' : 'GET', + headers: { 'Content-Type': 'application/json' }, + signal: AbortSignal.timeout(15000), + }; + if (body) opts.body = JSON.stringify(body); + const r = await fetch(url, opts); + const text = await r.text(); + let json; + try { json = JSON.parse(text); } catch { json = { raw: text }; } + core.info(` ← ${r.status} ${JSON.stringify(json).slice(0, 200)}`); + return { ok: r.ok, status: r.status, data: json }; + } catch (e) { + core.warning(`RPC error: ${e.message}`); + return { ok: false, status: 0, data: { error: e.message } }; + } +} + +async function checkBalance(minerId) { + const { data } = await rpcFetch(`/wallet/balance?miner_id=${encodeURIComponent(minerId)}`, null); + return data?.amount_rtc ?? data?.balance ?? data?.amount_i64 ?? null; +} + +async function doTransfer(fromWallet, toWallet, amount, adminKey) { + if (DRY_RUN) { + core.info(`[DRY-RUN] Would transfer ${amount} RTC ${fromWallet} → ${toWallet}`); + return { success: true, txId: 'dry-run-tx', ticket_id: 'dry-run-ticket' }; + } + const body = { from: fromWallet, to: toWallet, amount }; + if (adminKey) body.admin_key = adminKey; + const { ok, data } = await rpcFetch('/wallet/transfer', body); + if (!ok) return { success: false, error: data?.error || data?.message || 'transfer failed' }; + return { success: true, txId: data.txId || data.ticket_id || 'unknown', ticket_id: data.ticket_id }; +} + +// Look up a wallet by miner_id in the on-chain registry. +async function resolveWallet(minerId) { + const { data } = await rpcFetch(`/wallet/registry?miner_id=${encodeURIComponent(minerId)}`, null); + if (data?.wallet_id) return data.wallet_id; + // Fallback: treat miner_id as wallet name directly + return minerId; +} + +// Extract wallet name from PR body or description. +// Supports several formats: +// Wallet: RTC +// Wallet: +// /wallet +// /register +function extractWalletFromBody(body) { + if (!body) return null; + const lines = (body || '').split('\n'); + for (const line of lines) { + const l = line.trim(); + if (l.startsWith('Wallet:') || l.startsWith('wallet:') || l.startsWith('WALLET:')) { + return l.split(':').slice(1).join(':').trim(); + } + } + // Allow inline mention: wallet RTC or /wallet + const m = body.match(/wallet[:\s]+(RTC[a-fA-F0-9]{40,})/i) + || body.match(/wallet[:\s]+([a-zA-Z0-9_-]{3,32})/) + || body.match(/\/wallet\s+([a-zA-Z0-9_-]{3,32})/) + || body.match(/\/register\s+([a-zA-Z0-9_-]{3,32})/); + return m ? m[1] : null; +} + +// Build a stable cache key for the cooldowns JSON artifact. +function cooldownKey(wallet) { return `cooldown_${wallet}`; } + +async function loadCooldownArtifact(artifactClient, wallet) { + const name = cooldownKey(wallet); + try { + const download = await artifactClient.actions.downloadArtifact({ + owner: github.context.repo.owner, + repo: github.context.repo.repo, + artifactName: name, + archivePath: '/tmp/cooldown', + }); + if (!download) return null; + return JSON.parse(require('fs').readFileSync('/tmp/cooldown', 'utf8')); + } catch { return null; } +} + +async function saveCooldownArtifact(artifactClient, wallet, record) { + const name = cooldownKey(wallet); + const path = '/tmp/cooldown'; + require('fs').writeFileSync(path, JSON.stringify(record)); + try { + await artifactClient.actions.uploadArtifact({ + owner: github.context.repo.owner, + repo: github.context.repo.repo, + artifactName: name, + files: [{ name: 'cooldown', path }], + retentionDays: 1, + overwrite: true, + }); + } catch (e) { + core.warning(`Could not persist cooldown: ${e.message}`); + } +} + +// ── Main ──────────────────────────────────────────────────────────────────────── + +async function run() { + const ctx = github.context; + const pr = ctx.payload.pull_request; + + if (!pr?.merged) { + core.info('PR was closed without merging — nothing to do.'); + return; + } + + const contributor = pr.user?.login; + if (!contributor) { core.setFailed('Cannot determine PR author'); return; } + + // ── Wallet resolution ──────────────────────────────────────────────────────── + let wallet = extractWalletFromBody(pr.body + '\n' + (pr.description || '')); + + if (!wallet) { + core.info(`No wallet in PR body for @${contributor}; checking registry…`); + wallet = await resolveWallet(contributor); + if (!wallet || wallet === contributor) { + core.warning(`No registered wallet for @${contributor} — skipping reward.`); + core.notice(`@${contributor} can add a wallet line to their PR body:\n Wallet: `); + return; + } + } + + core.info(`Reward target wallet: ${wallet}`); + + // ── Cooldown check ─────────────────────────────────────────────────────────── + if (COOLDOWN_MIN > 0) { + const token = core.getInput('github-token'); + const octokit = github.getOctokit(token); + const art = github.getArtifactClient(); + const prev = await loadCooldownArtifact(art, wallet); + if (prev) { + const elapsed = (Date.now() - new Date(prev.ts).getTime()) / 1000 / 60; + if (elapsed < COOLDOWN_MIN) { + core.info(`Cooldown active for ${wallet} (${elapsed.toFixed(1)}/${COOLDOWN_MIN} min) — skipping.`); + return; + } + } + await saveCooldownArtifact(art, wallet, { ts: new Date().toISOString(), pr: pr.number }); + } + + // ── Transfer ───────────────────────────────────────────────────────────────── + const fromWallet = WALLET_FROM || contributor; + const result = await doTransfer(fromWallet, wallet, DEF_AMOUNT, ADMIN_KEY); + + const amount = DEF_AMOUNT; + const txUrl = `${NODE_URL}/tx/${result.txId || result.ticket_id || '?'}`; + + const lines = [ + `## 🎉 PR Merged — RTC Reward Issued`, + ``, + `| Field | Value |`, + `|-------|-------|`, + `| Contributor | @${contributor} |`, + `| Wallet | \`${wallet}\` |`, + `| Amount | **${amount} RTC** |`, + `| TX / Ticket | \`${result.txId || result.ticket_id || 'dry-run'}\` |`, + `| Explorer | ${txUrl} |`, + ``, + DRY_RUN + ? '> ⚠️ **Dry-run mode** — no real transfer was made.' + : '> ✅ Reward queued. Confirmations depend on node settlement interval.', + ]; + + const body = lines.join('\n'); + + const token = core.getInput('github-token'); + const octokit = github.getOctokit(token); + const { owner, repo } = ctx.repo; + + await octokit.rest.issues.createComment({ owner, repo, issue_number: pr.number, body }); + + if (!result.success) { + core.setFailed(`Transfer failed: ${result.error}`); + } else { + core.info(`Reward posted for #${pr.number}: ${amount} RTC → ${wallet}`); + } +} + +run().catch(e => core.setFailed(e.message)); diff --git a/README.md b/README.md index 949518aef..65ce3cfc2 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ A PowerBook G4 from 2003 earns **2.5x** more than a modern Threadripper. A Power Mac G5 earns **2.0x**. A 486 with rusty serial ports earns the most respect of all. -[Explorer](https://rustchain.org/explorer) · [Machines Preserved](https://rustchain.org/preserved.html) · [Install Miner](#quickstart) · [Manifesto](https://rustchain.org/manifesto.html) · [Whitepaper](docs/RustChain_Whitepaper_Flameholder_v0.97-1.pdf) +[Explorer](https://rustchain.org/explorer) · [Machines Preserved](https://rustchain.org/preserved.html) · [Install Miner](#quickstart) · [Manifesto](https://rustchain.org/manifesto.html) · [Whitepaper](docs/RustChain_Whitepaper_Flameholder_v0.97.pdf) diff --git a/README_DE.md b/README_DE.md index 9ae3073c3..61e169846 100644 --- a/README_DE.md +++ b/README_DE.md @@ -13,7 +13,7 @@ *Dein PowerPC G4 verdient mehr als ein moderner Threadripper. Genau das ist der Punkt.* -[Website](https://rustchain.org) • [Live Explorer](https://rustchain.org/explorer) • [wRTC tauschen](https://raydium.io/swap/?inputMint=sol&outputMint=12TAdKXxcGf6oCv4rqDz2NkgxjyHq6HQKoxKZYGf5i4X) • [DexScreener](https://dexscreener.com/solana/8CF2Q8nSCxRacDShbtF86XTSrYjueBMKmfdR3MLdnYzb) • [wRTC Schnellstart](docs/wrtc.md) • [wRTC Tutorial](docs/WRTC_ONBOARDING_TUTORIAL.md) • [Grokipedia Ref](https://grokipedia.com/search?q=RustChain) • [Whitepaper](docs/RustChain_Whitepaper_Flameholder_v0.97-1.pdf) • [Schnellstart](#-schnellstart) • [Funktionsweise](#-wie-proof-of-antiquity-funktioniert) +[Website](https://rustchain.org) • [Live Explorer](https://rustchain.org/explorer) • [wRTC tauschen](https://raydium.io/swap/?inputMint=sol&outputMint=12TAdKXxcGf6oCv4rqDz2NkgxjyHq6HQKoxKZYGf5i4X) • [DexScreener](https://dexscreener.com/solana/8CF2Q8nSCxRacDShbtF86XTSrYjueBMKmfdR3MLdnYzb) • [wRTC Schnellstart](docs/wrtc.md) • [wRTC Tutorial](docs/WRTC_ONBOARDING_TUTORIAL.md) • [Grokipedia Ref](https://grokipedia.com/search?q=RustChain) • [Whitepaper](docs/RustChain_Whitepaper_Flameholder_v0.97.pdf) • [Schnellstart](#-schnellstart) • [Funktionsweise](#-wie-proof-of-antiquity-funktioniert) diff --git a/README_ES.md b/README_ES.md index 51d512df4..2b8964055 100644 --- a/README_ES.md +++ b/README_ES.md @@ -20,7 +20,7 @@ *Tu PowerPC G4 gana más que un Threadripper moderno. Ese es el punto.* -[Website](https://rustchain.org) • [Manifesto](https://rustchain.org/manifesto.html) • [Principios Boudreaux](docs/BOUDREAUX_COMPUTING_PRINCIPLES.md) • [Live Explorer](https://rustchain.org/explorer) • [Swap wRTC](https://raydium.io/swap/?inputMint=sol&outputMint=12TAdKXxcGf6oCv4rqDz2NkgxjyHq6HQKoxKZYGf5i4X) • [DexScreener](https://dexscreener.com/solana/8CF2Q8nSCxRacDShbtF86XTSrYjueBMKmfdR3MLdnYzb) • [wRTC Quickstart](docs/wrtc.md) • [Tutorial wRTC](docs/WRTC_ONBOARDING_TUTORIAL.md) • [Ref. Grokipedia](https://grokipedia.com/search?q=RustChain) • [Whitepaper](docs/RustChain_Whitepaper_Flameholder_v0.97-1.pdf) • [Inicio Rápido](#-inicio-rápido) • [Cómo Funciona](#-cómo-funciona-proof-of-antiquity) +[Website](https://rustchain.org) • [Manifesto](https://rustchain.org/manifesto.html) • [Principios Boudreaux](docs/BOUDREAUX_COMPUTING_PRINCIPLES.md) • [Live Explorer](https://rustchain.org/explorer) • [Swap wRTC](https://raydium.io/swap/?inputMint=sol&outputMint=12TAdKXxcGf6oCv4rqDz2NkgxjyHq6HQKoxKZYGf5i4X) • [DexScreener](https://dexscreener.com/solana/8CF2Q8nSCxRacDShbtF86XTSrYjueBMKmfdR3MLdnYzb) • [wRTC Quickstart](docs/wrtc.md) • [Tutorial wRTC](docs/WRTC_ONBOARDING_TUTORIAL.md) • [Ref. Grokipedia](https://grokipedia.com/search?q=RustChain) • [Whitepaper](docs/RustChain_Whitepaper_Flameholder_v0.97.pdf) • [Inicio Rápido](#-inicio-rápido) • [Cómo Funciona](#-cómo-funciona-proof-of-antiquity) diff --git a/README_HI.md b/README_HI.md index 344ed5f40..858eca72a 100644 --- a/README_HI.md +++ b/README_HI.md @@ -22,7 +22,7 @@ *आपका PowerPC G4 एक आधुनिक Threadripper से भी अधिक कमा सकता है। यही इसका उद्देश्य है।* -[वेबसाइट](https://rustchain.org) • [लाइव एक्सप्लोरर](https://rustchain.org/explorer) • [wRTC स्वैप](https://raydium.io/swap/?inputMint=sol&outputMint=12TAdKXxcGf6oCv4rqDz2NkgxjyHq6HQKoxKZYGf5i4X) • [DexScreener](https://dexscreener.com/solana/8CF2Q8nSCxRacDShbtF86XTSrYjueBMKmfdR3MLdnYzb) • [wRTC क्विकस्टार्ट](docs/wrtc.md) • [wRTC ट्यूटोरियल](docs/WRTC_ONBOARDING_TUTORIAL.md) • [Grokipedia संदर्भ](https://grokipedia.com/search?q=RustChain) • [व्हाइटपेपर](docs/RustChain_Whitepaper_Flameholder_v0.97-1.pdf) • [क्विक स्टार्ट](#-quick-start) • [यह कैसे काम करता है](#-how-proof-of-antiquity-works) +[वेबसाइट](https://rustchain.org) • [लाइव एक्सप्लोरर](https://rustchain.org/explorer) • [wRTC स्वैप](https://raydium.io/swap/?inputMint=sol&outputMint=12TAdKXxcGf6oCv4rqDz2NkgxjyHq6HQKoxKZYGf5i4X) • [DexScreener](https://dexscreener.com/solana/8CF2Q8nSCxRacDShbtF86XTSrYjueBMKmfdR3MLdnYzb) • [wRTC क्विकस्टार्ट](docs/wrtc.md) • [wRTC ट्यूटोरियल](docs/WRTC_ONBOARDING_TUTORIAL.md) • [Grokipedia संदर्भ](https://grokipedia.com/search?q=RustChain) • [व्हाइटपेपर](docs/RustChain_Whitepaper_Flameholder_v0.97.pdf) • [क्विक स्टार्ट](#-quick-start) • [यह कैसे काम करता है](#-how-proof-of-antiquity-works) ### ⚡ क्विक स्टार्ट diff --git a/README_JA.md b/README_JA.md index cfe843069..d0440de43 100644 --- a/README_JA.md +++ b/README_JA.md @@ -22,7 +22,7 @@ *PowerPC G4は最新のThreadripperよりも多くの報酬を得られます。それがポイントです。* -[Webサイト](https://rustchain.org) • [ライブエクスプローラー](https://rustchain.org/explorer) • [wRTCスワップ](https://raydium.io/swap/?inputMint=sol&outputMint=12TAdKXxcGf6oCv4rqDz2NkgxjyHq6HQKoxKZYGf5i4X) • [DexScreener](https://dexscreener.com/solana/8CF2Q8nSCxRacDShbtF86XTSrYjueBMKmfdR3MLdnYzb) • [wRTCクイックスタート](docs/wrtc.md) • [wRTCチュートリアル](docs/WRTC_ONBOARDING_TUTORIAL.md) • [Grokipedia参照](https://grokipedia.com/search?q=RustChain) • [ホワイトペーパー](docs/RustChain_Whitepaper_Flameholder_v0.97-1.pdf) • [クイックスタート](#-quick-start) • [仕組み](#-how-proof-of-antiquity-works) +[Webサイト](https://rustchain.org) • [ライブエクスプローラー](https://rustchain.org/explorer) • [wRTCスワップ](https://raydium.io/swap/?inputMint=sol&outputMint=12TAdKXxcGf6oCv4rqDz2NkgxjyHq6HQKoxKZYGf5i4X) • [DexScreener](https://dexscreener.com/solana/8CF2Q8nSCxRacDShbtF86XTSrYjueBMKmfdR3MLdnYzb) • [wRTCクイックスタート](docs/wrtc.md) • [wRTCチュートリアル](docs/WRTC_ONBOARDING_TUTORIAL.md) • [Grokipedia参照](https://grokipedia.com/search?q=RustChain) • [ホワイトペーパー](docs/RustChain_Whitepaper_Flameholder_v0.97.pdf) • [クイックスタート](#-quick-start) • [仕組み](#-how-proof-of-antiquity-works) diff --git a/README_ZH-TW.md b/README_ZH-TW.md index 97dce543d..6de05b86b 100644 --- a/README_ZH-TW.md +++ b/README_ZH-TW.md @@ -13,7 +13,7 @@ *你的 PowerPC G4 賺得比最新的 Threadripper 還多。這就是重點。* -[官網](https://rustchain.org) • [區塊瀏覽器](https://rustchain.org/explorer) • [交換 wRTC](https://raydium.io/swap/?inputMint=sol&outputMint=12TAdKXxcGf6oCv4rqDz2NkgxjyHq6HQKoxKZYGf5i4X) • [價格圖表](https://dexscreener.com/solana/8CF2Q8nSCxRacDShbtF86XTSrYjueBMKmfdR3MLdnYzb) • [wRTC 快速入門](docs/wrtc.md) • [wRTC 教學](docs/WRTC_ONBOARDING_TUTORIAL.md) • [Grokipedia 參考](https://grokipedia.com/search?q=RustChain) • [白皮書](docs/RustChain_Whitepaper_Flameholder_v0.97-1.pdf) • [快速開始](#-快速開始) • [運作原理](#-古董證明如何運作) +[官網](https://rustchain.org) • [區塊瀏覽器](https://rustchain.org/explorer) • [交換 wRTC](https://raydium.io/swap/?inputMint=sol&outputMint=12TAdKXxcGf6oCv4rqDz2NkgxjyHq6HQKoxKZYGf5i4X) • [價格圖表](https://dexscreener.com/solana/8CF2Q8nSCxRacDShbtF86XTSrYjueBMKmfdR3MLdnYzb) • [wRTC 快速入門](docs/wrtc.md) • [wRTC 教學](docs/WRTC_ONBOARDING_TUTORIAL.md) • [Grokipedia 參考](https://grokipedia.com/search?q=RustChain) • [白皮書](docs/RustChain_Whitepaper_Flameholder_v0.97.pdf) • [快速開始](#-快速開始) • [運作原理](#-古董證明如何運作) diff --git a/README_ZH.md b/README_ZH.md index 6849a4402..2aa654099 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -13,7 +13,7 @@ *你的PowerPC G4比现代Threadripper赚得更多。就是这么硬核。* -[网站](https://rustchain.org) • [实时浏览器](https://rustchain.org/explorer) • [交换wRTC](https://raydium.io/swap/?inputMint=sol&outputMint=12TAdKXxcGf6oCv4rqDz2NkgxjyHq6HQKoxKZYGf5i4X) • [DexScreener](https://dexscreener.com/solana/8CF2Q8nSCxRacDShbtF86XTSrYjueBMKmfdR3MLdnYzb) • [wRTC快速入门](docs/wrtc.md) • [wRTC教程](docs/WRTC_ONBOARDING_TUTORIAL.md) • [Grokipedia参考](https://grokipedia.com/search?q=RustChain) • [白皮书](docs/RustChain_Whitepaper_Flameholder_v0.97-1.pdf) • [快速开始](#-快速开始) • [工作原理](#-古董证明如何工作) +[网站](https://rustchain.org) • [实时浏览器](https://rustchain.org/explorer) • [交换wRTC](https://raydium.io/swap/?inputMint=sol&outputMint=12TAdKXxcGf6oCv4rqDz2NkgxjyHq6HQKoxKZYGf5i4X) • [DexScreener](https://dexscreener.com/solana/8CF2Q8nSCxRacDShbtF86XTSrYjueBMKmfdR3MLdnYzb) • [wRTC快速入门](docs/wrtc.md) • [wRTC教程](docs/WRTC_ONBOARDING_TUTORIAL.md) • [Grokipedia参考](https://grokipedia.com/search?q=RustChain) • [白皮书](docs/RustChain_Whitepaper_Flameholder_v0.97.pdf) • [快速开始](#-快速开始) • [工作原理](#-古董证明如何工作) diff --git a/docs/MULTISIG_WALLET_GUIDE.md b/docs/MULTISIG_WALLET_GUIDE.md index 24c7ca116..80d0dff81 100644 --- a/docs/MULTISIG_WALLET_GUIDE.md +++ b/docs/MULTISIG_WALLET_GUIDE.md @@ -539,7 +539,7 @@ curl -sk "https://rustchain.org/health" ### 官方文档 -- [RustChain 白皮书](https://github.com/Scottcjn/Rustchain/blob/main/docs/RustChain_Whitepaper_Flameholder_v0.97-1.pdf) +- [RustChain 白皮书](https://github.com/Scottcjn/Rustchain/blob/main/docs/RustChain_Whitepaper_Flameholder_v0.97.pdf) - [协议规范](https://github.com/Scottcjn/Rustchain/blob/main/docs/PROTOCOL.md) - [API 参考](https://github.com/Scottcjn/Rustchain/blob/main/docs/API.md) - [钱包用户指南](https://github.com/Scottcjn/Rustchain/blob/main/docs/WALLET_USER_GUIDE.md) diff --git a/docs/protocol-overview.md b/docs/protocol-overview.md index 87a9d50fe..8659bfd6f 100644 --- a/docs/protocol-overview.md +++ b/docs/protocol-overview.md @@ -247,7 +247,7 @@ curl -sk https://rustchain.org/api/miners ## References -- **Whitepaper**: [RustChain_Whitepaper_Flameholder_v0.97-1.pdf](./RustChain_Whitepaper_Flameholder_v0.97-1.pdf) +- **Whitepaper**: [RustChain_Whitepaper_Flameholder_v0.97.pdf](./RustChain_Whitepaper_Flameholder_v0.97.pdf) - **API Documentation**: [API.md](./API.md) - **Protocol Spec**: [PROTOCOL.md](./PROTOCOL.md) - **Glossary**: [GLOSSARY.md](./GLOSSARY.md) diff --git a/docs/wrtc.md b/docs/wrtc.md index 2bf5a2892..7f1308a79 100644 --- a/docs/wrtc.md +++ b/docs/wrtc.md @@ -403,7 +403,7 @@ curl -sk "https://rustchain.org/wallet/balance?miner_id=my-miner-id" ## 📚 Additional Resources -- [RustChain Whitepaper](RustChain_Whitepaper_Flameholder_v0.97-1.pdf) +- [RustChain Whitepaper](RustChain_Whitepaper_Flameholder_v0.97.pdf) - [Protocol Specification](./PROTOCOL.md) - [API Reference](./API.md) - [Wallet User Guide](./WALLET_USER_GUIDE.md) diff --git a/docs/zh-CN/README.md b/docs/zh-CN/README.md index 7a38c1e2d..5c981b00b 100644 --- a/docs/zh-CN/README.md +++ b/docs/zh-CN/README.md @@ -20,7 +20,7 @@ *你的 PowerPC G4 比现代 Threadripper 赚得更多。这就是重点。* -[官网](https://rustchain.org) • [实时浏览器](https://rustchain.org/explorer) • [兑换 wRTC](https://raydium.io/swap/?inputMint=sol&outputMint=12TAdKXxcGf6oCv4rqDz2NkgxjyHq6HQKoxKZYGf5i4X) • [DexScreener](https://dexscreener.com/solana/8CF2Q8nSCxRacDShbtF86XTSrYjueBMKmfdR3MLdnYzb) • [wRTC 快速入门](docs/wrtc.md) • [wRTC 教程](docs/WRTC_ONBOARDING_TUTORIAL.md) • [Grokipedia 参考](https://grokipedia.com/search?q=RustChain) • [白皮书](docs/RustChain_Whitepaper_Flameholder_v0.97-1.pdf) • [快速开始](#-快速开始) • [工作原理](#-古董证明如何工作) +[官网](https://rustchain.org) • [实时浏览器](https://rustchain.org/explorer) • [兑换 wRTC](https://raydium.io/swap/?inputMint=sol&outputMint=12TAdKXxcGf6oCv4rqDz2NkgxjyHq6HQKoxKZYGf5i4X) • [DexScreener](https://dexscreener.com/solana/8CF2Q8nSCxRacDShbtF86XTSrYjueBMKmfdR3MLdnYzb) • [wRTC 快速入门](docs/wrtc.md) • [wRTC 教程](docs/WRTC_ONBOARDING_TUTORIAL.md) • [Grokipedia 参考](https://grokipedia.com/search?q=RustChain) • [白皮书](docs/RustChain_Whitepaper_Flameholder_v0.97.pdf) • [快速开始](#-快速开始) • [工作原理](#-古董证明如何工作) diff --git a/homebrew/INSTALL.md b/homebrew/INSTALL.md index 236e28519..6c2aff036 100644 --- a/homebrew/INSTALL.md +++ b/homebrew/INSTALL.md @@ -274,7 +274,7 @@ miners/ - [Homebrew Formula Cookbook](https://docs.brew.sh/Formula-Cookbook) - [RustChain Repository](https://github.com/Scottcjn/Rustchain) -- [RustChain Whitepaper](docs/RustChain_Whitepaper_Flameholder_v0.97-1.pdf) +- [RustChain Whitepaper](docs/RustChain_Whitepaper_Flameholder_v0.97.pdf) - [Issue #1612](https://github.com/rustchain-bounties/rustchain-bounties/issues/1612) --- diff --git a/integrations/mcp-server/IMPLEMENTATION.md b/integrations/mcp-server/IMPLEMENTATION.md index b37053906..ce28f5803 100644 --- a/integrations/mcp-server/IMPLEMENTATION.md +++ b/integrations/mcp-server/IMPLEMENTATION.md @@ -304,4 +304,4 @@ tests/test_mcp_server.py::TestToolList::test_list_tools_registered PASSED - [Model Context Protocol](https://modelcontextprotocol.io) - [MCP Python SDK](https://github.com/modelcontextprotocol/python-sdk) - [RustChain Documentation](../../README.md) -- [RustChain Whitepaper](../../docs/RustChain_Whitepaper_Flameholder_v0.97-1.pdf) +- [RustChain Whitepaper](../../docs/RustChain_Whitepaper_Flameholder_v0.97.pdf) diff --git a/integrations/mcp-server/README.md b/integrations/mcp-server/README.md index 30de638db..8578fc400 100644 --- a/integrations/mcp-server/README.md +++ b/integrations/mcp-server/README.md @@ -434,7 +434,7 @@ RustChain rewards vintage hardware with multipliers: ## 📚 Additional Resources - [RustChain Main Repository](https://github.com/Scottcjn/RustChain) -- [RustChain Whitepaper](../../docs/RustChain_Whitepaper_Flameholder_v0.97-1.pdf) +- [RustChain Whitepaper](../../docs/RustChain_Whitepaper_Flameholder_v0.97.pdf) - [Open Bounties](https://github.com/Scottcjn/rustchain-bounties/issues) - [Live Explorer](https://rustchain.org/explorer) - [Model Context Protocol Docs](https://modelcontextprotocol.io) diff --git a/sdk/README.md b/sdk/README.md index 04fb9042d..cc9427a40 100644 --- a/sdk/README.md +++ b/sdk/README.md @@ -429,5 +429,5 @@ MIT License - [RustChain GitHub](https://github.com/Scottcjn/Rustchain) - [RustChain Explorer](https://rustchain.org/explorer) -- [RustChain Whitepaper](https://github.com/Scottcjn/Rustchain/blob/main/docs/RustChain_Whitepaper_Flameholder_v0.97-1.pdf) +- [RustChain Whitepaper](https://github.com/Scottcjn/Rustchain/blob/main/docs/RustChain_Whitepaper_Flameholder_v0.97.pdf) - [Agent Economy SDK Docs](docs/AGENT_ECONOMY_SDK.md)