Integrations
  • Propeller Protocol Lib
  • Logic
    • VM Integration
      • Ethereum: Solidity
    • Native Integration
  • Indexing
    • Overview
    • General Integration Steps
      • 1. Setup
      • 2. Getting Started
      • 3. Substream Package Structure
      • 4. Testing
    • Common Problems & Patterns
      • Tracking Components
      • Normalizing relative ERC20 Balances
      • Tracking Contract Storage
      • Custom protobuf models
    • Reserved Attributes
  • Execution
    • Overview
    • Swap Executor
    • Swap Encoder
Powered by GitBook
On this page
  1. Indexing
  2. Common Problems & Patterns

Tracking Contract Storage

Indexing contract storage.

In VM implementations, accurately identifying and extracting relevant contract changes is essential. Each contract usually corresponds to a unique component, allowing its hex-encoded address to serve as the component ID, provided there is a one-to-one relationship between contracts and components. Note that this relationship may not always hold, so ensure this assumption applies to your specific protocol.

To streamline the extraction of relevant changes from the expanded block model, use the tycho_substreams::contract::extract_contract_changes helper function, which simplifies the process considerably.

The example below shows how to use a component store to define a predicate. This predicate filters for contract addresses of interest:

use tycho_substreams::contract::extract_contract_changes;

let mut transaction_contract_changes: HashMap<_, TransactionChanges> = HashMap::new();

extract_contract_changes(
    &block,
    |addr| {
        components_store
            .get_last(format!("pool:{0}", hex::encode(addr)))
            .is_some()
    },
    &mut transaction_contract_changes,
);
PreviousNormalizing relative ERC20 BalancesNextCustom protobuf models

Last updated 7 months ago