Skip to main content
Schema: base.defi Table: ez_lending_flashloans Type: View

What

This table captures flash loan transactions across lending protocols. Flash loans enable borrowing without collateral within a single transaction, provided the loan plus fees are repaid before transaction completion. This advanced DeFi primitive is primarily used for arbitrage, collateral swapping, and liquidations.

Key Use Cases

  • Analyzing arbitrage and MEV activity patterns
  • Tracking flash loan volume and fee revenue
  • Identifying power users and bot activity
  • Monitoring large-scale DeFi operations
  • Understanding cross-protocol composability

Important Relationships

  • Often precedes transactions in DEX tables for arbitrage analysis
  • Links to ez_lending_liquidations for liquidation strategies
  • May connect to multiple protocols within single transaction
  • References price.ez_prices_hourly for USD valuations

Commonly-used Fields

  • initiator: Address that triggered the flash loan
  • platform: Lending protocol providing the loan
  • flashloan_token/flashloan_token_symbol: Borrowed asset
  • flashloan_amount/flashloan_amount_usd: Loan size
  • premium_amount/premium_amount_usd: Fee paid

Sample queries

-- Daily flash loan volume and fees
SELECT
    DATE_TRUNC('day', block_timestamp) AS date,
    platform,
    COUNT(*) AS flashloan_count,
    SUM(flashloan_amount_usd) AS total_volume_usd,
    SUM(premium_amount_usd) AS total_fees_usd,
    AVG(premium_amount_usd / NULLIF(flashloan_amount_usd, 0) * 100) AS avg_fee_rate_pct
FROM <blockchain_name>.defi.ez_lending_flashloans
WHERE block_timestamp >= CURRENT_DATE - 30
    AND flashloan_amount_usd IS NOT NULL
GROUP BY 1, 2
ORDER BY 1 DESC, 4 DESC;

-- Most flash loaned assets
SELECT
    flashloan_token_symbol,
    flashloan_token,
    COUNT(*) AS loan_count,
    SUM(flashloan_amount) AS total_amount,
    SUM(flashloan_amount_usd) AS total_volume_usd,
    AVG(flashloan_amount_usd) AS avg_loan_size_usd,
    SUM(premium_amount_usd) AS total_fees_collected
FROM <blockchain_name>.defi.ez_lending_flashloans
WHERE block_timestamp >= CURRENT_DATE - 7
    AND flashloan_token_symbol IS NOT NULL
GROUP BY 1, 2
ORDER BY 5 DESC
LIMIT 20;

-- Flash loan user analysis
WITH flashloan_users AS (
    SELECT
        initiator,
        COUNT(*) AS flashloan_count,
        COUNT(DISTINCT DATE_TRUNC('day', block_timestamp)) AS active_days,
        COUNT(DISTINCT platform) AS protocols_used,
        SUM(flashloan_amount_usd) AS total_borrowed_usd,
        SUM(premium_amount_usd) AS total_fees_paid_usd
    FROM <blockchain_name>.defi.ez_lending_flashloans
    WHERE block_timestamp >= CURRENT_DATE - 30
        AND flashloan_amount_usd IS NOT NULL
    GROUP BY 1
)
SELECT
    CASE
        WHEN flashloan_count = 1 THEN 'One-time User'
        WHEN flashloan_count <= 10 THEN 'Occasional User'
        WHEN flashloan_count <= 100 THEN 'Regular User'
        ELSE 'Power User'
    END AS user_category,
    COUNT(*) AS user_count,
    SUM(total_borrowed_usd) AS category_volume_usd,
    AVG(total_fees_paid_usd) AS avg_fees_per_user
FROM flashloan_users
GROUP BY 1
ORDER BY 3 DESC;

-- Large flash loans (potential arbitrage/liquidations)
SELECT
    block_timestamp,
    tx_hash,
    platform,
    initiator,
    target,
    flashloan_token_symbol,
    flashloan_amount_usd,
    premium_amount_usd,
    premium_amount_usd / NULLIF(flashloan_amount_usd, 0) * 100 AS fee_rate_pct
FROM <blockchain_name>.defi.ez_lending_flashloans
WHERE flashloan_amount_usd > 1000000
    AND block_timestamp >= CURRENT_DATE - 1
ORDER BY flashloan_amount_usd DESC;

-- Wallet-specific flash loan analysis
SELECT
    initiator,
    platform,
    flashloan_token_symbol,
    COUNT(*) AS flashloan_count,
    SUM(flashloan_amount_usd) AS total_borrowed_usd,
    SUM(premium_amount_usd) AS total_fees_paid_usd,
    AVG(premium_amount_usd / NULLIF(flashloan_amount_usd, 0) * 100) AS avg_fee_rate_pct,
    MIN(block_timestamp) AS first_flashloan,
    MAX(block_timestamp) AS last_flashloan,
    COUNT(DISTINCT DATE_TRUNC('day', block_timestamp)) AS active_days
FROM <blockchain_name>.defi.ez_lending_flashloans
WHERE initiator = LOWER('<wallet_address>')
    AND block_timestamp >= CURRENT_DATE - 30
    AND flashloan_amount_usd IS NOT NULL
GROUP BY 1, 2, 3
ORDER BY total_borrowed_usd DESC;

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’ | | INITIATOR | TEXT | The address that triggered the flash loan execution. Example: ‘0x7a250d5630b4cf539739df2c5dacb4c659f2488d’ | | TARGET | TEXT | The contract address that receives and executes the flash loan logic. Example: ‘0x1111111254fb6c44bac0bed2854e76f90643097d’ | | PROTOCOL_MARKET | TEXT | The lending protocol’s receipt token issued to depositors. Example: ‘0xfedcbafedcbafedcbafedcbafedcbafedcbafed’ | | TOKEN_ADDRESS | TEXT | | | TOKEN_SYMBOL | TEXT | | | FLASHLOAN_TOKEN | TEXT | The contract address of the token borrowed in the flash loan. Example: ‘0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2’ This column will be deprecated October 13th, please update to token_address. | | FLASHLOAN_TOKEN_SYMBOL | TEXT | The symbol of the token borrowed in the flash loan. Example: ‘WETH’ This column will be deprecated October 13th, please update to token_symbol. | | FLASHLOAN_AMOUNT_UNADJ | NUMBER | The raw amount of tokens borrowed without decimal adjustment. Example: 1000000000000000000 | | FLASHLOAN_AMOUNT | FLOAT | The decimal-adjusted amount of tokens borrowed in the flash loan. Example: 1.0 | | FLASHLOAN_AMOUNT_USD | FLOAT | The USD value of assets borrowed in a flash loan. Example: 1000000.50 | | PREMIUM_AMOUNT_UNADJ | NUMBER | The raw fee amount charged for the flash loan. Example: 900000000000000 | | PREMIUM_AMOUNT | FLOAT | The decimal-adjusted fee paid for the flash loan. Example: 0.0009 | | PREMIUM_AMOUNT_USD | FLOAT | The USD value of the flash loan fee. Example: 0.90 | | EZ_LENDING_FLASHLOANS_ID | TEXT | Primary 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(block_number, tx_hash, 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_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;
``` |