On-chain attribution
Last updated
Was this helpful?
Prepared and AA-submitted calldata carries an ERC-8021 Schema 0 Celina attribution suffix so indexers and agents can identify app traffic on Celo mainnet.
Every tagged step appends ERC-8021 only via appendCelinaCalldataTag / toDataSuffix:
ERC-8021
Schema 0 codes — always includes platform code celina, then lowercase custom codes
Example: attributionTags: ["goclaim"] -> codes celina, goclaim.
Case rules for custom tags (before ERC-8021 lowercasing):
App tags (e.g. goclaim, celeste_ai) → uppercase in normalize helpers (GOCLAIM, CELESTE_AI), then lowercase in ERC-8021 codes
Celo Builders tags matching celo_<12 hex> → lowercase
Tags are deduped in first-seen order; the literal tag CELINA / code celina is platform-only
createCelinaClient({ attributionTags })
Every prepare* step via appendCelinaCalldataTag
createAAClient({ attributionTags })
Every step with data in sendPreparedFlow
Omit attributionTags on the AA client to pass step data through unchanged (useful when prepare* already tagged). Passing [] still applies the platform-only ERC-8021 code celina.
Use one consistent tag list per send path. Setting different lists on both the Celina client and the AA client can stack or mismatch suffixes.
Hand-built flows (no prepare*) that still need tags:
import { appendCelinaCalldataTag } from "@andrewkimjoseph/celina-sdk";
const data = appendCelinaCalldataTag(encodeFunctionData(...), ["goclaim"]);check_attribution_tag / checkAttributionInCalldata
You want all ERC-8021 tags in lowercase (mirrors erc8021.codes) or to confirm one tag
verify_attribution_tag / verifyAttributionInCalldata
You need the raw ERC-8021 layer
See Configuration, Prepared flows, and Account Abstraction.
Last updated
Was this helpful?
Was this helpful?