Compare commits
4 Commits
v2.0.2-rc
...
feat/owner
| Author | SHA1 | Date | |
|---|---|---|---|
|
ee6cbe125f
|
|||
|
d79aaafcd1
|
|||
|
defde73bd4
|
|||
|
afd8e3f30b
|
@@ -1,4 +1,4 @@
|
||||
FROM golang:1.23.0-bookworm as build
|
||||
FROM golang:1.23.3-bookworm as build
|
||||
|
||||
ENV CGO_ENABLED=1
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ func bootstrapRouter(handlerContainer *handler.Handler) *router.Router {
|
||||
)
|
||||
router.RegisterRoute(
|
||||
"TRACKER.TOKEN_BURN",
|
||||
handlerContainer.IndexTokenMint,
|
||||
handlerContainer.IndexTokenBurn,
|
||||
handlerContainer.AddToken,
|
||||
)
|
||||
router.RegisterRoute(
|
||||
@@ -38,6 +38,10 @@ func bootstrapRouter(handlerContainer *handler.Handler) *router.Router {
|
||||
handlerContainer.IndexFaucetGive,
|
||||
handlerContainer.FaucetHealthCheck,
|
||||
)
|
||||
router.RegisterRoute(
|
||||
"TRACKER.OWNERSHIP_TRANSFERRED",
|
||||
handlerContainer.IndexOwnershipChange,
|
||||
)
|
||||
|
||||
return router
|
||||
}
|
||||
|
||||
100
dev/bootstrap/owners/main.go
Normal file
100
dev/bootstrap/owners/main.go
Normal 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
2
go.mod
@@ -1,6 +1,6 @@
|
||||
module github.com/grassrootseconomics/eth-indexer
|
||||
|
||||
go 1.23.0
|
||||
go 1.23.3
|
||||
|
||||
require (
|
||||
github.com/VictoriaMetrics/metrics v1.35.1
|
||||
|
||||
11
internal/handler/ownership.go
Normal file
11
internal/handler/ownership.go
Normal 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)
|
||||
}
|
||||
@@ -29,15 +29,16 @@ 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"`
|
||||
InsertToken string `query:"insert-token"`
|
||||
InsertPool string `query:"insert-pool"`
|
||||
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"`
|
||||
}
|
||||
)
|
||||
|
||||
@@ -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 {
|
||||
return pg.executeTransaction(ctx, func(tx pgx.Tx) error {
|
||||
_, err := tx.Exec(
|
||||
|
||||
@@ -15,6 +15,7 @@ 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
|
||||
Pool() *pgxpool.Pool
|
||||
|
||||
7
migrations/002_track_ownership_change.sql
Normal file
7
migrations/002_track_ownership_change.sql
Normal 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'
|
||||
);
|
||||
12
queries.sql
12
queries.sql
@@ -104,6 +104,18 @@ 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
|
||||
|
||||
Reference in New Issue
Block a user