diff --git a/Dockerfile b/Dockerfile index 46d5cb8..2ed2872 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.23.0-bookworm as build +FROM golang:1.23.3-bookworm as build ENV CGO_ENABLED=1 diff --git a/cmd/service/router.go b/cmd/service/router.go index cc81af8..e620f29 100644 --- a/cmd/service/router.go +++ b/cmd/service/router.go @@ -38,6 +38,10 @@ func bootstrapRouter(handlerContainer *handler.Handler) *router.Router { handlerContainer.IndexFaucetGive, handlerContainer.FaucetHealthCheck, ) + router.RegisterRoute( + "TRACKER.OWNERSHIP_TRANSFERRED", + handlerContainer.IndexOwnershipChange, + ) return router } diff --git a/go.mod b/go.mod index 58826af..2643dad 100644 --- a/go.mod +++ b/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 diff --git a/internal/handler/ownership.go b/internal/handler/ownership.go new file mode 100644 index 0000000..ae5194f --- /dev/null +++ b/internal/handler/ownership.go @@ -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) +} diff --git a/internal/store/pg.go b/internal/store/pg.go index 820ffc2..1900b30 100644 --- a/internal/store/pg.go +++ b/internal/store/pg.go @@ -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( diff --git a/internal/store/store.go b/internal/store/store.go index 8beab2a..ba5180e 100644 --- a/internal/store/store.go +++ b/internal/store/store.go @@ -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 diff --git a/migrations/002_track_ownership_change.sql b/migrations/002_track_ownership_change.sql new file mode 100644 index 0000000..29f3cb5 --- /dev/null +++ b/migrations/002_track_ownership_change.sql @@ -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' +); \ No newline at end of file diff --git a/queries.sql b/queries.sql index 05df428..69b7e2e 100644 --- a/queries.sql +++ b/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