Search

Search projects, tokens and protocols by name or address

CROPS

Integrate CROPS

Integrate CROPS

Wear the badge

If your project is in the attested set, the badge is yours to use. Download the SVG, or copy it as markup that links to the garden.

Badge

About pages, footers, docs

CROPS badge, light
Light
CROPS badge, dark
Dark
CROPS badge, mono black
Mono blackBlack
CROPS badge, mono white
Mono whiteWhite

Tag

Headers, app UIs, next to a connect button

CROPS tag, light
Light
CROPS tag, dark
Dark
CROPS tag, mono black
Mono blackBlack
CROPS tag, mono white
Mono whiteWhite

Icon

Wallets and lists - works down to 20px

CROPS icon, light
Light
CROPS icon, dark
Dark
CROPS icon, mono black
Mono blackBlack
CROPS icon, mono white
Mono whiteWhite

Using it fairly

  • The snippet links the CROPS guide. Point its href at your project page on ETHBEAT instead, so a visitor can read the evaluation rather than only see that one exists.
  • The badge says we have reviewed you and named you onchain. It is not a certification, an audit, or an endorsement - please do not describe it as any of those.
  • Your rating can change. Make sure to check the API for the latest status before showing the badge.

Check your status in the API docs

For wallets and interfaces

Endpoints

Static JSON files on https://crops.l2beat.com, regenerated on every change to the reviews.

  • Every response is a static file generated from the ETHBEAT repository, so it is served from a CDN with no API key and no rate limit.
  • Not found means not reviewed. The project and address files answer 404 with an empty body when we have not reviewed the project or the address - treat it as "not reviewed", not as an error.
  • Address files are keyed by EIP-155 chain id and lowercase address. Lowercase the address before you build the URL.

Browse the interactive docs or read the OpenAPI spec.

/v1/address/{chainId}/{address}.json

Which protocol is this address?

The reviewed protocols a contract, proxy implementation or permission holder belongs to, with a rating per property. A shared contract lists every protocol that claims it, each once, with the name that protocol gives it.

chainId
EIP-155 chain id, e.g. 1 for Ethereum.
address
Lowercase 0x-prefixed address.
404
The address is not part of any reviewed protocol.
gethttps://crops.l2beat.com/v1/address/1/0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852.json
response
{
  "attestations": { … },
  "generatedAt": 1793787234,
  "commit": …,
  "chainId": 1,
  "address": "0x0d4a11d5eeaac28ec3f61d100daf4d40471f1852",
  "matches": [
    {
      "id": "uniswapv2",
      "slug": "uniswapv2",
      "name": "Uniswap V2",
      "href": "https://ethbeat.org/defi/projects/uniswapv2",
      "contractName": "UniswapV2Pair_WETH_USDT",
      "crops": {
        "censorshipResistance": {
          "sentiment": "good",
          "status": "reviewed"
        },
        "openSource": {
          "sentiment": "good",
          "status": "reviewed"
        },
        "privacy": {
          "sentiment": "neutral",
          "status": "fullyTransparent"
        },
        "security": {
          "sentiment": "good",
          "status": "reviewed"
        }
      },
      "attestation": {
        "uid": "0xcc6f0dbb88995141351b3fa017c1136be7cd5f6eb0b3f689fc2712084df3f271",
        "revision": 1
      }
    }
  ]
}
/v1/project/{id}.json

Everything about one protocol

The CROPS evaluations of one protocol, with the reasoning behind each rating.

id
The project id or its slug.
404
ETHBEAT has not reviewed this project.
gethttps://crops.l2beat.com/v1/project/uniswapv2.json
response
{
  "attestations": { … },
  "generatedAt": 1793787234,
  "commit": …,
  "id": "uniswapv2",
  "slug": "uniswapv2",
  "name": "Uniswap V2",
  "href": "https://ethbeat.org/defi/projects/uniswapv2",
  "crops": {
    "censorshipResistance": {
      "sentiment": "good",
      "status": "reviewed",
      "points": [
        "The core contracts are immutable and cannot be paused, so the exit window is infinite.",
        …
      ],
      "missing": [],
      "additionalConsiderations": [],
      "notReviewed": [
        "The interfaces users reach the pairs through."
      ]
    },
    "openSource": {
      "sentiment": "good",
      "status": "reviewed",
      "points": [
        "The core, the periphery and the interface are published under the GPL.",
        …
      ],
      "missing": [],
      "additionalConsiderations": [],
      "notReviewed": [],
      "license": {
        "spdxId": "GPL-3.0",
        "name": "GNU General Public License version 3",
        "url": "https://opensource.org/license/gpl-3-0",
        "categories": [
          "popular-strong-community"
        ]
      }
    },
    "privacy": {
      "sentiment": "neutral",
      "status": "fullyTransparent",
      "points": [
        "The protocol does not make privacy claims, and is fully transparent.",
        …
      ],
      "missing": [],
      "additionalConsiderations": [],
      "notReviewed": []
    },
    "security": {
      "sentiment": "good",
      "status": "reviewed",
      "points": [
        "Every contract that holds user funds is immutable, with no upgrade path.",
        …
      ],
      "missing": [],
      "additionalConsiderations": [
        "Per-pair token and liquidity risk stays with the user.",
        …
      ],
      "notReviewed": []
    }
  },
  "inGarden": true,
  "attestation": {
    "uid": "0xcc6f0dbb88995141351b3fa017c1136be7cd5f6eb0b3f689fc2712084df3f271",
    "revision": 1,
    "reviewedAt": 1793145600,
    "explorerUrl": "https://easscan.org/attestation/view/0xcc6f0dbb88995141351b3fa017c1136be7cd5f6eb0b3f689fc2712084df3f271"
  }
}
/v1/crops.json

All reviewed protocols

Every reviewed protocol in one response, with the full CROPS evaluations and the attestation that names them.

gethttps://crops.l2beat.com/v1/crops.json
response
{
  "attestations": {
    "network": "ethereum",
    "chainId": 1,
    "eas": "0xA1207F3BBa224E2c9c3c6D5aF63D0eb1582Ce587",
    "schemaUid": "0xbe00b10abb2fbae864b99c6ace4e0e622d5f690f822466e167353c32534dc3fb",
    "schema": "string[] projectIds,uint64 reviewedAt,uint32 revision",
    "attester": "0xa34C25578519beaa7A5F24e38BBa89A34594e4ee",
    "current": {
      "uid": "0xcc6f0dbb88995141351b3fa017c1136be7cd5f6eb0b3f689fc2712084df3f271",
      "revision": 1,
      "reviewedAt": 1793145600,
      "projectIds": [
        "safe",
        …
      ],
      "txHash": "0x29c8743362e7f0f48f1fe21eb2b62a3cb9dbdf212172af2de09ebe6c27c85697",
      "explorerUrl": "https://easscan.org/attestation/view/0xcc6f0dbb88995141351b3fa017c1136be7cd5f6eb0b3f689fc2712084df3f271"
    }
  },
  "generatedAt": 1793787234,
  "commit": …,
  "projects": [ … ]
}

Verifying the set onchain

One attestation on Ethereum Attestation Service, on Ethereum, names every protocol we have reviewed. It proves the set we named, not the ratings: ratings change as protocols change and are served by the API without a transaction.

Network
ethereum (chain id 1)
EAS contract
0xA1207F3BBa224E2c9c3c6D5aF63D0eb1582Ce587
Schema uid
0xbe00b10abb2fbae864b99c6ace4e0e622d5f690f822466e167353c32534dc3fb
Attester
0xa34C25578519beaa7A5F24e38BBa89A34594e4ee
Attestation
0xcc6f0dbb88995141351b3fa017c1136be7cd5f6eb0b3f689fc2712084df3f271
Covers
revision 1 · 4 projects
schema
string[] projectIds,uint64 reviewedAt,uint32 revision
  1. 1.Read the attestation from the EAS contract with the uid in attestations.current: getAttestation(uid).
  2. 2.Check attester and schema against the values above, so an attestation someone else made cannot be mistaken for ours.
  3. 3.Check it is the current one. The newest wins: of our attestations under the schema that are not revoked, the one with the highest revision names the current set. A change is a new attestation that points to the one it supersedes through refUID; older ones stay valid in EAS but no longer count.
  4. 4.Decode projectIds: these are the protocols we have reviewed, as of reviewedAt, at revision revision.
  5. 5.For the rating per property, the reasoning, and what we did not look at, read /v1/project/{id}.json. Ratings might change as protocols change.