Back to list
Development Update — July 13
Yesterday the skycoin wallet became a hypervisor feature; today it grew teeth. Bitcoin now works in the mesh-served wallet — the browser has always done its own BTC key derivation, transaction building and signing, so all it ever lacked was chain data, and a small gateway that translates the wallet’s BTC calls to an Electrum backend supplies exactly that, keys and signatures never leaving the tab. That gateway landed natively and then in the browser tab, dialing clearnet Electrum servers over the mesh through a skysocks exit so the wallet’s chain queries are IP-anonymous. Around it, the wallet’s backend configuration — which had been reimplemented three separate times — collapsed into one shared /wallet/config page that every surface embeds, complete with curated electrum-server dropdowns and skysocks-exit pickers. Skychat, meanwhile, shed its last loopback TCP port and became truly in-process, and a shared resolver bug that had quietly broken .dmsg:port addresses everywhere got fixed.
Skywire: Bitcoin Over the Mesh
3459 feat(wallet): BTC over the mesh — electrum→HTTP gateway (native) makes Bitcoin work in the skycoin-web wallet without any of the wallet’s secrets leaving the browser. The wallet already derives keys, builds transactions and signs them itself via the skycoin-lite WASM; the only missing piece was chain data. This adds pkg/btcgateway, which serves the wallet’s /v1/btc/{balance,utxos,history,fee,send} endpoints by translating them to an Electrum backend, dialing the ssl:// server through an injectable DialFunc so it is reachable over the mesh with no per-port forwarding — only chain queries cross, keys and signing stay client-side. It vendors three supporting skycoin changes (an Electrum client with a custom dialer, the matching backend constructor, and a more lenient JSON-RPC error parse), and it was verified live against a public Blockstream electrum server, returning the Bitcoin genesis address’s real 57.2 BTC balance. 3460 feat(wasm-visor): BTC over the mesh in the browser wallet (skysocks electrum gateway) is the browser twin: it runs the same gateway in-tab and dials the ssl:// electrum server through skysocks-client-lite, so the browser reaches a clearnet electrum server over the mesh, IP-anonymously, with the exit taken from the same skywire-upstream-proxy key that clearnet browsing already uses — no new configuration. 3464 feat(hv-ui): native wallet BTC route-through-exit (skysocks) for IP privacy closes the loop on the native side: rather than self-egressing straight to the electrum server, the native gateway can now route through a chosen skysocks exit via a raw skysocksDialFunc that lays a route to exitPK:skysocks, runs a yamux client plus SOCKS5 CONNECT over it, and tears the route down cleanly with the stream so no route leaks. Gateways are cached one per exit; an empty or self exit keeps the zero-config default. It was verified end-to-end — a real exit routes the electrum TCP and TLS through the remote skysocks-server, and an unroutable exit blocks on route setup rather than silently falling back to clearnet.
Skywire: One Shared Wallet Config
3462 feat(hv-ui): one shared wallet config page (/wallet/config) + skysocks-exit field ends a growing duplication problem — the wallet backend config had been written twice, once in browse.js for the ☰ wallet window and once in the Angular wallet tab — by replacing both with a single self-contained page served at /wallet/config and embedded via <iframe>. Because every surface shares the same origin, they share the same localStorage keys, and on Apply the page postMessages its parent to reload the wallet. It carries storage mode, the coin-node list, the curated BTC electrum server and a new skysocks-exit field for BTC egress — required on wasm, where the browser cannot reach clearnet itself, and optional on native, where an empty value self-egresses and a set value routes through another visor for IP privacy. 3463 feat(hv-ui): Angular wallet tab embeds the shared /wallet/config page finishes the dedup by pointing the wallet tab at the same page — a third copy of the config, deleted — passing ?wasm=1 when hosted by a browser visor so the exit field reads as required there, while preserving the native-only local skycoin-web server controls a static page cannot drive. 3457 feat(hv-ui): full wallet config in the taskbar (☰ menu) wallet window had earlier brought the ☰ window up to parity, replacing its thin single-node strip with the full coin-backend config behind a collapsible ⚙ toggle; 3467 feat(hv-ui): roomy wallet config panel (bigger type, full-width, more space) then gave the shared panel legible 13.5px type and full-width inputs instead of the cramped 12px monospace it started with. 3489 feat(wallet): drop coin-nodes section from config panel (converged to Settings → Nodes) later trimmed the panel back down, removing its coin-nodes list once skycoin-web’s own Settings → Nodes page became the authoritative node source and leaving only the skywire-specific settings — mode, BTC electrum, and skysocks exit.
Skywire: Picking an Exit and an Electrum Server
3461 feat(hv-ui): curated electrum-server dropdown in the wallet BTC field replaces the unfriendly raw-ssl://-URL field with a datalist of known public electrum servers — pick one or type your own, exactly as Electrum desktop ships a server list. 3471 feat(hv-ui): skysocks-exit dropdown + live proxy log in the wallet config brings the iframe browser’s proxy machinery into the wallet panel: the skysocks-exit field gains a “servers ▾” button that lists skysocks-server PKs straight from service discovery (showing PK, country and version), and a live log pane tails the visor’s resolving-proxy and [wallet] activity. Crucially the chosen exit is written to both the BTC-egress key and the shared upstream-proxy key, so one selection applies to the wallet’s Bitcoin traffic and to clearnet browsing alike; it was verified against 1035 live servers. 3472 feat(hv-ui): random skysocks-server picker in the wallet config + iframe browser adds a 🎲 button beside the dropdown in both the wallet panel and the iframe browser, fetching the proxy list and setting a random live exit — a quick way to spread load or find a working exit among the roughly thousand servers without scrolling.
Skywire: Portless Skychat and a Shared Resolver Bug
3456 feat(skychat): portless-internal — no TCP port, served in-process by the visor removes the last loopback port from an internal app. Skychat ran in-process but still bound :8001 for its DM HTTP surface, which the hypervisor reverse-proxied over the loop; now a portless skychat publishes its http.Handler to a shared in-process registry (launcher.RegisterHTTPHandler) and the visor’s control surface serves it directly via ServeHTTP — no loopback dial, and no intermediate http.Server WriteTimeout to strangle the SSE stream. This is the native twin of the wasm visor’s in-process skychat; the mesh listeners that carry the actual chat are untouched, and config-gen’s default internal-apps mode now emits skychat with --portless while external mode keeps its own port. 3458 fix(hv-ui): resolve .dmsg:port coin-node addresses (shared resolver bug) + reuse the resolver fixes a bug wider than the wallet: resolveBrowseHost checked the .dmsg/.skynet suffix on the host with the port still attached, so the readable node.skycoin.com.<pk>.dmsg:6420 form never matched and fell through — which also broke the iframe browser for any .dmsg site on a non-80 port. Stripping the port before the suffix match repaired both, and the wallet’s mesh path was refactored to reuse that one resolver over the authoritative dmsg client instead of hand-rolling PK parsing.
Skywire: Wallet Reliability and Defaults
3465 fix(wasm-wallet): wire node networking like the iframe browser + forward Content-Type fixes a browser wallet stuck forever on “Syncing blocks…”. The dmsg and clearnet fetch shims took no request headers, so every POST body was labeled application/json — but skycoin-web POSTs balance and transactions as x-www-form-urlencoded, which the node rejected as “addrs is required”, leaving the balance-obtained flag false and the loading banner permanently up. Forwarding the request Content-Type through both shims, and routing exactly like the iframe browser (dmsg via the resolving proxy, clearnet via skysocks-client-lite), cleared it. 3466 feat(wallet): default coin node = node.skycoin.com vhost, sourced from services-config.json stops hardcoding the wallet’s default node and instead sources it from the embedded services-config.json, expressed as the resolver vhost form https://node.skycoin.com.<pk>.dmsg so the wallet reaches the node over the mesh exactly as it would over clearnet — through the node’s port-80 Caddy forward with the real Host header preserved — rather than a bare dmsg://<pk>:6420. 3468 chore(wallet): vendor skycoin-web seed-persist + re-embed and 3469 chore(wallet): vendor skycoin-web password-at-creation + re-embed together fix the wallet’s seed/password UX: a no-password wallet now persists its seed in localStorage and survives a refresh instead of demanding re-entry, wallet creation prompts to optionally set a password that encrypts the seed at rest, and wallets remain encryptable after the fact.
Skywire: Build Hygiene
3455 chore(hv-ui): re-embed the Angular bundle (wallet + wasm parity) rebuilds the committed Angular bundle from develop source so a from-source build serves the current UI — the wallet config panel, the wasm wallet tab and the apps/about parity — since the recent source-only HV-UI PRs had left the committed bundle behind. 3470 build(wasm): stamp a clean version into the embedded wasm-visor blob fixes the wasm-visor target building with VCS stamping on and no version ldflags, which stamped the embedded blob +dirty whenever it was built from an uncommitted tree; adding a proper buildinfo stamp and -buildvcs=false makes the blob carry a clean git describe version and, importantly, be deterministic — the same source now produces the same committed blob.