How to write dimensions adapters

This guide will help you create adapters for DefiLlama's various dashboards, including feesarrow-up-right, volumesarrow-up-right, aggregatorsarrow-up-right, derivativesarrow-up-right, Bridge Aggregatorsarrow-up-right, Optionsarrow-up-right, and others.

What is an Adapter?

An adapter is some code that:

  1. Collects data on a protocol by calling some endpoints or making blockchain calls

  2. Computes a response and returns it

It's a TypeScript file that exports an async function which takes a FetchOptions object containing:

  • startTimestamp: Unix timestamp for start of period

  • endTimestamp: Unix timestamp for end of period

  • startBlock: Block number corresponding to start timestamp

  • endBlock: Block number corresponding to end timestamp

  • createBalances: Helper function to track token balances

  • api: Helper for making contract calls

  • getLogs: Helper for fetching event logs

The function returns an object with metrics (like fees, volume, etc.) for that time range.

Introduction to Dimension Adapters

DefiLlama's dashboards track various metrics (dimensions) for DeFi protocols. Each dashboard focuses on specific dimensions:

  • Dexs dashboard: Tracks trading volume from DEXs (spot/swaps)

  • Fees dashboard: Tracks fees and revenue from all types of protocols

  • Aggregators dashboard: Tracks volume from DEX aggregators

  • Derivatives dashboard: Tracks volume from derivatives protocols

  • Aggregator-Derivatives dashboard: Tracks volume from aggregator-derivatives protocols

  • Bridge Aggregators dashboard: Tracks volume from bridge aggregators

  • Options dashboard: Tracks notional and premium volume from options DEXs

How to List Your Project

The majority of adapters for DefiLlama dashboards are contributed and maintained by their respective communities, with all changes being coordinated through the DefiLlama/dimension-adapters GitHub repoarrow-up-right.

To add your protocol to any dashboard, follow these steps:

  1. Create a new file at [dashboard]/yourProtocolName/index.ts or [dashboard]/yourProtocolName.ts (where [dashboard] is the relevant folder like fees, dexs, aggregators, aggregator-derivatives, bridge-aggregators, options, etc.)

  2. Implement your adapter following the guidelines in this document

  3. Test your adapter using npm test [dashboard] yourProtocolName

  4. Submit a PR! A llama will review it and merge it. Once merged, it can take up to 24h to be available in the dashboard

circle-info

Seeing issues getting logs or with calls at historical blocks? You can replace the RPC being used by creating a .env file and filling it with rows like this: ETHEREUM_RPC="https://..." BSC_RPC="https://..." POLYGON_RPC="https://..." ...

Basic Example

Let's start with a simple, complete example of a fees adapter:

Adapter Structure

The object exported by your adapter file defines its behavior. The main configuration object holds a version key and supports two different structures:

Recommended Structure: For protocols with the same fetch logic across all chains, you can use the simplified structure with fetch, chains, start, and methodology at the root level.

SimpleAdapter Properties

  • fetch: The core async function that returns different dimensions of a protocol. The dimensions returned depend on which dashboard you're targeting (e.g., dailyVolume for the dexs dashboard, dailyFees for the fees dashboard). See "Core Dimensions" below.

  • chains: Array of chain constants (e.g., [CHAIN.ETHEREUM, CHAIN.POLYGON]) indicating which chains this adapter supports.

  • start: The earliest timestamp (as YYYY-MM-DD or unix timestamp) we can pass to the fetch function. This tells our servers how far back we can get historical data.

  • methodology: (Optional) Object describing how different dimensions are calculated. See "Metadata and Methodology" below.

  • runAtCurrTime: (Optional, defaults to false) Boolean flag. Set to true if the adapter can only return the latest data (e.g., last 24h) and cannot reliably use the startTimestamp and endTimestamp passed to fetch.

Example of Multi-chain Root-level Structure

Testing Your Adapter

Test your adapter locally before submitting a PR:

To test at specific day (unix format or yyyy-mm-dd):

This checks if your adapter correctly returns data for the requested time period.

Adapter Version

The top-level version key specifies which fetch signature the adapter uses and how it is scheduled.

Use version 2 whenever your data source can return data for an arbitrary time range. The fetch function receives a FetchOptions object with startTimestamp, endTimestamp, and all the helpers (createBalances, getLogs, api, etc.).

Version 2 is the only version that supports pullHourly: true, which lets the system call your adapter in hourly increments for more granular data and avoids recomputing the same period.

Version 1

Use version 1 only when your data source provides daily data that cannot be split into arbitrary time ranges — for example, an external API that returns one value per calendar day, or a Dune query that only makes sense at day boundaries. The fetch function receives (timestamp, chainBlocks, options) where timestamp is the start-of-day unix timestamp.

Version 1 does not support pullHourly.

When to Use Which

Version 2
Version 1

Use when

On-chain logs, contract calls, subgraphs, Dune queries with timestamp filters

External API that only returns daily aggregates

Fetch signature

(options: FetchOptions)

(timestamp, chainBlocks, options)

Time range

Arbitrary start/end timestamps

Fixed day (00:00–23:59 UTC)

pullHourly

Supported

Not supported

Preference

Always prefer this

Use only when v2 is not possible

Core Dimensions

Your fetch function should return an object containing properties corresponding to the metrics (dimensions) relevant to the dashboard you are targeting. All dimensions should be returned as balance objects (Object<string>) where keys are the token identifiers (e.g., ethereum:0x...) and values are the raw amounts (no decimal adjustments).

Minimum Requirements: To be listed, your adapter must provide accurate dailyFees and dailyRevenue dimensions. dailySupplySideRevenue is strongly encouraged whenever the protocol has supply-side costs. dailyHoldersRevenue should be included for protocols that distribute value to tokenholders. Always include breakdown labels and breakdownMethodology. Cumulative total* dimensions are deprecated and should not be used.

Here are the standard dimensions grouped by dashboard type:

Dexs and Dex Aggregators Dimensions:

  • dailyVolume: (Required) Trading volume for the period.

Derivatives and Aggregators-Derivatives Dimensions:

  • dailyVolume: (Required) Perpetual trading volume for the period.

  • openInterestAtEnd: (Optional) Open interest at the end of the period.

  • longOpenInterestAtEnd: (Optional) Long open interest at the end of the period.

  • shortOpenInterestAtEnd: (Optional) Short open interest at the end of the period.

Bridge Aggregators Dimensions:

  • dailyBridgeVolume: (Required) Bridge volume for the period.

Options Dimensions:

  • dailyNotionalVolume: (Required) Notional volume of options contracts traded/settled.

  • dailyPremiumVolume: (Required) Premium volume collected/paid.

  • openInterestAtEnd: (Optional) Open interest at the end of the period.

  • longOpenInterestAtEnd: (Optional) Long open interest at the end of the period.

  • shortOpenInterestAtEnd: (Optional) Short open interest at the end of the period.

Fees Dimensions:

Our fees dimensions follow an income statement model inspired by GAAP accounting standards. See the "Breakdown Labels & Income Statement" section below for the full methodology and rationale.

  • dailyFees: (Required) All fees and value collected from all sources (users, LPs, yield generation, liquid staking rewards, etc.), representing the total value flow into the protocol's ecosystem. This maps to Gross Protocol Revenue on the income statement — everything the protocol could theoretically keep if it took 100%. For a DEX this is total swap fees, for lending this is all borrow interest, for liquid staking this is all staking rewards from staked ETH. Block rewards are not fees — they are incentives. For chain adapters, track only transaction fees paid by users (not perp DEX fees built on top).

  • dailyUserFees: (Optional, but helpful) The portion of dailyFees directly paid by end-users (e.g., swap fees, borrow interest, liquidation penalties, marketplace commissions paid by buyers/sellers).

  • dailySupplySideRevenue: (Required when applicable) The portion of dailyFees distributed to liquidity providers, lenders, stakers, or other suppliers of capital/resources — as well as fees paid out to integrators, referrers, partners, and creators. This maps to Cost of Revenue on the income statement. Examples: LP fees on a DEX, interest paid to lenders, staking rewards passed through to stETH holders, blob fees to mainnet for rollups, validator commissions, trading rebates, integrator/referral fees, partner revenue shares, creator royalties.

    Real-world supply side examples from dimension-adaptersarrow-up-right:

    • Creator / Referral platform (Zoraarrow-up-right): Creator rewards + trade referrer + platform referrer fees all flow to dailySupplySideRevenue. Protocol rewards = dailyRevenue.

    • DEX LP fees (e3arrow-up-right): LP fees from trading = dailySupplySideRevenue, token buybacks = dailyHoldersRevenue.

    • Perp LP + rebates (GMXarrow-up-right): 70% of swap/margin/mint-redeem fees to GLP holders = dailySupplySideRevenue, 30% to GMX stakers = dailyHoldersRevenue.

    • Creator royalties (BasePaintarrow-up-right): 90% of mint fees to artists (METRIC.CREATOR_FEES) = dailySupplySideRevenue, 10% to protocol.

    • Lending interest (Aavearrow-up-right): Interest distributed to lenders = dailySupplySideRevenue. Also includes Paraswap partner fees as a supply side cost.

    • Liquid staking (Lidoarrow-up-right): 90% of staking + MEV rewards passed to stETH holders = dailySupplySideRevenue.

    • Savings/DSR costs (MakerDAOarrow-up-right): DSR interest paid to depositors + USDS staking rewards = dailySupplySideRevenue (uses allowNegativeValue: true).

  • dailyRevenue: (Required) The portion of dailyFees kept by the protocol entity itself. This maps to Gross Profit on the income statement. dailyRevenue = dailyFees - dailySupplySideRevenue.

  • dailyProtocolRevenue: (Optional, clarifies revenue split) The portion of dailyRevenue allocated to the protocol's treasury or core team.

  • dailyHoldersRevenue: (Optional, but important for protocols distributing to holders) All value flowing to governance token holders. This maps to Tokenholder Income on the income statement. Includes buybacks, token burns, direct distributions, AND income from external sources (airdrops from other protocols, bribes from other protocols, etc.).

Deprecated: dailyBribeRevenue and dailyTokenTax are deprecated as separate dimensions. Instead, include these as labeled sub-sections within dailyHoldersRevenue (e.g., dailyHoldersRevenue.add(token, amount, 'Bribes from Protocol X')).

Fee/Revenue Attribution Examples by Protocol Type:

If you are unsure how to classify fees and revenues, refer to this table or contact us at [email protected] or ask on Discord:

Attribute
DEXs
Lending
Chains
NFT Marketplace
Derivatives
CDP
Liquid Staking
Yield
Synthetics

UserFees

Swap fees paid by users

Interest paid by borrowers

Gas fees paid by users

Fees paid by users

Fees paid by users

Interest paid by borrowers

% of rewards paid to protocol

Paid management + performance fees

Fees paid by users

Fees

=UserFees

=UserFees

=UserFees

=UserFees

UserFees + burn/mint fees

=UserFees

Staking rewards

Yield

=UserFees

SupplySideRevenue

LPs revenue

Interest paid to lenders

Sequencer costs, blob fees

Creator earnings

LP revenue, trading rebates

*

Revenue earned by stETH holders

Yield excluding protocol fees

LPs revenue

Revenue

% of swap fees going to protocol governance

% of interest going to protocol governance

Burned coins (fees-sequencerCosts for rollups)

Marketplace revenue + creator earnings

Protocol governance revenue

=ProtocolRevenue

=ProtocolRevenue

=ProtocolRevenue

=ProtocolRevenue

ProtocolRevenue

% of swap fees going to treasury

% of interest going to protocol

*

Marketplace revenue

Value going to treasury

Interest going to treasury

=UserFees

=UserFees

% of fees going to treasury

HoldersRevenue

Money going to gov token holders

*

*

*

Value going to gov token holders

*

*

*

% of fees going to token holders

Notes:

  • Protocol governance includes treasury + gov token holders.

  • Revenue = HoldersRevenue + ProtocolRevenue.

  • Revenue = Fees - SupplySideRevenue.

  • Asterisk (*) indicates typically not applicable or zero for that category.

  • For chains: only track transaction fees paid by users. Perp DEX fees on Hyperliquid L1 are tracked under the perp adapter, not the chain adapter.

Implementation Steps

Building the fetch function is the core task. Here's a breakdown:

  1. Identify Supported Chains: Determine which blockchains your protocol runs on by referencing the chains.tsarrow-up-right file. For the recommended root-level structure, add these to the chains array. For chain-specific configurations, you'll need a BaseAdapter entry for each chain.

  2. Define Start Dates: Find your protocol's deployment date to set the start property (root-level for consistent dates, or per-chain for different deployment dates). This enables proper data backfilling.

  3. Choose Data Source(s): Select the appropriate method(s) to retrieve the necessary data for calculating dimensions. Common approaches are detailed below.

Data Source Examples

Choose the appropriate data source based on your protocol's architecture. The fetch function receives an options object containing helper utilities like createBalances, getLogs, api (for contract calls), queryDuneSql, etc.

On-Chain Event Logs

Ideal for tracking specific events that generate fees or volume:

Example: Ostiumarrow-up-right

Token Transfer Tracking

Track tokens received by protocol treasury/fee addresses:

Example: Synthetixarrow-up-right

Subgraphs

Fast queries for protocols with well-maintained subgraphs:

Examples:

Query Engines (Dune, Flipside, Allium)

For complex queries or when direct blockchain access is too expensive:

Example: Pumpswaparrow-up-right

Contract Calls

For protocols where data is accessible through view functions or requires multiple contract interactions:

Example: Beradromearrow-up-right

Metadata and Methodology

Always include a methodology object to explain how your metrics are calculated. This is crucial for transparency.

The methodology object provides a one-line summary per dimension. For detailed per-label explanations, use breakdownMethodology (see below).

Breakdown Labels & Income Statement

Why We Use an Income Statement Model

Our previous system only displayed aggregated numbers with no breakdown. Users didn't know what we were counting (e.g., does Ethereum fees include blob fees?), there was no way to tell if a new revenue stream was being tracked, and we only captured tokenholder income from burns/distributions while missing airdrops, bribes, etc.

We moved to a system inspired by GAAP accounting standards. The goal is:

  • Break down each component as much as possible

  • Name and description of each component must be easy to understand — if you were a user and saw this breakdown, would you understand what each thing is?

  • When a user wonders "does this include X revenue stream/cost?" it should be trivial to answer by looking at the breakdown

  • Include every way that tokenholders make money, even if it's coming from another protocol

Income Statement Template

This template is a reference for deciding which dimension and breakdown label to use when writing your adapter. For each revenue stream or cost in your protocol, find it in the template below to determine whether it belongs in dailyFees, dailySupplySideRevenue, dailyRevenue, dailyHoldersRevenue, etc. Then use the corresponding label in your .add() calls and breakdownMethodology object (see the code examples further below).

Gross Protocol Revenue (dailyFees):

  • + Swap Fees

  • + Liquidation Fees

  • + Interest Income (borrow interest)

  • + Staking Rewards

  • + MEV Captured

  • + Gas Fees (transaction fees on chains and rollups)

Cost of Funds (dailySupplySideRevenue):

  • - LP Payments

  • - Interest Expenses (paid to lenders/depositors)

  • - Staking Rewards, less fees (passed through to stakers)

  • - MEV paid to stakers, less fees

  • - Blob fees to mainnet (for rollups)

  • - Validator Commissions

  • - Trading Rebates (including those funded by token emissions)

  • - Integrator / Referral Fees (paid to partners, integrators, or referrers)

  • - Creator Royalties / Fees

Gross Profit (dailyRevenue) = Gross Protocol Revenue - Cost of Funds


Tokenholder Income (dailyHoldersRevenue) — OFF STATEMENT:

Capital Allocations:

  • + Treasury Buybacks

  • + Tokenholder Distributions

Other Tokenholder Flows:

  • + Airdrops Received by Tokenholders from Other Protocols (e.g., Binance Earn where BNB stakers receive airdrops from tokens that launch on Binance)

  • + Bribes Received by Tokenholders from Other Protocols

  • + Other Off-Protocol Tokenholder Income

Tokenholder Income = Capital Allocations + Other Tokenholder Flows

How to Implement This in Your Adapter

The income statement above maps directly to your .add() calls and breakdownMethodology. Here are compact examples from real adapters showing different protocol types:

Creator / Referral Platform (Zora)

Perp DEX with LP Split (GMX)

Liquid Staking (Lido)

When to Use Breakdown Labels

Always provide labels, even when there is only one source/destination of fees. This prevents having to update and backfill data later when the adapter is listed under a parent protocol.

For example, when writing a Fluid DEX adapter, add a 'Swap Fees' label even though it has only one source of fees. Later, when Fluid Lending is also listed and both are grouped under the Fluid parent protocol, the DEX adapter already has proper breakdown labels and doesn't need updating or data backfilling.

How Labels Change Per Dimension

Labels should vary by dimension to provide the most useful information:

  • dailyFees: Use source-of-fees labels that describe where money comes from. Simple labels like: 'Swap Fees', 'Borrow Interest', 'Flashloan Fees', 'Liquidation Fees', 'Staking Rewards', 'MEV Rewards'

  • dailyRevenue, dailyProtocolRevenue, dailySupplySideRevenue, dailyHoldersRevenue: Use more detailed labels that describe both the source and destination: 'Swap Fees To LPs', 'Borrow Interest To Treasury', 'Borrow Interest To Lenders', 'Staking Rewards To Protocol'

This distinction matters because the same source of fees often splits across multiple destinations:

Adding Breakdown Labels in Code

The third parameter in .add() specifies the category label. All balance methods support this:

Label Naming Best Practices

Labels must be clear, descriptive, and immediately understandable to a user who sees the breakdown:

Good labels:

  • 'Borrow Interest' — clear what borrowers are paying

  • 'GHO Borrow Interest' — specific to the GHO market

  • 'Liquidation Fees' — describes the fee source

  • 'Staking Rewards' — clear revenue source

  • 'MEV Rewards' — specific MEV-related revenue

  • 'Spot Fees' — trading fees on spot markets

  • 'Borrow Interest To Treasury' — clear destination

  • 'Borrow Interest To Lenders' — clear who receives it

  • 'Spot fees on Unit markets' — specific enough to distinguish from other spot fees

Bad labels:

  • 'Protocol Fees' — too vague, doesn't explain what kind of fees

  • 'Fees' — not descriptive at all

  • 'Revenue' — doesn't explain the source

  • 'Other' — not informative

  • 'Misc' — meaningless to users

Key principles:

  1. Be specific: Users should immediately understand what each label means

  2. Break down as much as possible: More granular breakdowns are always better

  3. Use constants when they fit: Check helpers/metrics.ts for shared labels, but prioritize clarity over reuse

  4. Vary labels across dimensions: Use different labels in dailyFees vs dailySupplySideRevenue when it helps understanding

  5. Think like income statements: Would an investor reading this breakdown understand exactly where the money comes from and goes?

  6. Answer "does this include X?": When a user wonders if a specific revenue stream or cost is included, the answer should be obvious from the breakdown

Using Metric Constants

Standard labels are defined in helpers/metrics.tsarrow-up-right:

When to use constants vs custom labels:

  • Use constants when they clearly describe your category

  • Write custom labels when constants would be unclear or confusing — user understanding is more important than code consistency

  • Before creating a new constant, check if an existing one fits. Before using a constant, check if it's clear enough for your use case.

breakdownMethodology Object

Every label used in .add() calls MUST appear in breakdownMethodology, and every label in breakdownMethodology must have corresponding data in code. This object documents each sub-section.

Structure

Complete Example: Aave (Lending)

Example: Fluid (Lending with Buybacks)

Example: Hyperliquid (DEX with Buybacks)

Example: Liquity (CDP with No Protocol Revenue)

Adding to Your Adapter

Requirements Checklist

Must have:

  1. Every label used in .add() calls has a corresponding entry in breakdownMethodology

  2. Every label in breakdownMethodology has corresponding data assigned in code

  3. Labels are descriptive and immediately understandable to users

  4. Descriptions clearly explain what each category represents

  5. Labels are provided even when there's only one source of fees (for parent protocol compatibility)

  6. dailySupplySideRevenue (Cost of Revenue) is tracked whenever the protocol pays out to suppliers

Common mistakes to avoid:

  1. Using vague labels like "Protocol Fees" or "Other" — be specific

  2. Missing breakdownMethodology entries for labels used in code

  3. Having breakdownMethodology entries with no corresponding data

  4. Not breaking down enough — more detail is always better

  5. Using the same labels across all dimensions when different labels would be clearer

  6. Forgetting to label single-source adapters (breaks when listed under parent protocol)

  7. Tracking block rewards as fees — they are incentives, not fees

  8. Including perp DEX fees in chain adapters — those belong in the perp adapter

Real-World Examples

Browse these adapters for complete implementations:

For full income statement examples showing how major protocols in each category break down their financials, see the examples folderarrow-up-right.

Code Structure Guidelines

Follow these rules when writing adapters:

  • Prefer on-chain data: Use on-chain event logs and contract calls where possible. We are stricter about this for chains where we maintain our own indexer, or where there is significant volume/fees, or where you suspect wash trading.

  • Use pullHourly: true (version 2 adapters only): This avoids recomputing data for the same time period repeatedly, and provides more granular hourly data.

  • Never swallow errors: It's better to fail than to return incorrect data. If a small chain with $10K volume fails, it shouldn't break an adapter that tracks $100M daily on other chains — return 0 for the failing chain.

  • Use/add helper code: When multiple adapters use similar logic, extract it into shared helpers.

  • No npm dependencies: Do not add npm packages. This leads to bloat.

  • Use api.multiCall: Prefer api.multiCall over Promise.all for batching EVM calls. Use PromisePool for non-EVM calls.

  • Return token breakdowns: Always return amounts with token addresses (not pre-converted USD). Always include methodology and breakdownMethodology (where appropriate).

  • Watch for wash trading: Be vigilant about wash trading, especially on low-fee chains.

Important Considerations

Precision

Use the BigNumber library (available via options.createBalances() or direct import) for mathematical operations involving token amounts, especially when dealing with different decimals or potentially large/small numbers, to avoid JavaScript precision issues.

Helper Functions Reference

DeFiLlama provides numerous helper functions to simplify common tasks in adapter development. These are available either via direct import or through the options object passed to your fetch function.

Protocol-Specific Helpers (Common Abstractions)

These helpers provide high-level abstractions for common DeFi protocol archetypes.

Uniswap V2/V3-like Protocols

Compound V2-like Protocols

  • compoundV2Export: Creates an adapter for Compound V2-like protocols, taking config parameters and returning an object that tracks fees, revenue, and distribution among holders and suppliers.

    Example:

Token Tracking Helpers

Functions for tracking native and ERC20 token movements.

  • addTokensReceived: Tracks ERC20 token transfers received by specified addresses. Supports filtering by sender/receiver and custom token transformations. Uses indexer first, then logs.

    Example:

  • addGasTokensReceived: Tracks native token transfers (like ETH) received by specified multisig addresses.

  • getETHReceived: Tracks native token transfers on EVM chains via Allium DB queries.

    Example Implementation - DexToolsarrow-up-right

  • getSolanaReceived: Fetches token transfers to specified Solana addresses, allows blacklisting senders/signers.

    Example:

EVM Data Helpers

Functions for querying EVM logs and indexers.

Query Engine Helpers

Functions for querying external data platforms.

Chain-Specific Helpers

Helpers tailored for specific chains or L2s.

  • fetchTransactionFees (Available via options.fetchTransactionFees): Retrieves total native token transaction fees burned/collected by the network.

General Helpers

Utility functions for common adapter patterns.

  • startOfDay (Available via options.startOfDay): Converts options.endTimestamp to 00:00:00 UTC for data sources requiring exact day timestamps.

Helper Source Code Reference

You can find the full source code for these helper functions in the DefiLlama GitHub repository:

Frequently Asked Questions

How does DeFiLlama ensure data quality and accuracy?

Code Review Process: Each protocol adapter undergoes peer review by llamas through GitHub pull requests. This ensures code quality, data accuracy, and that a consistent methodology is applied to all protocols for the same metrics before any adapter goes live.

Methodology Consistency: We maintain a uniform methodology across all protocol adapters and chains. Whenever the methodology evolves, our team propagates the update to every relevant adapter to ensure figures remain fully comparable across protocols.

Monitoring Systems: We maintain internal alert systems that detect unusual data spikes, broken adapters, and anomalies across both TVL and dimension adapters (fees/revenue/volume). This allows the team to quickly identify and fix issues.

Historical Data Integrity: When protocols add new components (like treasury wallets, new contracts, etc.), we backfill historical data to maintain completeness and accuracy. This ensures users have access to accurate historical insights.

Data Classification Rules

  • Fees: Only fees paid by users for a transaction/storage/etc should be tracked as fees. Block rewards are a cost and must be tracked as incentives, not fees.

  • Revenue: Only the part of fees that gets burnt (or similar) can be tracked as revenue. The part that goes to stakers does not benefit the chain/holders — make sure to tag these correctly in the breakdown.

  • Holder revenue: Usually the same as revenue unless a portion is set aside for the protocol (like in the case of Zcash).

  • Chain fees: Track only the transaction fees paid by users. Do not include perp DEX fees for protocols like Hyperliquid L1 — those are counted under the perp listing.

How we handle data integrity and keep data organic?

Wash Trading Detection: We actively identify and remove wash trading volumes to prevent them from undermining legitimate trading data.

TVL Percentage Rules: For pools with very low fee percentages (like 0.01%) that enable wash trading, we apply minimum TVL percentage rules. Only volume from pools meeting these thresholds is counted, effectively filtering out wash trading while preserving legitimate activity.

Chain-Specific Considerations:

  • Solana: Due to lower transaction fees that make wash trading more viable, we apply TVL percentage filters to major Solana DEXs while maintaining legitimate volumes

  • BSC: During farming campaigns that create wash trading incentives for low-liquidity pairs, we remove affected pairs to maintain data integrity

How can I report data issues or provide feedback?

You can report issues or provide feedback by sending an email to [email protected]

Llamas regularly review feedback and implement necessary fixes to maintain the highest data quality standards across all adapters.

Last updated

Was this helpful?