# Migration to Hydra v2

## Versioning

All 0.x Hydra packages (a bit counter-intuitively) are considered Hydra v1. Since Hydra v2 (that is, versions 2.x) all Hydra packages (`hydra-cli`, `hydra-common`, `hydra-typegen` etc) recieve the same version on each release. So, say, Hydra version 2.0.1 means that all the packages together with the Docker images `hydra-indexer` and `hydra-indexer-gateway` are taged `2.0.1`

## What's new in Hydra v2

The key differences to keep in mind while migrating from v1 to v2:

* Hydra Processor is NOT generated by `hydra-cli` in v2
* Hydra Processor is run against a manifest file `manifest.yml`
* Mappings should be transpiled into a JS module
* `hydra-indexer` and `hydra-indexer-gateway` should be updated to v2

See examples of Hydra v2 in action [here](https://github.com/Joystream/hydra/tree/master/examples/v2)

## Migration

* Install the latest `hydra-cli` v2
* Run `hydra-cli  scaffold --silent` to generate a stub of a v2 Hydra project
* Run `yarn`

### Codegen

Nothing new here. Simply run `yarn codegen`

### Typegen for events

Update typegen section in `manifest.yml`

* List events and calls to which the types should be generated
* Add `customTypes` if needed:&#x20;
  * `lib`: from where the generated classes should import additional substrate types
  * `typedefsLoc`: path the type definitions

Install the types library: `cd mappings && yarn add <type library>`

Run `yarn typegen`

### Mapping files

Change mappings arguments: `DB` should be converted to `DatabaseManager` imported from `@dzlzv/hydra-db-utils`

Replace `event: SubstrateEvent` with a typed class generated by typegen in the previous step. The event data is now available at `event.data`

Whenever the corresponding extrinsic data is needed, use `event.ctx.extrinsic` and create a type-safe `Call` class out of it. Here is an example:

```typescript
import { DatabaseManager } from '@dzlzv/hydra-db-utils'
import { Post } from '../generated/graphql-server/src/modules/post/post.model'

import { Posts } from './generated/types'
export async function postCreated(
  db: DatabaseManager,
  event: Posts.PostCreatedEvent
) {
  const post = new Post()
  post.author = event.data.accountId.toHex()
  post.id = event.data.postId.toString()
  if (event.ctx.extrinsic === undefined) {
    throw new Error(`No extrinsic has been provided`)
  }
  // get type-safe call data out of the untyped extrinsic data
  const call = new Posts.CreatePostCall(event.ctx)
  post.content = call.args.content.toString()
  await db.save<Post>(post)
}
```

Add and install all the necessary dependencies for the mappings (e.g. the types library) and build the mappings:

```
yarn workspace sample-mappings add ...
yarn workspace sample-mappings install
yarn mappings:build
```

### Manifest file

Inspect and update the default `manifest.yml`

* (Optional)  Update `dataSource.chain`
* For each mapping, update the function name and the event it is handling
* Add `extrinsicHandlers` if needed

### Indexer and Indexer-Gateway

Use the latest v2.x Docker images (2.0.1-beta.9 at the time of writing). Check the indexer status by running the following GraphQL query:

```graphql
query {
  indexerStatus {
    chainHeight
    head
    hydraVersion
  }
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://dzhelezov.gitbook.io/hydra/migration-to-hydra-v2.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
