Skip to main content
Schema: avalanche.defi Table: ez_lending_liquidations Type: View

What

This table tracks liquidation events across lending protocols, where under-collateralized positions are forcibly closed to protect protocol solvency. Liquidations occur when a borrower’s health factor drops below 1, typically due to collateral value decline or debt value increase.

Key Use Cases

  • Monitoring protocol health and risk levels
  • Analyzing liquidation patterns during market volatility
  • Tracking liquidator profitability and competition
  • Understanding collateral risk profiles
  • Identifying frequently liquidated borrowers

Important Relationships

  • Links to ez_lending_borrows for original loan details
  • Connects to ez_lending_deposits for collateral information
  • Often preceded by entries in ez_lending_flashloans
  • References price.ez_prices_hourly for USD valuations

Commonly-used Fields

  • borrower: Address that was liquidated
  • liquidator: Address performing the liquidation
  • platform: Lending protocol
  • collateral_token/debt_token: Asset pair involved
  • amount/amount_usd: Collateral seized

Sample queries

-- Daily liquidation volume and metrics
SELECT
    DATE_TRUNC('day', block_timestamp) AS date,
    platform,
    COUNT(*) AS liquidation_count,
    COUNT(DISTINCT borrower) AS unique_borrowers_liquidated,
    SUM(amount_usd) AS total_debt_covered_usd,
    SUM(amount_usd) AS total_collateral_liquidated_usd,
    AVG(amount_usd / NULLIF(amount_usd, 0) - 1) * 100 AS avg_liquidation_bonus_pct
FROM <blockchain_name>.defi.ez_lending_liquidations
WHERE block_timestamp >= CURRENT_DATE - 30
    AND amount_usd IS NOT NULL
GROUP BY 1, 2
ORDER BY 1 DESC, 5 DESC;

-- Most liquidated asset pairs
SELECT
    collateral_token,
    collateral_token_symbol,
    debt_token,
    debt_token_symbol,
    COUNT(*) AS liquidation_count,
    SUM(amount_usd) AS total_collateral_liquidated_usd,
    AVG(amount_usd) AS avg_liquidation_size_usd
FROM <blockchain_name>.defi.ez_lending_liquidations
WHERE block_timestamp >= CURRENT_DATE - 7
    AND collateral_token_symbol IS NOT NULL
    AND debt_token_symbol IS NOT NULL
GROUP BY 1, 2, 3, 4
ORDER BY 6 DESC
LIMIT 20;

-- Liquidator analysis
WITH liquidator_stats AS (
    SELECT
        liquidator,
        COUNT(*) AS liquidations_performed,
        SUM(amount_usd) AS total_collateral_received_usd,
    FROM <blockchain_name>.defi.ez_lending_liquidations
    WHERE block_timestamp >= CURRENT_DATE - 30
        AND amount_usd IS NOT NULL
    GROUP BY 1
)
SELECT
    CASE
        WHEN liquidations_performed = 1 THEN 'Opportunistic'
        WHEN liquidations_performed <= 10 THEN 'Active'
        WHEN liquidations_performed <= 100 THEN 'Professional'
        ELSE 'Bot/High Frequency'
    END AS liquidator_type,
    COUNT(*) AS liquidator_count,
    SUM(total_collateral_received_usd) as total_collateral_received_usd
    SUM(liquidations_performed) AS total_liquidations
FROM liquidator_stats
GROUP BY 1
ORDER BY 3 DESC;

-- Large liquidations monitoring
SELECT
    block_timestamp,
    tx_hash,
    platform,
    borrower,
    liquidator,
    collateral_token_symbol,
    debt_token_symbol,
    amount_usd,
FROM <blockchain_name>.defi.ez_lending_liquidations
WHERE amount_usd > 10000
    AND block_timestamp >= CURRENT_DATE - 14
ORDER BY amount_usd DESC;

-- Borrower liquidation history
WITH borrower_liquidations AS (
    SELECT
        borrower,
        COUNT(*) AS times_liquidated,
        COUNT(DISTINCT DATE_TRUNC('day', block_timestamp)) AS liquidation_days,
        SUM(amount_usd) AS total_collateral_lost_usd,
        ARRAY_AGG(DISTINCT platform) AS platforms_liquidated_on
    FROM <blockchain_name>.defi.ez_lending_liquidations
    WHERE block_timestamp >= CURRENT_DATE - 90
        AND amount_usd IS NOT NULL
    GROUP BY 1
)
SELECT
    times_liquidated,
    platforms_liquidated_on,
    COUNT(*) AS borrower_count,
    AVG(total_collateral_lost_usd) AS avg_loss_from_liquidation
FROM borrower_liquidations
GROUP BY 1, 2
ORDER BY 1, 2;

Columns

Column NameData TypeDescription
BLOCK_NUMBERNUMBERSequential counter representing the position of a block in the blockchain since genesis (block 0).
Key Facts:
  • Immutable once finalized
  • Primary ordering mechanism for blockchain data
  • Increments by 1 for each new block
  • Used as a proxy for time in many analyses
Usage in Queries:
-- Recent data
WHERE block_number >= (SELECT MAX(block_number) - 1000 FROM fact_blocks)

-- Historical analysis
WHERE block_number BETWEEN 15000000 AND 16000000

-- Join across tables
JOIN <blockchain_name>.core.fact_event_logs USING (block_number)
Important: Block numbers are chain-specific. Block 15000000 on Ethereum ≠ block 15000000 on Polygon. | | BLOCK_TIMESTAMP | TIMESTAMP_NTZ | UTC timestamp when the block was produced by validators/miners. Format: TIMESTAMP_NTZ (no timezone) Precision: Second-level accuracy Reliability:
  • Set by block producer
  • Can have minor variations (±15 seconds)
  • Always increasing (newer blocks = later timestamps)
Best Practices:
-- Time-based filtering (most efficient)
WHERE block_timestamp >= DATEADD('day', -7, CURRENT_TIMESTAMP)

-- Hourly aggregations
DATE_TRUNC('hour', block_timestamp) AS hour

-- UTC date extraction
DATE(block_timestamp) AS block_date
Note: Use for time-series analysis, but be aware that block production rates vary by chain. | | TX_HASH | TEXT | Unique 66-character identifier for the transaction. Format: 0x + 64 hexadecimal characters Usage:
  • Primary key for transaction lookups
  • Join key for traces, logs, and token transfers
  • Immutable once confirmed
Example: 0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060 | | CONTRACT_ADDRESS | TEXT | Smart contract address that emitted this event or received the transaction. Key Points:
  • Always the immediate event emitter for logs
  • May differ from transaction to_address
  • Lowercase normalized format
  • Never NULL for valid events | | EVENT_NAME | TEXT | The event name as defined in the contract’s ABI.
Format: PascalCase event identifier Examples:
  • Transfer - Token transfers
  • Swap - DEX trades
  • OwnershipTransferred - Admin changes
  • Approval - Token approvals
Usage Pattern:
-- Find all event types for a contract
SELECT DISTINCT event_name, COUNT(*) as occurrences
FROM ez_decoded_event_logs
WHERE contract_address = LOWER('0x...')
GROUP BY 1
ORDER BY 2 DESC;
``` |
| EVENT_INDEX | NUMBER | Zero-based sequential position of the event within a transaction's execution.

**Key Facts**:
- Starts at 0 for first event
- Increments across all contracts in transaction
- Preserves execution order
- Essential for deterministic event ordering

**Usage Example**:
```sql
-- Trace event execution flow
SELECT
    event_index,
    contract_address,
    topic_0,
    SUBSTRING(data, 1, 10) AS data_preview
FROM <blockchain_name>.core.fact_event_logs
WHERE tx_hash = '0xabc...'
ORDER BY event_index;
``` |
| ORIGIN_FUNCTION_SIGNATURE | TEXT | Function signature (first 4 bytes) of the called method.

**Format**: 0x + 8 hex characters

**Common Signatures**:
- 0xa9059cbb: transfer(address,uint256)
- 0x095ea7b3: approve(address,uint256)
- 0x23b872dd: transferFrom(address,address,uint256)

**Note**: NULL for simple transfers or invalid calls |
| ORIGIN_FROM_ADDRESS | TEXT | The externally-owned account (EOA) or contract address that initiated the transaction.

**Key Points**:
- Always 42 characters (0x + 40 hex chars)
- Lowercase normalized in all tables
- Cannot be NULL for valid transactions
- For contract creation: sender of creation transaction

**Common Patterns**:
- EOA → EOA: Simple transfer
- EOA → Contract: User interaction
- Contract → Contract: Internal calls (see fact_traces)
- Known addresses: Exchange hot wallets, protocol deployers

**Query Examples**:
```sql
-- User activity analysis
SELECT from_address, COUNT(*) as tx_count
FROM <blockchain_name>.core.fact_transactions
WHERE block_timestamp >= CURRENT_DATE - 30
GROUP BY 1
ORDER BY 2 DESC;

-- New user detection
SELECT DISTINCT from_address
FROM <blockchain_name>.core.fact_transactions t1
WHERE NOT EXISTS (
    SELECT 1 FROM <blockchain_name>.core.fact_transactions t2
    WHERE t2.from_address = t1.from_address
    AND t2.block_number < t1.block_number
);
``` |
| ORIGIN_TO_ADDRESS | TEXT | The destination address for the transaction - either an EOA or contract address.

**Special Cases**:
- NULL: Contract creation transaction
- Contract address: Interacting with smart contract
- EOA address: Simple transfer or receiving funds

**Important Patterns**:
```sql
-- Contract deployments
WHERE to_address IS NULL

-- Popular contracts
SELECT to_address, COUNT(*) as interactions
FROM <blockchain_name>.core.fact_transactions
WHERE to_address IS NOT NULL
GROUP BY 1
ORDER BY 2 DESC;

-- Direct transfers only
WHERE to_address NOT IN (SELECT address FROM dim_contracts)
Note: For token transfers, this is the token contract, not the recipient. See ez_token_transfers tables for recipient. | | PLATFORM | TEXT | The lending protocol where the transaction occurred. Example: ‘aave’ | | LIQUIDATOR | TEXT | The address that performed the liquidation. Example: ‘0xabcdefabcdefabcdefabcdefabcdefabcdefabcd’ | | BORROWER | TEXT | The address that initiated a borrow or repayment transaction. Example: ‘0x1234567890123456789012345678901234567890’ | | PROTOCOL_MARKET | TEXT | The lending protocol’s receipt token issued to depositors. Example: ‘0xfedcbafedcbafedcbafedcbafedcbafedcbafed’ | | COLLATERAL_TOKEN | TEXT | The token contract address used as collateral in a liquidation. Example: ‘0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2’ | | COLLATERAL_TOKEN_SYMBOL | TEXT | The symbol of the asset used as collateral in liquidations. Example: ‘WETH’ | | LIQUIDATED_AMOUNT_UNADJ | FLOAT | | | LIQUIDATED_AMOUNT | FLOAT | | | LIQUIDATED_AMOUNT_USD | FLOAT | | | AMOUNT_UNADJ | FLOAT | The raw amount of tokens liquidated without decimal adjustment. This column will be deprecated October 13th, please update to liquidated_amount_unadj. | | AMOUNT | FLOAT | The decimal-adjusted amount of tokens liquidated. This column will be deprecated October 13th, please update to liquidated_amount. | | AMOUNT_USD | FLOAT | The USD value of the tokens liquidated. This column will be deprecated October 13th, please update to liquidated_amount_usd. | | DEBT_TOKEN | TEXT | The token contract address that was borrowed and is being repaid in liquidation. Example: ‘0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48’ | | DEBT_TOKEN_SYMBOL | TEXT | The symbol of the borrowed asset being repaid in liquidation. Example: ‘USDC’ | | REPAID_AMOUNT_UNADJ | NUMBER | | | REPAID_AMOUNT | FLOAT | | | REPAID_AMOUNT_USD | FLOAT | | | EZ_LENDING_LIQUIDATIONS_ID | TEXT | | | INSERTED_TIMESTAMP | TIMESTAMP_NTZ | UTC timestamp when the record was first added to the Flipside database. Format: TIMESTAMP_NTZ Use Cases:
  • Data freshness monitoring
  • Incremental processing markers
  • Debugging data pipeline issues
  • SLA tracking
Query Example:
-- Check data latency
SELECT
    DATE_TRUNC('hour', block_timestamp) as block_hour,
    DATE_TRUNC('hour', inserted_timestamp) as insert_hour,
    AVG(TIMESTAMPDIFF('minute', block_timestamp, inserted_timestamp)) as avg_latency_minutes
FROM <blockchain_name>.core.fact_transactions
WHERE block_timestamp >= CURRENT_DATE - 1
GROUP BY 1, 2;
``` |
| MODIFIED_TIMESTAMP | TIMESTAMP_NTZ | UTC timestamp of the most recent update to this record.

**Format**: TIMESTAMP_NTZ

**Triggers for Updates**:
- Data corrections
- Enrichment additions
- Reprocessing for accuracy
- Schema migrations

**Monitoring Usage**:
```sql
-- Recently modified records
SELECT *
FROM <blockchain_name>.core.fact_transactions
WHERE modified_timestamp > inserted_timestamp
AND modified_timestamp >= CURRENT_DATE - 1;

-- Data quality tracking
SELECT
    DATE(modified_timestamp) as mod_date,
    COUNT(*) as records_updated,
    COUNT(DISTINCT block_number) as blocks_affected
FROM <blockchain_name>.core.fact_transactions
WHERE modified_timestamp > inserted_timestamp
GROUP BY 1
ORDER BY 1 DESC;
``` |