Compare commits
1 Commits
master
...
sohail/deb
Author | SHA1 | Date | |
---|---|---|---|
bee35bc8f5 |
@ -1,4 +1,4 @@
|
||||
FROM golang:1.23.3-bookworm as build
|
||||
FROM golang:1.23.0-bookworm as build
|
||||
|
||||
ENV CGO_ENABLED=1
|
||||
|
||||
|
27
README.md
27
README.md
@ -2,21 +2,18 @@
|
||||
|
||||

|
||||
|
||||
A lightweight Postgres chain indexer designed to couple with
|
||||
[eth-tracker](https://github.com/grassrootseconomics/eth-tracker) to index all
|
||||
relevant GE related blockchain data on any EVM chain.
|
||||
A lightweight Postgres chain indexer designed to couple with [eth-tracker](https://github.com/grassrootseconomics/eth-tracker) to index all relevant GE related blockchain data on any EVM chain.
|
||||
|
||||
## Getting Started
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- Git
|
||||
- Docker
|
||||
- Postgres server
|
||||
- Access to a `eth-tracker` instance
|
||||
* Git
|
||||
* Docker
|
||||
* Postgres server
|
||||
* Access to a `eth-tracker` instance
|
||||
|
||||
See [docker-compose.yaml](dev/docker-compose.yaml) for an example on how to run
|
||||
and deploy a single instance.
|
||||
See [docker-compose.yaml](dev/docker-compose.yaml) for an example on how to run and deploy a single instance.
|
||||
|
||||
### 1. Build the Docker image
|
||||
|
||||
@ -37,9 +34,7 @@ For an example, see `dev/docker-compose.postgres.yaml`.
|
||||
|
||||
### 3. Update config values
|
||||
|
||||
See `.env.example` on how to override default values defined in `config.toml`
|
||||
using env variables. Alternatively, mount your own config.toml either during
|
||||
build time or Docker runtime.
|
||||
See `.env.example` on how to override default values defined in `config.toml` using env variables. Alternatively, mount your own config.toml either during build time or Docker runtime.
|
||||
|
||||
```bash
|
||||
# Override only specific config values
|
||||
@ -49,10 +44,10 @@ mv .env.example .env
|
||||
|
||||
Special env variables:
|
||||
|
||||
- DEV=*
|
||||
* DEV=*
|
||||
|
||||
Refer to [`config.toml`](config.toml) to understand different config value settings.
|
||||
|
||||
Refer to [`config.toml`](config.toml) to understand different config value
|
||||
settings.
|
||||
|
||||
### 4. Run the indexer
|
||||
|
||||
@ -63,4 +58,4 @@ docker compose up
|
||||
|
||||
## License
|
||||
|
||||
[AGPL-3.0](LICENSE).
|
||||
[AGPL-3.0](LICENSE).
|
@ -12,12 +12,12 @@ import (
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"github.com/grassrootseconomics/eth-indexer/v2/internal/api"
|
||||
"github.com/grassrootseconomics/eth-indexer/v2/internal/cache"
|
||||
"github.com/grassrootseconomics/eth-indexer/v2/internal/handler"
|
||||
"github.com/grassrootseconomics/eth-indexer/v2/internal/store"
|
||||
"github.com/grassrootseconomics/eth-indexer/v2/internal/sub"
|
||||
"github.com/grassrootseconomics/eth-indexer/v2/internal/util"
|
||||
"github.com/grassrootseconomics/eth-indexer/internal/api"
|
||||
"github.com/grassrootseconomics/eth-indexer/internal/cache"
|
||||
"github.com/grassrootseconomics/eth-indexer/internal/handler"
|
||||
"github.com/grassrootseconomics/eth-indexer/internal/store"
|
||||
"github.com/grassrootseconomics/eth-indexer/internal/sub"
|
||||
"github.com/grassrootseconomics/eth-indexer/internal/util"
|
||||
"github.com/grassrootseconomics/ethutils"
|
||||
"github.com/knadh/koanf/v2"
|
||||
)
|
||||
|
@ -1,8 +1,8 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/grassrootseconomics/eth-indexer/v2/internal/handler"
|
||||
"github.com/grassrootseconomics/eth-indexer/v2/pkg/router"
|
||||
"github.com/grassrootseconomics/eth-indexer/internal/handler"
|
||||
"github.com/grassrootseconomics/eth-indexer/pkg/router"
|
||||
)
|
||||
|
||||
func bootstrapRouter(handlerContainer *handler.Handler) *router.Router {
|
||||
@ -20,7 +20,7 @@ func bootstrapRouter(handlerContainer *handler.Handler) *router.Router {
|
||||
)
|
||||
router.RegisterRoute(
|
||||
"TRACKER.TOKEN_BURN",
|
||||
handlerContainer.IndexTokenBurn,
|
||||
handlerContainer.IndexTokenMint,
|
||||
handlerContainer.AddToken,
|
||||
)
|
||||
router.RegisterRoute(
|
||||
@ -38,15 +38,6 @@ func bootstrapRouter(handlerContainer *handler.Handler) *router.Router {
|
||||
handlerContainer.IndexFaucetGive,
|
||||
handlerContainer.FaucetHealthCheck,
|
||||
)
|
||||
router.RegisterRoute(
|
||||
"TRACKER.OWNERSHIP_TRANSFERRED",
|
||||
handlerContainer.IndexOwnershipChange,
|
||||
)
|
||||
|
||||
router.RegisterRoute(
|
||||
"TRACKER.INDEX_REMOVE",
|
||||
handlerContainer.IndexRemove,
|
||||
)
|
||||
|
||||
return router
|
||||
}
|
||||
|
4
go.mod
4
go.mod
@ -1,6 +1,6 @@
|
||||
module github.com/grassrootseconomics/eth-indexer/v2
|
||||
module github.com/grassrootseconomics/eth-indexer
|
||||
|
||||
go 1.23.3
|
||||
go 1.23.0
|
||||
|
||||
require (
|
||||
github.com/VictoriaMetrics/metrics v1.35.1
|
||||
|
@ -3,8 +3,8 @@ package handler
|
||||
import (
|
||||
"log/slog"
|
||||
|
||||
"github.com/grassrootseconomics/eth-indexer/v2/internal/cache"
|
||||
"github.com/grassrootseconomics/eth-indexer/v2/internal/store"
|
||||
"github.com/grassrootseconomics/eth-indexer/internal/cache"
|
||||
"github.com/grassrootseconomics/eth-indexer/internal/store"
|
||||
"github.com/grassrootseconomics/ethutils"
|
||||
)
|
||||
|
||||
|
@ -1,11 +0,0 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/grassrootseconomics/eth-tracker/pkg/event"
|
||||
)
|
||||
|
||||
func (h *Handler) IndexRemove(ctx context.Context, event event.Event) error {
|
||||
return h.store.RemoveContractAddress(ctx, event)
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/grassrootseconomics/eth-tracker/pkg/event"
|
||||
)
|
||||
|
||||
func (h *Handler) IndexOwnershipChange(ctx context.Context, event event.Event) error {
|
||||
return h.store.InsertOwnershipChange(ctx, event)
|
||||
}
|
@ -29,18 +29,15 @@ type (
|
||||
}
|
||||
|
||||
queries struct {
|
||||
InsertTx string `query:"insert-tx"`
|
||||
InsertTokenTransfer string `query:"insert-token-transfer"`
|
||||
InsertTokenMint string `query:"insert-token-mint"`
|
||||
InsertTokenBurn string `query:"insert-token-burn"`
|
||||
InsertFaucetGive string `query:"insert-faucet-give"`
|
||||
InsertPoolSwap string `query:"insert-pool-swap"`
|
||||
InsertPoolDeposit string `query:"insert-pool-deposit"`
|
||||
InsertOwnershipChange string `query:"insert-ownership-change"`
|
||||
InsertToken string `query:"insert-token"`
|
||||
InsertPool string `query:"insert-pool"`
|
||||
RemovePool string `query:"remove-pool"`
|
||||
RemoveToken string `query:"remove-token"`
|
||||
InsertTx string `query:"insert-tx"`
|
||||
InsertTokenTransfer string `query:"insert-token-transfer"`
|
||||
InsertTokenMint string `query:"insert-token-mint"`
|
||||
InsertTokenBurn string `query:"insert-token-burn"`
|
||||
InsertFaucetGive string `query:"insert-faucet-give"`
|
||||
InsertPoolSwap string `query:"insert-pool-swap"`
|
||||
InsertPoolDeposit string `query:"insert-pool-deposit"`
|
||||
InsertToken string `query:"insert-token"`
|
||||
InsertPool string `query:"insert-pool"`
|
||||
}
|
||||
)
|
||||
|
||||
@ -106,6 +103,7 @@ func (pg *Pg) InsertTokenMint(ctx context.Context, eventPayload event.Event) err
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
pg.logg.Info("InsertTokenMint", "eventPayload", eventPayload)
|
||||
|
||||
_, err = tx.Exec(
|
||||
ctx,
|
||||
@ -202,25 +200,6 @@ func (pg *Pg) InsertPoolDeposit(ctx context.Context, eventPayload event.Event) e
|
||||
})
|
||||
}
|
||||
|
||||
func (pg *Pg) InsertOwnershipChange(ctx context.Context, eventPayload event.Event) error {
|
||||
return pg.executeTransaction(ctx, func(tx pgx.Tx) error {
|
||||
txID, err := pg.insertTx(ctx, tx, eventPayload)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = tx.Exec(
|
||||
ctx,
|
||||
pg.queries.InsertOwnershipChange,
|
||||
txID,
|
||||
eventPayload.Payload["previousOwner"].(string),
|
||||
eventPayload.Payload["newOwner"].(string),
|
||||
eventPayload.ContractAddress,
|
||||
)
|
||||
return err
|
||||
})
|
||||
}
|
||||
|
||||
func (pg *Pg) InsertToken(ctx context.Context, contractAddress string, name string, symbol string, decimals uint8, sinkAddress string) error {
|
||||
return pg.executeTransaction(ctx, func(tx pgx.Tx) error {
|
||||
_, err := tx.Exec(
|
||||
@ -249,30 +228,6 @@ func (pg *Pg) InsertPool(ctx context.Context, contractAddress string, name strin
|
||||
})
|
||||
}
|
||||
|
||||
func (pg *Pg) RemoveContractAddress(ctx context.Context, eventPayload event.Event) error {
|
||||
return pg.executeTransaction(ctx, func(tx pgx.Tx) error {
|
||||
_, err := tx.Exec(
|
||||
ctx,
|
||||
pg.queries.RemovePool,
|
||||
eventPayload.Payload["address"].(string),
|
||||
)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = tx.Exec(
|
||||
ctx,
|
||||
pg.queries.RemoveToken,
|
||||
eventPayload.Payload["address"].(string),
|
||||
)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
func (pg *Pg) insertTx(ctx context.Context, tx pgx.Tx, eventPayload event.Event) (int, error) {
|
||||
var txID int
|
||||
if err := tx.QueryRow(
|
||||
|
@ -15,10 +15,8 @@ type (
|
||||
InsertFaucetGive(context.Context, event.Event) error
|
||||
InsertPoolSwap(context.Context, event.Event) error
|
||||
InsertPoolDeposit(context.Context, event.Event) error
|
||||
InsertOwnershipChange(context.Context, event.Event) error
|
||||
InsertToken(context.Context, string, string, string, uint8, string) error
|
||||
InsertPool(context.Context, string, string, string) error
|
||||
RemoveContractAddress(context.Context, event.Event) error
|
||||
Pool() *pgxpool.Pool
|
||||
Close()
|
||||
}
|
||||
|
@ -6,7 +6,7 @@ import (
|
||||
"log/slog"
|
||||
"time"
|
||||
|
||||
"github.com/grassrootseconomics/eth-indexer/v2/pkg/router"
|
||||
"github.com/grassrootseconomics/eth-indexer/pkg/router"
|
||||
"github.com/nats-io/nats.go"
|
||||
"github.com/nats-io/nats.go/jetstream"
|
||||
)
|
||||
|
@ -1,7 +0,0 @@
|
||||
CREATE TABLE IF NOT EXISTS ownership_change (
|
||||
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||
tx_id INT REFERENCES tx(id),
|
||||
previous_owner VARCHAR(42) NOT NULL DEFAULT '0x0000000000000000000000000000000000000000',
|
||||
new_owner VARCHAR(42) NOT NULL DEFAULT '0x0000000000000000000000000000000000000000',
|
||||
contract_address VARCHAR(42) NOT NULL DEFAULT '0x0000000000000000000000000000000000000000'
|
||||
);
|
@ -1,5 +0,0 @@
|
||||
ALTER TABLE tokens
|
||||
ADD COLUMN removed BOOLEAN NOT NULL DEFAULT false;
|
||||
|
||||
ALTER TABLE pools
|
||||
ADD COLUMN removed BOOLEAN NOT NULL DEFAULT false;
|
20
queries.sql
20
queries.sql
@ -104,18 +104,6 @@ INSERT INTO pool_deposit(
|
||||
contract_address
|
||||
) VALUES($1, $2, $3, $4, $5) ON CONFLICT DO NOTHING
|
||||
|
||||
--name: insert-ownership-change
|
||||
-- $1: tx_id
|
||||
-- $2: previous_owner
|
||||
-- $3: new_owner
|
||||
-- $4: contract_address
|
||||
INSERT INTO ownership_change(
|
||||
tx_id,
|
||||
previous_owner,
|
||||
new_owner,
|
||||
contract_address
|
||||
) VALUES($1, $2, $3, $4) ON CONFLICT DO NOTHING
|
||||
|
||||
--name: insert-token
|
||||
-- $1: contract_address
|
||||
-- $2: token_name
|
||||
@ -139,11 +127,3 @@ INSERT INTO pools(
|
||||
pool_name,
|
||||
pool_symbol
|
||||
) VALUES ($1, $2, $3) ON CONFLICT DO NOTHING
|
||||
|
||||
--name: remove-pool
|
||||
-- $1: contract_address
|
||||
UPDATE pools SET removed = true WHERE contract_address = $1
|
||||
|
||||
--name: remove-token
|
||||
-- $1: contract_address
|
||||
UPDATE tokens SET removed = true WHERE contract_address = $1
|
||||
|
Loading…
Reference in New Issue
Block a user