Hello World
A "Hello World" type of program for the Fuel Indexer service.
#![allow(unused)] fn main() { //! A "Hello World" type of program for the Fuel Indexer service. //! //! Build this example's WASM module using the following command. Note that a //! wasm32-unknown-unknown target will be required. //! //! ```bash //! cargo build -p hello-index --release --target wasm32-unknown-unknown //! ``` //! //! Start a local test Fuel node //! //! ```bash //! cargo run --bin fuel-node //! ``` //! //! With your database backend set up, now start your fuel-indexer binary using the //! assets from this example: //! //! ```bash //! cargo run --bin fuel-indexer -- --manifest examples/hello-world/hello_index.manifest.yaml //! ``` //! //! Now trigger an event. //! //! ```bash //! cargo run --bin hello-bin //! ``` extern crate alloc; use fuel_indexer_macros::indexer; use fuel_indexer_plugin::prelude::*; #[indexer(manifest = "examples/hello-world/hello_index.manifest.yaml")] mod hello_world_index { fn index_logged_greeting(event: Greeting, block: BlockData) { // Since all events require a u64 ID field, let's derive an ID using the // name of the person in the Greeting let greeter_name = trim_sized_ascii_string(&event.person.name); let greeting = trim_sized_ascii_string(&event.greeting); let greeter_id = first8_bytes_to_u64(&greeter_name); // Here we 'get or create' a Salutation based on the ID of the event // emitted in the LogData receipt of our smart contract let greeting = match Salutation::load(event.id) { Some(mut g) => { // If we found an event, let's use block height as a proxy for time g.last_seen = block.height; g } None => { // If we did not already have this Saluation stored in the database. Here we // show how you can use the Charfield type to store strings with length <= 255 let message = format!("{} 👋, my name is {}", &greeting, &greeter_name); Salutation { id: event.id, message_hash: first32_bytes_to_bytes32(&message), message, greeter: greeter_id, first_seen: block.height, last_seen: block.height, } } }; // Here we do the same with Greeter that we did for Saluation -- if we have an event // already saved in the database, load it and update it. If we do not have this Greeter // in the database then create one let greeter = match Greeter::load(greeter_id) { Some(mut g) => { g.last_seen = block.height; g } None => Greeter { id: greeter_id, first_seen: block.height, name: greeter_name, last_seen: block.height, }, }; // Both entity saves will occur in the same transaction greeting.save(); greeter.save(); } } }