We develop custom blockchain domain services including own TLD, ENS fork, dynamic pricing, DAO governance, CCIP-Read gateway, and wallet integration. Standard .eth or .bnb names don't always cover ecosystem needs. A gaming project requires storing character coordinates in the resolver, a DeFi protocol needs dynamic pricing based on liquidity, and a corporate namespace demands DAO governance. A custom TLD gives you full control: pricing, registration rules, governance, and custom record types. A typical pain point is that registrars ignore context — prices aren't flexible, the resolver doesn't store custom data, and management is centralized. We solve this with a custom smart contract using a modular architecture. Using a ready-made ENS fork cuts development costs by 60% (saving $20,000–$40,000) and reduces risks. The result is a production-ready service that wallets resolve via CCIP-Read, and the community governs through governance.
How an ENS Fork Simplifies Domain Service Creation
An ENS fork reduces development time by 60% compared to writing contracts from scratch. ENS has been audited, has ready-made subgraphs, wallet integrations, and ethers.js understands it natively. Key parts you need to change:
- Registry — practically unchanged.
- BaseRegistrar — change TLD to your own, set grace period and expiry policy per project needs.
- ETHRegistrarController — pricing and commit-reveal logic.
- PublicResolver — add custom record types.
- NameWrapper — optional, adds ERC-1155 subdomains and fuses.
Custom Resolver Records
For a gaming domain, you need specific data:
// Extending PublicResolver with custom fields contract GamingResolver is PublicResolver { // node => game_id => in-game address mapping(bytes32 => mapping(uint256 => string)) private _gameAddresses; // node => character stats (IPFS hash) mapping(bytes32 => string) private _characterData; event GameAddressChanged(bytes32 indexed node, uint256 gameId, string gameAddress); function setGameAddress( bytes32 node, uint256 gameId, string calldata gameAddress ) external authorised(node) { _gameAddresses[node][gameId] = gameAddress; emit GameAddressChanged(node, gameId, gameAddress); } function gameAddress(bytes32 node, uint256 gameId) external view returns (string memory) { return _gameAddresses[node][gameId]; } } Why Dynamic Pricing Is Beneficial
Dynamic pricing via bonding curve outperforms fixed pricing: registration volume increases by 30% due to lowering the barrier for long names. The ENS fork uses linear or step pricing by name length. For a custom service, you can add a premium for short names at launch: the first 30 days after launch — 10x price, then normalizes. This prevents bots from scooping short names.
contract CustomPriceOracle { uint256 public constant LAUNCH_PREMIUM_PERIOD = 30 days; uint256 public launchTime; // Premium multiplier: decreases linearly from 10x to 1x over 30 days function getPremiumMultiplier() public view returns (uint256) { if (block.timestamp >= launchTime + LAUNCH_PREMIUM_PERIOD) return 1e18; uint256 elapsed = block.timestamp - launchTime; uint256 premium = 10e18 - (9e18 * elapsed / LAUNCH_PREMIUM_PERIOD); return premium; } function price(string calldata name, uint256 duration) external view returns (uint256) { uint256 basePrice = getBasePrice(name, duration); return basePrice * getPremiumMultiplier() / 1e18; } } Short names (1-3 characters) can be sold via Vickrey auction or Dutch auction instead of fixed price. The auction contract locks deposits, then after completion transfers the name to the winner and returns bids to others. This increases revenue from scarce names and prevents bot sniping.
Integration and Management
Governance Integration
For a DAO-governed namespace: changing pricing, adding new TLDs, reserved names — all through governance proposals.
contract DomainGovernor { ICustomRegistry public registry; ICustomPriceOracle public priceOracle; // Only via governance timelock function updatePrices(uint256[] calldata newPrices) external onlyTimelock { priceOracle.updatePrices(newPrices); } function reserveName(string calldata name) external onlyTimelock { bytes32 label = keccak256(bytes(name)); registry.setSubnodeOwner(BASE_NODE, label, address(this)); } function setTLDManager(address manager) external onlyTimelock { registry.setOwner(ROOT_NODE, manager); } } Wallet Integration
The problem with custom domains: wallets don't know about them by default. Solutions:
- RainbowKit, WalletConnect support any EVM-compatible ENS fork if you pass the correct registry address.
- Universal Resolver: the ENS L1 resolver can be configured as a gateway for custom namespaces via CCIP-Read. This allows MetaMask and other wallets to resolve custom names without changes on their side.
- Custom browser extension — for maximum control, but requires adoption effort.
Monetization and Revenue
Revenue Model
- Registration fees — main source. 100% goes to treasury or split with stakers.
- Renewal fees — annual. Provides predictable cash flow, motivates keeping popular names active.
- Secondary market royalty — 2-5% on secondary sales (ERC-2981). Passive income from NFT trading.
- Premium auctions — short names (1-3 chars) sold via auction.
Technical Aspects
Tech Stack
| Component | Technology |
|---|---|
| Contracts | Solidity 0.8.x + ENS fork + OpenZeppelin |
| Subgraph | The Graph (AssemblyScript) |
| Resolution SDK | TypeScript, fork ENS.js |
| Frontend | React + wagmi + viem |
| CCIP-Read gateway | Node.js + Express |
| Auction mechanism | Vickrey or Dutch auction contract |
Comparison: ENS Fork vs From Scratch
| Criterion | ENS Fork | From Scratch |
|---|---|---|
| Development time | 4-6 weeks | 12-16 weeks |
| Security audit | Built-in | Requires full audit |
| Wallet compatibility | Native via CCIP-Read | Requires SDK |
| Gas optimization | Already optimized | Needs tuning |
| Risks | Low | High |
Conclusion: ENS fork is 2.5x faster and 3x cheaper than custom development. MVP development starts at $25,000, full production service from $60,000.
Development Timeline
Detailed Phase Plan
-
Phase 1 — Core Contracts (4-6 weeks): Registry + Resolver + BaseRegistrar + PriceOracle + Controller. Adaptation of ENS fork.
-
Phase 2 — Extended Features (2-4 weeks): custom resolver types, governance integration, premium auction.
-
Phase 3 — Infrastructure (2-3 weeks): The Graph subgraph, resolution SDK, CCIP-Read gateway.
-
Phase 4 — Frontend (2-4 weeks): registration UI, domain management, marketplace integration.
-
Audit (2-4 weeks): mandatory — the registrar accepts ETH/tokens.
Full production-ready service: 3-4 months. MVP with basic registration: 6-8 weeks.
What's Included
- Contract audit by a third-party firm (Certora, Trail of Bits upon request)
- Smart contract documentation in Russian and English
- Source code in a private repository under MIT license
- Deployment to testnet and mainnet (Ethereum, Polygon, Arbitrum, Base)
- CCIP-Read gateway setup for compatibility with MetaMask and WalletConnect
- Integration with The Graph for domain listing in directories
- Transfer of management rights via multisig (Gnosis Safe) — no single point of failure
- 3 months of post-launch support (bug fixes, gas optimization)
- Team training: workshop on administering the domain service
Additional information can be found in ENS documentation.
We have 5+ years of experience in blockchain domain systems, have delivered 20+ custom domain projects, and have been trusted by companies like ConsenSys, Polygon, and Binance. Our smart contract audit and wallet integration guarantee security and compatibility. Our audits have covered 50+ smart contracts.
Contact us for a consultation — we will assess your project and prepare a commercial proposal and roadmap within 1 day. Get your consultation today. We guarantee transparency and full documentation.







