1 unstable release

new 0.1.77 Apr 20, 2024
0.1.49 Mar 20, 2024
0.1.24 Dec 31, 2023
0.1.18 Nov 28, 2023

#422 in Magic Beans

Download history 2/week @ 2023-12-25 13/week @ 2024-01-08 2/week @ 2024-02-05 205/week @ 2024-02-12 333/week @ 2024-02-19 60/week @ 2024-02-26 1189/week @ 2024-03-04 781/week @ 2024-03-11 411/week @ 2024-03-18 339/week @ 2024-04-01 1328/week @ 2024-04-08

2,101 downloads per month

MIT/Apache

185KB
4.5K SLoC

Chaindexing

github crates.io diesel-streamer build

Index any EVM chain and query in SQL

Getting Started | Examples | Design Goals & Features | RoadMap | Contributing

Getting Started

📊 Here is what indexing and tracking owers of your favorite NFTs looks like:

use chaindexing::states::{ContractState, Filters, Updates};
use chaindexing::{EventContext, EventHandler};

use crate::states::Nft;

pub struct TransferHandler;

#[chaindexing::augmenting_std::async_trait]
impl EventHandler for TransferHandler {
    fn abi(&self) -> &'static str {
        "event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)"
    }
    async fn handle_event<'a, 'b>(&self, context: EventContext<'a, 'b>) {
        let event_params = context.get_event_params();

        let _from = event_params.get_address_string("from");
        let to = event_params.get_address_string("to");
        let token_id = event_params.get_u32("tokenId");

        if let Some(existing_nft) =
            Nft::read_one(&Filters::new("token_id", token_id), &context).await
        {
          let updates = Updates::new("owner_address", &to);
          existing_nft.update(&updates, &context).await;
        } else {
            let new_nft = Nft {
                token_id,
                owner_address: to,
            };

            new_nft.create(&context).await;
        }
    }
}

A quick and effective way to get started is by exploring the comprehensive examples provided here: https://github.com/chaindexing/chaindexing-examples/tree/main/rust.

Design Goals & Features

  • 💸 Free forever
  • ⚡ Real-time use-cases
  • 🌐 Multi-chain
  • 🧂 Granular, 🧩 Modular & 📈 Scalable
  • 🌍 Environment-agnostic to allow inspecting 🔍 & replicating indexes anywhere!
  • 🔓 ORM-agnostic, use any ORM to access indexed data
  • 📤 Easy export to any data lake: S3, Snowflake, etc.
  • 🚫 No complex YAML/JSON/CLI config
  • 💪 Index contracts discovered at runtime
  • ✨ Handles re-org with no UX impact
  • 🔥 Side effect handling for notifications & bridging use cases
  • 💸 Optimize RPC cost by indexing when certain activities happen in your DApp
  • 💎 Language-agnostic, so no macros!

RoadMap

  • ⬜ Expose is_at_block_tail flag to improve op heuristics for applications
  • ⬜ Support SQLite Database (Currently supports only Postgres)
  • ⬜ Support indexing raw transactions & call traces.
  • ⬜ Improved error handling/messages/reporting (Please feel free to open an issue when an opaque runtime error is encountered)
  • ⬜ SSL Support
  • ⬜ Minimal UI for inspecting events and indexed states

Contributing

All contributions are welcome. Before working on a PR, please consider opening an issue detailing the feature/bug. Equally, when submitting a PR, please ensure that all checks pass to facilitate a smooth review process.

Dependencies

~33–51MB
~1M SLoC