Getting Started

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.

PropertyValue
Live chainsEthereum (via XNS)
BuildingSolana, Bitcoin
Total chains planned12
Revenue model50% platform / 50% extension owner per domain sale
Renewal feesNone — ever
Domain expiryNo expiry field in the contract
Extension max length5 characters (a-z, 0-9)
Contact[email protected]
Why This Exists

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.

⚠ Problem
✓ Solved by permanent human-readable domains

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.

⚠ Problem
✓ Eliminated by typing names instead of addresses

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.

⚠ Problem
✓ Name encodes chain context, no errors possible

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.

⚠ Problem
✓ Extension encodes the chain

5. All Existing Naming Services Expire

ServiceChainExtensionFee Model
ENSEthereum.eth$5–$20/year
SNS / BonfidaSolana.solAnnual
ADA HandleCardano$handleAnnual premium
SuiNSSUI.suiAnnual
Space IDBNB Chain.bnbAnnual
XRPNSXRP Ledger.xrpAnnual
ICNSCosmos.cosmosAnnual / limited
Polkadot Name SystemPolkadot.dotAnnual

Miss a renewal and your domain is immediately claimable by anyone — including attackers who snatch lapsed domains to redirect incoming funds.

⚠ Problem
✓ No expiry field exists in our contracts

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.

⚠ Problem
✓ Human-readable name is always verifiable
Getting Started

Quick Start

Register a Domain (Ethereum — Live Now)

1

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.

2

Search Your Name

Search for yourname.erc20 or yourname.erc. Names are first-come, first-served.

3

Connect Your Wallet

Connect MetaMask, Coinbase Wallet, or any EVM Web3 wallet. No private keys shared.

4

Pay Once — Own Forever

Pay 0.01 ETH. Permanently registered on-chain. No renewals. No expiry. Ever.

5

Share Your Name

Share yourname.erc20 anywhere. Resolves to your wallet on-chain immediately.

Register an Extension (Earn Passive Income)

1

Choose Your Extension

Pick up to 5 characters: .defi, .nft, .dao. Check it isn't disabled or already registered.

2

Pay Registration Fee

One-time fee: ~$15 (5 chars) to ~$750 (2 chars). 100% to PermanentWallet. Your only cost ever.

3

Set Domain Price

Choose what users pay to register under your extension. Update anytime.

4

Earn 50% Forever

Every registration of anyname.yourextension sends 50% to your wallet automatically. On-chain. Forever.

Core Concepts

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

Solidity
function nameHash(string memory name, string memory extension)
    internal pure returns (bytes32)
{
    return keccak256(abi.encodePacked(
        keccak256(abi.encodePacked(name)),
        keccak256(abi.encodePacked(extension))
    ));
}
Core Concepts

Permanent Ownership

Permanent ownership is enforced at the data structure level — not just as a policy. The Domain struct has no expiry field:

Solidity
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.

Core Concepts

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

Revenue Distribution
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
Core Concepts

Extensions

PropertyRule
Maximum length5 characters
Minimum length2 characters
CharactersLowercase letters and numbers (a-z, 0-9) only
UniquenessOne per chain (same extension can exist on different chains)
OwnershipPermanent, non-transferable

Registration Fees by Length

LengthFee (USD equiv)Examples
2 chars~$750.fi, .ai
3 chars~$300.nft, .dao, .pay
4 chars~$75.defi, .hodl
5 chars~$15.token, .chain
Core Concepts

Secondary Market

PartyShare
Domain seller95%
PermanentWallet platform2.5%
Extension owner2.5%

Extension owners earn on every secondary sale in their namespace — not only on initial registrations. This compounds as trading volume grows.

Smart Contracts

Contract Architecture

ExtensionRegistry

Manages extension registrations, ownership, pricing, disabled list, and the 50/50 payment split on every domain sale.

↓ referenced by
DomainRegistry

Stores all domain registrations permanently. Performs resolution and reverse lookups. Calls ExtensionRegistry for payment splits.

↓ interacts with
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, PolkadotSolidity (EVM)
SolanaRust / Anchor
BitcoinClarity (Stacks L2)
CardanoAiken
SUIMove
NEARRust / near-sdk-rs
CosmosRust / CosmWasm
StellarNode.js Federation Server (SEP-2)
XRPJavaScript / XLS-20 NFT
Smart Contracts

ExtensionRegistry Contract

Solidity
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;
}
Smart Contracts

DomainRegistry Contract

Solidity
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);
}
Smart Contracts

Payment Splits

EventPlatformExtension OwnerSeller
Domain registration (third-party ext)50%50%
Domain registration (PW-owned ext)100%
Extension registration fee100%
Secondary market sale2.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.

Chains

Ethereum (Live Now)

PropertyValue
Status● Live
Extensions.erc, .erc20
Registrationx2xpay.me
Domain price0.01 ETH (one-time)
CompetitorENS (.eth) — $5–20/year renewal
WalletsMetaMask, Coinbase Wallet, Rainbow, WalletConnect
Chains

Solana (Building)

PropertyValue
Status🔹 Building
Extension.sol
LanguageRust / Anchor framework
Monthly active users22 million
CompetitorSNS / Bonfida — 283,000 domains, annual fees
WalletsPhantom, Solflare, Backpack
Chains

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.

PropertyValue
Status🔹 Building
Extension.btc
LanguageClarity (Stacks L2)
Address typesP2PKH (1...), P2SH (3...), P2WPKH (bc1q...), P2TR (bc1p...)
CompetitorNone — world's first permanent Bitcoin naming service
WalletsLeather, Xverse
Chains

Other Chains (Coming Soon)

BNB Chain — .bnb
Avalanche — .avax
XRP Ledger — .xrp
Tron — .trx
Cardano — .ada
Polkadot — .dot
SUI — .sui
NEAR — .near
Cosmos — .cosmos
Stellar — .xlm
Chains

Competitor Map

ChainCompetitorModelPW Advantage
EthereumENS (.eth)Annual $5–20Permanent + open marketplace
SolanaSNS / Bonfida (.sol)AnnualPermanent + marketplace
BNB ChainSpace ID (.bnb)AnnualPermanent + marketplace
CardanoADA Handle ($handle)Annual premiumPermanent + open marketplace
SUISuiNS (.sui)AnnualPermanent + marketplace
XRPXRPNS (.xrp)AnnualPermanent + marketplace
CosmosICNS (.cosmos)LimitedPermanent + IBC resolution
PolkadotPolkadot Name System (.dot)AnnualPermanent + first-mover
BitcoinNoneWorld's first permanent BTC naming
AvalancheNoneFirst-mover on top-10 chain
TronNoneUSDT payment safety
NEAR, StellarNone significantFirst permanent service
Integration

Resolving Names

JavaScript
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"
Reference

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

Reference

Pricing

ItemPrice
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 fee5% total (2.5% platform + 2.5% ext owner)
Renewal feeNone. Ever.
Reference

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.

Reference

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.