An experimental content tagging protocol for the decentralized internet.
ETS is a simple, decentralized protocol built for developers to tokenize hashtag strings as non-fungible tokens (NFTs), link them with online media and surface this data for use in networks, platforms and applications.
Developer Focused
Composable Typescript libraries and APIs to build applications with speed
Universal
Tags and Tagging Records are composable units shared across the ecosystem
Immutable
Provenance and attribution of the tag graph is backed by the blockchain
Incentivized
Novel crypto-economic design that rewards ecosystem actors
Barebones Examples
Create Tagging Record using sdk-core
/// 1. Import modules
import { createRelayerClient } from "@ethereum-tag-service/sdk-core";
import { privateKeyToAccount } from "viem/accounts";
import { arbitrumSepolia } from "viem/chains";
// 2. Initialize account
const account = privateKeyToAccount("0x..."); // Your private key here
// 3. Initialize RelayerClient
const client = createRelayerClient({
chainId: arbitrumSepolia.id,
relayerAddress: "0xa01c9cb373c5e29934b92e5afa6a78e3d590340b",
account
});
// 4. Create a Tagging Record!
client?.createTaggingRecord(
["#rainbow", "#unicorn", "#og", "#uniswap"],
"https://uniswap.org",
"Demo"
)
.then((result) => console.log("Tagging record created:", result))
.catch((error) => console.error("Error creating tagging record:", error));
Output: Tagging record created: { transactionHash: '0x0b36f4d57ff8f2ab6f82e6f1ffc7c9c02ecdc1c5ed8da68c09a79f31b9917e00', status: 'success', taggingRecordId: '80903853133999221435814377604232091751415136525898835875800777163543136099110' }
Surface Tagging Record using ETS API
import { getSubgraphEndpoint } from "@ethereum-tag-service/subgraph-endpoints";
// Arbitrum Sepolia
const endpoint = getSubgraphEndpoint(421614);
const graphqlQuery = {
query: `
{
taggingRecords(
first: 1
skip: 0
orderBy: timestamp
orderDirection: desc
where: {id: "80903853133999221435814377604232091751415136525898835875800777163543136099110"}
) {
recordType
timestamp
relayer {
name
}
tagger {
id
}
tags {
display
machineName
}
target {
targetURI
targetType
}
}
}
`,
};
const response = await fetch(endpoint, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(graphqlQuery),
});
const { data } = await response.json();
console.info(JSON.stringify(data, null, 2));
Output: { "taggingRecords": [ { "recordType": "Demo", "timestamp": "1724717433", "relayer": { "name": "ETSRelayer" }, "tagger": { "id": "0x07bd3b64f9f51fe1d5c79f81dfc0460fff305b0e" }, "tags": [ { "display": "#unicorn", "machineName": "unicorn" }, { "display": "#rainbow", "machineName": "rainbow" }, { "display": "#og", "machineName": "og" }, { "display": "#uniswap", "machineName": "uniswap" } ], "target": { "targetURI": "https://uniswap.org", "targetType": "UNKNOWN" } } ] }
Features
ETS is a community-owned tagging infrastructure for the Ethereum Ecosystem and beyond. It provides a set of tools to create, manage, and query tagging records on an EVM blockchain.
Tagging infrastructure
- Developer focused architecture with composable modules
- Typescript SDKs for vanilla javascript and React that leverage Viem for interacting with ETS smart contracts
- Decentralized subgraph API on The Graph
- Tagging records stored on-chain ensuring data tag graph attribution and immutability
Community Ownership
- Tag strings tokenized as ERC-721 NFTs
- Per-tag fees for tagging records distrubuted to creators, owners and relayers
- Relayer model for apps to create tagging records and benefit economically
- Fully on-chain tag auction modeled after Nouns DAO to ensure fair and controlled tag distribution
Community & Support
Check out the following places for more ETS-related content:
- Follow @etsxyz, @mhpaler, @viiiiiiiiiiiid, @0x_Sero, @0xZach on X
- Read and subscribe to the ETS blog
- Join the discussion on GitHub
Open Source
Help support future development and make ETS a sustainable open-source project: