171 lines
6.0 KiB
Markdown
171 lines
6.0 KiB
Markdown
|
|
# Palladium Wallet
|
||
|
|
|
||
|
|
**An SPV desktop wallet built specifically for the Palladium (PLM) cryptocurrency** and optimized for its chain.
|
||
|
|
|
||
|
|
Unlike generic wallets adapted to many coins, Palladium Wallet is designed around Palladium's consensus parameters — a Bitcoin-derived UTXO chain with 2-minute blocks and LWMA difficulty — and centralizes them in a single network profile. This keeps it lightweight, predictable and faithful to the chain: no client-side difficulty recalculation (trust is anchored to hardcoded checkpoints), mandatory Merkle verification on every confirmed transaction, and a network client written specifically for Palladium's indexing server.
|
||
|
|
|
||
|
|
## Features
|
||
|
|
|
||
|
|
- **Lightweight SPV**: syncs against an indexing server (ElectrumX-like protocol) without downloading the full chain.
|
||
|
|
- **Security**: seed and private keys encrypted on disk (AES-GCM, PBKDF2-SHA512), never in plaintext in logs or on the wire; every server response is validated with Merkle proofs + checkpoints.
|
||
|
|
- **HD wallet** (BIP39/BIP32), SegWit/wrapped/legacy addresses, watch-only from xpub.
|
||
|
|
- **PSBT-centric**: signing flows go through PSBT (offline / air-gapped / multisig).
|
||
|
|
- **Multi-network**: mainnet, testnet, regtest.
|
||
|
|
- **GUI** (Avalonia) and **CLI** on the same core.
|
||
|
|
- **Multilingual**: Italian, English, Spanish, French, Portuguese, German.
|
||
|
|
|
||
|
|
## Architecture
|
||
|
|
|
||
|
|
```
|
||
|
|
PalladiumWallet.sln
|
||
|
|
├─ src/Core/ Chain/ Crypto/ Wallet/ Spv/ Net/ Storage/ (no UI dependency)
|
||
|
|
├─ src/App/ Avalonia GUI
|
||
|
|
├─ src/Cli/ CLI on the same Core
|
||
|
|
└─ tests/ xUnit
|
||
|
|
```
|
||
|
|
|
||
|
|
Stack: **.NET 8 + Avalonia UI + NBitcoin**.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Development environment
|
||
|
|
|
||
|
|
You only need the **.NET 8 SDK**. The core and crypto are fully testable without the GUI or a real network.
|
||
|
|
|
||
|
|
### Windows
|
||
|
|
|
||
|
|
1. Install the .NET 8 SDK:
|
||
|
|
```powershell
|
||
|
|
winget install Microsoft.DotNet.SDK.8
|
||
|
|
```
|
||
|
|
(alternatively, the installer from <https://dotnet.microsoft.com/download/dotnet/8.0>)
|
||
|
|
2. Clone the repository and restore dependencies:
|
||
|
|
```powershell
|
||
|
|
git clone <repo-URL>
|
||
|
|
cd PalladiumWallet
|
||
|
|
dotnet restore
|
||
|
|
```
|
||
|
|
|
||
|
|
### Linux
|
||
|
|
|
||
|
|
1. Install the .NET 8 SDK through your distro's package manager, or without root via the official script:
|
||
|
|
```bash
|
||
|
|
curl -sSL https://dot.net/v1/dotnet-install.sh | bash -s -- --channel 8.0
|
||
|
|
export PATH="$HOME/.dotnet:$PATH" DOTNET_ROOT="$HOME/.dotnet"
|
||
|
|
```
|
||
|
|
(add the two `export` lines to your `~/.bashrc` to make them permanent)
|
||
|
|
2. Clone and restore:
|
||
|
|
```bash
|
||
|
|
git clone <repo-URL>
|
||
|
|
cd PalladiumWallet
|
||
|
|
dotnet restore
|
||
|
|
```
|
||
|
|
|
||
|
|
> The GUI uses Avalonia, which runs natively on both platforms with no extra graphics dependencies.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Running it
|
||
|
|
|
||
|
|
**GUI** (with hot reload for development):
|
||
|
|
```bash
|
||
|
|
dotnet watch --project src/App
|
||
|
|
```
|
||
|
|
or a single run:
|
||
|
|
```bash
|
||
|
|
dotnet run --project src/App
|
||
|
|
```
|
||
|
|
|
||
|
|
**CLI** (same core, useful for scripts and headless environments):
|
||
|
|
```bash
|
||
|
|
dotnet run --project src/Cli -- <command>
|
||
|
|
```
|
||
|
|
Run without arguments for the full list of commands.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Running tests
|
||
|
|
|
||
|
|
Tests are the **primary verification layer** — the core logic and crypto run headless, without the GUI or a real network.
|
||
|
|
|
||
|
|
Run the whole suite:
|
||
|
|
```bash
|
||
|
|
dotnet test
|
||
|
|
```
|
||
|
|
|
||
|
|
Run a single test (or a group) by name:
|
||
|
|
```bash
|
||
|
|
dotnet test --filter "FullyQualifiedName~TestName"
|
||
|
|
```
|
||
|
|
|
||
|
|
Run only the tests in one project:
|
||
|
|
```bash
|
||
|
|
dotnet test tests/PalladiumWallet.Tests
|
||
|
|
```
|
||
|
|
|
||
|
|
> Cross-implementation tests compare addresses, txids and PSBTs against reference golden vectors: a different address or txid is a blocking bug.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Building
|
||
|
|
|
||
|
|
**Development build:**
|
||
|
|
```bash
|
||
|
|
dotnet build
|
||
|
|
```
|
||
|
|
|
||
|
|
**Windows publish** (single self-contained executable):
|
||
|
|
```bash
|
||
|
|
dotnet publish src/App -r win-x64 -p:PublishSingleFile=true --self-contained
|
||
|
|
```
|
||
|
|
|
||
|
|
**Linux publish** (self-contained; the AppImage is then produced with [PupNet Deploy](https://github.com/kuiperzone/PupNet-Deploy)):
|
||
|
|
```bash
|
||
|
|
dotnet publish src/App -r linux-x64 --self-contained
|
||
|
|
```
|
||
|
|
|
||
|
|
The application **version** is set in a single place: the `<Version>` tag in [`src/App/PalladiumWallet.App.csproj`](src/App/PalladiumWallet.App.csproj). It appears in the window title and is stamped into the published binaries.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## User guide (quick)
|
||
|
|
|
||
|
|
### First launch
|
||
|
|
1. On first launch, choose **where to store data** (wallet, configuration, certificates) — the default path or a folder of your choice.
|
||
|
|
2. Create a new wallet, restore from seed, or open an existing wallet.
|
||
|
|
3. If you create a wallet, **write the seed phrase down on paper**: it will not be shown again. You can protect the file with a password.
|
||
|
|
|
||
|
|
### Main tabs
|
||
|
|
- **History** — list of transactions. *Double-click* a row to open the full detail (amount, fee, addresses, sizes, confirmations).
|
||
|
|
- **Send** — recipient + amount (or "send all"), adjustable fee; for watch-only wallets a PSBT is produced to be signed offline.
|
||
|
|
- **Receive** — next unused address, with a **QR code** and a **Copy** button.
|
||
|
|
- **Addresses** — all derived addresses with balances; click for details (keys, derivation path).
|
||
|
|
- **Contacts** — address book with labels.
|
||
|
|
|
||
|
|
### Connection
|
||
|
|
- The status indicator at the bottom shows the connection to the **indexing server**; tapping it opens the server settings.
|
||
|
|
- Sync is SPV: it downloads only what concerns your wallet and verifies every confirmed transaction with a Merkle proof.
|
||
|
|
|
||
|
|
### Settings and Help
|
||
|
|
- **Settings**: language, display unit (PLM / mPLM / µPLM / sat), server.
|
||
|
|
- **Help**: software information and version.
|
||
|
|
|
||
|
|
### CLI in brief
|
||
|
|
```bash
|
||
|
|
# Wallet
|
||
|
|
dotnet run --project src/Cli -- create [--words 12|24] [--kind segwit|wrapped|legacy] [--net mainnet|testnet|regtest] [--password P]
|
||
|
|
dotnet run --project src/Cli -- restore "<mnemonic>" [...]
|
||
|
|
dotnet run --project src/Cli -- info [--net ...] [--password P]
|
||
|
|
|
||
|
|
# Network
|
||
|
|
dotnet run --project src/Cli -- sync [--server host[:port]] [--ssl]
|
||
|
|
dotnet run --project src/Cli -- send --to ADDRESS (--amount X | --all) [--feerate sat/vB] [--broadcast]
|
||
|
|
```
|
||
|
|
The default wallet file is `~/.palladium-wallet/<network>/wallets/default.wallet.json` (override with `--file`).
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## License
|
||
|
|
|
||
|
|
Released under the MIT License. See the [LICENSE](LICENSE) file.
|