# Open-source database

{% embed url="<https://github.com/chain-love/chain-love>" %}

## Database structure

Database source is the `main` branch containing CSV files. For users' convenience, an automated script translates these files into JSON format on every push and updates `json` branch. Here is how `main` branch is structured:

```
├── networks/
│   ├── arbitrum/
│   │   ├── rpc.csv
│   │   ├── explorer.csv
│   │   ├── wallet.csv
│   │   └── ...
│   ├── ... (other networks, each with their own service tables)
├── providers/
│   ├── rpc.csv
│   ├── explorer.csv
│   ├── wallet.csv
│   ├── ...
```

`providers` folder contains a list of providers and their offers that exist on several chains. That helps keeping the database size small, readable and syncrhonized across chains, as including provider into the `networks` folder only requires utilizing the [reference syntax](https://github.com/Chain-Love/chain-love/wiki/Provider-References), not recreating the entity.

### Examples

{% tabs %}
{% tab title="Single-chain example" %}
For this example, let's assume we want to add a Glif wallet to Chain.Love database. Glif wallet only exists on Filecoin chain. Thus, the entity we create will be located in the following file in the `main` branch:

```
├── networks/
│   ├── filecoin/
│   │   ├── wallet.csv
```

We need to populate all the columns according to the specification, so the line with Glif wallet will look in the following way:

```
glif,Glif,"[""[Website](https://www.glif.io/en/wallet)""]",TRUE,"[""Web""]",TRUE,FALSE,TRUE,TRUE,FALSE,TRUE,TRUE,FALSE,"[""ERC-20""]",TRUE,$0,"[""email"", ""slack""]","[""Audited (self claim)""]","[""EN"", ""CH""]",TRUE
```

{% endtab %}

{% tab title="Multi-chain example" %}
For this example, let's assume we want to add a Metamask wallet to Chain.Love database. Metamask wallet virtually exists on every EVM-compatible chain. Thus, the entity we create will be located in the following file in the `main` branch:

```
├── providers/
│   ├── wallet.csv
```

The record there will look the following way:

```
metamask,Metamask,"[""[Website](https://metamask.io/)""]",TRUE,"[""Chrome"",""Firefox"",""Edge"",""iOS"",""Android""]",FALSE,FALSE,FALSE,TRUE,TRUE,FALSE,TRUE,FALSE,"[""ERC-20"",""ERC-721"",""ERC-1155""]",FALSE,$0,"[""email"",""helpdesk""]","[""October 2024 by ConsenSys Diligence""]","[""EN"",""ES"",""FR"",""RU"",""ZH"",""JA""]",FALSE
```

Then, we refer the Metamask in every network that is EVM-compatible:

```
├── networks/
│   ├── filecoin/
│   │   ├── wallet.csv
├── networks/
│   ├── ethereum/
│   │   ├── wallet.csv
├── networks/
│   ├── arbitrum/
│   │   ├── wallet.csv
...
```

The record in each of these `wallet.csv` will look the following way:

```
metamask,!provider:metamask,,,,,,,,,,,,,,,,,,
```

Please note, that CSV structure of the file have to be maintained, so despite the fact we don't need to populate any of the columns besides `slug` and `provider` - we still need to add commas for every existing column. To learn more about the provider references, please read our [GitHub Database Wiki](https://github.com/Chain-Love/chain-love/wiki/Provider-References).
{% endtab %}

{% tab title="Multi-offer example" %}
For this example, let's assume we want to add Infura provider in the `rpc` category. Infura provides different offers depending on whether node you want to request needs to be archival or not, on which chain you are requesting services, and whether you are fitting into the certain limits or not. Also, Infura is multi-chain.

For that, let's create the following entities in the `providers` folder:

```
infura-free-full-archive,Infura,"[""[Website](https://www.infura.io/)"",""[Docs](https://docs.metamask.io/services)""]",Free,Full Archive,$0,$0,NULL,NULL,NULL,NULL,NULL,NULL,FALSE,FALSE,"[""eth"",""web3"",""net""]","[""3M credits/day with throughput 500 credits/sec"",""1 API Key""]","[""Enterprise-grade security""]","[""Usage analytics"",""Credit-based monitoring""]","[""Global""]",
infura-pay-as-you-go-full-archive,Infura,"[""[Buy](https://www.infura.io/pricing)"",""[Docs](https://docs.metamask.io/services/)""]",Pay-as-you-go,Full Archive,$50/$225,$0,NULL,NULL,NULL,NULL,NULL,NULL,FALSE,FALSE,"[""eth"",""web3"",""net"",""debug"",""trace""]","[""15M/75M credits/day with throughput 4K/40K credits/sec"" ,""5/unlimited API Keys""]","[""Enterprise-grade security""]","[""Detailed usage analytics"",""Flex billing""]","[""Global""]",
infura-enterprise-full-archive,Infura,"[""[Contact](https://www.infura.io/contact)"",""[Docs](https://docs.metamask.io/services/)""]",Enterprise,Full Archive,Custom,Custom,NULL,NULL,NULL,Custom,NULL,NULL,FALSE,FALSE,"[""eth"",""web3"",""net"",""debug"",""trace""]","[""custom limits""]","[""Advanced security, support SLA""]","[""Advanced analytics"",""Custom dashboards"",""Crypto payments""]","[""Global""]",
infura-free-recent-state,Infura,"[""[Website](https://www.infura.io/)"",""[Docs](https://docs.metamask.io/services)""]",Free,Recent-State,$0,$0,NULL,NULL,NULL,,NULL,NULL,FALSE,FALSE,"[""eth"",""web3"",""net""]","[""3M credits/day with throughput 500 credits/sec"",""1 API Key""]","[""Enterprise-grade security""]","[""Usage analytics"",""Credit-based monitoring""]","[""Global""]",
infura-pay-as-you-go-recent-state,Infura,"[""[Buy](https://www.infura.io/pricing)"",""[Docs](https://docs.metamask.io/services/)""]",Pay-as-you-go,Recent-State,$50/$225,$0,NULL,NULL,NULL,,NULL,NULL,FALSE,FALSE,"[""eth"",""web3"",""net"",""debug"",""trace""]","[""15M/75M credits/day with throughput 4K/40K credits/sec"" ,""5/unlimited API Keys""]","[""Enterprise-grade security""]","[""Detailed usage analytics"",""Flex billing""]","[""Global""]",
infura-enterprise-recent-state,Infura,"[""[Contact](https://www.infura.io/contact)"",""[Docs](https://docs.metamask.io/services/)""]",Enterprise,Recent-State,Custom,Custom,NULL,NULL,NULL,,NULL,NULL,FALSE,FALSE,"[""eth"",""web3"",""net"",""debug"",""trace""]","[""custom limits""]","[""Advanced security, support SLA""]","[""Advanced analytics"",""Custom dashboards"",""Crypto payments""]","[""Global""]",
```

As one can see, there are two entities (`full-archive` and `recent-state`) for each of the 3 plans (`free`, `pay-as-you-go`, `enterprise` provided by Infura. In the [json](https://github.com/Chain-Love/chain-love/tree/json/json) files as well as in the Toolbox UI these entities will be rendered later as a single group, simplifying usage.

Then, each of these plans exist on both `one` and `sepolia` chains of the Arbitrum ecosystem. Thus, the following lines needs to be added to the `networks/arbitrum/rpc.csv` file:

```
infura-one-free-recent-state,!provider:infura-free-recent-state,"[""[Website](https://www.infura.io/networks/ethereum/arbitrum)"",""[Docs](https://docs.metamask.io/services/reference/arbitrum/)""]",,,one,,,,,,,,,,,,,,,,
infura-one-pay-as-you-go-recent-state,!provider:infura-pay-as-you-go-recent-state,"[""[Buy](https://www.infura.io/pricing)"",""[Docs](https://docs.metamask.io/services/reference/arbitrum/)""]",,,one,,,,,,,,,,,,,,,,
infura-one-enterprise-recent-state,!provider:infura-enterprise-recent-state,"[""[Contact](https://www.infura.io/contact)"",""[Docs](https://docs.metamask.io/services/reference/arbitrum/)""]",,,one,,,,,,,,,,,,,,,,
infura-sepolia-free-recent-state,!provider:infura-free-recent-state,"[""[Website](https://www.infura.io/networks/ethereum/arbitrum)"",""[Docs](https://docs.metamask.io/services/reference/arbitrum/)""]",,,sepolia,,,,,,,,,,,,,,,,
infura-sepolia-pay-as-you-go-recent-state,!provider:infura-pay-as-you-go-recent-state,"[""[Buy](https://www.infura.io/pricing)"",""[Docs](https://docs.metamask.io/services/reference/arbitrum/)""]",,,sepolia,,,,,,,,,,,,,,,,
infura-sepolia-enterprise-recent-state,!provider:infura-enterprise-recent-state,"[""[Contact](https://www.infura.io/contact)"",""[Docs](https://docs.metamask.io/services/reference/arbitrum/)""]",,,sepolia,,,,,,,,,,,,,,,,
infura-one-free-full-archive,!provider:infura-free-full-archive,"[""[Website](https://www.infura.io/networks/ethereum/arbitrum)"",""[Docs](https://docs.metamask.io/services/reference/arbitrum/)""]",,,one,,,,,,,,,,,,,,,,
infura-one-pay-as-you-go-full-archive,!provider:infura-pay-as-you-go-full-archive,"[""[Buy](https://www.infura.io/pricing)"",""[Docs](https://docs.metamask.io/services/reference/arbitrum/)""]",,,one,,,,,,,,,,,,,,,,
infura-one-enterprise-full-archive,!provider:infura-enterprise-full-archive,"[""[Contact](https://www.infura.io/contact)"",""[Docs](https://docs.metamask.io/services/reference/arbitrum/)""]",,,one,,,,,,,,,,,,,,,,
infura-sepolia-free-full-archive,!provider:infura-free-full-archive,"[""[Website](https://www.infura.io/networks/ethereum/arbitrum)"",""[Docs](https://docs.metamask.io/services/reference/arbitrum/)""]",,,sepolia,,,,,,,,,,,,,,,,
infura-sepolia-pay-as-you-go-full-archive,!provider:infura-pay-as-you-go-full-archive,"[""[Buy](https://www.infura.io/pricing)"",""[Docs](https://docs.metamask.io/services/reference/arbitrum/)""]",,,sepolia,,,,,,,,,,,,,,,,
infura-sepolia-enterprise-full-archive,!provider:infura-enterprise-full-archive,"[""[Contact](https://www.infura.io/contact)"",""[Docs](https://docs.metamask.io/services/reference/arbitrum/)""]",,,sepolia,,,,,,,,,,,,,,,,
```

Slug needs to be unique per ecosystem, so we add either `one` or `sepolia` to the respective line to ensure it stays unique. Also, we populate the `chain` and `provider` columns to make records distinct for any automated system (such as [Toolbox](https://chain-love.gitbook.io/chain.loves-toolbox/readme)) trying to read it.

Slug is then used to optimize search for the inserted entities to other Web3 developers, so when adding an entry, please think about how would you search for this entity in the search engines.
{% endtab %}
{% endtabs %}

{% hint style="info" %}
Please note, that the examples provided according to the database specification set on 18 of December, 2025. Database's structure is still evolving according to the [DBIPs](#database-improvement-proposals-dbips), so please, ensure to check the actual columns and their types (either in the file or in the [Style Guide](https://github.com/Chain-Love/chain-love/wiki/Style-Guide)) before [submitting a PR](#how-to-contribute).​
{% endhint %}

## How to Contribute

### Adding/modifying/removing data

{% hint style="info" %}
We highly recommend contributing data utilizng the [Contributor service](https://chain-love.gitbook.io/chain.loves-toolbox/contributing/contributor-service). It allows anyone without developer experience to participate in the ecosystem, while the steps below require at least basic knowledge of Git and Github.
{% endhint %}

1. **Fork & branch**: Fork the repo and create a descriptive branch (e.g. `add-ankr-provider`).
2. **Choose what to edit**: Pick the right CSV (e.g. `rpc.csv` in the correct network).
3. **Follow the rules**: Check the [Style Guide](https://github.com/Chain-Love/chain-love/wiki/Style-Guide) and [Column Definitions](https://github.com/Chain-Love/chain-love/wiki) for formatting and examples, then edit your entry.
4. **Validate & commit**: Make sure the CSV is correct, then commit and push.
5. **Open a PR**: Describe your changes, link related issues, optionally - [provide an address for rewards](https://chain-love.gitbook.io/chain.loves-toolbox/contributing/rewards-program). Maintainers will review and merge.

### Database improvement proposals (DBIPs)

The database structure is not set in stone. As Web3 itself is a bleeding edge technology, Chain.Love's team feels like there should be a mechanism in place to evolve the database within time. Database improvement proposals are essentially the [GitHub issues](https://github.com/Chain-Love/chain-love/issues/new?template=db_improvement_proposal.yml) that drive changes in the structure of the database. Using them, one may:

* Add/remove categories
* Add/remove column(s)
* Change column(s)

We believe, that path to success is through many developers contributing to the ecosystem and improving it for everybody, exactly the way Web3 was initially designed. For that, the DBIPs are a subject of compensations according to the [Rewards program](https://chain-love.gitbook.io/chain.loves-toolbox/contributing/rewards-program) rules. Take a look, find a way to improve our database, contribute to the common good and get rewarded!
