Simple Summary

A standard URI and JSON schema for decentralized autonomous organizations (DAOs).

Abstract

A standard URI and JSON schema for decentralized autonomous organizations (DAOs), focusing on relating on-chain and off-chain representations of membership and proposals.

Motivation

DAOs, since being invoked in [1, 2], 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, will enhance DAO search, discoverability, legibility, and proposal simulation. More consistent data across the ecosystem is also a prerequisite for future DAO standards.

Specification

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-1234 compliant contract MUST implement the EIP1234 interface below:

pragma solidity ^0.4.20;

/// @title EIP-1234 DAOs
/// @dev See <https://eips.ethereum.org/EIPS/eip-1234>

interface EIP1234 {
    /// @notice A distinct Uniform Resource Identifier (URI) pointing to a JSON object following the "EIP-1234 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-1234 Members JSON-LD Schema". The proposalsURI should point to a JSON file that conforms to the "EIP-1234 Proposals JSON-LD Schema". The activityLogURI should point to a JSON file that conforms to the "EIP-1234 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-1234 DAO JSON-LD Schema mentioned above.

{
	"@context": "<https://www.daostar.org>",
	"@type": "DAO",
	"name": "<name of the DAO>",
	"description": "<description>",
	"membersURI": "<URI>",
	"proposalsURI": "<URI>",
	"activityLogURI": "<URI>",
	"governanceURI": "<URI>"
}

Members

Members JSON-LD Schema.

{
  "@context": {
    "type": {
      "@id": "@type"
    },
    "id": {
      "@id": "@id"
    },
    "DAO": "<http://daostar.org/schemas/DAO>",
    "name": "<http://daostar.org/schemas/name>",
    "address": "<http://daostar.org/schemas/EthereumAddress>",
    "members": {
      "@id": "<http://daostar.org/schemas/members>",
      "@container": "@set"
    },
    "member": "<http://daostar.org/schemas/member>"
  },
  "type": "DAO",
  "name": "<name of the DAO>",
  "members": [
    {
      "id": "MEMBER_ID_HERE",
      "type": "member",
      "address": "<EthereumAddress>"
    },
    {
      "id": "MEMBER_ID_HERE",
      "type": "member",
      "address": "<EthereumAddress>"
    },
		{
			"type": "DAO",
			"name": "DAO_NAME_HERE",
			"address": "<EthereumAddress>"
		}
  ]
}

Proposals

Proposals JSON-LD Schema. Every EIP-1234 contract should implement a proposalsURI pointing to a JSON object satisfying this schema.

In particular, any on-chain proposal MUST have a id of the form CAIP10_ADDRESS + “?proposalId=” + PROPOSAL_ID, where CAIP10_ADDRESS is an address following the CAIP-10 standard [4]. Off-chain proposals MAY use a similar id format.

{
  "@context": {
    "type": {
      "@id": "@type"
    },
    "id": {
      "@id": "@id"
    },
    "DAO": "<http://daostar.org/schemas/DAO>",
    "name": "<http://daostar.org/schemas/DAOName>",
    "address": "<http://daostar.org/schemas/EthereumAddress>",
    "proposals": {
      "@id": "<http://daostar.org/schemas/proposals>",
      "@container": "@set"
    },
    "proposal": "<http://daostar.org/schemas/proposal>",
    "member": "<http://daostar.org/schemas/member>",
    "title": "<http://daostar.org/proposalTitle>",
    "contentURI": "<http://daostar.org/proposalContentURI>",
    "status": "<http://daostar.org/proposalStatus>",
    "calls": {
      "@id": "<http://daostar.org/schemas/calls>",
      "@container": "@set"
    },
    "callData": "<http://daostar.org/schemas/callData>",
    "from": "<http://daostar/org/schemas/fromAddress>"
  },
  "type": "DAO",
  "name": "DAO_NAME_HERE",
  "proposals": [
    {
      "id": "PROPOSAL_ID_HERE",
      "type": "proposal",
      "title": "MY PROPOSAL",
      "contentURI": "<https://discourse.DAO.com/ID>",
      "status": "<free text>",
      "calls": {
        "type": "CallDataEVM",
        "from": "0xdef",
        "callData": "0x123abcdef"
      }
    }
  ]
}