Commit graph

374 commits

Author SHA1 Message Date
MarcanoFilms
8c9625f67f Add OracleVision integration: BIP-110 spam detection and block template analysis
Integrate lightweight sovereign analysis tools from OracleVision into PyBLOCK's
Bitcoin menu. Adds modular BIP-110 violation scanning, Mempool Glass composition
via getblocktemplate, block detail view, and optional launch of the full
OracleVision TUI. Detection logic is separated from UI for community extension.
2026-06-21 10:02:04 -04:00
GaltRanch
893aabc85d Security audit round 2: eliminate shell=True, mask secrets, fix race conditions
- Replace all shell=True subprocess calls with Python-native processing
  (nodeconnection.py, SPV/nodeconnection.py, SPV/ppi.py)
- Mask sensitive inputs (private keys, passwords, tokens) with getpass
- Add threading.Lock to block_explorer.py shared state
- Use json.loads() instead of fragile string splitting in apisnd.py
- Add path validation before file open in apisnd.py
- Replace random.randint with secrets.randbelow for mining nonces
- Fix destructive exception handlers in clone.py and feed.py
- Replace bare except clauses with specific exceptions + logging
- Remove unused imports (psutil, xmltodict, block_visualizer, base64, say)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 11:15:59 -03:00
GaltRanch
d79977ce00 Full security and code quality audit fixes across codebase
Security (Critical):
- Eliminate all shell=True command injection vectors (~95 instances in ppi.py, spvblock.py)
- Replace subprocess curl calls with requests library
- Add input validation (fiat code allowlist, IP address validation)
- Replace weak random.randint/choice with secrets module for crypto ops
- Remove token/credential exposure from print statements
- Add path traversal prevention in config.py
- Create .conf.example templates, scrub local credentials

Stability:
- Replace 63 bare except clauses with specific exceptions + logging
- Fix file handle leaks with context managers (lnd.py, apisnd.py)
- Add threading.Lock for race conditions in clock/data.py
- Cap unbounded list growth (MAX_HISTORY_LEN=50)
- Add timeout=10 to ~50 requests calls missing timeouts

Maintainability:
- Extract _load_macaroon() helper (dedup 69 instances in PyBlock.py)
- Extract _load_lnd_config() helper (dedup 33 instances in nodeconnection.py)
- Normalize json import (simplejson with stdlib fallback)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 10:57:20 -03:00
GaltRanch
3498d59214 Merge origin/master: resolve conflicts keeping ColdCore and dynamic paid status
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 17:48:20 -03:00
GaltRanch
68e235f457 Fix dangerous-subprocess-use-audit across codebase
Replace all dynamic .split() patterns in subprocess calls with safe
alternatives: shlex.split(), explicit list args, and _run_btc/_run_ln
helpers in PyBlock.py. Covers PyBlock, block_visualizer, clockscript,
lastblockdetail, mempoolclock, nodeconnection, and ai/context.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 17:35:03 -03:00
GaltRanch
93a87351a3 Fix HIGH severity issues from security audit
#6 Shell injection in SPV/spvblock.py (6 user-input instances):
- OP_RETURN: curl shell command → requests.post()
- BitcoinStrings: validate numeric input + requests.get()
- Ocean hashrate/earnings: requests.get() instead of curl
- Weather v1/v2: requests.get() with HTTPS
- Rate.sx: requests.get() instead of curl shell pipe

#7/#8 File handle leaks in PyBlock.py:
- Replace all json.load(open(...)) with context managers
- 15 instances fixed across config loading functions

#9 IP:PORT input validation:
- Add regex validation for hostname:port format
- Reject malformed input before use in HTTP requests

#10 Invalid escape sequences in SPV/spvblock.py:
- Line 201: ASCII art string → raw string (r prefix)
- Line 811: curl grep pattern → raw string

Also: remove unused imports (Panel, Text) from ai/ui.py

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 14:38:18 -03:00
GaltRanch
cfe4e5c912 Fix 5 critical security issues from audit
1. Shell injection in readHexBlock/readHexTx (PyBlock.py):
   - Validate user input with hex-only regex before use
   - Replace shell=True pipe chain with subprocess list + piped stdin
   - Same fix for OP_RETURN loop TX decoding

2. Shell injection in weather commands (ppi.py):
   - Replace curl shell commands with requests.get()
   - User input (city, lang, unit) no longer touches shell
   - Upgraded from HTTP to HTTPS

3. Runtime crash in SPV/spvblock.py:
   - os.path.isfile() called with 2 args (TypeError)
   - Fixed to use 'and' for two separate checks

4. Config files added to .gitignore:
   - pybitblock/config/*.conf (RPC creds, API keys, tokens)
   - pybitblock/SPV/config/*.conf
   - *.log files

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 14:28:30 -03:00
GaltRanch
962a1ab746 Add AI Assistant module powered by Astrolexis KCode
New pybitblock/ai/ package integrating with Astrolexis AI Gateway
at https://api.astrolexis.space:

- client.py: API client for auth, top-up (Lightning), chat (SSE
  streaming), and usage tracking
- context.py: Gathers Bitcoin/Lightning node data (via CLI, RPC,
  or mempool.space API) for AI context injection
- ui.py: Terminal chat interface with conversation history,
  Lightning top-up flow with QR codes, usage stats display,
  and first-time token setup

Accessible from Main Menu as "I - AI Assistant". All queries go
through Astrolexis gateway — user pays in sats via Lightning.
Token stored in pyblocksettings.conf.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 10:48:25 -03:00
GaltRanch
09377371af Remove all payment gates — LNBits, LNPay, OpenNode now FREE
Remove 1000-sat Lightning invoice paywalls from LNBits, LNPay, and
OpenNode API integrations. All three now go directly to config setup
(same flow as TippinMe/TallyCoin which were already free).

Changes:
- Replace aaccPPiLNBits/LNPay/OpenNode() payment loops with direct
  config-or-setup logic in both PyBlock.py and SPV/spvblock.py
- Change all menu labels from PAID/PREMIUM/LOCKED to FREE
- Remove LNURL file existence checks (lnbitSN.conf gates)
- Remove ~400 lines of payment invoice generation, QR display,
  and payment polling code

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 09:48:58 -03:00
GaltRanch
8f7ec5e6ad Remove broken ColdCore integration
ColdCore was non-functional due to literal '$HOME' paths that never
expanded, making all file checks always fail. The upstream project
(jamesob/coldcore) is experimental/alpha and requires Coldcard
hardware, limiting its audience.

Removed: callColdCore() function, menu entry "I" (ColdCore), and
handlers from PyBlock.py, SPV/spvblock.py, and umbrel-app.yml.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 09:38:15 -03:00
GaltRanch
dcd9d44cde Restore Rich UI menus lost during clock integration
The clock commit (8e27372) inadvertently reverted Rich Columns menus
(Bitcoin submenu, Lightning, API menus) back to plain ANSI format.
Restored from commit 3062a34 and reapplied clock changes on top:
- artist()/design() delegation to clock.run_clock()
- mainmenuControl unified clock launch
- menuSelection()/menuSelectionLN() using cfg singleton
- Settings D option with clockDisplaySettings()
- TUI startup using cfg.intro_mode

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 09:23:09 -03:00
GaltRanch
4488bd7aac Add 5 visual features to block clock: miner pool, weight, histogram, peers, moon
- Miner pool tag: shows who mined the last block (coinbase decode for local/remote, API for lite)
- Block weight meter: colored fullness bar (green/yellow/red)
- Block time histogram: sparkline of last 14 block intervals with color-coded speed + streak detection
- Peer count: network connections indicator with health coloring
- Moon phase: current lunar phase emoji + name

All toggleable via Settings → D (Clock Display Settings).
Also fixes negative countdown timer (clamp to 0) and countdown row tracking bug.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 09:08:18 -03:00
GaltRanch
8e2737251d Add enhanced block clock with 12 new features for Menu A
New clock/ package replaces the old design() polling loop with a
flicker-free ANSI cursor-positioned renderer. Features include:
countdown timer, epoch/halving progress bar, fee rate indicator,
hashrate sparkline, matrix mining animation, odometer digit transition,
heartbeat pulse, zen mode, UTC time display, fireworks on milestone
blocks, generative hash art, and configurable sound modes.

All features are toggleable via Settings → D (Clock Display Settings).

Also fixes hardcoded config paths in menuSelection(), menuSelectionLN(),
and TUI startup to use the cfg singleton instead.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 08:35:59 -03:00
GaltRanch
eb1eab9dd8 Redesign ColdCore integration with Rich UI and proper path handling
Major improvements to callColdCore():
- Fix $HOME path bug: use os.path.expanduser() for all paths
- Rich status panel showing: Bitcoin CLI, ColdCore install, wallet file
- Step-by-step setup guide with Rich panels when public.txt missing
- Auto-create ~/.pyblock directory with confirmation
- Show wallet balances from bitcoin-cli before launching
- Install ColdCore to ~/.pyblock/coldcore with --depth 1
- Proper error handling with show_error()

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 16:22:23 -03:00
GaltRanch
3062a344ec Reorganize all large menus into Rich categorized columns
Convert 7 ANSI menus to Rich Columns with colored category headers:

PyBlock.py (4 menus):
- Lightning Local (21 items): Invoices/Channels/Node/Chat
- Lightning Remote (13 items): Invoices/Channels/Node/LNBits
- API Menu (20 items): Lightning APIs/Payment/Data/Tools
- API Menu OnchainOnly (22 items): same + PhoenixD/Luxor

SPV/spvblock.py (3 menus):
- Bitcoin Core (19 items): Blockchain/Monitoring/Tools/Mining
- Lightning (20 items): Payments/Channels/Node/Tools
- API Menu (24 items): Lightning APIs/Payment/Data/Tools

Each category uses distinct colors (orange/cyan/green/yellow/magenta)
for quick visual scanning. All keybindings preserved.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 16:22:23 -03:00
GaltRanch
a4b3b231a9 Fix console name collision: rename Rich console import to rich_console
PyBlock.py has a local function console() (bitcoin-cli console).
The Rich Console import was shadowing it. Renamed to rich_console.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 16:22:23 -03:00
GaltRanch
c6e28916bd Reorganize Bitcoin submenu into 4 categorized columns with Rich
Replace the flat 25-item single-column ANSI menu with Rich Columns
organized by category:

- BLOCKCHAIN: Console, Info, Run Numbers, Latest, Moscow Time, Genesis
- MONITORING: Mempool, Unconfirmed, Visualizer, Block/Node/Mempool/Peers
- TOOLS: Decode HEX, QR, Tx Confirm, Search, OP_RETURN, Misc, ColdCore
- STATS & MINING: Stats, Hashrate, CLI/OwnNode Miner, Vanity, Wallet

Each category has its own color (orange, cyan, green, yellow) and
header. Much easier to scan and find features.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 16:22:23 -03:00
GaltRanch
e1d4276c9e Add interactive Rich block visualizer with treemap and fee analysis
New block_viz.py replacing the old asciimatics-based block_visualizer:

- Colorful transaction treemap (purple→blue→green→yellow→red fee scale)
- Block info panel: height, hash, pool, tx count, size, weight, fees
- Top 8 fee transactions table with color-coded fee rates
- Fee distribution histogram with 8 color-coded buckets
- Works with bitcoin-cli and mempool.space API
- Interactive navigation: prev/next/latest/goto block
- Launch standalone: python3 block_viz.py [height]

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 16:22:23 -03:00
GaltRanch
6b57e9e0f0 Fix Ctrl+C to return to main menu instead of exiting
- artist(): catch KeyboardInterrupt explicitly so Ctrl+C breaks the
  block display loop and returns to caller
- main(): change KeyboardInterrupt handler from sys.exit(0) to
  continue, which loops back to menuSelection()

Users can now press Ctrl+C to exit any screen and return to the menu.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 15:22:50 -03:00
GaltRanch
4460be7b38 Always fallback to Lite Mode when node config is incomplete
When bitcoincli is empty, go straight to Lite Mode instead of trying
remote mode (which also fails without tls/macaroon). Also validate
remote mode has tls configured before attempting connection.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 15:18:46 -03:00
GaltRanch
da1f8efc64 Add missing codecs import to PyBlock.py
codecs is used in 10+ places for macaroon encoding but was previously
available only via star imports that were removed in the security audit.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 15:17:58 -03:00
GaltRanch
d842f97de0 Handle both string and dict formats in intro.conf for --tui mode
intro.conf can contain either a plain string ("A"/"B"/"C") or a dict
with keys like fullbtclnd/fullbtc. Handle both formats when detecting
the mode for TUI launch.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 15:07:29 -03:00
GaltRanch
296b59e786 Use lazy import for MainMenuCROPPED to avoid circular import
Move SPV.spvblock import inside the functions that call
MainMenuCROPPED() instead of top-level, preventing circular
dependency issues when SPV modules load before PyBlock globals.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 15:07:29 -03:00
GaltRanch
e1923ffcff Add missing MainMenuCROPPED import from SPV.spvblock
This function was previously available via the removed star import
'from SPV.spvblock import *'. Add explicit import so Lite Mode
fallback and mode C selection work correctly.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 15:07:29 -03:00
GaltRanch
ffb2b9e72d Validate bitcoincli path before execution, fallback to Lite Mode
When bitcoincli is empty in bclock.conf, instead of crashing with
PermissionError, MainMenu now:
1. Falls back to RPC remote mode if ip_port/rpcuser are configured
2. Redirects to Lite Mode (MainMenuCROPPED) if nothing is configured

Also simplified the fatal error handler in main() to show the error
message visibly before exiting.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 15:07:29 -03:00
GaltRanch
cc9a5e236e Handle empty bitcoincli path gracefully instead of crashing
When bclock.conf has an empty bitcoincli path, catch the PermissionError
and redirect to introINIT() with a helpful error message instead of
crashing with 'Fatal error: Permission denied'.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 13:47:26 -03:00
GaltRanch
b6540b059b Add Textual TUI dashboard (Level 3) with --tui launch flag
New pybitblock/tui/ package providing a modern terminal UI:

Structure:
  tui/app.py           - Main Textual App with CSS layout, auto-refresh
  tui/screens/         - Screen classes (main_menu.py with keybindings)
  tui/widgets/         - StatusBar widget with reactive block/price data
  tui/workers/         - Async data fetchers (block height, price, fees, mempool)

Features:
  - Persistent status bar with mode, block height, BTC price
  - Side panel showing live fee estimates (fast/medium/slow)
  - Keyboard navigation (A=PyBLOCK, B=Bitcoin, L=Lightning, etc.)
  - Auto-refresh every 30 seconds via async workers
  - Dark theme with Bitcoin-inspired color scheme
  - CSS-based responsive layout

Launch: python3 PyBlock.py --tui
Fallback: python3 PyBlock.py (original CLI mode)

Added textual>=0.89 to requirements.txt.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 13:35:04 -03:00
GaltRanch
f30ba8ea04 Integrate Rich panels, headers, and menus in main menu screens
Replace ANSI escape code menus with Rich-styled components:
- PyBlock.py MainMenu(): Rich status bar, header panel with node info,
  table-based menu with colored keys
- SPV/spvblock.py MainMenuCROPPED(): same Rich integration
- Use rich_prompt() for styled input

The main menu now renders with bordered panels, consistent styling,
and proper terminal-width adaptation via Rich.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 13:29:40 -03:00
GaltRanch
d9b0862a1b Add invalid option feedback to main menu controllers
When users type an unrecognized option, they now see a yellow
"Invalid option 'X'. Try again." message instead of silent no-op.

Applied to:
- PyBlock.py mainmenuControl() and bitcoincoremenuLocalControl()
- SPV/spvblock.py mainmenuLOCALcontrol()

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 13:15:20 -03:00
GaltRanch
a2c31cd41a Add visible error messages to user instead of silent logging
Add show_error(str(e)) before every logger.debug() call so users see
a red error message when operations fail, instead of silent failures:
- PyBlock.py: 31 instances of "Suppressed error" pattern
- SPV/spvblock.py: 186 instances of "spvblock" error pattern

Users now see "! Error: <message>" in red text before being returned
to the menu, while errors still log to pyblock.log for debugging.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 13:13:16 -03:00
GaltRanch
458b60fbbc Add status bar with mode, block height, and BTC price to main menus
- PyBlock.py MainMenu(): fetch BTC price from mempool.space API,
  display status_bar() showing mode/block/price before menu header
- SPV/spvblock.py MainMenuCROPPED(): same status_bar integration
- Import shared.ui utilities in both files

The status bar shows at a glance: active mode (Local/Remote/Lite),
current block height, and USD price of Bitcoin.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 13:09:21 -03:00
GaltRanch
04c0e33efc Rename 'Cropped' mode to 'Lite Mode' in user-facing text
- PyBlock.py: Update intro screen text and option label
- SPV/spvblock.py: Change all n="CROPPED" display labels to "LITE MODE"
- Internal config value 'cropped' in intro.conf unchanged for backward compat

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 13:07:21 -03:00
GaltRanch
455cb986ce Convert download/install shell chains to list-based subprocess in PyBlock.py
Replace 27 mkdir/cd/wget/tar/unzip/git-clone/chmod shell chains with
os.makedirs() + list-based subprocess.run(cwd=) calls:
- Mempool-cli x86/ARM installers
- Phoenix wallet 4 platform installers
- Nostr console 5 platform installers + seed tools
- SatSale, Warden, Bija, Coldcore, Cashu, bpytop, Luxor, UTXOracle

4 remaining shell=True are legitimate pipe chains (bitcoincli|xxd, jq).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 12:51:41 -03:00
GaltRanch
c0b40e91f7 Convert simple subprocess shell=True to list format with cwd
Replace cd-and-run shell patterns with list-based subprocess.run()
using cwd parameter for directory context:

- Phoenix macOS ARM installer
- Luxor CLI help
- Mempool CLI (2 instances)
- SatSale, Cashu, Warden, bpytop launchers
- Bija docker-compose
- Both SPV/spvblock.py and PyBlock.py

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 12:21:08 -03:00
GaltRanch
273d806d37 Rename shadowed builtin 'list' variable to 'cmd'
Replace all uses of 'list' as a variable name for shell command strings
with 'cmd' to avoid shadowing Python's built-in list type.
Affects ppi.py, PyBlock.py, SPV/ppi.py, and SPV/spvblock.py.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 12:10:49 -03:00
GaltRanch
a746b36420 Replace star imports with explicit imports in core files
- PyBlock.py: Replace 14 star imports with explicit named imports,
  remove unused `from art import *` and `from SPV.spvblock import *`
- ppi.py: Replace star imports, remove unused art/nodeconnection imports,
  remove duplicate `import requests` and dead lnpay_py comments
- nodeconnection.py: Replace star imports, remove unused art import

This improves code clarity, prevents namespace pollution, and makes
dependencies between modules explicit and traceable.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 12:03:52 -03:00
GaltRanch
3c7eb44030 Fix mutable default argument bug in all rpc() functions
Replace params=[] with params=None pattern to prevent shared state
between calls. Affects PyBlock.py, nodeconnection.py,
SPV/nodeconnection.py, and clockscriptREMOTE.py.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 11:59:22 -03:00
GaltRanch
7366e9fe9c Refactor architecture: config singleton, logging, menu system, dependencies
Major improvements across 7 areas:

- Add centralized Config singleton (config.py) replacing ~176 config
  reloads per session with a single cached load
- Add logging framework (log.py) with RotatingFileHandler, replacing
  silent except Exception: pass blocks with structured logging
- Refactor menu system (menu.py) with data-driven color selection,
  eliminating ~1,370 lines of duplicate menu functions
- Create shared/ modules extracting 7 utility functions duplicated
  between PyBlock.py and SPV/spvblock.py
- Clean dependencies: pin all versions, remove stdlib packages
  (asyncio, threading), remove unused imports
- Improve Docker: pin ubuntu:24.04, add non-root user, use venv
- Improve CI: update to actions v4/v5, add test job before publish
- Fix entry point: wrap main loop in def main(), proper module import

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 10:58:24 -03:00
GaltRanch
0224cfe230 Fix critical security vulnerabilities across the codebase
Replace insecure patterns that exposed the application to command injection,
arbitrary code execution, and data interception attacks.

- Replace os.popen/os.system with subprocess.run using argument lists
- Migrate pickle config serialization to JSON format
- Replace bare except: blocks with specific exception types
- Fix insecure HTTP URLs to HTTPS (opreturnbot.com, ascii.live)
- Replace shell curl commands with requests library calls
- Add migrate_config.py script for pickle-to-JSON config migration
- Convert existing SPV config files to JSON format

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 10:24:47 -03:00
Satoshi Nakamoto
db8a30f584
Update menu options for Bitcoin and Lightning 2026-03-21 04:18:19 +01:00
Satoshi Nakamoto
e775426be3
Remove unused import for jq in PyBlock.py 2025-11-28 23:53:34 +01:00
Satoshi Nakamoto
2675d92c52
Update PyBlock.py 2025-06-22 19:03:58 +02:00
curly60e
9c37b04deb
Update PyBlock.py 2025-03-16 00:23:02 -03:00
Satoshi Nakamoto
9ddd808a3a
Update PyBlock.py 2024-12-27 16:33:54 +01:00
Satoshi Nakamoto
551ab4d2cb
Update PyBlock.py 2024-10-28 00:15:36 +01:00
Satoshi Nakamoto
c6e95ea947
Update PyBlock.py 2024-10-23 01:45:05 +02:00
Satoshi Nakamoto
56fd5b0a1b
Update PyBlock.py 2024-10-22 19:15:04 +02:00
Satoshi Nakamoto
b98cba242b
Update PyBlock.py 2024-10-22 00:50:59 +02:00
Satoshi Nakamoto
3363b47155
Update PyBlock.py 2024-10-22 00:47:34 +02:00
Satoshi Nakamoto
c09c3bf4b2
Update PyBlock.py 2024-10-22 00:24:42 +02:00