Compare commits

..
Author SHA1 Message Date
kamikazechaser e9308bab2c fix: price quotes update 2024-08-12 17:18:18 +08:00
kamikazechaser 715fc1b489 fix: pool swap insert query 2024-06-28 16:00:19 +08:00
kamikazechaser 1b4a43450f fix: insert correct contract address
* closes #7

every specific event now links to the contract address that emitted the event log.
2024-06-26 08:43:10 +08:00
kamikazechaser 5df4b89123 ci: fix Dockerfile 2024-06-10 16:18:24 +08:00
kamikazechaser fb22f26e18 feat: metrics port update -> :5002 2024-06-10 15:45:43 +08:00
9 changed files with 174 additions and 41 deletions
+7 -3
View File
@@ -7,11 +7,11 @@ ARG TARGETPLATFORM
ARG BUILD=dev
RUN echo "Building on $BUILDPLATFORM, building for $TARGETPLATFORM"
WORKDIR /build
WORKDIR /code
COPY . .
RUN go mod download
RUN go build -o celo-indexer -ldflags="-X main.build=${BUILD} -s -w" cmd/*
RUN go build -o /build/celo-indexer -ldflags="-X main.build=${BUILD} -s -w" cmd/*
FROM debian:bookworm-slim
@@ -21,7 +21,11 @@ WORKDIR /service
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=build /build/* .
COPY migrations migrations/
COPY config.toml .
COPY queries.sql .
COPY LICENSE .
EXPOSE 5001
EXPOSE 5002
CMD ["./celo-indexer"]
+61
View File
@@ -0,0 +1,61 @@
# celo-indexer
![GitHub Tag](https://img.shields.io/github/v/tag/grassrootseconomics/celo-indexer)
A lightweight Postgres chain indexer designed to couple with [celo-tracker](https://github.com/grassrootseconomics/celo-tracker) to index all relevant GE related blockchain data on the Celo blockchain.
## Getting Started
### Prerequisites
* Git
* Docker
* Postgres server
* Access to a `celo-tracker` 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
We provide pre-built images for `linux/amd64`. See the packages tab on Github.
If you are on any other platform:
```bash
git clone https://github.com/grassrootseconomics/celo-indexer.git
cd celo-indexer
docker buildx build --build-arg BUILD=$(git rev-parse --short HEAD) --tag celo-indexer:$(git rev-parse --short HEAD) --tag celo-indexer:latest .
docker images
```
### 2. Run Postgres
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.
```bash
# Override only specific config values
nano .env.example
mv .env.example .env
```
Special env variables:
* DEV=*
Refer to [`config.toml`](config.toml) to understand different config value settings.
### 4. Run the indexer
```bash
cd dev
docker compose up
```
## License
[AGPL-3.0](LICENSE).
+1 -1
View File
@@ -2,7 +2,7 @@
go_process = true
[api]
address = ":5001"
address = ":5002"
[postgres]
dsn = "postgres://postgres:postgres@127.0.0.1:5432/ge_celo_data"
+22
View File
@@ -0,0 +1,22 @@
services:
postgres:
image: postgres:16-alpine
restart: unless-stopped
user: postgres
environment:
- POSTGRES_PASSWORD=postgres
- POSTGRES_USER=postgres
volumes:
- ./init_db.sql:/docker-entrypoint-initdb.d/init_db.sql
- indexer-pg:/var/lib/postgresql/data
ports:
- "127.0.0.1:5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready"]
interval: 10s
timeout: 5s
retries: 5
volumes:
indexer-pg:
driver: local
+15 -4
View File
@@ -8,15 +8,26 @@ services:
- POSTGRES_USER=postgres
volumes:
- ./init_db.sql:/docker-entrypoint-initdb.d/init_db.sql
- indexer-pg:/var/lib/postgresql/data
- celo-indexer-pg:/var/lib/postgresql/data
ports:
- "127.0.0.1:5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready"]
interval: 10s
timeout: 5s
retries: 5
retries: 5
celo-indexer:
image: celo-indexer:latest
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
environment:
# Point to the correct celo-tracker JetStream instance
- INDEXER_JETSTREAM__ENDPOINT=nats://nats:4222
ports:
- 127.0.0.1:5002:5002
volumes:
indexer-pg:
celo-indexer-pg:
driver: local
+7 -2
View File
@@ -37,7 +37,6 @@ type (
InsertPoolSwap string `query:"insert-pool-swap"`
InsertPoolDeposit string `query:"insert-pool-deposit"`
InsertPriceQuoteUpdate string `query:"insert-price-quote-update"`
CheckAddressExists string `query:"address-exists"`
}
)
@@ -87,6 +86,7 @@ func (pg *Pg) InsertTokenTransfer(ctx context.Context, eventPayload event.Event)
eventPayload.Payload["from"].(string),
eventPayload.Payload["to"].(string),
eventPayload.Payload["value"].(string),
eventPayload.ContractAddress,
)
return err
})
@@ -106,6 +106,7 @@ func (pg *Pg) InsertTokenMint(ctx context.Context, eventPayload event.Event) err
eventPayload.Payload["tokenMinter"].(string),
eventPayload.Payload["to"].(string),
eventPayload.Payload["value"].(string),
eventPayload.ContractAddress,
)
return err
})
@@ -124,6 +125,7 @@ func (pg *Pg) InsertTokenBurn(ctx context.Context, eventPayload event.Event) err
txID,
eventPayload.Payload["tokenBurner"].(string),
eventPayload.Payload["value"].(string),
eventPayload.ContractAddress,
)
return err
})
@@ -143,6 +145,7 @@ func (pg *Pg) InsertFaucetGive(ctx context.Context, eventPayload event.Event) er
eventPayload.Payload["token"].(string),
eventPayload.Payload["recipient"].(string),
eventPayload.Payload["amount"].(string),
eventPayload.ContractAddress,
)
return err
})
@@ -165,6 +168,7 @@ func (pg *Pg) InsertPoolSwap(ctx context.Context, eventPayload event.Event) erro
eventPayload.Payload["amountIn"].(string),
eventPayload.Payload["amountOut"].(string),
eventPayload.Payload["fee"].(string),
eventPayload.ContractAddress,
)
return err
})
@@ -184,6 +188,7 @@ func (pg *Pg) InsertPoolDeposit(ctx context.Context, eventPayload event.Event) e
eventPayload.Payload["initiator"].(string),
eventPayload.Payload["tokenIn"].(string),
eventPayload.Payload["amountIn"].(string),
eventPayload.ContractAddress,
)
return err
})
@@ -202,6 +207,7 @@ func (pg *Pg) InsertPriceQuoteUpdate(ctx context.Context, eventPayload event.Eve
txID,
eventPayload.Payload["token"].(string),
eventPayload.Payload["exchangeRate"].(string),
eventPayload.ContractAddress,
)
return err
})
@@ -214,7 +220,6 @@ func (pg *Pg) insertTx(ctx context.Context, tx pgx.Tx, eventPayload event.Event)
pg.queries.InsertTx,
eventPayload.TxHash,
eventPayload.Block,
eventPayload.ContractAddress,
time.Unix(int64(eventPayload.Timestamp), 0).UTC(),
eventPayload.Success,
).Scan(&txID); err != nil {
-1
View File
@@ -65,7 +65,6 @@ CREATE TABLE IF NOT EXISTS price_index_updates (
exchange_rate NUMERIC NOT NULL
);
CREATE TABLE IF NOT EXISTS contracts (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
contract_address VARCHAR(42) UNIQUE NOT NULL,
+29
View File
@@ -0,0 +1,29 @@
ALTER TABLE tx DROP COLUMN contract_address;
ALTER TABLE token_transfer ADD COLUMN contract_address VARCHAR(42);
UPDATE token_transfer SET contract_address = '0x0000000000000000000000000000000000000000';
ALTER TABLE token_transfer ALTER COLUMN contract_address SET NOT NULL;
ALTER TABLE token_mint ADD COLUMN contract_address VARCHAR(42);
UPDATE token_mint SET contract_address = '0x0000000000000000000000000000000000000000';
ALTER TABLE token_mint ALTER COLUMN contract_address SET NOT NULL;
ALTER TABLE token_burn ADD COLUMN contract_address VARCHAR(42);
UPDATE token_burn SET contract_address = '0x0000000000000000000000000000000000000000';
ALTER TABLE token_burn ALTER COLUMN contract_address SET NOT NULL;
ALTER TABLE faucet_give ADD COLUMN contract_address VARCHAR(42);
UPDATE faucet_give SET contract_address = '0x0000000000000000000000000000000000000000';
ALTER TABLE faucet_give ALTER COLUMN contract_address SET NOT NULL;
ALTER TABLE pool_swap ADD COLUMN contract_address VARCHAR(42);
UPDATE pool_swap SET contract_address = '0x0000000000000000000000000000000000000000';
ALTER TABLE pool_swap ALTER COLUMN contract_address SET NOT NULL;
ALTER TABLE pool_deposit ADD COLUMN contract_address VARCHAR(42);
UPDATE pool_deposit SET contract_address = '0x0000000000000000000000000000000000000000';
ALTER TABLE pool_deposit ALTER COLUMN contract_address SET NOT NULL;
ALTER TABLE price_index_updates ADD COLUMN contract_address VARCHAR(42);
UPDATE price_index_updates SET contract_address = '0x0000000000000000000000000000000000000000';
ALTER TABLE price_index_updates ALTER COLUMN contract_address SET NOT NULL;
+32 -30
View File
@@ -1,17 +1,15 @@
--name: insert-tx
-- $1: tx_hash
-- $2: block_number
-- $3: contract_address
-- $4: date_block
-- $5: success
-- $3: date_block
-- $4: success
WITH insert_tx AS (
INSERT INTO tx(
tx_hash,
block_number,
contract_address,
date_block,
success
) VALUES($1, $2, $3, $4, $5) ON CONFLICT DO NOTHING RETURNING id
) VALUES($1, $2, $3, $4) ON CONFLICT DO NOTHING RETURNING id
)
SELECT id FROM insert_tx
UNION ALL
@@ -23,46 +21,54 @@ LIMIT 1
-- $2: sender_address
-- $3: recipient_address
-- $4: transfer_value
-- $5: contract_address
INSERT INTO token_transfer(
tx_id,
sender_address,
recipient_address,
transfer_value
) VALUES($1, $2, $3, $4) ON CONFLICT DO NOTHING
transfer_value,
contract_address
) VALUES($1, $2, $3, $4, $5) ON CONFLICT DO NOTHING
--name: insert-token-mint
-- $1: tx_id
-- $2: minter_address
-- $3: recipient_address
-- $4: mint_value
-- $5: contract_address
INSERT INTO token_mint(
tx_id,
minter_address,
recipient_address,
mint_value
) VALUES($1, $2, $3, $4) ON CONFLICT DO NOTHING
mint_value,
contract_address
) VALUES($1, $2, $3, $4, $5) ON CONFLICT DO NOTHING
--name: insert-token-burn
-- $1: tx_id
-- $2: burner_address
-- $3: burn_value
-- $4: contract_address
INSERT INTO token_burn(
tx_id,
burner_address,
burn_value
) VALUES($1, $2, $3) ON CONFLICT DO NOTHING
burn_value,
contract_address
) VALUES($1, $2, $3, $4) ON CONFLICT DO NOTHING
--name: insert-faucet-give
-- $1: tx_id
-- $2: token_address
-- $3: recipient_address
-- $4: give_value
-- $5: contract_address
INSERT INTO faucet_give(
tx_id,
token_address,
recipient_address,
give_value
) VALUES($1, $2, $3, $4) ON CONFLICT DO NOTHING
give_value,
contract_address
) VALUES($1, $2, $3, $4, $5) ON CONFLICT DO NOTHING
--name: insert-pool-swap
-- $1: tx_id
@@ -72,6 +78,7 @@ INSERT INTO faucet_give(
-- $5: in_value
-- $6: out_value
-- $7: fee
-- $8: contract_address
INSERT INTO pool_swap(
tx_id,
initiator_address,
@@ -79,37 +86,32 @@ INSERT INTO pool_swap(
token_out_address,
in_value,
out_value,
fee
) VALUES($1, $2, $3, $4, $5, $6, $7) ON CONFLICT DO NOTHING
fee,
contract_address
) VALUES($1, $2, $3, $4, $5, $6, $7, $8) ON CONFLICT DO NOTHING
--name: insert-pool-deposit
-- $1: tx_id
-- $2: initiator_address
-- $3: token_in_address
-- $4: token_out_address
-- $5: in_value
-- $6: out_value
-- $7: fee
-- $4: in_value
-- $5: contract_address
INSERT INTO pool_deposit(
tx_id,
initiator_address,
token_in_address,
in_value
) VALUES($1, $2, $3, $4) ON CONFLICT DO NOTHING
in_value,
contract_address
) VALUES($1, $2, $3, $4, $5) ON CONFLICT DO NOTHING
--name: insert-price-quote-update
-- $1: tx_id
-- $2: token
-- $3: exchange_rate
-- $4: contract_address
INSERT INTO price_index_updates(
tx_id,
token,
exchange_rate
) VALUES($1, $2, $3) ON CONFLICT DO NOTHING
--name: address-exists
-- $1: blockchain_address_1
-- $2: blockchain_address_2
SELECT EXISTS(
SELECT 1 FROM sarafu_network.accounts WHERE blockchain_address=$1 OR blockchain_address=$2
)
exchange_rate,
contract_address
) VALUES($1, $2, $3, $4) ON CONFLICT DO NOTHING