Compare commits

...

4 Commits

9 changed files with 167 additions and 12 deletions

View File

@@ -1,4 +1,4 @@
FROM golang:1.23.0-bookworm as build FROM golang:1.23.3-bookworm as build
ENV CGO_ENABLED=1 ENV CGO_ENABLED=1

View File

@@ -20,7 +20,7 @@ func bootstrapRouter(handlerContainer *handler.Handler) *router.Router {
) )
router.RegisterRoute( router.RegisterRoute(
"TRACKER.TOKEN_BURN", "TRACKER.TOKEN_BURN",
handlerContainer.IndexTokenMint, handlerContainer.IndexTokenBurn,
handlerContainer.AddToken, handlerContainer.AddToken,
) )
router.RegisterRoute( router.RegisterRoute(
@@ -38,6 +38,10 @@ func bootstrapRouter(handlerContainer *handler.Handler) *router.Router {
handlerContainer.IndexFaucetGive, handlerContainer.IndexFaucetGive,
handlerContainer.FaucetHealthCheck, handlerContainer.FaucetHealthCheck,
) )
router.RegisterRoute(
"TRACKER.OWNERSHIP_TRANSFERRED",
handlerContainer.IndexOwnershipChange,
)
return router return router
} }

View File

@@ -0,0 +1,100 @@
package main
import (
"context"
"flag"
"log/slog"
"os"
"time"
"github.com/grassrootseconomics/eth-indexer/internal/store"
"github.com/grassrootseconomics/eth-indexer/internal/util"
"github.com/grassrootseconomics/ethutils"
"github.com/jackc/pgx/v5/pgxpool"
"github.com/knadh/koanf/v2"
"github.com/lmittmann/w3"
)
const (
insertOwnerQuery = `INSERT INTO ownership_change(
new_owner
contract_address
) VALUES ($1, $2) ON CONFLICT DO NOTHING`
getTokens = `SELECT contract_address FROM tokens`
getPools = `SELECT contract_address FROM pools`
)
var (
build = "dev"
confFlag string
migrationsFolderFlag string
queriesFlag string
lo *slog.Logger
ko *koanf.Koanf
dbPool *pgxpool.Pool
)
func init() {
flag.StringVar(&confFlag, "config", "config.toml", "Config file location")
flag.StringVar(&migrationsFolderFlag, "migrations", "migrations/", "Migrations folder location")
flag.StringVar(&queriesFlag, "queries", "queries.sql", "Queries file location")
flag.Parse()
lo = util.InitLogger()
ko = util.InitConfig(lo, confFlag)
lo.Info("starting owners bootstrapper", "build", build)
}
func main() {
var ownerGetter = w3.MustNewFunc("owner()", "address")
chainProvider := ethutils.NewProvider(ko.MustString("chain.rpc_endpoint"), ko.MustInt64("chain.chainid"))
var err error
dbPool, err = newPgStore()
if err != nil {
lo.Error("could not initialize postgres store", "error", err)
os.Exit(1)
}
ctx, cancel := context.WithTimeout(context.Background(), time.Minute*5)
defer cancel()
// TODO: get all tokens and pools
}
func newPgStore() (*pgxpool.Pool, error) {
store, err := store.NewPgStore(store.PgOpts{
Logg: lo,
DSN: ko.MustString("postgres.dsn"),
MigrationsFolderPath: migrationsFolderFlag,
QueriesFolderPath: queriesFlag,
})
if err != nil {
lo.Error("could not initialize postgres store", "error", err)
os.Exit(1)
}
return store.Pool(), nil
}
func insertOwnershipChange(ctx context.Context, owner string, contractAddress string) error {
_, err := dbPool.Exec(
ctx,
insertOwnerQuery,
owner,
contractAddress,
)
if err != nil {
return err
}
return nil
}

2
go.mod
View File

@@ -1,6 +1,6 @@
module github.com/grassrootseconomics/eth-indexer module github.com/grassrootseconomics/eth-indexer
go 1.23.0 go 1.23.3
require ( require (
github.com/VictoriaMetrics/metrics v1.35.1 github.com/VictoriaMetrics/metrics v1.35.1

View File

@@ -0,0 +1,11 @@
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)
}

View File

@@ -29,15 +29,16 @@ type (
} }
queries struct { queries struct {
InsertTx string `query:"insert-tx"` InsertTx string `query:"insert-tx"`
InsertTokenTransfer string `query:"insert-token-transfer"` InsertTokenTransfer string `query:"insert-token-transfer"`
InsertTokenMint string `query:"insert-token-mint"` InsertTokenMint string `query:"insert-token-mint"`
InsertTokenBurn string `query:"insert-token-burn"` InsertTokenBurn string `query:"insert-token-burn"`
InsertFaucetGive string `query:"insert-faucet-give"` InsertFaucetGive string `query:"insert-faucet-give"`
InsertPoolSwap string `query:"insert-pool-swap"` InsertPoolSwap string `query:"insert-pool-swap"`
InsertPoolDeposit string `query:"insert-pool-deposit"` InsertPoolDeposit string `query:"insert-pool-deposit"`
InsertToken string `query:"insert-token"` InsertOwnershipChange string `query:"insert-ownership-change"`
InsertPool string `query:"insert-pool"` InsertToken string `query:"insert-token"`
InsertPool string `query:"insert-pool"`
} }
) )
@@ -199,6 +200,25 @@ 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 { 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 { return pg.executeTransaction(ctx, func(tx pgx.Tx) error {
_, err := tx.Exec( _, err := tx.Exec(

View File

@@ -15,6 +15,7 @@ type (
InsertFaucetGive(context.Context, event.Event) error InsertFaucetGive(context.Context, event.Event) error
InsertPoolSwap(context.Context, event.Event) error InsertPoolSwap(context.Context, event.Event) error
InsertPoolDeposit(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 InsertToken(context.Context, string, string, string, uint8, string) error
InsertPool(context.Context, string, string, string) error InsertPool(context.Context, string, string, string) error
Pool() *pgxpool.Pool Pool() *pgxpool.Pool

View File

@@ -0,0 +1,7 @@
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'
);

View File

@@ -104,6 +104,18 @@ INSERT INTO pool_deposit(
contract_address contract_address
) VALUES($1, $2, $3, $4, $5) ON CONFLICT DO NOTHING ) 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 --name: insert-token
-- $1: contract_address -- $1: contract_address
-- $2: token_name -- $2: token_name