First, take a look at the Substreams manifest (substreams.yaml), which contains the declaration of all the Injective Foundational Modules.
...output omitted...modules:-name:all_transactions# 1.kind:mapinitialBlock:0inputs:-source:sf.cosmos.type.v2.Blockoutput:type:proto:sf.substreams.cosmos.v1.TransactionList-name:all_events# 2.kind:mapinitialBlock:0inputs:-source:sf.cosmos.type.v2.Blockoutput:type:proto:sf.substreams.cosmos.v1.EventList-name:index_events# 3.kind:blockIndexinputs:-map:all_eventsoutput:type:proto:sf.substreams.index.v1.Keysdoc:| `index_events` sets the keys corresponding to every event 'type' ex: `coin_received`, `message` or `injective.peggy.v1.EventDepositClaim`-name:filtered_events# 4.kind:mapblockFilter:module:index_eventsquery:params:trueinputs:-params:string-map:all_eventsoutput:type:proto:sf.substreams.cosmos.v1.EventListdoc:| `filtered_events` reads from `all_events` and applies a filter on the event types, only outputting the events that match the filter. The only operator that you should need to use this filter is the logical or `||`, because each event can only match one type.
The all_transactions module provides access to all the transactions of the Injective blockchain. It receives a raw Injective block object as input (sf.cosmos.type.v2.Block), and outputs a list of transactions object (sf.substreams.cosmos.v1.TransactionList).
The all_events module provides access to all the events in the Injective blockchain. It receives a raw Injective block as input (sf.cosmos.type.v2.Block), and outputs a list of events object (sf.substreams.cosmos.v1.EventList).
The index_events module uses the all_events module to create a cache where events are sorted based on their type field. This cache helps in the performance of the module. You can read more about index modules in the corresponding documentation.
The filtered_events allows you to use the index_events module (i.e. using the cache of events), to filter only the event types you are interested in. The string parameter passed as input is used to specify which events you want to consume.
Use The Foundational Modules
All this module are pre-programmed and ready to use in your Substreams.
Use in a Substreams
Using another module as input for your Substreams is very easy: you just have to declare it in the manifest.
For example, the following declaration of the my_test_module module receives the all_transactions module as input:
Then, in the Rust handler declaration, you can simply receive the output object of the all_transactions module: