The formal EIP can be found at*. Discussions are hosted at Ethereum Magicians.*

<aside> 💡 eip: 4824 title: DAO API description: An API standard for decentralized autonomous organizations (DAOs). author: Joshua Tan (@thelastjosh), Isaac Patka (@ipatka), Ido Gershtein, Eyal Eithcowich, Michael Zargham (@mzargham), Sam Furter (@nivida) discussions-to: status: Draft type: Standards Track category: ERC created: 2022-02-17



An API standard for decentralized autonomous organizations (DAOs), focused on relating on-chain and off-chain representations of membership and proposals.


DAOs, since being invoked in the Ethereum whitepaper, have been vaguely defined. This has led to a wide range of patterns but little standardization or interoperability between the frameworks and tools that have emerged. Standardization and interoperability are necessary to support a variety of use-cases. In particular, a standard daoURI, similar to tokenURI in ERC-721 but extended to the needs of current DAOs and DAO tooling, will enhance DAO discoverability, legibility, proposal simulation, and interoperability between tools. More consistent data across the ecosystem is also a prerequisite for future DAO standards.


The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in RFC 2119.

Every EIP-4824 compliant contract MUST implement the EIP4824 interface below:

pragma solidity ^0.4.20;

/// @title EIP-4824 DAOs
/// @dev See <>

interface EIP4824 {
    /// @notice A distinct Uniform Resource Identifier (URI) pointing to a JSON object following the "EIP-4824 DAO JSON-LD Schema". This JSON file splits into four URIs: membersURI, proposalsURI, activityLogURI, and governanceURI. The membersURI should point to a JSON file that conforms to the "EIP-4824 Members JSON-LD Schema". The proposalsURI should point to a JSON file that conforms to the "EIP-4824 Proposals JSON-LD Schema". The activityLogURI should point to a JSON file that conforms to the "EIP-4824 Activity Log JSON-LD Schema". The governanceURI should point to a flatfile, normatively a .md file. Each of the JSON files named above can be statically-hosted or dynamically-generated.
    function daoURI() external view returns (string _daoURI);

The EIP-4824 DAO JSON-LD Schema mentioned above.

    "@context": "<>",
    "type": "DAO",
    "name": "<name of the DAO>",
    "description": "<description>",
    "membersURI": "<URI>",
    "proposalsURI": "<URI>",
    "activityLogURI": "<URI>",
    "governanceURI": "<URI>"

A DAO MAY inherit the EIP4824 interface above or it MAY create an external registration contract that is compliant with EIP-4824. The external registration contract MUST store the DAO’s primary address.

pragma solidity ^0.8.1;

/// @title EIP-4824 DAOs
/// @dev See <>

error NotOwner();
error NotOffered();

contract EIP4824Registration is EIP4824 {

        string private daoURI;
        address daoAddress;
mapping (address => bool) daoRegistered;
        address offeredAddress;

        event TransferOffered(address currentOwner, address newOwner);
        event TransferAccepted(address oldOwner, address newOwner);

        function initialize(address _daoAddress) {
            if (_daoAddress == msg.sender) {
                daoAddress = _daoAddress;
                emit TransferAccepted(address(0), _daoAddress);
            } else {
                offeredAddress = _daoAddress;
                emit TransferOffered(address(0), _daoAddress);


        function daoURI() external view returns (string _daoURI) {
            return daoURI;
    function offerTransfer(address _offeredAddress) external {
            if (msg.sender != daoAddress) revert NotOwner();
            offeredAddress = _offeredAddress;

            emit TransferOffered(daoAddress, _offeredAddress);

    function acceptTransfer() external {
            address _oldOwner = daoAddress;
            if (msg.sender != offeredAddress) revert NotOffered();
            daoAddress = msg.sender;
            emit TransferAccepted(_oldOwner, daoAddress);

If a DAO uses an external registration contract, the DAO SHOULD use a common registration factory contract to enable efficient network indexing.

pragma solidity ^0.8.1;

/// @title EIP-4824 DAOs
/// @dev See <>

interface EIP4824RegistrationFactory is CloneFactory {
    function summonRegistration();