Wallet Management

Wallet Management

Wallet Management

Hologram includes a full DERO wallet implementation with all features you need to manage your funds.

Wallet Operations

OperationDescriptionAPI Method
Create WalletGenerate new wallet with seed phraseCreateWallet(path, password)
Open WalletOpen existing wallet fileOpenWallet(path, password)
Close WalletSecurely close and lockCloseWallet()
Switch WalletHot-swap between walletsSwitchWallet(path, password)
Restore WalletRecover from 25-word seedRestoreWallet(path, password, seed)

Creating a New Wallet

  1. Navigate to Wallet tab
  2. Click Create New Wallet
  3. Choose a secure password (minimum 8 characters)
  4. IMPORTANT: Write down your 25-word seed phrase
⚠️

Your seed phrase is the ONLY way to recover your wallet. Store it securely offline. Never share it with anyone. For maximum security, consider using Privacy Mode to block all non-DERO network connections.

Restoring from Seed

  1. Navigate to Wallet tab
  2. Click Restore Wallet
  3. Enter your 25-word seed phrase (space-separated)
  4. Choose a new password
  5. Wait for wallet to sync

Balance & Transactions

Viewing Balance

Your wallet displays:

  • Available Balance: Immediately spendable
  • Locked Balance: Pending confirmations
  • Total Balance: Available + Locked

Privacy Toggles

Hologram includes per-field privacy controls directly in the Wallet UI:

  • Hide Balance — Masks the visible DERO balance with dots
  • Hide Address — Masks the wallet address with dots

These toggles appear as eye / eye-off buttons beside the balance and address fields. The preferences persist across sessions and also apply to related wallet surfaces such as:

  • the sidebar wallet summary
  • the wallet modal's current wallet display
  • recent activity and history amounts when balance hiding is enabled

When Hide Address is enabled, address copy controls are hidden until the address is shown again.

// Get balance (mature + locked)
mature, locked := wallet.Get_Balance()

Wallet Sync

When you click Refresh in the Wallet tab, Hologram automatically syncs your wallet with the daemon to discover new transactions:

SyncWallet() -> {
    success: bool,
    synced: bool,
    walletHeight: uint64,
    daemonHeight: uint64,
    blocksBehind: int64,
    message: string,
}

Sync Status Indicators:

  • SYNCED — Wallet is up to date with the blockchain
  • X BEHIND — Shows how many blocks behind the wallet is
  • SYNCING — Wallet is catching up to the daemon

Transaction History

View all transactions with filters:

  • Incoming/Outgoing: Direction filter
  • Coinbase: Mining rewards only
  • By SCID: Specific token transactions
  • Height Range: Block range filter
  • Port Filters: By source/destination port
entries := wallet.Show_Transfers(scid, coinbase, in, out, min, max, sender, receiver, dstport, srcport)

Transaction Labels

Add semantic labels to transactions for better organization:

  • Label transactions — Add custom descriptions to any transaction
  • Automatic labels — Version history commits show descriptive labels (e.g., "Updated styles.css, app.js")
  • Search by label — Find transactions by their labels

Labels are stored locally and help you track the purpose of transactions over time.

SetTransactionLabel(txid string, label string) -> { success: true }
GetTransactionLabel(txid string) -> { label: "Payment to Alice" }
GetAllTransactionLabels() -> { labels: { "txid1": "label1", ... } }
DeleteTransactionLabel(txid string) -> { success: true }

Sending DERO

  1. Click Send in the Wallet tab
  2. Enter recipient address (dero1...)
  3. Enter amount
  4. Optionally add a comment (payload)
  5. Enter wallet password
  6. Confirm transaction

Transactions require approximately 4-5 seconds to propagate and will show as "pending" until confirmed in a block.

Ringsize UI Control

Hologram allows you to explicitly select the Ringsize for both DERO and Token transfers.

  • Available Options: 2, 16, 32, 64, 128
  • Default: 16 (Standard anonymity)
⚠️

Developer Note on Ringsize 2: Using ringsize 2 is critical when interacting with smart contracts that need to read the caller's address via ADDRESS_STRING(SIGNER()). If you use ringsize 16 or higher, the transaction is fully anonymous, and SIGNER() will return an empty string.

Receiving DERO

Your wallet address is always visible in the Wallet tab. You can:

  • Click to copy the full address
  • Generate a payment request with amount
  • Create an integrated address with payment ID

Integrated Addresses

Generate an integrated address with embedded payment data:

GetIntegratedAddress(destinationPort uint64, comment string, amount uint64) -> {
    success: true,
    integratedAddress: "deroi1qy...",
    baseAddress: "dero1qy...",
    destinationPort: 12345,
    comment: "Payment for order #123",
    amount: 100000,
}
ParameterDescription
destinationPortService port identifier (DERO's equivalent of payment ID)
commentOptional message embedded in the address
amountRequested amount in atomic units (1 DERO = 100,000)

Decoding Integrated Addresses

Extract embedded data from any DERO address:

SplitIntegratedAddress(address string) -> {
    success: true,
    baseAddress: "dero1qy...",
    isIntegrated: true,
    isMainnet: true,
    destinationPort: 12345,
    comment: "Payment for order #123",
    amount: 100000,
    argumentCount: 3,
}

DERO doesn't use traditional "payment IDs" like Monero. Instead, it embeds RPC_DESTINATION_PORT, comments, and amounts directly in integrated addresses (deroi... on mainnet, detoi... on simulator).

Coinbase Transactions

View mining rewards received (from external miners or Developer Support (EPOCH)):

// Filter coinbase transactions only
GetTransactionHistory(limit int) // Filter for coinbase: true

Coinbase transactions are marked with a pickaxe icon in the transaction history and represent mining rewards received to this wallet address. Learn more about supporting TELA developers through Developer Support (EPOCH).

Villager Avatar Integration

Hologram integrates with the Villager avatar system to display unique visual identities for connected wallets.

How It Works

When a wallet connects, Hologram displays:

  1. Address-Derived Frame: A unique 24×24 pixel frame generated deterministically from your wallet address
  2. Custom Avatar Pixels: If you've stored custom pixels in the Villager smart contract, they're overlaid on the frame
  3. Fallback: If no custom avatar exists, the address-derived identicon frame is displayed

Sidebar Display

The wallet avatar appears in the sidebar:

  • Collapsed Rail: 24px circular avatar
  • Expanded Sidebar: 40px circular avatar with address suffix (last 8 characters)
  • Pending State: Yellow pulsing border during approval

Technical Details

// Avatar fetching (avatarService.js)
getAvatarUrl(address, size) -> dataURL
 
// Identicon generation (villager-identicon.js)
VillagerIdenticon.render(address, size) -> canvas

The avatar system uses:

  • 64-color palette with transparency support
  • Deterministic frame generation from SHA-256 address hash
  • Canvas-based rendering with frame + pixel overlay
  • Local caching to avoid redundant blockchain calls

You don't need a Villager avatar to use Hologram. Without one, your unique address-derived identicon frame is displayed instead.

Avatar Editor

Hologram includes a built-in pixel art editor for creating and customizing your Villager avatar.

Pixel Art Editor

The editor provides a 24×24 pixel canvas with the official 52-color Villager palette:

  • Paint tool — Click or drag to paint pixels
  • Eraser tool — Click or drag to erase pixels (transparent)
  • Color palette — 52 colors organized by groups (Reds, Oranges, Yellows, Greens, Blues, etc.)
  • Live preview — See your avatar with the address-derived frame in real-time
  • Grid display — Visual 24×24 grid for precise pixel placement

Color Palette

The 52-color palette includes:

  • Reds (4 shades) — Light Red, Red, Pure Red, Dark Red
  • Oranges (4 shades) — Light Orange, Orange, OrangeRed, Dark Orange
  • Peach/Brown (4 shades) — Light Peach, Peach, DarkOrange, Brown
  • Gold/Brown (4 shades) — Light Gold, Gold, Amber, Dark Brown
  • Yellows (4 shades) — Light Yellow, Yellow, Pure Yellow, Golden
  • Lime/Green (4 shades) — Light Lime, Lime, Chartreuse, Dark Green
  • Greens (4 shades) — Light Green, Green, Pure Green, Dark Green
  • Mint/Spring (4 shades) — Light Mint, Mint, Spring Green, Dark Mint
  • Cyans (4 shades) — Light Cyan, Cyan, Pure Cyan, Dark Cyan
  • Blues (4 shades) — Light Blue, Blue, Pure Blue, Dark Blue
  • Indigo (4 shades) — Light Indigo, Indigo, Pure Indigo, Dark Indigo
  • Violets (4 shades) — Light Violet, Violet, Pure Violet, Dark Violet
  • Magentas (4 shades) — Light Magenta, Magenta, Pure Magenta, Dark Magenta
  • Pinks (4 shades) — Light Pink, Pink, Pure Pink, Dark Pink
  • Grays (6 shades) — Light Gray, Gray, Dark Gray, plus transparent

Live Preview

As you paint, the editor shows a live preview of your avatar:

  • Address-derived frame — Your unique identicon frame is automatically applied
  • Custom pixels overlay — Your painted pixels appear on top of the frame
  • 256×256 preview — High-resolution preview for detail work

Blockchain Storage

When you save your avatar:

  1. Pixel data encoded — Your 24×24 pixel art is encoded as a 576-character string
  2. Stored on-chain — Saved to the Villager smart contract
  3. Associated with address — Linked to your wallet address
  4. Developer donation — Small fee (default: 0.0001 DERO) supports Villager development

Saving Your Avatar

  1. Paint your design — Use the paint and eraser tools to create your avatar
  2. Preview in real-time — See how it looks with your address frame
  3. Click "Save to Blockchain" — Stores your avatar on-chain
  4. Wait for confirmation — Transaction must be confirmed before avatar appears

Your avatar is stored permanently on the DERO blockchain. Once saved, it will appear whenever your address is displayed in Hologram or other Villager-compatible apps.

Click-to-Edit Navigation

Access the Avatar Editor quickly from multiple locations:

Sidebar Avatar Click

Click your avatar in the sidebar to open the editor:

  • Collapsed rail — Click the 24px circular avatar
  • Expanded sidebar — Click the 40px circular avatar
  • Visual feedback — Hover effects indicate the avatar is clickable
  • Tooltip — "Click to customize your avatar" appears on hover

Wallet Menu Button

From the wallet menu in the sidebar:

  1. Click wallet status — Opens the wallet menu
  2. Click "Edit Avatar" — Button at the bottom of the menu
  3. Editor opens — Navigates directly to the Avatar Editor

The "Edit Avatar" button includes a user icon and is always visible when a wallet is connected.

Recent Wallets

Hologram remembers your recently used wallets:

  • Up to 10 recent wallets stored
  • Shows address prefix for identification
  • Tracks last used timestamp
  • Quick-access from wallet selector

Data stored in datashards/settings/recent_wallets_info.json

Token Portfolio

View and manage all tokens in your wallet:

// Get all tracked tokens with balances
GetTrackedTokens() -> {
    success: true,
    tokens: [
        { scid: "...", name: "TokenName", symbol: "TKN", balance: 1000 },
        ...
    ]
}
 
// Add a token to track
AddTrackedToken(scid string, name string, symbol string) -> { success: true }
 
// Remove a token from tracking
RemoveTrackedToken(scid string) -> { success: true }
 
// Send tokens to another address
TransferToken(scid string, destination string, amount uint64, password string) -> {
    success: true,
    txid: "abc123..."
}

Token Management

  • View balances: See all tokens held by your wallet
  • Add tokens: Track new token SCIDs by entering the SCID, name, and symbol
  • Remove tokens: Hide tokens from your portfolio
  • Send tokens: Transfer tokens to other addresses (uses Burn field internally)

Address Book

Save frequently used addresses for quick access:

Adding Contacts

  1. Go to Wallet > Address Book
  2. Click Add Contact
  3. Enter name and DERO address
  4. Optionally add notes

Using Contacts

  • Quick Send: Click the send icon next to any contact
  • Copy Address: Click to copy the full address
  • Edit/Delete: Manage your contacts list

API Reference

// Get all contacts
GetAddressBook() -> {
    contacts: [
        { id: "...", label: "Alice", address: "dero1qy...", notes: "Friend" },
        ...
    ]
}
 
// Add a contact
AddContact(label string, address string, notes string) -> { success: true }
 
// Update an existing contact
UpdateContact(id string, label string, address string, notes string) -> { success: true }
 
// Delete a contact
DeleteContact(id string) -> { success: true }

Address Book is stored locally and never transmitted. Your contacts are private to your device.

Sign & Verify Messages

Cryptographically sign messages to prove wallet ownership, or verify signatures from others.

Signing Messages

  1. Go to Wallet > Sign Message
  2. Enter the message to sign
  3. Enter wallet password
  4. Click Sign
  5. Copy the PEM-formatted signature
SignMessage(message string) -> {
    signature: "-----BEGIN DERO SIGNED MESSAGE-----\n...",
    address: "dero1qy...",
    message: "Hello, world!"
}

Verifying Signatures

  1. Go to Wallet > Sign Message
  2. Switch to Verify tab
  3. Paste the PEM signature
  4. Click Verify
  5. See verification result with signer address
VerifySignature(signedMessage string) -> {
    valid: true,
    address: "dero1qy...",
    message: "Hello, world!"
}

Use Cases

  • Prove ownership: Sign a message to prove you control an address
  • Verify identity: Confirm a message came from a specific wallet
  • Off-chain agreements: Create signed statements without blockchain transactions
  • Authentication: Use signatures for login systems
⚠️

Never sign messages you don't understand. Malicious actors may try to trick you into signing harmful content.

Export Transaction History

Export your transaction history to CSV for record-keeping or tax purposes.

How to Export

  1. Go to Wallet > History
  2. Apply any desired filters
  3. Click Export CSV
  4. Save the file to your computer

CSV Format

The exported file includes:

ColumnDescription
txidTransaction hash
typeIN, OUT, COINBASE, SC
amountAmount in DERO
feeTransaction fee
heightBlock height
timestampDate and time
destinationRecipient address (if OUT)
payloadComment/memo (if any)

Backup & Security

Access wallet backup and security options:

View Seed Phrase

  1. Go to Wallet > Backup & Security
  2. Enter wallet password
  3. View your 25-word seed phrase
⚠️

Only view your seed phrase in a private, secure location. Anyone with your seed can access your funds.

Change Wallet Password

Update your wallet's encryption password:

  1. Go to Wallet > Backup & Security
  2. Enter your current password
  3. Enter and confirm your new password
  4. Click Change Password
ChangeWalletPassword(currentPassword, newPassword string) -> {
    success: bool,
    message: string,
}

Changing your password re-encrypts the wallet file. Your seed phrase remains the same—this only changes the local file encryption.

View Wallet Keys

For advanced users, view raw wallet keys:

GetWalletKeys(password string) -> {
    spendKey: "...",
    viewKey: "..."
}

Security Features

Encryption

  • All wallet files encrypted with user password
  • Uses DERO's native encryption (not just wrapped)
  • Password never stored, only used in memory

Network Isolation

  • Mainnet and Simulator wallets are separate
  • Simulator wallets use deto1... prefix (vs dero1... for mainnet)
  • Opening a wallet on the wrong network shows a warning
  • No cross-network contamination possible

Seed Phrase Security

  • Seed shown only at creation time
  • Never logged or transmitted
  • Not recoverable from wallet file without password

External Wallet Connection

Connect to external wallets via XSWD:

// Connect to Engram or other XSWD-compatible wallet
ConnectXSWD() -> { success: bool, address: string }
DisconnectXSWD()

This enables using Hologram's browser with wallets that have additional features like hardware wallet support.

DERO Fundamentals

Atomic Units

DERO uses 5 decimal places:

HumanAtomic Units
1 DERO100,000
0.5 DERO50,000
0.00001 DERO1

All API methods that accept or return amounts use atomic units.

Address Formats

PrefixTypeNetwork
dero1...Standard addressMainnet
deto1...Standard addressSimulator
deroi1...Integrated addressMainnet
detoi1...Integrated addressSimulator

Integrated addresses embed payment data (destination port, comment, amount) directly in the address string.

API Reference

Wallet Lifecycle

OpenWallet(filePath string, password string) map[string]interface{}
CloseWallet() map[string]interface{}
CreateWallet(filePath string, password string) map[string]interface{}
RestoreWallet(filePath string, password string, seed string) map[string]interface{}
SwitchWallet(filePath string, password string) map[string]interface{}
IsWalletOpen() bool
GetWalletStatus() map[string]interface{}
GetCurrentWalletPath() map[string]interface{}
SelectWalletFile() map[string]interface{}

Balance & Sync

GetBalance() map[string]interface{}
GetAddress() map[string]interface{}
SyncWallet() map[string]interface{}
GetWalletSyncStatus() map[string]interface{}

Transactions

Transfer(destination string, amount uint64, paymentID string) map[string]interface{}
TransferToken(scid string, destination string, amount uint64, password string) map[string]interface{}
GetTransactionHistory(limit int) map[string]interface{}
GetWalletMiningEarnings(limit int) map[string]interface{}
GetMiningEarningsSummary() map[string]interface{}

Integrated Addresses

GetIntegratedAddress(destinationPort uint64, comment string, amount uint64) map[string]interface{}
SplitIntegratedAddress(address string) map[string]interface{}

Transaction Labels

SetTransactionLabel(txid string, label string) map[string]interface{}
GetTransactionLabel(txid string) map[string]interface{}
GetAllTransactionLabels() map[string]interface{}
DeleteTransactionLabel(txid string) map[string]interface{}

Token Portfolio

GetTrackedTokens() map[string]interface{}
AddTrackedToken(scid string, name string, symbol string) map[string]interface{}
RemoveTrackedToken(scid string) map[string]interface{}

Address Book

GetAddressBook() map[string]interface{}
AddContact(label string, address string, notes string) map[string]interface{}
UpdateContact(id string, label string, address string, notes string) map[string]interface{}
DeleteContact(id string) map[string]interface{}

Security

GetSeedPhrase(password string) map[string]interface{}
GetWalletKeys(password string) map[string]interface{}
ChangeWalletPassword(currentPassword string, newPassword string) map[string]interface{}
SignMessage(message string) map[string]interface{}
VerifySignature(signedData string) map[string]interface{}

Recent Wallets

GetRecentWalletsWithInfo() map[string]interface{}
RemoveRecentWallet(path string) map[string]interface{}
ClearRecentWallets() map[string]interface{}

External Wallet (XSWD)

ConnectXSWD() map[string]interface{}
DisconnectXSWD() map[string]interface{}
GetXSWDStatus() map[string]interface{}