From d28996feeef34b0781a9b5b74d9c2b31fd206701 Mon Sep 17 00:00:00 2001 From: Martin Marinov Date: Thu, 11 Jun 2026 00:07:56 +0300 Subject: [PATCH] feat(wallet): rebrand to LightNode Wallet, prebuilt one-click download, standalone build The wallet is its own product - LightNode Wallet - an independent, community wallet for the LightChain ecosystem (not an official LightChain product, and not positioned against any other wallet). - Rename the product to "LightNode Wallet" everywhere (manifest, popup, EIP-6963 provider name + rdns, package name, README). "LightChain" stays only where it names the network the wallet connects to. - /wallet page: lead with a prebuilt "Download the wallet" (no build needed) -> unzip -> Load unpacked, with build-from-source as a developer fallback. Copy reframed to stand on its own (no MetaMask/Phantom comparisons). - Distribution: a wallet-release workflow builds + zips the extension and attaches lightnode-wallet-chrome.zip to a GitHub Release, so the download button always serves a current build (v0.1.0 published). - .gitignore: guard against an accidental nested repo clone and ignore the WXT build output. --- .github/workflows/wallet-release.yml | 41 ++++++++++++++++++++++++ .gitignore | 7 ++++ app/wallet/page.tsx | 48 +++++++++++++++++----------- wallet/README.md | 2 +- wallet/entrypoints/inpage.ts | 10 +++--- wallet/entrypoints/popup/App.tsx | 2 +- wallet/entrypoints/popup/index.html | 2 +- wallet/package-lock.json | 4 +-- wallet/package.json | 2 +- wallet/wxt.config.ts | 4 +-- 10 files changed, 90 insertions(+), 32 deletions(-) create mode 100644 .github/workflows/wallet-release.yml diff --git a/.github/workflows/wallet-release.yml b/.github/workflows/wallet-release.yml new file mode 100644 index 0000000..f46f292 --- /dev/null +++ b/.github/workflows/wallet-release.yml @@ -0,0 +1,41 @@ +name: Wallet release + +# Builds the prebuilt extension zip and attaches it to a GitHub Release so the +# website's "Download the wallet" button always serves a current build. The +# wallet is self-contained (no SDK build step), so this is a plain npm build. +on: + push: + tags: ["wallet-v*"] + workflow_dispatch: + +permissions: + contents: write + +jobs: + release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: "20" + - name: Build + zip the extension + working-directory: wallet + run: | + npm install --no-audit --no-fund + npm run build + npm run zip + - name: Stable asset name + run: cp wallet/.output/*-chrome.zip lightnode-wallet-chrome.zip + - name: Publish to release + env: + GH_TOKEN: ${{ github.token }} + run: | + TAG="${{ github.ref_type == 'tag' && github.ref_name || 'wallet-latest' }}" + if gh release view "$TAG" >/dev/null 2>&1; then + gh release upload "$TAG" lightnode-wallet-chrome.zip --clobber + else + gh release create "$TAG" lightnode-wallet-chrome.zip \ + --title "LightNode Wallet ($TAG)" \ + --notes "Prebuilt LightChain wallet extension (Chrome MV3). Unzip and Load unpacked in chrome://extensions." + fi diff --git a/.gitignore b/.gitignore index 3c40533..4f02bf6 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,13 @@ next-env.d.ts # SDK build output sdk/dist +# Guard against an accidental nested clone of this repo (git clone run inside it) +/lightnode/ + +# Wallet build output (WXT) +wallet/.output +wallet/.wxt + # Local-only owner docs (strategy/QA/capabilities) QA-AND-BUSINESS.md CAPABILITIES.md diff --git a/app/wallet/page.tsx b/app/wallet/page.tsx index 6e9d94d..1d399df 100644 --- a/app/wallet/page.tsx +++ b/app/wallet/page.tsx @@ -3,17 +3,18 @@ import Link from "next/link"; import { Server, Sparkles, Landmark, ArrowLeftRight, Fuel, ShieldCheck, Download, KeyRound, Github, Lock } from "lucide-react"; export const metadata: Metadata = { - title: "LightChain Wallet - self-custodial wallet for LightChain", + title: "LightNode Wallet - a self-custodial wallet for the LightChain ecosystem", description: - "A self-custodial browser wallet built for LightChain: worker monitoring, encrypted AI inference, and DAO intelligence. Your keys never leave your device. No smart contract, no custody.", + "LightNode Wallet: a self-custodial home for your LCAI, your worker, encrypted AI inference, and DAO governance on LightChain. Your keys never leave your device. Independent and community-built.", }; const REPO = "https://github.com/marinom2/lightnode/tree/main/wallet"; +const DOWNLOAD_URL = "https://github.com/marinom2/lightnode/releases/latest/download/lightnode-wallet-chrome.zip"; const FEATURES: { icon: typeof Server; title: string; body: string; status: "live" | "soon" }[] = [ { icon: ShieldCheck, title: "Self-custodial", body: "Keys are generated and encrypted on your device with AES-256-GCM + scrypt. They never leave it. No server, no custody, no smart contract.", status: "live" }, { icon: Fuel, title: "Gas done right", body: "LightChain fees are negligible, so the wallet drops the gwei sliders and scary fee modals. One tap, fee shown as what it is: nothing.", status: "live" }, - { icon: Server, title: "Worker control", body: "See if your address is a registered worker, its stake, headroom, and claimable rewards - and stake or top up in one click. No other wallet knows LightChain workers exist.", status: "soon" }, + { icon: Server, title: "Worker control", body: "Your worker, in your wallet: registration, stake, headroom, and claimable rewards at a glance, then stake or top up in a tap.", status: "soon" }, { icon: Sparkles, title: "Encrypted AI inference", body: "Ask an AI a question and pay per call from your own key, end-to-end encrypted and settled on-chain - right inside the wallet.", status: "soon" }, { icon: Landmark, title: "DAO intelligence", body: "Decoded proposals, quorum distance, and your voting power, surfaced from the registries. Vote on the official DAO in a tap.", status: "soon" }, { icon: ArrowLeftRight, title: "Built-in bridge", body: "Move LCAI between Ethereum and LightChain without leaving the wallet, over the Hyperlane warp route.", status: "soon" }, @@ -44,19 +45,22 @@ export default function WalletPage() {
{/* hero */}
-

Self-custodial · LightChain

+

Self-custodial · Independent

- The LightChain Wallet + LightNode Wallet

- A browser wallet built for LightChain - worker monitoring, encrypted AI, and DAO intelligence. Like Phantom, it is a pure self-custodial wallet: no smart contract, no custody, and your keys never leave your device. + A self-custodial wallet for the LightChain ecosystem. Hold your LCAI, monitor your worker, run encrypted AI inference, and read the DAO - all in one place. Your keys never leave your device.

- - Install it + + Download the wallet + + + How to install - View source + Source
@@ -84,20 +88,19 @@ export default function WalletPage() { {/* install */}
-

Install it today

+

Install it (no build needed)

- The wallet is open source and runs from source while it goes through a security audit. A Chrome Web Store listing follows the audit. Until then, load it unpacked in ~2 minutes: + Grab the prebuilt extension and load it in under a minute. A one-click Chrome Web Store listing lands after the security audit.

- -
{`git clone https://github.com/marinom2/lightnode
-cd lightnode/wallet
-npm install
-npm run build`}
-

Produces a loadable extension at wallet/.output/chrome-mv3.

+ + + lightnode-wallet-chrome.zip + +

Then unzip it anywhere - no Node, no build.

- Open chrome://extensions, enable Developer mode (top right), click Load unpacked, and select the wallet/.output/chrome-mv3 folder. + Open chrome://extensions, enable Developer mode (top right), click Load unpacked, and select the unzipped folder. Pin the extension, open it, and create a new 24-word wallet (or import one). The recovery phrase is shown once and encrypted on your device - write it down; nobody, including us, can recover it. @@ -105,8 +108,15 @@ npm run build`}

- Once installed, the wallet appears automatically in dApp connect dialogs alongside MetaMask (via EIP-6963) - no need to overwrite anything. + Once installed, the wallet appears automatically in dApp connect dialogs via EIP-6963 - it coexists cleanly with any other wallet you have.

+
+ Prefer to build from source? (developers) +
{`git clone https://github.com/marinom2/lightnode
+cd lightnode/wallet
+npm install
+npm run build      # outputs wallet/.output/chrome-mv3`}
+
{/* security */} diff --git a/wallet/README.md b/wallet/README.md index 917b9d1..e2bba17 100644 --- a/wallet/README.md +++ b/wallet/README.md @@ -1,4 +1,4 @@ -# LightChain Wallet +# LightNode Wallet A **self-custodial** browser wallet for LightChain (EVM L1, chain 9200; testnet 8200). Like Phantom/MetaMask, it is a pure client-side **EOA wallet** - there is **no smart contract**, no relayer, and no server. Your keys are generated and encrypted **on your device and never leave it**. We are not an exchange and never custody funds. diff --git a/wallet/entrypoints/inpage.ts b/wallet/entrypoints/inpage.ts index 38ac671..0e86187 100644 --- a/wallet/entrypoints/inpage.ts +++ b/wallet/entrypoints/inpage.ts @@ -1,8 +1,8 @@ import { PAGE_TO_CONTENT, CONTENT_TO_PAGE, type ContentMessage } from "../src/provider/protocol"; // Injected into the page's MAIN world. Exposes a standard EIP-1193 provider and -// announces it via EIP-6963 so dapps can pick "LightChain Wallet" ALONGSIDE -// MetaMask. We do not overwrite window.ethereum (only set it if nothing else has). +// announces it via EIP-6963 so dapps can pick "LightNode Wallet" alongside any other wallet. +// We do not overwrite window.ethereum (only set it if nothing else has). type Handler = (args: unknown) => void; function createProvider() { @@ -22,7 +22,7 @@ function createProvider() { }); const provider = { - isLightChainWallet: true, + isLightNodeWallet: true, request({ method, params }: { method: string; params?: unknown[] }): Promise { if (typeof method !== "string") return Promise.reject({ code: -32602, message: "Invalid params" }); const id = nextId++; @@ -46,9 +46,9 @@ function createProvider() { function announce(provider: ReturnType) { const info = { uuid: crypto.randomUUID(), - name: "LightChain Wallet", + name: "LightNode Wallet", icon: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiI+PGNpcmNsZSBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiIGZpbGw9IiM3MDY0ZTkiLz48L3N2Zz4=", - rdns: "ai.lightchain.wallet", + rdns: "app.lightnode.wallet", }; const emit = () => window.dispatchEvent(new CustomEvent("eip6963:announceProvider", { detail: Object.freeze({ info, provider }) })); window.addEventListener("eip6963:requestProvider", emit); diff --git a/wallet/entrypoints/popup/App.tsx b/wallet/entrypoints/popup/App.tsx index 933ba7c..7ac4a5f 100644 --- a/wallet/entrypoints/popup/App.tsx +++ b/wallet/entrypoints/popup/App.tsx @@ -27,7 +27,7 @@ export function App() { function Shell({ children }: { children: React.ReactNode }) { return (
-
LightChain Wallet
+
LightNode Wallet
{children}
); diff --git a/wallet/entrypoints/popup/index.html b/wallet/entrypoints/popup/index.html index c181abc..a64d084 100644 --- a/wallet/entrypoints/popup/index.html +++ b/wallet/entrypoints/popup/index.html @@ -3,7 +3,7 @@ - LightChain Wallet + LightNode Wallet
diff --git a/wallet/package-lock.json b/wallet/package-lock.json index 596907e..3041084 100644 --- a/wallet/package-lock.json +++ b/wallet/package-lock.json @@ -1,11 +1,11 @@ { - "name": "lightchain-wallet", + "name": "lightnode-wallet", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "lightchain-wallet", + "name": "lightnode-wallet", "version": "0.1.0", "hasInstallScript": true, "dependencies": { diff --git a/wallet/package.json b/wallet/package.json index ee9daba..ecf3e64 100644 --- a/wallet/package.json +++ b/wallet/package.json @@ -1,5 +1,5 @@ { - "name": "lightchain-wallet", + "name": "lightnode-wallet", "private": true, "version": "0.1.0", "type": "module", diff --git a/wallet/wxt.config.ts b/wallet/wxt.config.ts index b3b754d..e28985b 100644 --- a/wallet/wxt.config.ts +++ b/wallet/wxt.config.ts @@ -1,14 +1,14 @@ import { defineConfig } from "wxt"; import { fileURLToPath } from "node:url"; -// LightChain Wallet - self-custodial EOA extension. Keys never leave the device. +// LightNode Wallet - self-custodial EOA extension. Keys never leave the device. // The inpage provider is web-accessible (required to inject into the MAIN world); // use_dynamic_url randomizes its URL per session to blunt wallet fingerprinting. export default defineConfig({ modules: ["@wxt-dev/module-react"], alias: { "@": fileURLToPath(new URL("./src", import.meta.url)) }, manifest: { - name: "LightChain Wallet", + name: "LightNode Wallet", description: "Self-custodial wallet for LightChain. Your keys never leave this device.", minimum_chrome_version: "120", permissions: ["storage", "alarms", "notifications"],