# @eth-optimism/data-transport-layer

> ## What is this?

Latest version **0.1.3** (published 2021-04-09) · MIT license · 0 weekly downloads

## Install

```sh
npm install @eth-optimism/data-transport-layer
pnpm add @eth-optimism/data-transport-layer
yarn add @eth-optimism/data-transport-layer
bun add @eth-optimism/data-transport-layer
```

## Health

**Score 25/100 (F)** — status: abandoned.

Positive: has types; no vulnerabilities; high quality score.

Warnings: low downloads; no esm support; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.1.3 |
| Published | 2021-04-09 |
| First published | 2021-02-11 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | CommonJS |
| Dependencies | 15 |
| Unpacked size | 151.2 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Maintainers | karlfloersch, ben-chain, will_optimism, k-ho, tynes, kelvinfichter |

## Links

- npm: https://www.npmjs.com/package/@eth-optimism/data-transport-layer
- npm.io page: https://npm.io/package/@eth-optimism/data-transport-layer

## Dependencies (15)

- [bcfg](https://npm.io/package/bcfg.md) ^0.1.6
- [cors](https://npm.io/package/cors.md) ^2.8.5
- [level](https://npm.io/package/level.md) ^6.0.1
- [colors](https://npm.io/package/colors.md) ^1.4.0
- [dotenv](https://npm.io/package/dotenv.md) ^8.2.0
- [ethers](https://npm.io/package/ethers.md) ^5.0.26
- [express](https://npm.io/package/express.md) ^4.17.1
- [levelup](https://npm.io/package/levelup.md) ^4.4.0
- [node-fetch](https://npm.io/package/node-fetch.md) ^2.6.1
- [@types/express](https://npm.io/package/@types/express.md) ^4.17.11
- [browser-or-node](https://npm.io/package/browser-or-node.md) ^1.3.0
- [@eth-optimism/contracts](https://npm.io/package/@eth-optimism/contracts.md) ^0.1.6
- [@eth-optimism/core-utils](https://npm.io/package/@eth-optimism/core-utils.md) 0.1.9
- [@ethersproject/providers](https://npm.io/package/@ethersproject/providers.md) ^5.0.21
- [@eth-optimism/service-base](https://npm.io/package/@eth-optimism/service-base.md) 1.1.5

## Recent versions

- 0.1.3 (latest) — 2021-04-09
- 0.1.0 — 2021-02-11

## README

# @eth-optimism/data-transport-layer

## What is this?

The Optimistic Ethereum Data Transport Layer is a long-running software service (written in TypeScript) designed to reliably index Optimistic Ethereum transaction data from Layer 1 (Ethereum). Specifically, this service indexes:

* Transactions that have been enqueued for submission to the CanonicalTransactionChain via [`enqueue`](https://github.com/ethereum-optimism/contracts-v2/blob/13b7deef60f773241723ea874fc6e81b4003b164/contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol#L225-L231).
* Transactions that have been included in the CanonicalTransactionChain via [`appendQueueBatch`](https://github.com/ethereum-optimism/contracts-v2/blob/13b7deef60f773241723ea874fc6e81b4003b164/contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol#L302-L306) or [`appendSequencerBatch`](https://github.com/ethereum-optimism/contracts-v2/blob/13b7deef60f773241723ea874fc6e81b4003b164/contracts/optimistic-ethereum/OVM/chain/OVM_CanonicalTransactionChain.sol#L352-L354).
* State roots (transaction results) that have been published to the StateCommitmentChain via [`appendStateBatch`](https://github.com/ethereum-optimism/contracts-v2/blob/13b7deef60f773241723ea874fc6e81b4003b164/contracts/optimistic-ethereum/OVM/chain/OVM_StateCommitmentChain.sol#L127-L132).

## How does it work?

We run two sub-services, the [`L1IngestionService`](./src/services/l1-ingestion/service.ts) and the [`L1TransportServer`](./src/services/server/service.ts). The `L1IngestionService` is responsible for querying for the various events and transaction data necessary to accurately index information from our Layer 1 (Ethereum) smart contracts. The `L1TransportServer` simply provides an API for accessing this information.

## Getting started

### Configuration

See an example config at [.env.example](.env.example); copy into a `.env` file before running.

`L1_TRANSPORT__L1_RPC_ENDPOINT` can be the JSON RPC endpoint of any L1 Ethereum node. `L1_TRANSPORT__ADDRESS_MANAGER` should be the contract addresss of the Address Manager on the corresponding network; find their values in the [Regenesis repo](https://github.com/ethereum-optimism/regenesis).

### Building and usage

After cloning and switching to the repository, install dependencies:

```bash
$ yarn
```

Use the following commands to build, use, test, and lint:

```bash
$ yarn build
$ yarn start
$ yarn test
$ yarn lint
```

## Configuration

We're using `dotenv` for our configuration.
Copy `.env.example` into `.env`, feel free to modify it.
Here's the list of environment variables you can change:

| Variable                                                | Default   |  Description |
| ------------------------------------------------------- | --------- | ------------ |
| DATA_TRANSPORT_LAYER__DB_PATH                           | ./db      | Path to the database for this service. |
| DATA_TRANSPORT_LAYER__ADDRESS_MANAGER                   | -         | Address of the AddressManager contract on L1. See [regenesis](https://github.com/ethereum-optimism/regenesis) repo to find this address for mainnet or kovan. |
| DATA_TRANSPORT_LAYER__POLLING_INTERVAL                  | 5000      | Period of time between execution loops. |
| DATA_TRANSPORT_LAYER__DANGEROUSLY_CATCH_ALL_ERRORS      | false     | If true, will catch all errors without throwing. |
| DATA_TRANSPORT_LAYER__CONFIRMATIONS                     | 12        | Number of confirmations to wait before accepting transactions as "canonical". |
| DATA_TRANSPORT_LAYER__SERVER_HOSTNAME                   | localhost | Host to run the API on. |
| DATA_TRANSPORT_LAYER__SERVER_PORT                       | 7878      | Port to run the API on. |
| DATA_TRANSPORT_LAYER__SYNC_FROM_L1                      | true      | Whether or not to sync from L1. |
| DATA_TRANSPORT_LAYER__L1_RPC_ENDPOINT                   | -         | RPC endpoint for an L1 node. |
| DATA_TRANSPORT_LAYER__LOGS_PER_POLLING_INTERVAL         | 2000      | Logs to sync per polling interval. |
| DATA_TRANSPORT_LAYER__SYNC_FROM_L2                      | false     | Whether or not to sync from L2. |
| DATA_TRANSPORT_LAYER__L2_RPC_ENDPOINT                   | -         | RPC endpoint for an L2 node. |
| DATA_TRANSPORT_LAYER__TRANSACTIONS_PER_POLLING_INTERVAL | 1000      | Number of L2 transactions to query per polling interval. |
| DATA_TRANSPORT_LAYER__L2_CHAIN_ID                       | -         | L2 chain ID. |
| DATA_TRANSPORT_LAYER__LEGACY_SEQUENCER_COMPATIBILITY    | false     | Whether or not to enable "legacy" sequencer sync (without the custom `eth_getBlockRange` endpoint) |

## HTTP API

This section describes the HTTP API for accessing indexed Layer 1 data.

### Latest Ethereum Block Context

#### Request

```
GET /eth/context/latest
```

#### Response

```ts
{
    "blockNumber": number,
    "timestamp": number
}
```

### Enqueue by Index

#### Request

```
GET /enqueue/index/{index: number}
```

#### Response

```ts
{
  "index": number,
  "target": string,
  "data": string,
  "gasLimit": number,
  "origin": string,
  "blockNumber": number,
  "timestamp": number
}
```

### Transaction by Index

#### Request

```
GET /transaction/index/{index: number}
```

#### Response

```ts
{
    "transaction": {
        "index": number,
        "batchIndex": number,
        "data": string,
        "blockNumber": number,
        "timestamp": number,
        "gasLimit": number,
        "target": string,
        "origin": string,
        "queueOrigin": string,
        "type": string | null,
        "decoded": {
            "sig": {
                "r": string,
                "s": string,
                "v": string
            },
            "gasLimit": number,
            "gasPrice": number,
            "nonce": number,
            "target": string,
            "data": string
        } | null,
        "queueIndex": number | null,
    },
    
    "batch": {
        "index": number,
        "blockNumber": number,
        "timestamp": number,
        "submitter": string,
        "size": number,
        "root": string,
        "prevTotalElements": number,
        "extraData": string
    }
}
```

### Transaction Batch by Index

#### Request

```
GET /batch/transaction/index/{index: number}
```

#### Response

```ts
{
    "batch": {
        "index": number,
        "blockNumber": number,
        "timestamp": number,
        "submitter": string,
        "size": number,
        "root": string,
        "prevTotalElements": number,
        "extraData": string
    },
    
    "transactions": [
      {
        "index": number,
        "batchIndex": number,
        "data": string,
        "blockNumber": number,
        "timestamp": number,
        "gasLimit": number,
        "target": string,
        "origin": string,
        "queueOrigin": string,
        "type": string | null,
        "decoded": {
            "sig": {
                "r": string,
                "s": string,
                "v": string
            },
            "gasLimit": number,
            "gasPrice": number,
            "nonce": number,
            "target": string,
            "data": string
        } | null,
        "queueIndex": number | null,
      }
    ]
}
```


### State Root by Index

#### Request

```
GET /stateroot/index/{index: number}
```

#### Response

```ts
{
    "stateRoot": {
        "index": number,
        "batchIndex": number,
        "value": string
    },

    "batch": {
        "index": number,
        "blockNumber": number,
        "timestamp": number,
        "submitter": string,
        "size": number,
        "root": string,
        "prevTotalElements": number,
        "extraData": string
    },
}
```

### State Root Batch by Index

#### Request

```
GET /batch/stateroot/index/{index: number}
```

#### Response

```ts
{
    "batch": {
        "index": number,
        "blockNumber": number,
        "timestamp": number,
        "submitter": string,
        "size": number,
        "root": string,
        "prevTotalElements": number,
        "extraData": string
    },
    
    "stateRoots": [
        {
            "index": number,
            "batchIndex": number,
            "value": string
        }
    ]
}
```

---
_Source: https://npm.io/package/@eth-optimism/data-transport-layer · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
