Types
Objects
Object types are the most commonly used type in indexer GraphQL schema. Each object type marked with an @entity directive will be converted into a SQL table.
type Account @entity {
id: ID!
address: Address!
balance: U64!
}
This Account object type from the GraphQL schema, might be used in an indexer module like so:
extern crate alloc;
use fuel_indexer_utils::prelude::*;
#[indexer(manifest = "indexer.manifest.yaml")]
mod indexer_mod {
fn handle_event(event: Event) {
let address = Address::default();
let balance = 0;
let account = Account::new(address, balance);
account.save();
}
}
Enums
Enum types are simply implemented as String types.
enum SignatureLabel {
Multi
Single
}
Enum types in relation to Fuel indexer's implementation are just
Stringtypes used primarily to label object types. There is no other way thatenumtypes should be used at this time. ThisSignatureLabelobject type from the GraphQL schema, might be used in an indexer module like so:
extern crate alloc;
use fuel_indexer_utils::prelude::*;
#[indexer(manifest = "indexer.manifest.yaml")]
mod indexer_mod {
fn handle_event(event: Event) {
let label = SignatureLabel::Multi;
assert_eq!(label.to_string(), "SignatureLabel::Multi".to_string());
}
}
Unions
Union types are unique in that any type marked as a union will be converted into an Object type, who's fields are the unique set of fields over all members of the union.
enum TransactionLabel {
Create
Script
Mint
}
type CreateTransaction @entity {
id: ID!
bytecode_length: U64!
contract_id: ContractId!
label: TransactionLabel!
}
type ScriptTransaction @entity {
id: ID!
maturity: U64!
label: TransactionLabel!
}
type MintTransaction @entity {
id: ID!
metadata: Json
label: TransactionLabel!
}
union Transaction = CreateTransaction | ScriptTransaction | MintTransaction
The Transaction union type above, will internally produce the following object type:
type Transaction @entity {
id: ID!
bytecode_length: U64!
contract_id: ContractId!
label: TransactionLabel!
maturity: U64!
metadata: Json
}
IMPORTANT: Note the order of the fields in the derived
Transactionobject type: the fields are ordered according to the unique set of fields from each of the union's members.The
id,bytecode_length,contract_id, andlabelfields come first, from theCreateTransactionobject type. Next comes thematurityfield from theScriptTransactionobject - because theScriptTransaction'sidandlabelfiels are already a part of the derivedTransactionobject, courtesy of theCreateTransactionobject type. Finally, comes themetadatafield, as part of theMintTransactionobject type. ThisTransactionunion type from the GraphQL schema, might be used in an indexer module like so:
extern crate alloc;
use fuel_indexer_utils::prelude::*;
#[indexer(manifest = "indexer.manifest.yaml")]
mod indexer_mod {
fn handle_event(event: Event) {
let bytecode_length = 1024;
let contract_id = ContractId::default();
let label = TransactionLabel::Create;
let maturity = 10000000;
let metadata = None;
let transaction = Transaction::new(bytecode_length, contract_id, label, maturity, metadata);
transaction.save();
}
}