Skip to content

Repository files navigation

JEE Wallet

JEE Wallet

Your keys. Your chain. Zero on-chain fees.

The open-source, non-custodial browser wallet built natively for the JEE blockchain — one install, every major browser.


Version License TypeScript React Turborepo


Chrome Brave Edge Firefox


🌐 Website · 🔍 Explorer · 📦 Releases · 🐛 Issues · 🔐 Security


      ██╗███████╗███████╗     ██╗    ██╗ █████╗ ██╗     ██╗     ███████╗████████╗
      ██║██╔════╝██╔════╝     ██║    ██║██╔══██╗██║     ██║     ██╔════╝╚══██╔══╝
      ██║█████╗  █████╗       ██║ █╗ ██║███████║██║     ██║     █████╗     ██║
██   ██║██╔══╝  ██╔══╝       ██║███╗██║██╔══██║██║     ██║     ██╔══╝     ██║
╚█████╔╝███████╗███████╗     ╚███╔███╔╝██║  ██║███████╗███████╗███████╗   ██║
 ╚════╝ ╚══════╝╚══════╝      ╚══╝╚══╝ ╚═╝  ╚═╝╚══════╝╚══════╝╚══════╝   ╚═╝

🔥 Zero-fee L1 — send JEE without gas headaches
🔐 Non-custodial — keys never leave your device
🌍 Cross-browser — Chrome · Brave · Edge · Firefox
🧩 dApp native — connect, sign, send from any JEE site
📦 One buildnpm run bundle → load everywhere



📑 Table of Contents


🌟 Overview

JEE Wallet is a production-grade browser extension wallet for the JEE zero-fee Layer-1 network. It ships as a single cross-browser build — no separate Chrome vs Firefox forks.

Built for real users and real dApps:

  • Create HD wallets from a 12 / 24-word seed
  • Import legacy private keys
  • Manage multiple accounts across wallets
  • Connect to JEE dApps with explicit approval
  • Sign messages and send transactions from a clean React UI
  • Auto-lock after idle — session keys wiped on lock

Privacy first: JEE Wallet collects zero telemetry. See PRIVACY_POLICY.md.


📸 Screenshots

Screenshots and a product demo will be added in a future release. For now, see Releases to download and try the latest build.


✨ Features

🔐 Wallet & Keys

  • Non-custodial — you hold the keys
  • AES-256-GCM encryption at rest
  • Password-derived key (Argon2 + PBKDF2)
  • HD wallet (BIP39 mnemonic)
  • Legacy single-key import
  • Multi-wallet · multi-account

🌐 Web3 & UX

  • JEE dApp connectivity
  • Per-origin connect / disconnect
  • Message signing
  • Transaction send & stake flows
  • Configurable auto-lock timer
  • Popup (all browsers) + Firefox sidebar
🔍 Full feature list
Feature Details
🔐 Non-custodial Private keys never leave your device
🔒 AES-256-GCM Sensitive data encrypted with password-derived keys
🌱 HD Wallets 12 or 24-word BIP39 mnemonics
🔑 Legacy import Raw private key support
🌐 dApp bridge Isolated + MAIN-world content scripts
✍️ Sign messages Off-chain ownership proofs
💸 Send & stake Full transaction flows with confirmation
⏱️ Auto-lock Idle timeout → keys cleared from session
📦 Multi-account Unlimited wallets & accounts locally
🦊 Cross-browser Single manifest, single build

🌍 Supported Browsers

Browser Min version Toolbar Side panel Load method
Google Chrome 114+ Popup Load unpacked → dist/
Brave Latest Popup Load unpacked → dist/
Microsoft Edge Latest Popup Load unpacked → dist/
Mozilla Firefox 128+ Popup Sidebar Temporary add-on → dist/manifest.json

One command builds for all: npm run bundle → output in apps/extension/dist


⛓️ Chain Info

Property Value
Network JEE Mainnet
Chain ID JEE
Bech32 prefix jee
Native token JEE
On-chain denom jeff
Decimals 6
Tx fees Zero
Block explorer jeescan.org
Official site jee.money

⚙️ How It Works

Architecture

flowchart LR
    subgraph EXT["🧩 Extension"]
        UI["Popup / Sidebar<br/><i>React UI</i>"]
        BG["Background<br/><i>Crypto + RPC</i>"]
        CS["Content Script<br/><i>Isolated</i>"]
        BR["Bridge<br/><i>MAIN world</i>"]
    end

    subgraph WEB["🌍 Website"]
        DAPP["JEE dApp"]
    end

    subgraph CHAIN["⛓️ JEE Network"]
        RPC["RPC / LCD"]
    end

    DAPP <-->|window.postMessage| BR
    BR <-->|postMessage| CS
    CS <-->|Messager| BG
    UI <-->|Messager| BG
    BG <-->|HTTPS| RPC

    style UI fill:#0f172a,stroke:#00d4aa,color:#e2e8f0
    style BG fill:#0f172a,stroke:#00d4aa,color:#e2e8f0
    style CHAIN fill:#1e1b4b,stroke:#818cf8,color:#e2e8f0
Loading

dApp request flow

sequenceDiagram
    participant D as dApp (web page)
    participant B as Content Bridge
    participant C as Content Script
    participant K as Background
    participant U as Wallet UI

    D->>B: pocket-network request
    B->>C: postMessage (same origin)
    C->>K: Messager API
    K->>U: Open approval popup
    U->>K: User confirms
    K->>C: Signed result / txid
    C->>B: Response
    B->>D: postMessage response
Loading

Security boundaries

flowchart TB
    subgraph TRUSTED["✅ Trusted — Extension only"]
        BG2["Background script"]
        UI2["Extension pages"]
    end

    subgraph UNTRUSTED["⚠️ Untrusted — Web pages"]
        PAGE["Any website / dApp"]
    end

    PAGE -->|"postMessage only"| BR2["Bridge"]
    BR2 --> CS2["Content script"] --> BG2
    UI2 --> BG2

    style TRUSTED fill:#052e16,stroke:#22c55e,color:#ecfdf5
    style UNTRUSTED fill:#450a0a,stroke:#ef4444,color:#fef2f2
Loading

🚀 Build from Source

Prerequisites

Requirement Version
Node.js 24.18.0 LTS (nvm recommended)
npm 11.x or higher
OS Linux, macOS, or Windows (WSL recommended)
nvm install 24.18.0
nvm use

Build steps

git clone https://github.com/SujayPro/Jee-wallet.git
cd Jee-wallet
npm ci
cp apps/extension/.env.example apps/extension/.env
npm run bundle

Output

Artifact Path Purpose
Unpacked extension apps/extension/dist/ Load unpacked in Chrome, Brave, Edge, or Firefox
Store package apps/extension/dist.zip Firefox Add-ons (AMO) upload

The bundle script produces a standard ZIP archive with manifest.json at the archive root. Background scripts are split into webpack chunks (bg-vendors-*.js, background.js) to stay under AMO's 5 MB per-file limit. No remote code is loaded at runtime.

For Mozilla AMO automated builds, use:

npm run build-for-amo

🧩 Install the Extension

Chrome · Brave · Edge

chrome://extensions  →  Developer mode ON  →  Load unpacked  →  select dist/
  1. Open chrome://extensions (or brave://extensions, edge://extensions)
  2. Toggle Developer mode (top right)
  3. Load unpacked → pick apps/extension/dist
  4. Pin JEE WALLET to your toolbar
  5. After rebuilds → hit Refresh on the extension card

Firefox

about:debugging  →  Load Temporary Add-on  →  dist/manifest.json
  1. Build the extension (npm run bundle) or download a release
  2. Open about:debugging#/runtime/this-firefox
  3. Click Load Temporary Add-on…
  4. Select apps/extension/dist/manifest.json

Temporary add-ons are cleared when Firefox restarts. Re-load from the same path after restart.

⚠️ Issue Solution
White blank popup Load extension/dist/, not extension/
Invalid zip on AMO Use dist.zip from npm run bundle — do not zip manually
dApp won't connect (Firefox) Requires Firefox 128+

Firefox sidebar: View → Sidebar → JEE WALLET

Firefox Add-ons (AMO) — developer notes

After npm run build-for-amo, upload apps/extension/dist.zip to the Firefox Developer Hub.

Item Value
Upload file apps/extension/dist.zip
Source code This repository + build command above
Privacy policy PRIVACY_POLICY.md
Data collection None (data_collection_permissions.required: ["none"] in manifest)

Do not manually zip the dist/ folder — the bundle script creates the correct archive structure.


🛠 Tech Stack

TypeScript React Redux Webpack Sass Turborepo WebExtensions

Layer Tech
UI React 18, Redux Toolkit, React Router, Bootstrap 5, Sass
Extension Manifest V3, cross-browser ext API shim
Crypto AES-256-GCM, Argon2, BIP39 HD derivation
Build Turborepo, webpack 5, Create React App (extension-ui)
Chain JEE RPC / LCD, Cosmos-style addressing

📁 Project Structure

Jee-wallet/
├── apps/
│   ├── extension/          # MV3 entry — background, content, bridge
│   ├── extension-ui/       # React popup & sidebar UI
│   └── sdk-demo/           # SDK playground
├── packages/
│   ├── background/         # Wallet logic, RPC, encryption
│   ├── content/            # dApp message relay (isolated world)
│   ├── content-bridge/     # Page-context injector (MAIN world)
│   ├── sdk/                # Core dApp SDK
│   ├── react-sdk/          # React hooks for dApps
│   ├── wallet-utils/       # Key derivation & chain utils
│   ├── util-browser/       # Cross-browser messaging & routes
│   └── …                   # types, constants, ui, util
└── apps/extension/dist/    # 👈 Load this in your browser

💻 Development

npm run dev          # Watch all packages
npm run build        # Build packages
npm run build-ui     # Build React UI only
npm run bundle       # Full extension build + dist.zip
npm run build-for-amo # Same as bundle — AMO-compatible output
npm run test         # Run test suite
npm run format       # Prettier format
🧪 Run specific tests
npm run test:wallet-utils
npm run test:background
npm run test:util

🔌 SDK for dApp Developers

Integrate JEE Wallet into your dApp:

Package Use case
packages/sdk Vanilla JS / any framework
packages/react-sdk React hooks (useJeeWallet, etc.)
apps/sdk-demo Live integration example
cd apps/sdk-demo && npm start   # Demo at localhost:3000

🔒 Security Model

All sensitive operations execute only in the background script.
The UI and content scripts never touch raw private keys.

Rule Implementation
Keys stay local Never sent over postMessage or network
Encrypted at rest AES-256-GCM + password-derived keys
Session isolation Auto-lock wipes in-memory secrets
dApp permissions Explicit per-origin user approval
Connect / disconnect Only extension UI can authorize origins
Message validation UUID replay protection on dApp bridge

Responsible disclosure: hello@jee.money — please report privately before public disclosure.


❓ FAQ

Is JEE Wallet custodial?

No. Your seed phrase and private keys are generated and stored only on your device, encrypted with your password. We never see them.

Which browsers are supported?

Chrome 114+, Brave, Edge, and Firefox 128+. One npm run bundle produces a build for all of them.

Why is my Firefox popup white/blank?

You loaded the wrong folder. Select apps/extension/dist/manifest.json, not the parent extension/ directory.

Does it work with MetaMask?

JEE Wallet is purpose-built for the JEE chain via the Pocket Network provider bridge — not EVM / MetaMask.

Where are my keys stored?

Encrypted in extension local storage. Session keys (unlocked state) live in extension session storage and are cleared on lock.


🗺 Roadmap

  • Cross-browser support (Chrome, Brave, Edge, Firefox)
  • HD & legacy wallet import
  • dApp connect / sign / send
  • Firefox sidebar panel
  • AMO-ready build pipeline (dist.zip, manifest compliance)
  • Chrome Web Store listing
  • Firefox Add-ons (AMO) public listing approved
  • Hardware wallet support
  • Mobile companion app
  • Multi-language UI

🤝 Contributing

Contributions welcome! To get started:

  1. Fork the repo
  2. Create a feature branch (git checkout -b feature/amazing-thing)
  3. Commit your changes (git commit -m 'Add amazing thing')
  4. Push to the branch (git push origin feature/amazing-thing)
  5. Open a Pull Request

Please keep PRs focused and run npm run test before submitting.


👤 Author

SujayPro

Built by SujayPro · Sujay@jee.money

GitHub Email Website


📄 License

Apache License 2.0

JEE Wallet is open source — use, modify, and distribute under Apache 2.0 terms.



If JEE Wallet helps you — star the repo. It helps others find it.


Star on GitHub


Built for JEE · Built for the open web · Zero fees on-chain



About

Non-custodial Browser extension wallet for the JEE blockchain — HD wallets, dApp connect, message signing.

Topics

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages