Skip to main content
Schema: somnia.defi Table: ez_lending_withdraws Type: View

What

This table tracks withdrawal transactions where users remove their supplied liquidity from lending protocols. Withdrawals include the original deposit plus earned interest, subject to available liquidity in the protocol.

Key Use Cases

  • Monitoring liquidity flows and protocol health
  • Detecting potential bank run scenarios
  • Calculating realized yields for depositors
  • Analyzing withdrawal patterns and timing
  • Tracking large withdrawals that may impact rates

Important Relationships

  • Links to ez_lending_deposits for position lifecycle
  • Affected by ez_lending_borrows (reduces available liquidity)
  • Increased by ez_lending_repayments (adds liquidity)
  • References price.ez_prices_hourly for USD valuations

Commonly-used Fields

  • depositor: Address withdrawing funds
  • platform: Lending protocol
  • token_address/token_symbol: Withdrawn asset
  • amount/amount_usd: Withdrawal quantity including interest
  • block_timestamp: When withdrawal occurred

Sample queries

-- Daily withdrawal patterns
SELECT 
    DATE_TRUNC('day', block_timestamp) AS date,
    platform,
    COUNT(*) AS withdrawal_count,
    COUNT(DISTINCT depositor) AS unique_withdrawers,
    SUM(amount_usd) AS total_withdrawn_usd,
    AVG(amount_usd) AS avg_withdrawal_size_usd
FROM <blockchain_name>.defi.ez_lending_withdraws
WHERE block_timestamp >= CURRENT_DATE - 30
    AND amount_usd IS NOT NULL
GROUP BY 1, 2
ORDER BY 1 DESC, 5 DESC;

-- Platform liquidity analysis (deposits vs withdrawals)
WITH platform_deposits AS (
    SELECT 
        platform,
        token_address,
        token_symbol,
        COUNT(DISTINCT depositor) AS unique_depositors,
        SUM(amount) AS total_deposited_tokens,
        SUM(amount_usd) AS total_deposited_usd,
        COUNT(*) AS deposit_transactions,
        AVG(amount_usd) AS avg_deposit_size_usd
    FROM <blockchain_name>.defi.ez_lending_deposits
    WHERE block_timestamp >= CURRENT_DATE - 90
        AND amount IS NOT NULL
    GROUP BY 1, 2, 3
),
platform_withdrawals AS (
    SELECT 
        platform,
        token_address,
        token_symbol,
        COUNT(DISTINCT depositor) AS unique_withdrawers,
        SUM(amount) AS total_withdrawn_tokens,
        SUM(amount_usd) AS total_withdrawn_usd,
        COUNT(*) AS withdrawal_transactions,
        AVG(amount_usd) AS avg_withdrawal_size_usd
    FROM <blockchain_name>.defi.ez_lending_withdraws
    WHERE block_timestamp >= CURRENT_DATE - 90
        AND amount IS NOT NULL
    GROUP BY 1, 2, 3
)
SELECT 
    COALESCE(d.platform, w.platform) AS platform,
    COALESCE(d.token_address, w.token_address) AS token_address,
    COALESCE(d.token_symbol, w.token_symbol) AS token_symbol,
    d.unique_depositors,
    w.unique_withdrawers,
    d.total_deposited_usd,
    w.total_withdrawn_usd,
    (d.total_deposited_usd - COALESCE(w.total_withdrawn_usd, 0)) AS net_deposits_usd,
    d.deposit_transactions,
    w.withdrawal_transactions,
    d.avg_deposit_size_usd,
    w.avg_withdrawal_size_usd
FROM platform_deposits d
FULL OUTER JOIN platform_withdrawals w
    ON d.platform = w.platform
    AND d.token_address = w.token_address
WHERE COALESCE(d.total_deposited_usd, 0) > 100000
    OR COALESCE(w.total_withdrawn_usd, 0) > 100000
ORDER BY net_deposits_usd DESC;

-- Liquidity stress analysis
WITH hourly_flows AS (
    SELECT 
        DATE_TRUNC('hour', block_timestamp) AS hour,
        platform,
        token_symbol,
        0 AS deposits_usd,
        SUM(amount_usd) AS withdrawals_usd
    FROM <blockchain_name>.defi.ez_lending_withdraws
    WHERE block_timestamp >= CURRENT_DATE - 7
        AND amount_usd IS NOT NULL
    GROUP BY 1, 2, 3
    
    UNION ALL
    
    SELECT 
        DATE_TRUNC('hour', block_timestamp) AS hour,
        platform,
        token_symbol,
        SUM(amount_usd) AS deposits_usd,
        0 AS withdrawals_usd
    FROM <blockchain_name>.defi.ez_lending_deposits
    WHERE block_timestamp >= CURRENT_DATE - 7
        AND amount_usd IS NOT NULL
    GROUP BY 1, 2, 3
)
SELECT 
    hour,
    platform,
    token_symbol,
    SUM(deposits_usd) AS hourly_deposits,
    SUM(withdrawals_usd) AS hourly_withdrawals,
    SUM(deposits_usd - withdrawals_usd) AS net_flow,
    SUM(SUM(deposits_usd - withdrawals_usd)) OVER (
        PARTITION BY platform, token_symbol 
        ORDER BY hour
    ) AS cumulative_flow
FROM hourly_flows
GROUP BY 1, 2, 3
HAVING SUM(withdrawals_usd) > 10000
ORDER BY 1 DESC, 6;

-- Large withdrawals monitoring (potential bank run indicators)
SELECT 
    block_timestamp,
    tx_hash,
    platform,
    depositor,
    token_symbol,
    amount AS withdrawn_tokens,
    amount_usd AS withdrawn_usd,
    LAG(amount_usd) OVER (PARTITION BY platform, token_symbol ORDER BY block_timestamp) AS prev_withdrawal_usd,
    amount_usd / NULLIF(LAG(amount_usd) OVER (PARTITION BY platform, token_symbol ORDER BY block_timestamp), 0) AS size_multiplier
FROM <blockchain_name>.defi.ez_lending_withdraws
WHERE amount_usd > 1000000
    AND block_timestamp >= CURRENT_DATE - 3
ORDER BY withdrawn_usd DESC;

-- Withdrawal timing patterns
SELECT 
    EXTRACT(HOUR FROM block_timestamp) AS hour_of_day,
    COUNT(*) AS withdrawal_count,
    SUM(amount_usd) AS total_withdrawn_usd,
    AVG(amount_usd) AS avg_withdrawal_size
FROM <blockchain_name>.defi.ez_lending_withdraws
WHERE block_timestamp >= CURRENT_DATE - 30
    AND amount_usd IS NOT NULL
GROUP BY 1
ORDER BY 1;

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: Important: Block numbers are chain-specific. Block 15000000 on Ethereum ≠ block 15000000 on Polygon.
BLOCK_TIMESTAMPTIMESTAMP_NTZUTC 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: Note: Use for time-series analysis, but be aware that block production rates vary by chain.
TX_HASHTEXTUnique 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_ADDRESSTEXTSmart 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_NAMETEXTThe 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:
EVENT_INDEXNUMBERZero-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:
ORIGIN_FUNCTION_SIGNATURETEXTFunction 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_ADDRESSTEXTThe 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:
ORIGIN_TO_ADDRESSTEXTThe 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: Note: For token transfers, this is the token contract, not the recipient. See eztokentransfers tables for recipient.
PLATFORMTEXTThe lending protocol where the transaction occurred. Example: ‘aave’
DEPOSITORTEXTThe address that supplied liquidity to the lending protocol. Example: ‘0x9876543210987654321098765432109876543210’
PROTOCOL_MARKETTEXTThe lending protocol’s receipt token issued to depositors. Example: ‘0xfedcbafedcbafedcbafedcbafedcbafedcbafed’
TOKEN_ADDRESSTEXTThe contract address of the underlying asset being lent or borrowed. Example: ‘0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48’
TOKEN_SYMBOLTEXTThe ticker symbol of the asset involved in the lending transaction. Example: ‘USDC’
AMOUNT_UNADJNUMBERThe raw amount of tokens borrowed or repaid without decimal adjustment. Example: 1000000000
AMOUNTFLOATThe decimal-adjusted quantity of tokens in the transaction. Example: 1000.5
AMOUNT_USDFLOATThe USD value of tokens at transaction time. Example: 1500.75
EZ_LENDING_WITHDRAWS_IDTEXTPrimary key - unique identifier for each row ensuring data integrity. Format: Usually VARCHAR containing composite key generated using MD5 hash of the relevant columns. Example: MD5(blocknumber, txhash, trace_index) Usage: Deduplication in incremental loads Join operations for data quality checks Troubleshooting specific records Important: Implementation varies by table - check table-specific documentation.
INSERTED_TIMESTAMPTIMESTAMP_NTZUTC 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:
MODIFIED_TIMESTAMPTIMESTAMP_NTZUTC 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: