[EP 5.x][Executable] Standardized Recovery Process for ENS Tokens sent to ENS ERC20 Contract - [DRAFT]

[Executable] Standardized Recovery Process for ENS Tokens sent to ENS ERC20 Contract

  • Status: Pending
  • Discussion Thread: Discuss
  • Votes: Pending
  • Author: accessor.eth


The proposal aims to establish a standardized procedure for the ENS DAO to efficiently and fairly address cases where community members accidentally transfer ENS tokens back to the ENS Token contract. The process is designed to be transparent and to provide guidance for such event.


The standardized recovery process will include the following steps, integrating the following specifications

Scheduled Reviews:

Implement scheduled reviews (e.g., annually or semi-annually) to address and resolve all pending recovery requests collectively.

Fee and Reimbursement Policy:

Introduce a fee structure for recovery requests to cover operational costs and discourage carelessness. The fee could be a fixed percentage of the recovered tokens (e.g., 25%).

Stipulate that recovered tokens be returned only to the original sending address to prevent fraudulent claims.

Mandate public disclosure for requests involving significant token amounts (e.g., over $10,000), ensuring transparency and community oversight.

All requests must be made via a request through the DAO forum under the category :
Meta-Governance > DAO-Governance

A Meta-Governance Steward shall respond and acknowledge the request within 14 days or before the next voting period, but no later than 72 hours prior the the first day of the voting cycle, whichever comes first.

Requests over $10,000 USD shall be put to vote in the next voting cycle allowing community members to participate in the decision-making process. All details of the claim shall be made public and included in the vote.

Conduct a verification process to confirm the legitimacy of the claim, including transaction history and token ownership.

Require claimants to submit a screenshot showing custody of the wallet involved in the mistaken transfer. Also to include any other verification deemed necessary by Meta-Governance Stewards within reason.

Refund Pool:

Meta-Governance stewards shall designate a specified wallet that funds can be spent from to return tokens accidentally sent. A portion of the recovery fees can be accumulated and used for community benefits or as rewards for protocol engagement or forum contributions et al.


The contract below shall be used in all refunded token transactions for accountability and transparency.

pragma solidity ^0.8.0;

interface IERC20 {
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);

contract ENSTransferContract {
    IERC20 private ensToken;
    address private constant ENS_TOKEN_ADDRESS = 0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72;
    bool private locked = false;

    event TokensTransferred(address from, address to, uint256 amount);

    constructor() {
        ensToken = IERC20(ENS_TOKEN_ADDRESS);

    modifier nonReentrant() {
        require(!locked, "Reentrant call detected");
        locked = true;
        locked = false;

    function transferENS(address recipient, uint256 amount) external nonReentrant {
        require(recipient != address(0), "Cannot transfer to the zero address");
        require(amount > 0, "Amount must be greater than 0");
        uint256 allowance = ensToken.allowance(msg.sender, address(this));
        require(allowance >= amount, "Check the token allowance. Permission not granted to spend the specified amount.");

        bool success = ensToken.transferFrom(msg.sender, recipient, amount);
        require(success, "Token transfer failed");

        emit TokensTransferred(msg.sender, recipient, amount);

    // Fallback function to reject incoming Ether transfers
    fallback() external payable {
        revert("This contract does not accept Ether");

    // Fallback function for receive Ether (for newer Solidity versions)
    receive() external payable {
        revert("This contract does not accept Ether");

The following table outlines the general structure for transactions related to the recovery process. Specific details will be populated based on individual recovery cases and the established recovery process structure.

Functionality Description Parameter Type Notes
Grant Permission grants allowance to contract spender address Address of ENSTransferContract
amount uint256 Amount of tokens contract can handle
Token Transfer Initiate transfer of ENS tokens via contract recipient address Address receiving the tokens
amount uint256 Amount of tokens to transfer

The TokensTransferred event in the ENSTransferContract contract will emit information about the token transfer, including the sender, recipient, and the amount of tokens transferred. You can listen to this event to track token transfers.

note: this contract can also be used for dispersing ENS Governance tokens from the DAO. This can also function as dedicated log for transparency. This will help organize and declutter other wallet issuance.