Nad Wallet
π Nad Wallet - Monad Chain Identity for AI Agents. Create wallets, sign messages (SIWE), manage MON tokens programmatically. Built for the Nad ecosystem (nad.fun, NadMail, NadName).
Like a lobster shell, security has layers β review code before you run it.
License
SKILL.md
π Nad Wallet - Monad Chain Identity for AI Agents
Every autonomous agent needs a wallet on Monad. Create one without human help.
TL;DR: Programmatic wallet creation on Monad blockchain. SIWE auth for NadMail, MON balance checks, ecosystem integration.
Why Nad Wallet?
- Monad Native β Built specifically for Monad blockchain (Chain ID 143)
- True Autonomy β Your agent creates and controls its own wallet
- No Browser Needed β Pure CLI, no extensions or popups
- Nad Ecosystem Ready β NadMail, NadName, nad.fun integration
- SIWE Ready β Sign-In with Ethereum for Web3 services
- Secure by Default β Environment variables, no plaintext keys
Create and manage Monad chain wallets programmatically for the Nad ecosystem.
β οΈ Security First
| β DO | β DON'T |
|---|---|
| Use NAD_PRIVATE_KEY environment variable | Store private keys in plain text files |
| Set wallet files to chmod 600 | Commit wallet files to git |
Use --env mode (recommended) | Use console.log(privateKey) |
| Back up mnemonics offline | Share private keys or mnemonics |
Store files in ~/.nad-wallet/ only | Auto-detect wallets outside ~/.nad-wallet/ |
π Security Standards: Identical to Base Wallet security practices but adapted for Monad/Nad ecosystem.
Network Information
| Property | Value |
|---|---|
| Blockchain | Monad |
| Chain ID | 143 |
| RPC URL | https://rpc.monad.xyz |
| Explorer | https://explorer.monad.xyz |
| Native Token | MON |
| Ecosystem | nad.fun, NadMail, NadName |
Quick Start
Create a New Wallet (Recommended)
# Output as environment variable format (safest)
node scripts/create-wallet.js --env
# Output example:
# export NAD_WALLET_ADDRESS="0x..."
# export NAD_PRIVATE_KEY="0x..."
Then copy to your shell or .env file.
Create with File Storage (Opt-in)
# Only if you need file-based storage
node scripts/create-wallet.js --managed my-agent
β οΈ This stores private key in ~/.nad-wallet/wallets/my-agent.json
Usage Examples
Load Wallet from Environment
const { ethers } = require('ethers');
// β
SECURE: Load from environment variable
const wallet = new ethers.Wallet(process.env.NAD_PRIVATE_KEY);
console.log('Address:', wallet.address);
// β NEVER: console.log('Private Key:', wallet.privateKey);
Connect to Monad
const provider = new ethers.JsonRpcProvider('https://rpc.monad.xyz');
const connectedWallet = wallet.connect(provider);
// Check balance
const balance = await provider.getBalance(wallet.address);
console.log('Balance:', ethers.formatEther(balance), 'MON');
Sign Message (SIWE for NadMail)
const message = `nadmail.ai wants you to sign in with your Ethereum account:
${wallet.address}
Sign in to NadMail
URI: https://nadmail.ai
Version: 1
Chain ID: 143
Nonce: ${nonce}
Issued At: ${new Date().toISOString()}`;
const signature = await wallet.signMessage(message);
Send Transaction
const provider = new ethers.JsonRpcProvider('https://rpc.monad.xyz');
const connectedWallet = wallet.connect(provider);
const tx = await connectedWallet.sendTransaction({
to: recipientAddress,
value: ethers.parseEther('0.1') // 0.1 MON
});
const receipt = await tx.wait();
console.log('TX Hash:', tx.hash);
console.log('Explorer:', `https://explorer.monad.xyz/tx/${tx.hash}`);
Scripts
| Script | Description |
|---|---|
create-wallet.js --env | Create wallet, output as env vars (recommended) |
create-wallet.js --managed [name] | Create wallet, save to file (opt-in) |
create-wallet.js --json | Create wallet, output as JSON |
nadmail-register.js --handle [name] | Register for NadMail with SIWE |
check-balance.js [address] | Check MON wallet balance |
NadMail Integration
Register for NadMail (Web3 email for Nad ecosystem) using your wallet signature.
Environment Variable Method (Recommended)
# Set your private key
export NAD_PRIVATE_KEY="0x..."
# Register with your desired handle
node scripts/nadmail-register.js --handle littlelobster
Managed Wallet Method
# First create a managed wallet
node scripts/create-wallet.js --managed my-agent
# Then register for NadMail
node scripts/nadmail-register.js --wallet my-agent --handle littlelobster
What Happens During Registration
- Start Auth - Request authentication message from NadMail API
- Sign Message - Use your private key to sign the SIWE message
- Agent Register - Submit signature and handle to complete registration
- Save Token - Store access token in
~/.nad-wallet/nadmail-token.json
Check Balance
# Using environment variable
NAD_PRIVATE_KEY="0x..." node scripts/check-balance.js
# Using managed wallet
node scripts/check-balance.js my-wallet
# Using specific address
node scripts/check-balance.js 0x1234...5678
Example output:
π° Nad Wallet Balance Check
==================================================
Address: 0x1234...5678
Network: Monad (Chain ID 143)
RPC: https://rpc.monad.xyz
π Balance: 42.5 MON
Wei: 42500000000000000000
π Explorer: https://explorer.monad.xyz/address/0x1234...5678
π Nad Ecosystem:
β’ nad.fun - Meme token platform
β’ NadMail (nadmail.ai) - Web3 email
β’ NadName (app.nad.domains) - Domain names
File Structure
~/.nad-wallet/
βββ wallets/ # Managed wallet storage
β βββ my-agent.json # Wallet file (600 perms)
β βββ my-agent.mnemonic # Backup phrase (400 perms)
βββ nadmail-token.json # NadMail API token (600 perms)
βββ audit.log # Operation audit log (600 perms)
Nad Ecosystem Services
π nad.fun
- Meme token creation platform
- Community-driven token launches
- Built on Monad for fast transactions
π§ NadMail (nadmail.ai)
- Web3 email service for Nad ecosystem
- SIWE authentication with your wallet
- Integrated with this skill via
nadmail-register.js
π NadName (app.nad.domains)
- Domain name service for Nad ecosystem
- Link human-readable names to wallet addresses
- Built on Monad infrastructure
π Audit Logging
All operations are logged to ~/.nad-wallet/audit.log with:
- Timestamp
- Action type (wallet_created, nadmail_registered, etc.)
- Masked address (first 6 + last 4 chars)
- Success/failure status
- No sensitive data (private keys never logged)
Security Best Practices
Environment Variables
# β
Recommended approach
export NAD_PRIVATE_KEY="0x..."
export NAD_WALLET_ADDRESS="0x..."
# Use in scripts
node scripts/check-balance.js
node scripts/nadmail-register.js --handle myname
File Storage (Use with caution)
const fs = require('fs');
const path = require('path');
// Store with restricted permissions (only if absolutely necessary)
const filepath = path.join(process.env.HOME, '.nad-wallet', 'wallets', 'wallet.json');
fs.writeFileSync(filepath, JSON.stringify({
address: wallet.address,
privateKey: wallet.privateKey // Only store if absolutely necessary
}), { mode: 0o600 }); // Owner read/write only
.gitignore
Add to your project's .gitignore:
# Nad Wallet files - NEVER commit!
.nad-wallet/
*.wallet.json
*.mnemonic
private-key*
nad-private-key*
# Environment files
.env
.env.local
Differences from Base Wallet
| Aspect | Base Wallet | Nad Wallet |
|---|---|---|
| Blockchain | Base (8453) | Monad (143) |
| RPC | https://mainnet.base.org | https://rpc.monad.xyz |
| Explorer | basescan.org | explorer.monad.xyz |
| Native Token | ETH | MON |
| Email Service | BaseMail | NadMail |
| Config Directory | ~/.base-wallet/ | ~/.nad-wallet/ |
| Wallet Directory | ~/.openclaw/wallets/ | ~/.nad-wallet/wallets/ |
| Environment Variable | PRIVATE_KEY | NAD_PRIVATE_KEY |
| Ecosystem | Base ecosystem | nad.fun, NadMail, NadName |
Migration from Base Wallet
If you have Base Wallet experience:
- Same security model - All security practices are identical
- Different network - Chain ID 143 instead of 8453
- Different token - MON instead of ETH
- Different services - NadMail instead of BaseMail
- Different directories - ~/.nad-wallet/ instead of ~/.base-wallet/
Installation & Setup
# Navigate to skill directory
cd /path/to/nad-wallet
# Install dependencies
npm install
# Create your first wallet
node scripts/create-wallet.js --env
# Check balance
NAD_PRIVATE_KEY="0x..." node scripts/check-balance.js
# Register for NadMail
NAD_PRIVATE_KEY="0x..." node scripts/nadmail-register.js --handle myname
Dependencies
{
"ethers": "^6.0.0"
}
No additional dependencies required. Pure Node.js + ethers.js.
Troubleshooting
Common Issues
-
"Wallet not found"
- Solution: Set NAD_PRIVATE_KEY environment variable or create managed wallet
-
"Registration failed"
- Check internet connection
- Verify handle is available
- Ensure wallet has MON for gas fees
-
"Permission denied"
- Check file permissions:
chmod 600 ~/.nad-wallet/wallets/*.json - Verify directory permissions:
chmod 700 ~/.nad-wallet/
- Check file permissions:
Environment Variable Not Set
# Check if set
echo $NAD_PRIVATE_KEY
# Set temporarily
export NAD_PRIVATE_KEY="0x..."
# Set permanently (add to ~/.bashrc or ~/.zshrc)
echo 'export NAD_PRIVATE_KEY="0x..."' >> ~/.bashrc
Changelog
v1.0.0 (2026-02-09)
- π Initial release for Monad blockchain
- π Security: Environment variable approach (--env mode default)
- π§ NadMail SIWE integration
- π° MON balance checking
- π Comprehensive audit logging
- π Nad ecosystem integration (nad.fun, NadMail, NadName)
- π Complete documentation with security best practices
- π File permissions enforcement (600/700)
License
MIT License - Build awesome things with Nad Wallet! π
Files
5 totalComments
Loading commentsβ¦
