PermanentWallet Documentation
PermanentWallet is the world's first permanent, multi-chain crypto wallet naming platform. It replaces dangerous 42-character hex wallet addresses with human-readable domain names owned permanently on-chain — no renewal fees, no expiry dates, no risk of losing your identity.
The platform operates as a two-tier open marketplace: anyone can register a domain extension and earn 50% of every domain sold under it — forever, on-chain, automatically.
● Ethereum is live now via the XNS platform. Solana and Bitcoin are in active development. 12 chains planned in total.
| Property | Value |
|---|---|
| Live chains | Ethereum (via XNS) |
| Building | Solana, Bitcoin |
| Total chains planned | 12 |
| Revenue model | 50% platform / 50% extension owner per domain sale |
| Renewal fees | None — ever |
| Domain expiry | No expiry field in the contract |
| Extension max length | 5 characters (a-z, 0-9) |
| Contact | [email protected] |
Problems We Solve
The 42-character hexadecimal wallet address format was designed for cryptographic security — not for humans. This creates six distinct, costly, and entirely preventable problems.
1. Address Poisoning Attacks
⚠ $80M+ lost in confirmed address poisoning attacks.
Attackers send tiny transactions from addresses resembling your legitimate contacts — differing only in middle characters. When you copy from your transaction history, you may grab the poisoned address. Funds gone. No recourse.
2. Clipboard Hijacking (Clipper Malware)
⚠ One clipper operator stole $560,000. Active since 2017. Now sold as a dark-web subscription service.
Clipper malware silently monitors your device clipboard. The moment it detects a cryptocurrency wallet address, it instantly replaces it with the attacker's address. Advanced variants like Laplas Clipper generate replacement addresses matching the first and last characters of the original — defeating the common "check first/last chars" verification habit.
With a permanent domain name, you type benson.erc20 — you never need to copy a raw address. Clipboard hijacking is completely eliminated.
3. The Sharing Nightmare
Sharing a 42-character hex string via email, text, or invoice creates multiple failure modes: you paste it wrong, they copy it wrong, you forget to label the blockchain layer, you label it incorrectly, or you send on the wrong network. Any of these results in permanent fund loss. The name benson.erc20 carries its own chain context — no disclaimer needed.
4. Wrong Network Sends
Ethereum, BNB Chain, Avalanche, Tron, and Polkadot share identical address formats (0x hex). Sending USDT on Ethereum to a BNB Chain address results in funds stranded or permanently lost. The blockchain cannot distinguish intent from error. Chain-specific extensions (.bnb, .avax, .trx) make this impossible.
5. All Existing Naming Services Expire
| Service | Chain | Extension | Fee Model |
|---|---|---|---|
| ENS | Ethereum | .eth | $5–$20/year |
| SNS / Bonfida | Solana | .sol | Annual |
| ADA Handle | Cardano | $handle | Annual premium |
| SuiNS | SUI | .sui | Annual |
| Space ID | BNB Chain | .bnb | Annual |
| XRPNS | XRP Ledger | .xrp | Annual |
| ICNS | Cosmos | .cosmos | Annual / limited |
| Polkadot Name System | Polkadot | .dot | Annual |
Miss a renewal and your domain is immediately claimable by anyone — including attackers who snatch lapsed domains to redirect incoming funds.
6. QR Code Swapping Attacks
Attackers replace legitimate crypto QR codes on websites, invoices, and printed materials with codes encoding their own wallet. Since the hex string is meaningless to humans, victims cannot verify the destination before scanning. A human-readable domain displayed alongside is always visually verifiable.
Quick Start
Register a Domain (Ethereum — Live Now)
Visit x2xPay Registration
Go to x2xpay.me/?tab=register — PermanentWallet's Ethereum registration portal. The Get Name tab and .erc20 extension are pre-selected automatically.
Search Your Name
Search for yourname.erc20 or yourname.erc. Names are first-come, first-served.
Connect Your Wallet
Connect MetaMask, Coinbase Wallet, or any EVM Web3 wallet. No private keys shared.
Pay Once — Own Forever
Pay 0.01 ETH. Permanently registered on-chain. No renewals. No expiry. Ever.
Share Your Name
Share yourname.erc20 anywhere. Resolves to your wallet on-chain immediately.
Register an Extension (Earn Passive Income)
Choose Your Extension
Pick up to 5 characters: .defi, .nft, .dao. Check it isn't disabled or already registered.
Pay Registration Fee
One-time fee: ~$15 (5 chars) to ~$750 (2 chars). 100% to PermanentWallet. Your only cost ever.
Set Domain Price
Choose what users pay to register under your extension. Update anytime.
Earn 50% Forever
Every registration of anyname.yourextension sends 50% to your wallet automatically. On-chain. Forever.
How Resolution Works
Step 1 — Application calls resolver
A wallet, dApp, or payment app requests resolution of benson.erc20
Step 2 — ExtensionRegistry validates
Contract confirms .erc20 is a registered, active, non-disabled extension
Step 3 — DomainRegistry resolves
Contract looks up keccak256("benson" + "erc20") and returns the stored wallet address
Step 4 — Address returned
0x71C7656EC7ab88b098defB751B7401B5f6d8976F returned to the application
Name Hashing
function nameHash(string memory name, string memory extension) internal pure returns (bytes32) { return keccak256(abi.encodePacked( keccak256(abi.encodePacked(name)), keccak256(abi.encodePacked(extension)) )); }
Permanent Ownership
Permanent ownership is enforced at the data structure level — not just as a policy. The Domain struct has no expiry field:
struct Domain { address owner; string resolvedAddress; string extension; uint256 registeredAt; // NO expiry field. No renewal function. // This domain is permanent by mathematical design. }
Because there is no expiresAt field and no renew() function, it is mathematically impossible for a domain to expire. Even the contract admin cannot expire a registered domain.
The Two-Tier Model
Tier 1 — Extension Owners
Anyone registers a domain extension (max 5 characters) by paying a one-time fee. As an extension owner, you earn 50% of every domain registration and 2.5% of every secondary market sale under your extension — automatically, on-chain, forever.
Tier 2 — Domain Holders
End users register a domain under any available extension with a one-time payment. Domain is permanently registered. No renewals. No expiry.
Revenue Flow
Domain registration (third-party extension): 50% → PermanentWallet treasury 50% → Extension owner wallet (automatic, on-chain) Domain registration (PW-owned extension): 100% → PermanentWallet treasury Extension registration fee: 100% → PermanentWallet treasury Secondary market sale: 95% → Domain seller 2.5% → PermanentWallet platform 2.5% → Extension owner
Extensions
| Property | Rule |
|---|---|
| Maximum length | 5 characters |
| Minimum length | 2 characters |
| Characters | Lowercase letters and numbers (a-z, 0-9) only |
| Uniqueness | One per chain (same extension can exist on different chains) |
| Ownership | Permanent, non-transferable |
Registration Fees by Length
| Length | Fee (USD equiv) | Examples |
|---|---|---|
| 2 chars | ~$750 | .fi, .ai |
| 3 chars | ~$300 | .nft, .dao, .pay |
| 4 chars | ~$75 | .defi, .hodl |
| 5 chars | ~$15 | .token, .chain |
Secondary Market
| Party | Share |
|---|---|
| Domain seller | 95% |
| PermanentWallet platform | 2.5% |
| Extension owner | 2.5% |
Extension owners earn on every secondary sale in their namespace — not only on initial registrations. This compounds as trading volume grows.
Contract Architecture
ExtensionRegistry
Manages extension registrations, ownership, pricing, disabled list, and the 50/50 payment split on every domain sale.
DomainRegistry
Stores all domain registrations permanently. Performs resolution and reverse lookups. Calls ExtensionRegistry for payment splits.
SecondaryMarket
Escrow for domain resale. Handles 95/2.5/2.5 fee distribution. Transfers ownership on-chain.
Languages by Chain
| Chain(s) | Language |
|---|---|
| Ethereum, BNB, Avalanche, Tron, Polkadot | Solidity (EVM) |
| Solana | Rust / Anchor |
| Bitcoin | Clarity (Stacks L2) |
| Cardano | Aiken |
| SUI | Move |
| NEAR | Rust / near-sdk-rs |
| Cosmos | Rust / CosmWasm |
| Stellar | Node.js Federation Server (SEP-2) |
| XRP | JavaScript / XLS-20 NFT |
ExtensionRegistry Contract
struct Extension { address owner; uint256 domainPrice; uint8 minDomainLength; uint256 registeredAt; uint256 totalDomains; uint256 revenueAccrued; bool isActive; string description; } function _splitPayment(string memory ext, uint256 amount) internal { Extension storage e = extensions[keccak256(bytes(ext))]; uint256 platformShare = (amount * 50) / 100; uint256 ownerShare = amount - platformShare; (bool ok1,) = platformTreasury.call{value: platformShare}(""); require(ok1, "Platform transfer failed"); (bool ok2,) = e.owner.call{value: ownerShare}(""); require(ok2, "Owner transfer failed"); e.revenueAccrued += ownerShare; }
DomainRegistry Contract
function registerDomain( string calldata name, string calldata ext ) external payable nonReentrant { require(extensionRegistry.isActive(ext), "Extension not active"); require(!extensionRegistry.isDisabled(ext), "Extension disabled"); bytes32 dHash = nameHash(name, ext); require(_domains[dHash].owner == address(0), "Already registered"); require(msg.value >= extensionRegistry.getDomainPrice(ext), "Insufficient"); extensionRegistry._splitPayment(ext, msg.value); _domains[dHash] = Domain({ owner: msg.sender, resolvedAddress: addressToString(msg.sender), extension: ext, registeredAt: block.timestamp // NO expiry field }); _ownerDomains[msg.sender].push(dHash); emit DomainRegistered(name, ext, msg.sender, msg.value); }
Payment Splits
| Event | Platform | Extension Owner | Seller |
|---|---|---|---|
| Domain registration (third-party ext) | 50% | 50% | — |
| Domain registration (PW-owned ext) | 100% | — | — |
| Extension registration fee | 100% | — | — |
| Secondary market sale | 2.5% | 2.5% | 95% |
Payment splits are atomic — both the platform share and owner share succeed or the entire transaction reverts. Funds cannot be partially distributed.
Ethereum (Live Now)
| Property | Value |
|---|---|
| Status | ● Live |
| Extensions | .erc, .erc20 |
| Registration | x2xpay.me |
| Domain price | 0.01 ETH (one-time) |
| Competitor | ENS (.eth) — $5–20/year renewal |
| Wallets | MetaMask, Coinbase Wallet, Rainbow, WalletConnect |
Solana (Building)
| Property | Value |
|---|---|
| Status | 🔹 Building |
| Extension | .sol |
| Language | Rust / Anchor framework |
| Monthly active users | 22 million |
| Competitor | SNS / Bonfida — 283,000 domains, annual fees |
| Wallets | Phantom, Solflare, Backpack |
Bitcoin (Building)
Bitcoin has no native smart contracts. PermanentWallet builds on Stacks L2 using Clarity — a decidable, secure language anchored to Bitcoin, enabling sBTC payments.
| Property | Value |
|---|---|
| Status | 🔹 Building |
| Extension | .btc |
| Language | Clarity (Stacks L2) |
| Address types | P2PKH (1...), P2SH (3...), P2WPKH (bc1q...), P2TR (bc1p...) |
| Competitor | None — world's first permanent Bitcoin naming service |
| Wallets | Leather, Xverse |
Other Chains (Coming Soon)
Competitor Map
| Chain | Competitor | Model | PW Advantage |
|---|---|---|---|
| Ethereum | ENS (.eth) | Annual $5–20 | Permanent + open marketplace |
| Solana | SNS / Bonfida (.sol) | Annual | Permanent + marketplace |
| BNB Chain | Space ID (.bnb) | Annual | Permanent + marketplace |
| Cardano | ADA Handle ($handle) | Annual premium | Permanent + open marketplace |
| SUI | SuiNS (.sui) | Annual | Permanent + marketplace |
| XRP | XRPNS (.xrp) | Annual | Permanent + marketplace |
| Cosmos | ICNS (.cosmos) | Limited | Permanent + IBC resolution |
| Polkadot | Polkadot Name System (.dot) | Annual | Permanent + first-mover |
| Bitcoin | None | — | World's first permanent BTC naming |
| Avalanche | None | — | First-mover on top-10 chain |
| Tron | None | — | USDT payment safety |
| NEAR, Stellar | None significant | — | First permanent service |
Resolving Names
import { ethers } from 'ethers'; const provider = new ethers.JsonRpcProvider('https://mainnet.infura.io/v3/YOUR_KEY'); const registry = new ethers.Contract(REGISTRY_ADDRESS, REGISTRY_ABI, provider); // Forward: name → address async function resolveDomain(name, extension) { return await registry.resolve(name, extension); } // Reverse: address → names async function lookupWallet(walletAddress) { return await registry.reverseResolve(walletAddress); } // Usage const addr = await resolveDomain('benson', 'erc20'); // → "0x71C7656EC7ab88b098defB751B7401B5f6d8976F"
Disabled Extensions
Cross-chain: Each chain's native extension is disabled on all other chains (.btc, .eth, .sol, .bnb, .avax, .xrp, .trx, .ada, .dot, .sui, .near, .atom, .xlm — each disabled except on their own chain).
Financial protection: .bank .visa .swift .paypal .stripe .fed .sec
Security protection: .admin .root .system .wallet .seed .key .safe .official .verify .auth .sign .recovery
Platform reserved: .pw .perm .pwallet .test .null .void .help
Pricing
| Item | Price |
|---|---|
| Domain — .erc or .erc20 (Ethereum) | 0.01 ETH (one-time) |
| Extension registration — 5 chars | ~$15 USD equiv |
| Extension registration — 4 chars | ~$75 USD equiv |
| Extension registration — 3 chars | ~$300 USD equiv |
| Extension registration — 2 chars | ~$750 USD equiv |
| Secondary market fee | 5% total (2.5% platform + 2.5% ext owner) |
| Renewal fee | None. Ever. |
Frequently Asked Questions
Can my domain ever expire?
No. The smart contract contains no expiry field and no renewal function. It is mathematically impossible for your domain to expire after registration.
Can I transfer my domain to another wallet?
Domain ownership is non-transferable by default. You can list a domain for sale on the secondary marketplace, which handles the transfer atomically on-chain.
Can I update the wallet address my domain points to?
Yes. Only the domain owner can update the resolved address. Useful if you switch wallets.
What if I lose access to my wallet?
Your domain is tied to your wallet. Loss of private keys means loss of access to your domain. There is no recovery mechanism. Store your seed phrase securely offline.
Can PermanentWallet disable my domain?
No. Once registered, no admin can modify or delete your domain record. Only you can update the resolved address.
Can the same domain exist on multiple chains?
Yes. benson.sol and benson.bnb are entirely separate registrations on different chains.
Security
- Reentrancy protection (OpenZeppelin ReentrancyGuard) on all payable functions
- Atomic payment splits — both transfers succeed or transaction reverts
- No admin keys can modify existing domain records
- Immutable core — no upgrade mechanism after mainnet deployment
- Emergency pause for new registrations only (existing records unaffected)
- Multi-sig governance for all administrative operations
⚠ PermanentWallet will NEVER ask for your private key or seed phrase. Anyone who does is attempting to scam you. All legitimate interactions happen through your wallet's transaction signing only.
Report a Vulnerability
Report security vulnerabilities responsibly to [email protected]. Do not publicly disclose before giving us reasonable time to respond.