Skip to main content

Developers

Coinbase Verifications

Coinbase Verifications is a set of Coinbase-verified onchain attestations that enable access to apps and other onchain benefits. A verification serves as a link between a user's Coinbase account and wallet address, and proves a specific attribute about that account without revealing any private information. Verified Pools specifically utilize the Verified Account and Verified Country attestations to determine trade eligibility with our liquidity pools.

For developers who want to integrate with Coinbase Verifications, please see:

You can also reach out directly to the team in the Coinbase Verifications Discord.

Querying Attestations with the EAS Subgraph

As a developer integrating with Coinbase Verifications, you can use the Ethereum Attestation Service (EAS) subgraph to query for attested wallets. This allows you to programmatically determine which wallets have specific Coinbase Verifications, which can be useful for building applications that require verification checks.

EAS Subgraph Access

The EAS subgraph for Base is publicly available at:

https://base.easscan.org/graphql

You can use this GraphQL endpoint to query for attestations using standard GraphQL queries.

Mainnet Schema IDs

Coinbase Verifications uses the following schema IDs on Base:

Verification TypeSchema ID
Verified Account0xf8b05c79f090979bf4a80270aba232dff11a10d9ca55c4f88de95317970f0de9
Verified Business Account0xf82663c0eac879bed1e09e3d4598752359a321f51b38ae669728f480abf3f474
Verified Country0x1801901fabd0e6189356b4fb52bb0ab855276d84f7ec140839fbd1f6801ca065
Verified Business Country0xf87445e61219642b989807bc418e5d5fa8e3adb49e230891055a997121f6c80b

Sample Queries

Below are queries that you can use to fetch attested wallets from the EAS subgraph. These queries include pagination to handle large result sets efficiently.

Query for Verified Account Attestations

This query fetches all active (non-revoked) Verified Account and Verified Business Account attestations:

query GetVerifiedAccountsByAttester($take: Int = 1000, $skip: Int = 0) {
attestations(
where: {
AND: [
{
OR: [
{
schemaId: {
equals: "0xf8b05c79f090979bf4a80270aba232dff11a10d9ca55c4f88de95317970f0de9"
}
}
{
schemaId: {
equals: "0xf82663c0eac879bed1e09e3d4598752359a321f51b38ae669728f480abf3f474"
}
}
]
}
{ revoked: { equals: false } }
{ attester: { equals: "0x357458739F90461b99789350868CD7CF330Dd7EE" } }
]
}
take: $take
skip: $skip
orderBy: [{ timeCreated: desc }, { id: asc }]
) {
recipient
schemaId
timeCreated
data
decodedDataJson
id
}
}

Variables (example):

{
"first": 1000,
"skip": 0
}
Command Line Example

You can execute this query directly from the command line using curl:

curl -X POST \
-H "Content-Type: application/json" \
--data '{"query": "query GetVerifiedAccountsByAttester($take: Int = 1000, $skip: Int = 0) { attestations(where: { AND: [{ OR: [{ schemaId: { equals: \"0xf8b05c79f090979bf4a80270aba232dff11a10d9ca55c4f88de95317970f0de9\" } }, { schemaId: { equals: \"0xf82663c0eac879bed1e09e3d4598752359a321f51b38ae669728f480abf3f474\" } }] }, { revoked: { equals: false } }, { attester: { equals: \"0x357458739F90461b99789350868CD7CF330Dd7EE\" } }] }, take: $take, skip: $skip, orderBy: [{ timeCreated: desc }, { id: asc }]) { recipient schemaId timeCreated data decodedDataJson id } }", "variables": {"take": 10, "skip": 0}}' \
https://base.easscan.org/graphql | jq

This example uses jq for pretty-printing the JSON response. If you don't have jq installed, you can omit the | jq part.

Verified Account Data

For Verified Account attestations, the data field is a single boolean that is always true, so there is not a need to separately parse the data field for these attestations.

Query for Verified Country Attestations

This query fetches all active (non-revoked) Verified Country and Verified Business Country attestations:

query GetVerifiedCountriesByAttester($take: Int = 1000, $skip: Int = 0) {
attestations(
where: {
AND: [
{
OR: [
{
schemaId: {
equals: "0x1801901fabd0e6189356b4fb52bb0ab855276d84f7ec140839fbd1f6801ca065"
}
}
{
schemaId: {
equals: "0xf87445e61219642b989807bc418e5d5fa8e3adb49e230891055a997121f6c80b"
}
}
]
}
{ revoked: { equals: false } }
{ attester: { equals: "0x357458739F90461b99789350868CD7CF330Dd7EE" } }
]
}
take: $take
skip: $skip
orderBy: [{ timeCreated: desc }, { id: asc }]
) {
recipient
schemaId
timeCreated
data
decodedDataJson
id
}
}

Variables:

{
"first": 1000,
"skip": 0
}
Command Line Example

You can execute this query directly from the command line using curl:

curl -X POST \
-H "Content-Type: application/json" \
--data '{"query": "query GetVerifiedCountriesByAttester($take: Int = 1000, $skip: Int = 0) { attestations(where: { AND: [{ OR: [{ schemaId: { equals: \"0x1801901fabd0e6189356b4fb52bb0ab855276d84f7ec140839fbd1f6801ca065\" } }, { schemaId: { equals: \"0xf87445e61219642b989807bc418e5d5fa8e3adb49e230891055a997121f6c80b\" } }] }, { revoked: { equals: false } }, { attester: { equals: \"0x357458739F90461b99789350868CD7CF330Dd7EE\" } }] }, take: $take, skip: $skip, orderBy: [{ timeCreated: desc }, { id: asc }]) { recipient schemaId timeCreated data decodedDataJson id } }", "variables": {"take": 10, "skip": 0}}' \
https://base.easscan.org/graphql | jq

This example uses jq for pretty-printing the JSON response. If you don't have jq installed, you can omit the | jq part.

Verified Country Data

For Verified Country attestations, the data field contains the ISO country code in an encoded format. You'll need to decode this data according to the EAS schema to extract the actual country code.

Here's an example attestation from a snippet of a response containing a Verified Country attestation for the United States (US):

{
"recipient": "0x0067b83C180Ceb0253D96431AB6c017F7a1FFF96",
"schemaId": "0x1801901fabd0e6189356b4fb52bb0ab855276d84f7ec140839fbd1f6801ca065",
"timeCreated": 1741218973,
"data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000025553000000000000000000000000000000000000000000000000000000000000",
"decodedDataJson": "[{\"name\":\"verifiedCountry\",\"type\":\"string\",\"signature\":\"string verifiedCountry\",\"value\":{\"name\":\"verifiedCountry\",\"type\":\"string\",\"value\":\"US\"}}]",
"id": "0x2b6c4e0cf593d22adb6bd27aa37a222fd6ee50daf3851214424678d23eb3cc64"
},

Parsing the Country Code

Developers can easily extract the country code from the decodedDataJson field. Here's a JavaScript example:

// Parse the decodedDataJson string into a JavaScript object
const decodedData = JSON.parse(attestation.decodedDataJson);

// Extract the country code
const countryCode = decodedData[0].value.value;
console.log(`Verified Country: ${countryCode}`); // Output: "Verified Country: US"

Alternatively, if you're working with the raw data field, you can use the EAS SDK to decode it according to the schema definition.

For more information on working with EAS data formats, refer to the EAS documentation.

Using the Queries in Your Application

To use these queries in your application, you can implement them using any GraphQL client (like Apollo Client, urql, or even a simple fetch request). Increment the skip parameter to page through results.

For production applications, consider implementing proper error handling, rate limiting, and caching strategies when querying the EAS subgraph.