Radical Domains is a Harberger-inspired ownership and leasing system for Ethereum Name Service (ENS) domains.
Domain squatting is a chronic problem that affects ENS and DNS alike. One solution to such a problem is the Harberger tax system as outlined by Weyl and Posner (2017). Under such a system assets are always for sale on the market. The current owner self-assesses the value of their asset, pays a predefined rental (or tax if collected by government) in proportion to that price and must sell to any buyer who offers to meet the that price.
Radical Domains allows the migration of individual ENS names to an ownership model inspired by Harberger taxes. It was built at ETHLondon and so borrows the UK property market's terminology of freehold and leasehold title (for which lessor and lessee may be interchanged respectively).
It is live on Rinkeby and can be tried out at radical.domains.
How it Works
The owner of an ENS domain can create and sell a tradable lease on their domain name with all rental yield accruing to them. When they transfer ownership of their ERC721 ENS token to the Radical Domain smart contract, they received two ERC721 tokens in return:
- A freehold token which has no control over the domain name but receives all future rent from it.
- A leasehold token which controls the underlying domain name (e.g.
setResolver) but must declare its own selling price and pay rent at a set fraction of that price.
Neither holder alone can transfer ownership of the underlying ENS domain name, but any account or contract in possession of both the freehold and the leasehold token can withdraw it.
The leasehold token is "always for sale" (hat tip @simondlr) and can be purchased at any time through the Radical Domains site or automatically listed on markets such as OpenSea. The freehold token can optionally be traded or listed by its owner.
The system relies heavily on the ERC721 non-fungible token (NFT) standard which invokes
onERC721Received on the recipient when a transfer takes place, and the ENS registrar functionality which allows the owner to nominate a controlling address which can make changes but not transfer ownership.
The owner of an ENS name can "radicalise" their domain by transferring ownership of their ERC721 token to the
RadicalManager contract. This is done by calling
safeTransferFrom on the ENS smart contract which invokes
onERC721Received on the
RadicalManager contract, which then goes about minting the leasehold and freehold tokens from the
RadicalFreehold contracts respectively.
Smart contracts were authored with help from Truffle, OpenZepellin and ENS (hat tip @makoto_inoue for assistance on site).
When radicalising a domain the initial owner sets the rental yield (e.g. at 10%) and initial sale price (e.g. 1 ETH) for the leasehold. Subsequent holders can set a new selling price (e.g. 10 ETH) for the domain after taking possession but must pay rent at the initial rate on the new price (10% x 10 ETH = 1 ETH/year). The holder of the freehold token receives the rent and can withdraw as much of it as has accrued at any time.
The leaseholder has exclusive control of the actual domain name as long as they hold the leasehold token.
Building and Running
git clone firstname.lastname@example.org:rkalis/radical.domains.git cd radical.domains yarn
.env and add a development mnemonic, Infura ID and optionally an Etherscan API key and an ENS test label (see tests).
yarn truffle compile
The tests run against a fork of Ropsten so that it can be tested against the real ENS with a pre-registered ENS name. To perform these tests, a few prerequisites are required.
- Use the mnemonic inside your
.envfile to register any
.ethdomain on Ropsten (https://app.ens.domains/)
- Add the domain name as
.envfile (without the
- Make sure your
INFURA_IDare filled out in your
.envfile as well as the
- Make sure
ganache-cliis installed globally (
npm i -g ganache-cli)
source: not found
Experienced on Ubuntu 18.04 LTS
exportbefore all variables in your
yarn truffle migrate --network rinkeby
The front end is based on CRA and can be launched for development with: