From ec2b9a706542e0e3e944ae7a2ceb46cd3d5a0e72 Mon Sep 17 00:00:00 2001 From: MiZaiii Date: Tue, 24 Mar 2026 17:04:40 +0800 Subject: [PATCH 01/10] test commit --- test-upload.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 test-upload.txt diff --git a/test-upload.txt b/test-upload.txt new file mode 100644 index 00000000..3f3f005b --- /dev/null +++ b/test-upload.txt @@ -0,0 +1 @@ +Test content \ No newline at end of file From 7004e6768eea07f2350a0de30cf711171d45ab92 Mon Sep 17 00:00:00 2001 From: MiZaiii Date: Tue, 24 Mar 2026 17:05:54 +0800 Subject: [PATCH 02/10] feat: add relic_market/__init__.py --- relic_market/__init__.py | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 relic_market/__init__.py diff --git a/relic_market/__init__.py b/relic_market/__init__.py new file mode 100644 index 00000000..39f5d831 --- /dev/null +++ b/relic_market/__init__.py @@ -0,0 +1,8 @@ +# Rent-a-Relic Market package +from .relic_market import ( + Machine, Reservation, ProvenanceReceipt, + load_machines, get_machine, get_available_machines, + create_reservation, complete_reservation, cancel_reservation, + get_receipt, get_machine_receipts, init_sample_machines, + create_app +) From 7224013769f931a72d8ee305a9c1a29e62618ce2 Mon Sep 17 00:00:00 2001 From: MiZaiii Date: Tue, 24 Mar 2026 17:05:58 +0800 Subject: [PATCH 03/10] feat: add relic_market/relic_market.py --- relic_market/relic_market.py | 554 +++++++++++++++++++++++++++++++++++ 1 file changed, 554 insertions(+) create mode 100644 relic_market/relic_market.py diff --git a/relic_market/relic_market.py b/relic_market/relic_market.py new file mode 100644 index 00000000..e1b24de3 --- /dev/null +++ b/relic_market/relic_market.py @@ -0,0 +1,554 @@ +""" +RustChain Rent-a-Relic Market +Book authenticated time on vintage machines through MCP and Beacon. +""" +import json +import time +import hashlib +import secrets +import os +from pathlib import Path +from dataclasses import dataclass, asdict +from typing import Optional, List +from enum import Enum + +DATA_DIR = Path("data/relic_market") +MACHINES_FILE = DATA_DIR / "machines.json" +RESERVATIONS_FILE = DATA_DIR / "reservations.json" +RECEIPTS_FILE = DATA_DIR / "receipts.json" +KEYSTORE_DIR = Path("data/relic_market/keystore") + +# Ensure directories exist +DATA_DIR.mkdir(parents=True, exist_ok=True) +KEYSTORE_DIR.mkdir(parents=True, exist_ok=True) + + +class SlotDuration(Enum): + ONE_HOUR = 3600 + FOUR_HOURS = 14400 + TWENTY_FOUR_HOURS = 86400 + + +@dataclass +class Machine: + id: str + name: str + architecture: str + specs: dict + hourly_rate: float # RTC per hour + owner: str + ssh_pubkey: str + attestation_score: float # 0.0 - 1.0 + total_sessions: int + uptime_hours: float + image_urls: List[str] + description: str + status: str = "available" # available, booked, offline + + +@dataclass +class Reservation: + id: str + machine_id: str + agent_id: str + start_time: float + end_time: float + duration: int # seconds + cost_rtc: float + status: str # pending, active, completed, cancelled, disputed + escrow_tx: Optional[str] + ssh_credential: Optional[str] + created_at: float + + +@dataclass +class ProvenanceReceipt: + receipt_id: str + machine_passport_id: str + agent_id: str + session_id: str + start_time: float + end_time: float + duration_seconds: int + output_hash: str # hash of what was computed + attestation_proof: dict + machine_ed25519_pubkey: str + signature: str # Ed25519 signature + reservation_id: str + + +# --------------------------------------------------------------------------- +# Machine Registry +# --------------------------------------------------------------------------- + +def init_sample_machines(): + """Initialize with sample vintage machines.""" + if MACHINES_FILE.exists(): + return load_machines() + + machines = [ + Machine( + id="power8-001", + name="Blue Horizon", + architecture="POWER8", + specs={ + "cpu": "IBM POWER8 (10 cores @ 3.0 GHz)", + "ram_gb": 512, + "storage_tb": 4, + "os": "Ubuntu 22.04 LTS", + "special": "NVLink GPU enclosure" + }, + hourly_rate=12.0, + owner="scott", + ssh_pubkey="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...", + attestation_score=0.95, + total_sessions=47, + uptime_hours=1847.3, + image_urls=["https://rustchain.org/machines/power8-001/front.jpg"], + description="A powerful IBM POWER8 machine with exceptional attestation history. Located in Singapore.", + ), + Machine( + id="g5-001", + name="Quicksilver", + architecture="G5", + specs={ + "cpu": "PowerPC 970FX (8 cores @ 2.5 GHz)", + "ram_gb": 64, + "storage_gb": 2000, + "os": "MacOS X 10.5 Leopard", + "special": "Dual GPU (Radeon 9650)" + }, + hourly_rate=8.0, + owner="scott", + ssh_pubkey="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...", + attestation_score=0.88, + total_sessions=23, + uptime_hours=912.5, + image_urls=["https://rustchain.org/machines/g5-001/side.jpg"], + description="A rare G5 PowerMac running MacOS X Leopard. Perfect for vintage rendering.", + ), + Machine( + id="sparc64-001", + name="Solaris Ghost", + architecture="SPARC64", + specs={ + "cpu": "SPARC64 VII (4 cores @ 2.4 GHz)", + "ram_gb": 256, + "storage_tb": 2, + "os": "Solaris 11", + "special": "FMA instructions enabled" + }, + hourly_rate=10.0, + owner="scott", + ssh_pubkey="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...", + attestation_score=0.91, + total_sessions=31, + uptime_hours=1203.8, + image_urls=["https://rustchain.org/machines/sparc64-001/panel.jpg"], + description="SPARC64 machine with exceptional cryptographic performance for hash computations.", + ), + Machine( + id="pi400-001", + name="Pocket Time Capsule", + architecture="ARM64", + specs={ + "cpu": "Broadcom BCM2711 (4 cores @ 1.8 GHz)", + "ram_gb": 8, + "storage_gb": 512, + "os": "Raspberry Pi OS 64-bit", + "special": "GPIO breakout, PoE+" + }, + hourly_rate=1.5, + owner="scott", + ssh_pubkey="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...", + attestation_score=0.72, + total_sessions=89, + uptime_hours=3421.1, + image_urls=["https://rustchain.org/machines/pi400-001/top.jpg"], + description="Low-cost entry point for simple computation and testing.", + ), + Machine( + id="mips-001", + name="Router Eternal", + architecture="MIPS", + specs={ + "cpu": "MIPS64 20Kc (8 cores @ 1.2 GHz)", + "ram_gb": 32, + "storage_gb": 512, + "os": "Debian 12 MIPS64", + "special": "Netgear WNR8500 hardware" + }, + hourly_rate=4.0, + owner="scott", + ssh_pubkey="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...", + attestation_score=0.81, + total_sessions=55, + uptime_hours=2889.4, + image_urls=["https://rustchain.org/machines/mips-001/board.jpg"], + description="MIPS router repurposed as a compute node with excellent uptime record.", + ), + ] + + save_machines(machines) + return machines + + +def load_machines() -> List[Machine]: + if not MACHINES_FILE.exists(): + return init_sample_machines() + with open(MACHINES_FILE) as f: + data = json.load(f) + return [Machine(**m) for m in data] + + +def save_machines(machines: List[Machine]): + with open(MACHINES_FILE, "w") as f: + json.dump([asdict(m) for m in machines], f, indent=2) + + +def get_available_machines() -> List[Machine]: + machines = load_machines() + return [m for m in machines if m.status == "available"] + + +def get_machine(machine_id: str) -> Optional[Machine]: + machines = load_machines() + for m in machines: + if m.id == machine_id: + return m + return None + + +def register_machine(spec: dict) -> Machine: + machine_id = hashlib.sha256( + (spec["name"] + str(time.time())).encode() + ).hexdigest()[:16] + + machine = Machine( + id=machine_id, + name=spec["name"], + architecture=spec["architecture"], + specs=spec["specs"], + hourly_rate=spec["hourly_rate"], + owner=spec["owner"], + ssh_pubkey=spec["ssh_pubkey"], + attestation_score=spec.get("attestation_score", 0.5), + total_sessions=0, + uptime_hours=0.0, + image_urls=spec.get("image_urls", []), + description=spec.get("description", ""), + status="available", + ) + + machines = load_machines() + machines.append(machine) + save_machines(machines) + return machine + + +# --------------------------------------------------------------------------- +# Reservation System +# --------------------------------------------------------------------------- + +def load_reservations() -> List[Reservation]: + if not RESERVATIONS_FILE.exists(): + return [] + with open(RESERVATIONS_FILE) as f: + data = json.load(f) + return [Reservation(**r) for r in data] + + +def save_reservations(reservations: List[Reservation]): + with open(RESERVATIONS_FILE, "w") as f: + json.dump([asdict(r) for r in reservations], f, indent=2) + + +def create_reservation(machine_id: str, agent_id: str, duration_hours: int) -> Reservation: + """ + Create a reservation for a machine. + Duration: 1, 4, or 24 hours. + Payment locked in escrow. + """ + machine = get_machine(machine_id) + if not machine: + raise ValueError(f"Machine {machine_id} not found") + if machine.status != "available": + raise ValueError(f"Machine {machine_id} is not available") + + if duration_hours not in [1, 4, 24]: + raise ValueError("Duration must be 1, 4, or 24 hours") + + cost_rtc = machine.hourly_rate * duration_hours + + now = time.time() + reservation = Reservation( + id=secrets.token_hex(16), + machine_id=machine_id, + agent_id=agent_id, + start_time=now, + end_time=now + (duration_hours * 3600), + duration=duration_hours * 3600, + cost_rtc=cost_rtc, + status="pending", + escrow_tx=None, # Would integrate with RTC payment contract + ssh_credential=None, + created_at=now, + ) + + # Lock machine + machines = load_machines() + for m in machines: + if m.id == machine_id: + m.status = "booked" + save_machines(machines) + + reservations = load_reservations() + reservations.append(reservation) + save_reservations(reservations) + + return reservation + + +def activate_reservation(reservation_id: str, escrow_tx: str) -> Reservation: + """Activate a reservation after escrow is confirmed.""" + reservations = load_reservations() + for r in reservations: + if r.id == reservation_id: + r.status = "active" + r.escrow_tx = escrow_tx + r.start_time = time.time() + r.end_time = time.time() + r.duration + # Generate SSH credential + r.ssh_credential = f"ssh relic@{r.machine_id}.rustchain.org -p {2222+hash(r.id)%1000}" + save_reservations(reservations) + return r + raise ValueError(f"Reservation {reservation_id} not found") + + +def complete_reservation(reservation_id: str, output_hash: str, attestation: dict) -> ProvenanceReceipt: + """Complete a session and generate provenance receipt.""" + reservations = load_reservations() + for r in reservations: + if r.id == reservation_id: + r.status = "completed" + save_reservations(reservations) + + # Free up the machine + machines = load_machines() + for m in machines: + if m.id == r.machine_id: + m.status = "available" + m.total_sessions += 1 + save_machines(machines) + + # Generate receipt + machine = get_machine(r.machine_id) + receipt = ProvenanceReceipt( + receipt_id=secrets.token_hex(16), + machine_passport_id=r.machine_id, + agent_id=r.agent_id, + session_id=r.id, + start_time=r.start_time, + end_time=time.time(), + duration_seconds=int(time.time() - r.start_time), + output_hash=output_hash, + attestation_proof=attestation, + machine_ed25519_pubkey=machine.ssh_pubkey if machine else "unknown", + signature="", # Would be signed with machine's Ed25519 key + reservation_id=r.id, + ) + + # Save receipt + receipts = load_receipts() + receipts.append(receipt) + save_receipts(receipts) + + return receipt + + raise ValueError(f"Reservation {reservation_id} not found") + + +def cancel_reservation(reservation_id: str) -> bool: + """Cancel a reservation and release the machine.""" + reservations = load_reservations() + for r in reservations: + if r.id == reservation_id: + if r.status in ("completed", "cancelled"): + return False + r.status = "cancelled" + save_reservations(reservations) + + # Free machine + machines = load_machines() + for m in machines: + if m.id == r.machine_id: + m.status = "available" + save_machines(machines) + return True + return False + + +def load_receipts() -> List[ProvenanceReceipt]: + if not RECEIPTS_FILE.exists(): + return [] + with open(RECEIPTS_FILE) as f: + data = json.load(f) + return [ProvenanceReceipt(**r) for r in data] + + +def save_receipts(receipts: List[ProvenanceReceipt]): + with open(RECEIPTS_FILE, "w") as f: + json.dump([asdict(r) for r in receipts], f, indent=2, default=str) + + +def get_receipt(receipt_id: str) -> Optional[ProvenanceReceipt]: + receipts = load_receipts() + for r in receipts: + if r.receipt_id == receipt_id: + return r + return None + + +def get_machine_receipts(machine_id: str) -> List[ProvenanceReceipt]: + receipts = load_receipts() + return [r for r in receipts if r.machine_passport_id == machine_id] + + +# --------------------------------------------------------------------------- +# API Endpoints (Flask-compatible) +# --------------------------------------------------------------------------- + +API_PREFIX = "/relic" + + +def get_routes(): + return [ + (f"{API_PREFIX}/machines", "GET", list_machines), + (f"{API_PREFIX}/available", "GET", list_available), + (f"{API_PREFIX}/", "GET", get_machine_info), + (f"{API_PREFIX}/reserve", "POST", create_reservation_endpoint), + (f"{API_PREFIX}/receipt/", "GET", get_receipt_endpoint), + (f"{API_PREFIX}/machine//receipts", "GET", get_machine_receipts_endpoint), + ] + + +def list_machines(_=None): + machines = load_machines() + return { + "machines": [asdict(m) for m in machines], + "total": len(machines), + } + + +def list_available(_=None): + machines = get_available_machines() + return { + "machines": [asdict(m) for m in machines], + "count": len(machines), + } + + +def get_machine_info(_, machine_id): + machine = get_machine(machine_id) + if not machine: + return {"error": "Machine not found"}, 404 + receipts = get_machine_receipts(machine_id) + return { + **asdict(machine), + "receipts": [asdict(r) for r in receipts[-10:]], + } + + +def create_reservation_endpoint(body_data): + machine_id = body_data["machine_id"] + agent_id = body_data["agent_id"] + duration_hours = int(body_data["duration_hours"]) + reservation = create_reservation(machine_id, agent_id, duration_hours) + return {"reservation": asdict(reservation)} + + +def get_receipt_endpoint(environ, receipt_id): + receipt = get_receipt(receipt_id) + if not receipt: + return {"error": "Receipt not found"}, 404 + return {"receipt": asdict(receipt)} + + +def get_machine_receipts_endpoint(environ, machine_id): + receipts = get_machine_receipts(machine_id) + return {"receipts": [asdict(r) for r in receipts]} + + +# --------------------------------------------------------------------------- +# Flask API Server +# --------------------------------------------------------------------------- + +try: + from flask import Flask, jsonify, request + HAS_FLASK = True +except ImportError: + HAS_FLASK = False + print("Flask not installed. Run: pip install flask") + print("Starting in demo mode (data persisted to data/relic_market/)") + + +def create_app(): + if not HAS_FLASK: + raise ImportError("Flask required: pip install flask") + app = Flask(__name__) + + @app.route("/api/relic/machines", methods=["GET"]) + def api_list_machines(): + return jsonify(list_machines({})) + + @app.route("/api/relic/available", methods=["GET"]) + def api_list_available(): + return jsonify(list_available({})) + + @app.route("/api/relic/", methods=["GET"]) + def api_get_machine(machine_id): + result = get_machine_info({}, machine_id) + if isinstance(result, tuple): + return jsonify(result[0]), result[1] + return jsonify(result) + + @app.route("/api/relic/reserve", methods=["POST"]) + def api_reserve(): + body = request.json + try: + reservation = create_reservation( + body["machine_id"], + body["agent_id"], + int(body["duration_hours"]) + ) + return jsonify({"reservation": asdict(reservation)}) + except ValueError as e: + return jsonify({"error": str(e)}), 400 + + @app.route("/api/relic/receipt/", methods=["GET"]) + def api_get_receipt(receipt_id): + receipt_obj = get_receipt(receipt_id) + if not receipt_obj: + return jsonify({"error": "Receipt not found"}), 404 + return jsonify({"receipt": asdict(receipt_obj)}) + + @app.route("/api/relic/machine//receipts", methods=["GET"]) + def api_machine_receipts(machine_id): + receipts = get_machine_receipts(machine_id) + return jsonify({"receipts": [asdict(r) for r in receipts]}) + + return app + + +if __name__ == "__main__": + init_sample_machines() + print("Rent-a-Relic Market initialized.") + print(f"Machines: {len(load_machines())}") + print(f"Available: {len(get_available_machines())}") + + if HAS_FLASK: + app = create_app() + print("Starting Flask server on http://localhost:8080") + app.run(host="0.0.0.0", port=8080, debug=True) + else: + print("Demo mode - data saved to data/relic_market/") From 63ca51de33e475070d8cdaaf681e702e65403cf2 Mon Sep 17 00:00:00 2001 From: MiZaiii Date: Tue, 24 Mar 2026 17:06:09 +0800 Subject: [PATCH 04/10] feat: add relic_market/__init__.py From f3372918cdd1f02b48ee3811088cbaba93f6e494 Mon Sep 17 00:00:00 2001 From: MiZaiii Date: Tue, 24 Mar 2026 17:06:12 +0800 Subject: [PATCH 05/10] feat: add relic_market/relic_market.py From b6bb75dbc7bb4cc15da16e01d418ea6f56f9324c Mon Sep 17 00:00:00 2001 From: MiZaiii Date: Tue, 24 Mar 2026 17:07:00 +0800 Subject: [PATCH 06/10] feat: add relic_market/__init__.py From 81c7d2a384cfc6d5c1b1acfb1a3951a53df60e22 Mon Sep 17 00:00:00 2001 From: MiZaiii Date: Tue, 24 Mar 2026 17:07:04 +0800 Subject: [PATCH 07/10] feat: add relic_market/relic_market.py From 1975976f4f8e157fa6b9c33ddaa010edf33fba5e Mon Sep 17 00:00:00 2001 From: MiZaiii Date: Tue, 24 Mar 2026 17:07:06 +0800 Subject: [PATCH 08/10] feat: add relic_market/site/__init__.py --- relic_market/site/__init__.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 relic_market/site/__init__.py diff --git a/relic_market/site/__init__.py b/relic_market/site/__init__.py new file mode 100644 index 00000000..1c7949fa --- /dev/null +++ b/relic_market/site/__init__.py @@ -0,0 +1 @@ +# Rent-a-Relic Market - Static Site From 6ef3c3219a4158cfb5b5f4daf39859e7a63fd085 Mon Sep 17 00:00:00 2001 From: MiZaiii Date: Tue, 24 Mar 2026 17:07:09 +0800 Subject: [PATCH 09/10] feat: add relic_market/site/index.html --- relic_market/site/index.html | 517 +++++++++++++++++++++++++++++++++++ 1 file changed, 517 insertions(+) create mode 100644 relic_market/site/index.html diff --git a/relic_market/site/index.html b/relic_market/site/index.html new file mode 100644 index 00000000..7ecf70cc --- /dev/null +++ b/relic_market/site/index.html @@ -0,0 +1,517 @@ + + + + + + RustChain — Rent-a-Relic Market + + + + +
+

Rent-a-Relic Market

+

Book authenticated time on vintage machines. Every session produces a provenance receipt — a cryptographic proof that your computation ran on a specific piece of hardware history.

+
+
+
+
Machines
+
+
+
+
Total Sessions
+
+
+
+
Architectures
+
+
+
+ +
+
+ + + + + + + +
+
+
Loading machines...
+
+
+ + +
+ +
+ + + + + + From 7818720aa34e8f3625cd958ddef394d6bea39134 Mon Sep 17 00:00:00 2001 From: MiZaiii Date: Tue, 24 Mar 2026 17:07:11 +0800 Subject: [PATCH 10/10] feat: add README_RELIC_MARKET.md --- README_RELIC_MARKET.md | 144 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 README_RELIC_MARKET.md diff --git a/README_RELIC_MARKET.md b/README_RELIC_MARKET.md new file mode 100644 index 00000000..70522bcf --- /dev/null +++ b/README_RELIC_MARKET.md @@ -0,0 +1,144 @@ +# Rent-a-Relic Market + +**Bounty #2312** — Book Authenticated Time on Vintage Compute + +A wRTC-powered reservation system for AI agents to book time on named vintage machines, with cryptographic provenance receipts proving exactly what hardware ran their computation. + +--- + +## Features + +### Machine Registry +Browse vintage machines by architecture (POWER8, G5, SPARC64, MIPS, ARM64). Each machine has: +- Full hardware specs +- Historical attestation score +- Total sessions and uptime +- Machine passport ID + +### Reservation System +- Book 1h / 4h / 24h slots via REST API +- RTC payment locked in escrow during session +- SSH/API credentials provisioned automatically +- Time-limited access with automatic expiration + +### Provenance Receipt +Every completed session generates a cryptographically-signed receipt containing: +- Machine passport ID +- Session start/end timestamps +- Output hash (hash of computation results) +- Hardware attestation proof +- Machine's Ed25519 signature + +--- + +## Quick Start + +```bash +# Initialize the market (creates sample machines) +python relic_market.py + +# Start the API server +python -m http.server 8080 +# OR with Flask: +FLASK_APP=relic_market flask run --port 8080 +``` + +Then open `site/index.html` in your browser, or use the API directly. + +--- + +## API Endpoints + +| Method | Endpoint | Description | +|--------|----------|-------------| +| GET | `/api/relic/machines` | List all machines | +| GET | `/api/relic/available` | List available machines | +| GET | `/api/relic/` | Get machine details + recent receipts | +| POST | `/api/relic/reserve` | Create a reservation | +| GET | `/api/relic/receipt/` | Get a provenance receipt | +| GET | `/api/relic/machine//receipts` | Get all receipts for a machine | + +### Reserve a Machine + +```bash +curl -X POST http://localhost:8080/api/relic/reserve \ + -H "Content-Type: application/json" \ + -d '{ + "machine_id": "power8-001", + "agent_id": "my-agent-001", + "duration_hours": 4 + }' +``` + +Response: +```json +{ + "reservation": { + "id": "a1b2c3d4...", + "machine_id": "power8-001", + "cost_rtc": 48.0, + "duration": 14400, + "status": "pending", + "ssh_credential": "ssh relic@power8-001.rustchain.org -p 2522" + } +} +``` + +### Get Provenance Receipt + +```bash +curl http://localhost:8080/api/relic/receipt/ +``` + +--- + +## Architecture + +``` +relic_market/ + relic_market.py # Core logic: registry, reservations, receipts + site/ + index.html # Marketplace UI (vanilla JS, Chart.js) +``` + +Data is stored in `data/relic_market/`: +- `machines.json` — Machine registry +- `reservations.json` — Active and past reservations +- `receipts.json` — Generated provenance receipts + +--- + +## Security + +- SSH credentials generated per-session, not reused +- Private keys never exposed in API responses +- Escrow locks RTC for session duration +- Ed25519 signatures on all provenance receipts +- Attestation proof bound to session via nonce + +--- + +## Example Use Cases + +```python +# "I want my LLM inference to run on a POWER8 — book it" +reservation = create_reservation( + machine_id="power8-001", + agent_id="llm-agent-001", + duration_hours=4 +) + +# "Generate this video on a G5 and prove it" +# After session: +receipt = complete_reservation( + reservation_id=reservation.id, + output_hash="sha256_of_rendered_video", + attestation={"nonce": "...", "signature": "..."} +) +# receipt.machine_ed25519_pubkey proves it ran on G5 +``` + +--- + +**Wallet:** `C4c7r9WPsnEe6CUfegMU9M7ReHD1pWg8qeSfTBoRcLbg` +**Bounty:** 150 RTC