Starknet data reference

This page contains reference about the available data in Starknet DNA streams.

Filter ID

All filters have an associated ID. To help clients correlate filters with data, the filter ID is included in the filterIds field of all data objects. This field contains the list of all filter IDs that matched a piece of data.

Nullable fields

Important: most fields are nullable to allow evolving the protocol. You should always assert the presence of a field for critical indexers.

Field elements

Apibara represents Starknet field elements as hex-encode strings.

export type FieldElement = `0x${string}`;

Data types

Block

The root object is the Block.

export type Block = {
  header?: BlockHeader;
  transactions: Transaction[];
  receipts: TransactionReceipt[];
  events: Event[];
  messages: MessageToL1[];
  storageDiffs: StorageDiff[];
  contractChanges: ContractChange[];
  nonceUpdates: NonceUpdate[];
};

Block header

This is the block header, which contains information about the block.

export type BlockHeader = {
  blockHash?: FieldElement;
  parentBlockHash?: FieldElement;
  blockNumber?: bigint;
  sequencerAddress?: FieldElement;
  newRoot?: FieldElement;
  timestamp?: Date;
  starknetVersion?: string;
  l1GasPrice?: ResourcePrice;
  l1DataGasPrice?: ResourcePrice;
  l1DataAvailabilityMode?: "blob" | "calldata";
};

export type ResourcePrice = {
  priceInFri?: FieldElement;
  priceInWei?: FieldElement;
};

Properties

  • blockHash: the block hash.

  • parentBlockHash: the block hash of the parent block.

  • blockNumber: the block number.

  • sequencerAddress: the sequencer address.

  • newRoot: the new state root.

  • timestamp: the block timestamp.

  • starknetVersion: the Starknet version.

  • l1GasPrice: the L1 gas price.

  • l1DataGasPrice: the L1 data gas price.

  • l1DataAvailabilityMode: the L1 data availability mode.

  • priceInFri: the price of L1 gas in the block, in units of fri (10^-18 $STRK).

  • priceInWei: the price of L1 gas in the block, in units of wei (10^-18 $ETH).

Event

An event is emitted by a transaction.

export type Event = {
  filterIds: number[];
  address?: FieldElement;
  keys: FieldElement[];
  data: FieldElement[];
  eventIndex?: number;
  transactionIndex?: number;
  transactionHash?: FieldElement;
  transactionStatus?: "succeeded" | "reverted";
};

Properties

  • address: the address of the contract that emitted the event.
  • keys: the keys of the event.
  • data: the data of the event.
  • eventIndex: the index of the event in the block.
  • transactionIndex: the index of the transaction that emitted the event.
  • transactionHash: the hash of the transaction that emitted the event.
  • transactionStatus: the status of the transaction that emitted the event.

Relevant filters

  • filter.events
  • filter.transactions[].includeEvents
  • filter.events[].includeSiblings
  • filter.messages[].includeEvents

Transaction

Starknet has different types of transactions, all of them are grouped together in the Transaction type. Common transaction information is accessible in the meta field.

export type TransactionMeta = {
  transactionIndex?: number;
  transactionHash?: FieldElement;
  transactionStatus?: "succeeded" | "reverted";
};

export type Transaction = {
  filterIds: number[];
  meta?: TransactionMeta;
  transaction?: 
      | InvokeTransactionV0
      | InvokeTransactionV1
      | InvokeTransactionV3
      | L1HandlerTransaction
      | DeployTransaction
      | DeclareTransactionV0
      | DeclareTransactionV1
      | DeclareTransactionV2
      | DeclareTransactionV3
      | DeployAccountTransactionV1
      | DeployAccountTransactionV3;
};

Properties

  • meta: transaction metadata.

  • transaction: the transaction type.

  • meta.transactionIndex: the index of the transaction in the block.

  • meta.transactionHash: the hash of the transaction.

  • meta.transactionStatus: the status of the transaction.

Relevant filters

  • filter.transactions
  • filter.events[].includeTransaction
  • filter.messages[].includeTransaction
export type InvokeTransactionV0 = {
  _tag: "invokeV0";
  invokeV0: {
    maxFee?: FieldElement;
    signature: FieldElement[];
    contractAddress?: FieldElement;
    entryPointSelector?: FieldElement;
    calldata: FieldElement[];
  };
}

Properties

  • maxFee: the maximum fee for the transaction.
  • signature: the signature of the transaction.
  • contractAddress: the address of the contract that will receive the call.
  • entryPointSelector: the selector of the function that will be called.
  • calldata: the calldata of the transaction.
export type InvokeTransactionV1 = {
  _tag: "invokeV1";
  invokeV1: {
    senderAddress?: FieldElement;
    calldata: FieldElement[];
    maxFee?: FieldElement;
    signature: FieldElement[];
    nonce?: FieldElement;
  };
};

Properties

  • senderAddress: the address of the account that will send the transaction.
  • calldata: the calldata of the transaction.
  • maxFee: the maximum fee for the transaction.
  • signature: the signature of the transaction.
  • nonce: the nonce of the transaction.
export type ResourceBounds = {
  maxAmount?: bigint;
  maxPricePerUnit?: bigint;
}

export type ResourceBoundsMapping = {
  l1Gas?: ResourceBounds;
  l2Gas?: ResourceBounds;
};

export type InvokeTransactionV3 = {
  _tag: "invokeV3";
  invokeV3: {
    senderAddress?: FieldElement;
    calldata: FieldElement[];
    signature: FieldElement[];
    nonce?: FieldElement;
    resourceBounds?: ResourceBoundsMapping;
    tip?: bigint;
    paymasterData: FieldElement[];
    accountDeploymentData: FieldElement[];
    nonceDataAvailabilityMode?: "l1" | "l2";
    feeDataAvailabilityMode?: "l1" | "l2";
  };
};

Properties

  • senderAddress: the address of the account that will send the transaction.
  • calldata: the calldata of the transaction.
  • signature: the signature of the transaction.
  • nonce: the nonce of the transaction.
  • resourceBounds: the resource bounds of the transaction.
  • tip: the tip of the transaction.
  • paymasterData: the paymaster data of the transaction.
  • accountDeploymentData: the account deployment data of the transaction.
  • nonceDataAvailabilityMode: the nonce data availability mode of the transaction.
  • feeDataAvailabilityMode: the fee data availability mode of the transaction.
export type L1HandlerTransaction = {
  _tag: "l1Handler";
  l1Handler: {
    contractAddress?: FieldElement;
    entryPointSelector?: FieldElement;
    calldata: FieldElement[];
    nonce?: bigint;
  };
}

Properties

  • contractAddress: the address of the contract that will receive the call.
  • entryPointSelector: the selector of the function that will be called.
  • calldata: the calldata of the transaction.
  • nonce: the nonce of the transaction.
export type DeployTransaction = {
  _tag: "deploy";
  deploy: {
    contractAddressSalt?: FieldElement;
    constructorCalldata: FieldElement[];
    classHash?: FieldElement;
  };
}

Properties

  • contractAddressSalt: the salt used to compute the contract address.
  • constructorCalldata: the calldata used to initialize the contract.
  • classHash: the class hash of the contract.
export type DeclareTransactionV0 = {
  _tag: "declareV0";
  declareV0: {
    senderAddress?: FieldElement;
    maxFee?: FieldElement;
    signature: FieldElement[];
    classHash?: FieldElement;
  };
}

Properties

  • senderAddress: the address of the account that will send the transaction.
  • maxFee: the maximum fee for the transaction.
  • signature: the signature of the transaction.
  • classHash: the class hash of the contract.
export type DeclareTransactionV1 = {
  _tag: "declareV1";
  declareV1: {
    senderAddress?: FieldElement;
    maxFee?: FieldElement;
    signature: FieldElement[];
    classHash?: FieldElement;
    nonce?: FieldElement;
  };
}

Properties

  • senderAddress: the address of the account that will send the transaction.
  • maxFee: the maximum fee for the transaction.
  • signature: the signature of the transaction.
  • classHash: the class hash of the contract.
  • nonce: the nonce of the transaction.
export type DeclareTransactionV2 = {
  _tag: "declareV2";
  declareV2: {
    senderAddress?: FieldElement;
    maxFee?: FieldElement;
    signature: FieldElement[];
    classHash?: FieldElement;
    nonce?: FieldElement;
    compiledClassHash?: FieldElement;
  };
}

Properties

  • senderAddress: the address of the account that will send the transaction.
  • maxFee: the maximum fee for the transaction.
  • signature: the signature of the transaction.
  • classHash: the class hash of the contract.
  • nonce: the nonce of the transaction.
  • compiledClassHash: the compiled class hash of the contract.
export type ResourceBounds = {
  maxAmount?: bigint;
  maxPricePerUnit?: bigint;
}

export type ResourceBoundsMapping = {
  l1Gas?: ResourceBounds;
  l2Gas?: ResourceBounds;
};

export type DeclareTransactionV3 = {
  _tag: "declareV3";
  declareV3: {
    senderAddress?: FieldElement;
    maxFee?: FieldElement;
    signature: FieldElement[];
    classHash?: FieldElement;
    nonce?: FieldElement;
    compiledClassHash?: FieldElement;
    resourceBounds?: ResourceBoundsMapping;
    tip?: bigint;
    paymasterData: FieldElement[];
    accountDeploymentData: FieldElement[];
    nonceDataAvailabilityMode?: "l1" | "l2";
    feeDataAvailabilityMode?: "l1" | "l2";
  };
}

Properties

  • senderAddress: the address of the account that will send the transaction.
  • maxFee: the maximum fee for the transaction.
  • signature: the signature of the transaction.
  • classHash: the class hash of the contract.
  • nonce: the nonce of the transaction.
  • compiledClassHash: the compiled class hash of the contract.
  • resourceBounds: the resource bounds of the transaction.
  • tip: the tip of the transaction.
  • paymasterData: the paymaster data of the transaction.
  • accountDeploymentData: the account deployment data of the transaction.
  • nonceDataAvailabilityMode: the nonce data availability mode of the transaction.
  • feeDataAvailabilityMode: the fee data availability mode of the transaction.
export type DeployAccountTransactionV1 = {
  _tag: "deployAccountV1";
  deployAccountV1: {
    maxFee?: FieldElement;
    signature: FieldElement[];
    nonce?: FieldElement;
    contractAddressSalt?: FieldElement;
    constructorCalldata: FieldElement[];
    classHash?: FieldElement;
  };
}

Properties

  • maxFee: the maximum fee for the transaction.
  • signature: the signature of the transaction.
  • nonce: the nonce of the transaction.
  • contractAddressSalt: the salt used to compute the contract address.
  • constructorCalldata: the calldata used to initialize the contract.
  • classHash: the class hash of the contract.
export type DeployAccountTransactionV3 = {
  _tag: "deployAccountV3";
  deployAccountV3: {
    signature: FieldElement[];
    nonce?: FieldElement;
    contractAddressSalt?: FieldElement;
    constructorCalldata: FieldElement[];n
    classHash?: FieldElement;
    resourceBounds?: ResourceBoundsMapping;
    tip?: bigint;
    paymasterData: FieldElement[];
    nonceDataAvailabilityMode?: "l1" | "l2";
    feeDataAvailabilityMode?: "l1" | "l2";
  };
};

Properties

  • signature: the signature of the transaction.
  • nonce: the nonce of the transaction.
  • contractAddressSalt: the salt used to compute the contract address.
  • constructorCalldata: the calldata used to initialize the contract.
  • classHash: the class hash of the contract
  • resourceBounds: the resource bounds of the transaction.
  • tip: the tip of the transaction.
  • paymasterData: the paymaster data of the transaction.
  • nonceDataAvailabilityMode: the nonce data availability mode of the transaction.
  • feeDataAvailabilityMode: the fee data availability mode of the transaction.

Transaction receipt

The receipt of a transaction contains information about the execution of the transaction.

export type TransactionReceipt = {
  filterIds: number[];
  meta?: TransactionReceiptMeta;
  receipt?:
    | InvokeTransactionReceipt
    | L1HandlerTransactionReceipt
    | DeclareTransactionReceipt
    | DeployTransactionReceipt
    | DeployAccountTransactionReceipt;
};

export type TransactionReceiptMeta = {
  transactionIndex?: number;
  transactionHash?: FieldElement;
  actualFee?: FeePayment;
  executionResources?: ExecutionResources;
  executionResult?: ExecutionSucceeded | ExecutionReverted;
};

export type InvokeTransactionReceipt = {
  _tag: "invoke";
  invoke: {}
};

export type L1HandlerTransactionReceipt = {
  _tag: "l1Handler";
  l1Handler: {
    messageHash?: Uint8Array;
  };
};

export type DeclareTransactionReceipt = {
  _tag: "declare";
  declare: {};
};

export type DeployTransactionReceipt = {
  _tag: "deploy";
  deploy: {
    contractAddress?: FieldElement;
  };
};

export type DeployAccountTransactionReceipt = {
  _tag: "deployAccount";
  deployAccount: {
    contractAddress?: FieldElement;
  };
};

export type ExecutionSucceeded = {
  _tag: "succeeded";
  succeeded: {};
};

export type ExecutionReverted = {
  _tag: "reverted";
  reverted: {
    reason: string;
  };
};

export type FeePayment = {
  amount?: FieldElement;
  unit?: "wei" | "strk";
};

Relevant filters

  • filter.transactions[].includeReceipt
  • filter.events[].includeReceipt
  • filter.messages[].includeReceipt

Message to L1

A message to L1 is sent by a transaction.

export type MessageToL1 = {
  filterIds: number[];
  fromAddress?: FieldElement;
  toAddress?: FieldElement;
  payload: FieldElement[];
  messageIndex?: number;
  transactionIndex?: number;
  transactionHash?: FieldElement;
  transactionStatus?: "succeeded" | "reverted";
};

Properties

  • fromAddress: the address of the contract that sent the message.
  • toAddress: the address of the contract that received the message.
  • payload: the payload of the message.
  • messageIndex: the index of the message in the block.
  • transactionIndex: the index of the transaction that sent the message.
  • transactionHash: the hash of the transaction that sent the message.
  • transactionStatus: the status of the transaction that sent the message.

Relevant filters

  • filter.messages
  • filter.transactions[].includeMessages
  • filter.events[].includeMessages

Storage diff

A storage diff is a change to the storage of a contract.

export type StorageDiff = {
  filterIds: number[];
  contractAddress?: FieldElement;
  storageEntries: StorageEntry[];
};

export type StorageEntry = {
  key?: FieldElement;
  value?: FieldElement;
};

Properties

  • contractAddress: the contract whose storage changed.

  • storageEntries: the storage entries that changed.

  • key: the key of the storage entry that changed.

  • value: the new value of the storage entry that changed.

Relevant filters

  • filter.storageDiffs

Contract change

A change in the declared or deployed contracts.

export type ContractChange = {
  filterIds: number[];
  change?: DeclaredClass | ReplacedClass | DeployedContract;
};

export type DeclaredClass = {
  _tag: "declaredClass";
  declaredClass: {
    classHash?: FieldElement;
    compiledClassHash?: FieldElement;
  };
};

export type ReplacedClass = {
  _tag: "replacedClass";
  replacedClass: {
    contractAddress?: FieldElement;
    classHash?: FieldElement;
  };
};

export type DeployedContract = {
  _tag: "deployedContract";
  deployedContract: {
    contractAddress?: FieldElement;
    classHash?: FieldElement;
  };
};

Relevant filters

  • filter.contractChanges

Nonce update

A change in the nonce of a contract.

export type NonceUpdate = {
  filterIds: number[];
  contractAddress?: FieldElement;
  nonce?: FieldElement;
};

Properties

  • contractAddress: the address of the contract whose nonce changed.
  • nonce: the new nonce of the contract.

Relevant filters

  • filter.nonceUpdates
Last modified
Apibara

Apibara is the fastest platform to build production-grade indexers that connect onchain data to web2 services.

© 2024 GNC Labs Limited. All rights reserved.