Hydra Typegen

Motivation

Hydra Typegen is a code generation tool for creating Typescript types for substrate events and extrinsics. Its primary use-case is to provide type-safe interfaces for Hydra mappings. For example, once a typescript class for the Balances.Transfer event is generated, a mapping can look like

export async function balancesTransfer(
  db: DatabaseManager,
  _event: SubstrateEvent
) {
  const event = new Balances.TransferEvent(_event);
  const transfer = new Transfer()
  transfer.from = Buffer.from(event.data.accountIds[0].toHex())
  transfer.to = Buffer.from(event.data.accountIds[1].toHex())
  transfer.value = event.data.balance.toBn()
  transfer.block = event.ctx.blockNumber
  transfer.comment = `Transferred ${transfer.value} from ${transfer.from} to ${transfer.to}`

  console.log(`Saving ${JSON.stringify(transfer, null, 2)}`)

  await db.save<Transfer>(transfer)
}

Commands

hydra-typegen help [COMMAND]

display help for hydra-typegen

See code: @oclif/plugin-help

hydra-typegen typegen [CONFIG]

Generate Typescript classes for the Substrate events

See code: src/commands/typegen/index.ts

A full sample Hydra project can be found here

Quickstart

A minimal example for generating classes for the Balances.Transfer and Treasury.Deposit events in Kusama:

It is also possible to run hydra-typegen against a manifest file:

The config file typegen.yml can look like this:

Hydra-typegen also supports config files like the one below:

Simply run hydra-typegen <path-to-config-file>

Custom types

Hydra Typegen supports custom substrate types via the --typedefs flag. The provided .json file should include type definitions for the arguments and parameters of the events and extrinsics to be generated. The type definitions file is copied to the generated sources.

In the config file, place the definition into the customTypes section. It assumes that all the custom runtime types are already available for import from a library, so that e.g. the generated import statement

is correctly resolved.

Last updated

Was this helpful?