From d2e8b2884c352d4277608b272bc7fae9d32eb605 Mon Sep 17 00:00:00 2001 From: Charaf ZELLOU Date: Mon, 3 Jul 2023 02:26:37 +0200 Subject: [PATCH 1/5] Working Build as per requirements (#1) * Working Build * Working Year Filter * Some cleaning --- .devcontainer/devcontainer.json | 0 .dockerignore | 0 .editorconfig | 0 .env.dist | 13 +- .github/workflows/actions.yml | 6 +- .gitignore | 1 + .vscode/extensions.json | 0 Dockerfile | 12 - Dockerfile.api | 13 + Dockerfile.indexer | 13 + Makefile | 24 ++ README.md | 20 +- {src => app/api}/.air.toml | 0 app/api/conf.go | 33 +++ {src => app/api}/go.mod | 2 +- {src => app/api}/go.sum | 0 app/api/main.go | 146 ++++++++++ app/api/types.go | 66 +++++ app/indexer/.air.toml | 44 +++ app/indexer/go.mod | 5 + app/indexer/go.sum | 2 + app/indexer/main.go | 179 ++++++++++++ app/indexer/types.go | 49 ++++ docker-compose.yaml | 38 ++- docs/ASSIGNEMENT.md | 4 +- docs/KILN - Mid Backend Exercice.pdf | Bin 155900 -> 0 bytes go.work | 6 + go.work.sum | 3 + postman/collection.json | 91 ++++++ src/main.go | 263 ------------------ .../pgadmin4/{volumes.json => servers.json} | 4 +- 31 files changed, 732 insertions(+), 305 deletions(-) mode change 100755 => 100644 .devcontainer/devcontainer.json mode change 100755 => 100644 .dockerignore mode change 100755 => 100644 .editorconfig mode change 100755 => 100644 .env.dist mode change 100755 => 100644 .github/workflows/actions.yml mode change 100755 => 100644 .gitignore mode change 100755 => 100644 .vscode/extensions.json delete mode 100755 Dockerfile create mode 100644 Dockerfile.api create mode 100644 Dockerfile.indexer mode change 100755 => 100644 Makefile mode change 100755 => 100644 README.md rename {src => app/api}/.air.toml (100%) mode change 100755 => 100644 create mode 100644 app/api/conf.go rename {src => app/api}/go.mod (96%) mode change 100755 => 100644 rename {src => app/api}/go.sum (100%) mode change 100755 => 100644 create mode 100644 app/api/main.go create mode 100644 app/api/types.go create mode 100644 app/indexer/.air.toml create mode 100644 app/indexer/go.mod create mode 100644 app/indexer/go.sum create mode 100644 app/indexer/main.go create mode 100644 app/indexer/types.go mode change 100755 => 100644 docker-compose.yaml mode change 100755 => 100644 docs/ASSIGNEMENT.md delete mode 100755 docs/KILN - Mid Backend Exercice.pdf create mode 100644 go.work create mode 100644 go.work.sum create mode 100644 postman/collection.json delete mode 100755 src/main.go rename volumes/pgadmin4/{volumes.json => servers.json} (88%) mode change 100755 => 100644 diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json old mode 100755 new mode 100644 diff --git a/.dockerignore b/.dockerignore old mode 100755 new mode 100644 diff --git a/.editorconfig b/.editorconfig old mode 100755 new mode 100644 diff --git a/.env.dist b/.env.dist old mode 100755 new mode 100644 index 343c8da..4c6d669 --- a/.env.dist +++ b/.env.dist @@ -2,21 +2,24 @@ # AIR_MODE=debug/release AIR_MODE="debug" +# Which port to use for the API +API_PORT="3000" + # Should the App clean the DB on start # POSTGRES_DROP=true/false POSTGRES_DROP=true # Postgres connection info -POSTGRES_HOST="host.docker.internal" +POSTGRES_HOST="postgres" POSTGRES_PORT="5432" -POSTGRES_USER="appuser" -POSTGRES_PASSWORD="Password123!" -POSTGRES_DB="tzktdelegator" +POSTGRES_USERNAME="appuser" +POSTGRES_PASSWORD="SecretsOfPg!5432" +POSTGRES_DB="tzktdelegations" # PGAdmin connection info PGA_PORT="8080" PGA_USERNAME="admin@postgres.com" -PGA_PASSWORD="Admin!123" +PGA_PASSWORD="Password123!" # Hasura connection info HSR_PORT="8081" diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml old mode 100755 new mode 100644 index 3d10999..4673743 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -1,5 +1,5 @@ # YAML file for Github Actions to use to build the Docker Image -name: Docker Image +name: Github Actions Build on: push: @@ -12,5 +12,5 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - name: Build the Docker image - run: docker build . \ No newline at end of file + - name: Build the Docker Compose + run: docker-compose build \ No newline at end of file diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 index 07db79c..320bcbf --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ tmp/ testdata/ build/ .env +*.pdf *.log \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json old mode 100755 new mode 100644 diff --git a/Dockerfile b/Dockerfile deleted file mode 100755 index 7e268d0..0000000 --- a/Dockerfile +++ /dev/null @@ -1,12 +0,0 @@ -FROM --platform=linux/amd64 golang:1.20.5 - -WORKDIR /app - -RUN go install github.com/cosmtrek/air@latest - -COPY src/go.mod src/go.sum ./ -RUN go mod download - -COPY ./src/ ./ - -CMD ["air", "-c", ".air.toml"] \ No newline at end of file diff --git a/Dockerfile.api b/Dockerfile.api new file mode 100644 index 0000000..0a140d1 --- /dev/null +++ b/Dockerfile.api @@ -0,0 +1,13 @@ +FROM --platform=linux/amd64 golang:1.20.5 + +WORKDIR /app/api + +RUN go install github.com/cosmtrek/air@latest + +COPY app/api/go.mod app/api/go.sum ./ +RUN go mod download + +COPY ./app/api/ ./ + +# CMD ["air", "-c", ".air.toml"] +CMD ["go", "run", "."] \ No newline at end of file diff --git a/Dockerfile.indexer b/Dockerfile.indexer new file mode 100644 index 0000000..865cad5 --- /dev/null +++ b/Dockerfile.indexer @@ -0,0 +1,13 @@ +FROM --platform=linux/amd64 golang:1.20.5 + +WORKDIR /app/indexer + +RUN go install github.com/cosmtrek/air@latest + +COPY app/indexer/go.mod app/indexer/go.sum ./ +RUN go mod download + +COPY ./app/indexer/ ./ + +# CMD ["air", "-c", ".air.toml"] +CMD ["go", "run", "."] \ No newline at end of file diff --git a/Makefile b/Makefile old mode 100755 new mode 100644 index e69de29..eb62aa1 --- a/Makefile +++ b/Makefile @@ -0,0 +1,24 @@ +install: + @echo "Installing dependencies..." + @cp .env.dist .env + @go version + @go mod download + @docker-compose build + +run: + @echo "Running application..." + @docker-compose up -d + +stop: + @echo "Stopping application..." + @docker-compose stop + +clean-logs: + @rm -rf app/api/logs/*.log + @rm -rf app/indexer/logs/*.log + +nuke: + @echo "Nuking application..." + @docker-compose down + @docker rmi -f tzkt-delegator-tools-indexer + @docker rmi -f tzkt-delegator-tools-api \ No newline at end of file diff --git a/README.md b/README.md old mode 100755 new mode 100644 index de4bfee..fd52f89 --- a/README.md +++ b/README.md @@ -1,8 +1,10 @@ -# KILN - Mid Backend Exercice +# TZKT DELEGATIONS API ## Original assignement : -In this exercise, you will build a service that gathers new [delegations](https://opentezos.com/baking/delegating/) made on the Tezos protocol and exposes them through a public API. +Build a service that : +- gathers new [delegations](https://opentezos.com/baking/delegating/) made on the Tezos protocol, +- exposes them through a public API. The original assignement document can be viewed [here](./docs/ASSIGNEMENT.md). @@ -28,11 +30,9 @@ go build . -o app ## Checklist : - - -- [ ] The service will poll the new delegations from this Tzkt API endpoint: https://api.tzkt.io/#operation/Operations_GetDelegations -- [ ] For each delegation, save the following information: sender's address, timestamp, amount, and block. -- [ ] Expose the collected data through a public API at the endpoint `/xtz/delegations`. +- [X] The service will poll the new delegations from this Tzkt API endpoint: https://api.tzkt.io/#operation/Operations_GetDelegations +- [X] For each delegation, save the following information: sender's address, timestamp, amount, and block. +- [X] Expose the collected data through a public API at the endpoint `/xtz/delegations`. - [ ] The expected response format is: ```json @@ -54,7 +54,7 @@ go build . -o app } ``` - - [ ] The sender’s address is the delegator. - - [ ] The delegations must be listed most recent first. - - [ ] The endpoint takes one optional query parameter `year` , which is specified in the format `YYYY` and will result in the data being filtered for that year only. + - [X] The sender’s address is the delegator. + - [X] The delegations must be listed most recent first. + - [X] The endpoint takes one optional query parameter `year` , which is specified in the format `YYYY` and will result in the data being filtered for that year only. - [ ] Ensure the service is production-ready, considering factors like performance, scalability, error handling, and reliability. \ No newline at end of file diff --git a/src/.air.toml b/app/api/.air.toml old mode 100755 new mode 100644 similarity index 100% rename from src/.air.toml rename to app/api/.air.toml diff --git a/app/api/conf.go b/app/api/conf.go new file mode 100644 index 0000000..2bcfc41 --- /dev/null +++ b/app/api/conf.go @@ -0,0 +1,33 @@ +package main + +import ( + "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v2/middleware/logger" + "github.com/gofiber/fiber/v2/middleware/recover" +) + +var ( + // Define a Fiber API config + config = fiber.Config{ + Prefork: false, + CaseSensitive: false, + StrictRouting: false, + ServerHeader: "", + AppName: "", + } + + // Define a Fiber Recoverer config + recover_config = recover.Config{ + Next: nil, + EnableStackTrace: false, + StackTraceHandler: recover.ConfigDefault.StackTraceHandler, + } + + // Define a Fiber Logger config + logger_config = logger.Config{ + Format: "[${time}] ${status} - ${latency} ${method} ${path}\n", + TimeFormat: "01-Jan-2000", + TimeZone: "Europe/Paris", + Output: setLogFile(), + } +) diff --git a/src/go.mod b/app/api/go.mod old mode 100755 new mode 100644 similarity index 96% rename from src/go.mod rename to app/api/go.mod index 4606c72..fcbe086 --- a/src/go.mod +++ b/app/api/go.mod @@ -1,4 +1,4 @@ -module tzkt-delegations +module tzkt-delegations-api go 1.20 diff --git a/src/go.sum b/app/api/go.sum old mode 100755 new mode 100644 similarity index 100% rename from src/go.sum rename to app/api/go.sum diff --git a/app/api/main.go b/app/api/main.go new file mode 100644 index 0000000..279b6cf --- /dev/null +++ b/app/api/main.go @@ -0,0 +1,146 @@ +package main + +import ( + "database/sql" + "fmt" + "log" + "os" + "time" + + "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v2/middleware/logger" + "github.com/gofiber/fiber/v2/middleware/recover" + _ "github.com/lib/pq" +) + +var ( + // Define API port + api_port, api_port_is_set = os.LookupEnv("API_PORT") + + // Define Postgres variables + pg_host, pg_host_is_set = os.LookupEnv("POSTGRES_HOST") + pg_port, pg_port_is_set = os.LookupEnv("POSTGRES_PORT") + pg_user, pg_user_is_set = os.LookupEnv("POSTGRES_USERNAME") + pg_password, pg_password_is_set = os.LookupEnv("POSTGRES_PASSWORD") + pg_db, pg_db_is_set = os.LookupEnv("POSTGRES_DB") +) + +func setLogFile() *os.File { + log_file, err := os.OpenFile("./logs/"+time.Now().String()+".log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) + if err != nil { + log.Fatalf("error opening log file: %v", err) + } + return log_file +} + +func startApiServer(db *sql.DB) { + app := fiber.New(config) + app.Use(recover.New(recover_config)) + app.Use(logger.New(logger_config)) + + // Create a "/xtz" endpoint group + v1 := app.Group("/xtz") + + // Bind endpoints to handlers + v1.Get("/delegations", func(c *fiber.Ctx) error { + params := c.Queries() + log.Printf("Params: %v\n", params) + log.Printf("params[\"year\"]: %v\n", params["year"]) + return c.JSON(streamDelegations(db, params["year"])) + }) + + // Setup static files + app.Static("/", "./frontend/public") + + // Handle 404 : not found + app.Use(func(c *fiber.Ctx) error { + return c.Status(404).SendFile("./frontend/public/404.html") + }) + + // Listen on port 3000 + listenerAddress := fmt.Sprintf(":%s", api_port) + log.Printf("Listening on %s\n", listenerAddress) + log.Fatal(app.Listen(listenerAddress)) +} + +func streamDelegations(db *sql.DB, requested_year string) []DelegationApi { + // Create a slice of DelegationApi + delegations := []DelegationApi{} + + var rows *sql.Rows + var err error + // Query the database + if requested_year == "" { + rows, err = db.Query("SELECT * FROM delegations") + } else { + rows, err = db.Query("SELECT * FROM delegations WHERE EXTRACT(YEAR FROM timestamp) = $1", requested_year) + } + if err != nil { + log.Fatal(err) + } + defer rows.Close() + + // Iterate over the rows + for rows.Next() { + var delegation DelegationApi + err := rows.Scan(&delegation.Hash, &delegation.Level, &delegation.Timestamp, &delegation.SenderAddress, &delegation.NewDelegateAddress, &delegation.Amount, &delegation.Status) + if err != nil { + log.Fatal(err) + } + delegations = append(delegations, delegation) + } + err = rows.Err() + if err != nil { + log.Fatal(err) + } + + return delegations +} + +func connectDatabase() *sql.DB { + // Connect to the Postgres database + postgresUrl := fmt.Sprintf("postgres://%s:%s@%s:%s/%s?sslmode=disable", + pg_user, + pg_password, + pg_host, + pg_port, + pg_db) + fmt.Printf("postgresUrl: %s\n", postgresUrl) + db, err := sql.Open("postgres", postgresUrl) + if err != nil { + log.Fatal(err) + } + return db +} + +func run() { + // Verify that the required environment variables are set + if !pg_user_is_set || !pg_host_is_set || !pg_port_is_set || !pg_password_is_set || !pg_db_is_set { + log.Printf("[run] PG_HOST: \"%s\" => %t\n", pg_host, pg_host_is_set) + log.Printf("[run] PG_PORT: \"%s\" => %t\n", pg_port, pg_port_is_set) + log.Printf("[run] PG_USER: \"%s\" => %t\n", pg_user, pg_user_is_set) + log.Printf("[run] PG_DB: \"%s\" => %t\n", pg_db, pg_db_is_set) + log.Fatal("[run] Please set the required environment variables") + } + + // Set the API port to default as 3000 if not set + if !api_port_is_set { + api_port = "3000" + log.Printf("[run] API_PORT: \"%s\" => %t\n", api_port, api_port_is_set) + } + + // Connect to the database + db := connectDatabase() + // Set the log file for the API server + logFile := setLogFile() + // Start the API server + startApiServer(db) + + defer logFile.Close() + defer db.Close() +} + +func main() { + // Run the application + run() +} diff --git a/app/api/types.go b/app/api/types.go new file mode 100644 index 0000000..d4a831c --- /dev/null +++ b/app/api/types.go @@ -0,0 +1,66 @@ +package main + +import "time" + +type Request struct { + Year int `json:"year,omitempty"` +} + +// Define a DelegationsApi struct +type DelegationApi struct { + Hash string `json:"hash"` + Level int `json:"level"` + Timestamp time.Time `json:"timestamp"` + SenderAddress string `json:"sender"` + NewDelegateAddress string `json:"newDelegate"` + Amount float64 `json:"amount"` + Status string `json:"status"` +} + +// Define a Delegation struct +type Delegation struct { + Id int `json:"id"` + Type string `json:"type"` + Level int `json:"level"` + Timestamp string `json:"timestamp"` + Block string `json:"block"` + Hash string `json:"hash"` + Counter int `json:"counter"` + Initiator struct { + Alias string `json:"alias"` + Address string `json:"address"` + } `json:"initiator"` + Sender struct { + Alias string `json:"alias"` + Address string `json:"address"` + } `json:"sender"` + SenderCodeHash int `json:"senderCodeHash"` + Nonce int `json:"nonce"` + GasLimit int `json:"gasLimit"` + GasUsed int `json:"gasUsed"` + StorageLimit int `json:"storageLimit"` + BakerFee int `json:"bakerFee"` + Amount float64 `json:"amount"` + PrevDelegate struct { + Alias string `json:"alias"` + Address string `json:"address"` + } `json:"prevDelegate"` + NewDelegate struct { + Alias string `json:"alias"` + Address string `json:"address"` + } `json:"newDelegate"` + Status string `json:"status"` + Errors []struct { + Type string `json:"type"` + } `json:"errors"` + Quote struct { + Btc int `json:"btc"` + Eur int `json:"eur"` + Usd int `json:"usd"` + Cny int `json:"cny"` + Jpy int `json:"jpy"` + Krw int `json:"krw"` + Eth int `json:"eth"` + Gbp int `json:"gbp"` + } `json:"quote"` +} diff --git a/app/indexer/.air.toml b/app/indexer/.air.toml new file mode 100644 index 0000000..9df46fe --- /dev/null +++ b/app/indexer/.air.toml @@ -0,0 +1,44 @@ +root = "." +testdata_dir = "testdata" +tmp_dir = "tmp" + +[build] + args_bin = [] + bin = "./tmp/main" + cmd = "go build -o ./tmp/main ." + delay = 0 + exclude_dir = ["assets", "tmp", "vendor", "testdata"] + exclude_file = [] + exclude_regex = ["_test.go"] + exclude_unchanged = false + follow_symlink = false + full_bin = "" + include_dir = [] + include_ext = ["go", "tpl", "tmpl", "html"] + include_file = [] + kill_delay = "0s" + log = "build-errors.log" + poll = false + poll_interval = 0 + rerun = false + rerun_delay = 500 + send_interrupt = false + stop_on_error = false + +[color] + app = "" + build = "yellow" + main = "magenta" + runner = "green" + watcher = "cyan" + +[log] + main_only = false + time = true + +[misc] + clean_on_exit = false + +[screen] + clear_on_rebuild = false + keep_scroll = true diff --git a/app/indexer/go.mod b/app/indexer/go.mod new file mode 100644 index 0000000..e09213d --- /dev/null +++ b/app/indexer/go.mod @@ -0,0 +1,5 @@ +module tzkt-delegations-indexer + +go 1.20 + +require github.com/lib/pq v1.10.9 diff --git a/app/indexer/go.sum b/app/indexer/go.sum new file mode 100644 index 0000000..aeddeae --- /dev/null +++ b/app/indexer/go.sum @@ -0,0 +1,2 @@ +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= diff --git a/app/indexer/main.go b/app/indexer/main.go new file mode 100644 index 0000000..ebc4fb1 --- /dev/null +++ b/app/indexer/main.go @@ -0,0 +1,179 @@ +package main + +import ( + "database/sql" + "encoding/json" + "fmt" + "io" + "log" + "net/http" + "os" + "time" + + _ "github.com/lib/pq" +) + +var ( + // Define Postgres variables + pg_host, pg_host_is_set = os.LookupEnv("POSTGRES_HOST") + pg_port, pg_port_is_set = os.LookupEnv("POSTGRES_PORT") + pg_user, pg_user_is_set = os.LookupEnv("POSTGRES_USERNAME") + pg_password, pg_password_is_set = os.LookupEnv("POSTGRES_PASSWORD") + pg_db, pg_db_is_set = os.LookupEnv("POSTGRES_DB") +) + +func connectDatabase() *sql.DB { + // Connect to the Postgres database + postgresUrl := fmt.Sprintf("postgres://%s:%s@%s:%s/%s?sslmode=disable", + pg_user, + pg_password, + pg_host, + pg_port, + pg_db) + fmt.Printf("postgresUrl: %s\n", postgresUrl) + db, err := sql.Open("postgres", postgresUrl) + if err != nil { + log.Fatal(err) + } + return db +} + +func initDatabase(db *sql.DB) { + // Create the delegations table if it doesn't exist + _, err := db.Exec("CREATE TABLE IF NOT EXISTS delegations (hash TEXT PRIMARY KEY, level INT, timestamp TIMESTAMP, sender TEXT, delegate TEXT, amount FLOAT, status TEXT)") + if err != nil { + log.Fatal("[initDatabase] ", err) + } else { + log.Println("[initDatabase] Table created") + } +} + +func getDelegationsCount() int { + // Request delegations count from https://api.tzkt.io/v1/operations/drain_delegate/count + response, err := http.Get("https://api.tzkt.io/v1/operations/delegations/count") + if err != nil { + log.Fatal(err) + } + defer response.Body.Close() + + // Print the HTTP Status Code and Status Name + log.Println("[getDelegationsCount] HTTP Response Status: ", response.StatusCode, http.StatusText(response.StatusCode)) + + // Read the response body + body, err := io.ReadAll(response.Body) + if err != nil { + log.Fatal(err) + } + + // Convert the response body to uint + var delegationsCount int + err = json.Unmarshal(body, &delegationsCount) + if err != nil { + log.Fatal(err) + } else { + log.Println("[getDelegationsCount] DelegationsCount: ", delegationsCount) + } + + return delegationsCount +} + +func getDelegations() []Delegation { + var delegations []Delegation + // Request delegations from https://api.tzkt.io/v1/operations/delegations + for i := 0; i < getDelegationsCount(); i += 10000 { + url := fmt.Sprintf("https://api.tzkt.io/v1/operations/delegations?limit=10000&offset=%d", i) + log.Printf("[getDelegations] URL: %s\n", url) + response, err := http.Get(url) + if err != nil { + log.Fatal(err) + } + defer response.Body.Close() + + // Print the HTTP Status Code and Status Name + log.Println("[getDelegations] HTTP Response Status:", response.StatusCode, http.StatusText(response.StatusCode)) + + // Read the response body + body, err := io.ReadAll(response.Body) + if err != nil { + log.Fatal(err) + } + + // Unmarshal the JSON data + var delegationsResponse []Delegation + err = json.Unmarshal(body, &delegationsResponse) + if err != nil { + log.Fatal(err) + } else { + log.Println("[getDelegations] Delegations: ", delegationsResponse) + } + + delegations = append(delegations, delegationsResponse...) + + // Sleep for 500 Milliseconds to avoid spamming the API + // Tzkt.io has no rate limits currently, but it's better to be safe than sorry + // This would be a good place to calculate a proper rate limit if we were using a different API + time.Sleep(500 * time.Millisecond) + } + // fmt.Printf("[getDelegations] Delegations: %v\n", delegations) + return delegations +} + +func pushDelegations(delegations []Delegation, db *sql.DB) { + fmt.Printf("[pushDelegations] Delegations Count : %d\n", len(delegations)) + // For each delegation in the delegations array + for i := 0; i < len(delegations); i++ { + // Check if the delegation already exists in the database + var exists bool + err := db.QueryRow("SELECT EXISTS(SELECT 1 FROM delegations WHERE hash=" + "'" + delegations[i].Hash + "'" + ")").Scan(&exists) + if err != nil { + log.Fatal(err) + } else { + // Insert Delegation into the database + if !exists { + _, err := db.Exec("INSERT INTO delegations (hash, level, timestamp, sender, delegate, amount, status) VALUES ($1, $2, $3, $4, $5, $6, $7)", + delegations[i].Hash, + delegations[i].Level, + delegations[i].Timestamp, + delegations[i].Sender.Address, + delegations[i].NewDelegate.Address, + delegations[i].Amount, + delegations[i].Status) + if err != nil { + log.Fatal(err) + } else { + log.Printf("[pushDelegations] Delegation inserted: %d\n", i) + } + } else { + log.Printf("[pushDelegations] Delegation already exists: %v\n", delegations[i]) + } + } + } +} + +func run() { + // Verify that the required environment variables are set + if !pg_user_is_set || !pg_host_is_set || !pg_port_is_set || !pg_password_is_set || !pg_db_is_set { + fmt.Printf("[run] PG_HOST: \"%s\" => %t\n", pg_host, pg_host_is_set) + fmt.Printf("[run] PG_PORT: \"%s\" => %t\n", pg_port, pg_port_is_set) + fmt.Printf("[run] PG_USER: \"%s\" => %t\n", pg_user, pg_user_is_set) + fmt.Printf("[run] PG_DB: \"%s\" => %t\n", pg_db, pg_db_is_set) + log.Fatal("[run] Please set the required environment variables") + } + + // Connect to the database + db := connectDatabase() + // Create necessary tables + initDatabase(db) + // Get delegations from Tzkt.io + delegations := getDelegations() + // Push delegations to the database + pushDelegations(delegations, db) + + // Close the database connection + defer db.Close() +} + +func main() { + // Run the Indexer to get & push Delegations + run() +} diff --git a/app/indexer/types.go b/app/indexer/types.go new file mode 100644 index 0000000..22db753 --- /dev/null +++ b/app/indexer/types.go @@ -0,0 +1,49 @@ +package main + +// Define a Delegation struct +type Delegation struct { + Id int `json:"id"` + Type string `json:"type"` + Level int `json:"level"` + Timestamp string `json:"timestamp"` + Block string `json:"block"` + Hash string `json:"hash"` + Counter int `json:"counter"` + Initiator struct { + Alias string `json:"alias"` + Address string `json:"address"` + } `json:"initiator"` + Sender struct { + Alias string `json:"alias"` + Address string `json:"address"` + } `json:"sender"` + SenderCodeHash int `json:"senderCodeHash"` + Nonce int `json:"nonce"` + GasLimit int `json:"gasLimit"` + GasUsed int `json:"gasUsed"` + StorageLimit int `json:"storageLimit"` + BakerFee int `json:"bakerFee"` + Amount float64 `json:"amount"` + PrevDelegate struct { + Alias string `json:"alias"` + Address string `json:"address"` + } `json:"prevDelegate"` + NewDelegate struct { + Alias string `json:"alias"` + Address string `json:"address"` + } `json:"newDelegate"` + Status string `json:"status"` + Errors []struct { + Type string `json:"type"` + } `json:"errors"` + Quote struct { + Btc int `json:"btc"` + Eur int `json:"eur"` + Usd int `json:"usd"` + Cny int `json:"cny"` + Jpy int `json:"jpy"` + Krw int `json:"krw"` + Eth int `json:"eth"` + Gbp int `json:"gbp"` + } `json:"quote"` +} diff --git a/docker-compose.yaml b/docker-compose.yaml old mode 100755 new mode 100644 index e1dc322..1d14b18 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -5,14 +5,14 @@ services: ports: - ${POSTGRES_PORT:-changeme}:${POSTGRES_PORT:-changeme} environment: - - POSTGRES_DB=${POSTGRES_DATABASE:-changeme} + - POSTGRES_DB=${POSTGRES_DB:-changeme} - POSTGRES_USER=${POSTGRES_USERNAME:-changeme} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-changeme} healthcheck: test: [ "CMD-SHELL", - "POSTGRES_isready --dbname=tzktdelegator --username=appuser" + "POSTGRES_isready --dbname=tzktdelegations --username=appuser" ] interval: 30s timeout: 5s @@ -26,24 +26,46 @@ services: ports: - ${PGA_PORT:-changeme}:${PGA_PORT:-changeme} volumes: - - ./volumes/pgadmin4:/volumes/pgadmin4 + - ./volumes/pgadmin4/:/volumes/pgadmin4/ environment: - PGADMIN_LISTEN_PORT=${PGA_PORT:-changeme} - PGADMIN_DEFAULT_EMAIL=${PGA_USERNAME:-changeme} - PGADMIN_DEFAULT_PASSWORD=${PGA_PASSWORD:-changeme} - PGADMIN_SERVER_JSON_FILE=/volumes/pgadmin4/servers.json - app: + indexer: build: context: . - dockerfile: Dockerfile + dockerfile: Dockerfile.indexer depends_on: - postgres - restart: unless-stopped + restart: no + volumes: + - ./app/indexer/logs/:/app/indexer/logs/ + environment: + - POSTGRES_HOST=${POSTGRES_HOST:-changeme} + - POSTGRES_PORT=${POSTGRES_PORT:-changeme} + - POSTGRES_DB=${POSTGRES_DB:-changeme} + - POSTGRES_USERNAME=${POSTGRES_USERNAME:-changeme} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-changeme} + + api: + build: + context: . + dockerfile: Dockerfile.api + depends_on: + - postgres + - indexer + ports: + - ${API_PORT:-changeme}:${API_PORT:-changeme} + restart: always + volumes: + - ./app/api/logs/:/app/api/logs/ environment: + - API_PORT=${API_PORT:-changeme} - POSTGRES_HOST=${POSTGRES_HOST:-changeme} - POSTGRES_PORT=${POSTGRES_PORT:-changeme} - - POSTGRES_DATABASE=${POSTGRES_DATABASE:-changeme} + - POSTGRES_DB=${POSTGRES_DB:-changeme} - POSTGRES_USERNAME=${POSTGRES_USERNAME:-changeme} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-changeme} @@ -55,7 +77,7 @@ services: # ports: # - ${HSR_PORT:-changeme}:${HSR_PORT:-changeme} # environment: -# - HASURA_GRAPHQL_DATABASE_URL=postgres://${POSTGRES_USERNAME:-changeme}:${POSTGRES_PASSWORD:-changeme}@postgres:${POSTGRES_PORT:-changeme}/${POSTGRES_DATABASE:-changeme} +# - HASURA_GRAPHQL_DATABASE_URL=postgres://${POSTGRES_USERNAME:-changeme}:${POSTGRES_PASSWORD:-changeme}@postgres:${POSTGRES_PORT:-changeme}/${POSTGRES_DB:-changeme} # - HASURA_GRAPHQL_ADMIN_SECRET=${HSR_GRAPHQL_ADMIN_SECRET:-changeme} # - HASURA_GRAPHQL_ENABLE_CONSOLE=true # - HASURA_GRAPHQL_DEV_MODE=false diff --git a/docs/ASSIGNEMENT.md b/docs/ASSIGNEMENT.md old mode 100755 new mode 100644 index 0a8ea26..6c4646d --- a/docs/ASSIGNEMENT.md +++ b/docs/ASSIGNEMENT.md @@ -1,6 +1,8 @@ # Exercise: Tezos Delegation Service -In this exercise, you will build a service that gathers new [delegations](https://opentezos.com/baking/delegating/) made on the Tezos protocol and exposes them through a public API. +Build a service that : +- gathers new [delegations](https://opentezos.com/baking/delegating/) made on the Tezos protocol, +- exposes them through a public API. ## Requirements: diff --git a/docs/KILN - Mid Backend Exercice.pdf b/docs/KILN - Mid Backend Exercice.pdf deleted file mode 100755 index 71f9d7ef45b8b97e3f3679688e93cb030cc727e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155900 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≥DSW-_UQ?wuO7$uBWZKy%vEt$|D-Ul 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 Date: Thu, 6 Jul 2023 15:22:36 +0200 Subject: [PATCH 2/5] Year Filter Added (#4) * Working Build * Working Year Filter * Some cleaning From 4a6cd3ce2572d9ab6a64a0bf346e2433193367d0 Mon Sep 17 00:00:00 2001 From: Charaf ZELLOU Date: Fri, 7 Jul 2023 10:37:30 +0200 Subject: [PATCH 3/5] Optimization and Cleaning (#3) * Improvements to Data Response * Updated Github Actions * Update main.go * Update app/api/main.go * Update main.go * Update main.go --- .env.dist | 20 ++++++++++---------- .github/workflows/actions.yml | 6 ++++-- README.md | 2 +- app/api/main.go | 14 ++++++++++---- app/api/types.go | 20 +++++++++++++------- app/indexer/main.go | 2 ++ 6 files changed, 40 insertions(+), 24 deletions(-) diff --git a/.env.dist b/.env.dist index 4c6d669..8b09032 100644 --- a/.env.dist +++ b/.env.dist @@ -10,17 +10,17 @@ API_PORT="3000" POSTGRES_DROP=true # Postgres connection info -POSTGRES_HOST="postgres" -POSTGRES_PORT="5432" -POSTGRES_USERNAME="appuser" -POSTGRES_PASSWORD="SecretsOfPg!5432" -POSTGRES_DB="tzktdelegations" +POSTGRES_HOST="" +POSTGRES_PORT="" +POSTGRES_USERNAME="" +POSTGRES_PASSWORD="" +POSTGRES_DB="" # PGAdmin connection info -PGA_PORT="8080" -PGA_USERNAME="admin@postgres.com" -PGA_PASSWORD="Password123!" +PGA_PORT="" +PGA_USERNAME="" +PGA_PASSWORD="!" # Hasura connection info -HSR_PORT="8081" -HSR_GRAPHQL_ADMIN_SECRET="SuperSecretPassword123" \ No newline at end of file +HSR_PORT="" +HSR_GRAPHQL_ADMIN_SECRET="" \ No newline at end of file diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml index 4673743..513c452 100644 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -12,5 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - name: Build the Docker Compose - run: docker-compose build \ No newline at end of file + - name: Build the Indexer Docker Image + run: docker build . -f Dockerfile.indexer -t indexer + - name: Build the Api Docker Image + run: docker build . -f Dockerfile.api -t api \ No newline at end of file diff --git a/README.md b/README.md index fd52f89..e0731ac 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ go build . -o app - [X] The service will poll the new delegations from this Tzkt API endpoint: https://api.tzkt.io/#operation/Operations_GetDelegations - [X] For each delegation, save the following information: sender's address, timestamp, amount, and block. - [X] Expose the collected data through a public API at the endpoint `/xtz/delegations`. - - [ ] The expected response format is: + - [X] The expected response format is: ```json { diff --git a/app/api/main.go b/app/api/main.go index 279b6cf..42de552 100644 --- a/app/api/main.go +++ b/app/api/main.go @@ -46,7 +46,13 @@ func startApiServer(db *sql.DB) { params := c.Queries() log.Printf("Params: %v\n", params) log.Printf("params[\"year\"]: %v\n", params["year"]) - return c.JSON(streamDelegations(db, params["year"])) + error := c.JSON(streamDelegations(db, params["year"])) + if error != nil { + log.Fatalf("Error: %v\n", error) + } + var result Response + result.Data = streamDelegations(db, params["year"]) + return c.JSON(result) }) // Setup static files @@ -71,9 +77,9 @@ func streamDelegations(db *sql.DB, requested_year string) []DelegationApi { var err error // Query the database if requested_year == "" { - rows, err = db.Query("SELECT * FROM delegations") + rows, err = db.Query("SELECT timestamp, amount, sender, level FROM delegations") } else { - rows, err = db.Query("SELECT * FROM delegations WHERE EXTRACT(YEAR FROM timestamp) = $1", requested_year) + rows, err = db.Query("SELECT timestamp, amount, sender, level FROM delegations WHERE EXTRACT(YEAR FROM timestamp) = $1", requested_year) } if err != nil { log.Fatal(err) @@ -83,7 +89,7 @@ func streamDelegations(db *sql.DB, requested_year string) []DelegationApi { // Iterate over the rows for rows.Next() { var delegation DelegationApi - err := rows.Scan(&delegation.Hash, &delegation.Level, &delegation.Timestamp, &delegation.SenderAddress, &delegation.NewDelegateAddress, &delegation.Amount, &delegation.Status) + err := rows.Scan(&delegation.Timestamp, &delegation.Amount, &delegation.Delegator, &delegation.Block) if err != nil { log.Fatal(err) } diff --git a/app/api/types.go b/app/api/types.go index d4a831c..228fd3c 100644 --- a/app/api/types.go +++ b/app/api/types.go @@ -6,15 +6,21 @@ type Request struct { Year int `json:"year,omitempty"` } +type Response struct { + Data []DelegationApi `json:"data,omitempty"` +} + // Define a DelegationsApi struct +// +// "timestamp": "2022-05-05T06:29:14Z", +// "amount": "125896", +// "delegator": "tz1a1SAaXRt9yoGMx29rh9FsBF4UzmvojdTL", +// "block": "2338084" type DelegationApi struct { - Hash string `json:"hash"` - Level int `json:"level"` - Timestamp time.Time `json:"timestamp"` - SenderAddress string `json:"sender"` - NewDelegateAddress string `json:"newDelegate"` - Amount float64 `json:"amount"` - Status string `json:"status"` + Timestamp time.Time `json:"timestamp"` + Amount float64 `json:"amount"` + Delegator string `json:"delegator"` + Block int `json:"block"` } // Define a Delegation struct diff --git a/app/indexer/main.go b/app/indexer/main.go index ebc4fb1..f4e38d1 100644 --- a/app/indexer/main.go +++ b/app/indexer/main.go @@ -81,7 +81,9 @@ func getDelegations() []Delegation { var delegations []Delegation // Request delegations from https://api.tzkt.io/v1/operations/delegations for i := 0; i < getDelegationsCount(); i += 10000 { + // for i := 0; i < 1; i += 10000 { url := fmt.Sprintf("https://api.tzkt.io/v1/operations/delegations?limit=10000&offset=%d", i) + // url := fmt.Sprintf("https://api.tzkt.io/v1/operations/delegations?limit=100&offset=%d", i) log.Printf("[getDelegations] URL: %s\n", url) response, err := http.Get(url) if err != nil { From 3e2ae5c846d7be424b1d9a4bcf2314d11da3ea27 Mon Sep 17 00:00:00 2001 From: Charaf ZELLOU Date: Fri, 7 Jul 2023 10:43:46 +0200 Subject: [PATCH 4/5] Update README.md --- README.md | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index e0731ac..8d1274e 100644 --- a/README.md +++ b/README.md @@ -9,12 +9,11 @@ Build a service that : The original assignement document can be viewed [here](./docs/ASSIGNEMENT.md). ## Usage : -### Using `Make` : -Using `Make`, you can execute the following commands : +### Using `Docker-compose` : +Using `Docker-compose`, you can execute the following commands : ```bash -make install -make start +docker-compose up -d ``` @@ -22,10 +21,20 @@ make start - Using a local install of Go, you can execute the following commands : ```bash -source .env -cd src -go build . -o app -./app +cp .env.dist .env +``` + +- Set up your Environement Variables, then : + +```bash +cd app/indexer +go build . -o indexer +./indexer +``` +```bash +cd app/api +go build . -o api +./api ``` ## Checklist : @@ -57,4 +66,4 @@ go build . -o app - [X] The sender’s address is the delegator. - [X] The delegations must be listed most recent first. - [X] The endpoint takes one optional query parameter `year` , which is specified in the format `YYYY` and will result in the data being filtered for that year only. -- [ ] Ensure the service is production-ready, considering factors like performance, scalability, error handling, and reliability. \ No newline at end of file +- [ ] Ensure the service is production-ready, considering factors like performance, scalability, error handling, and reliability. From e64ef9c656e1a1e73e52d0dc5a2976a715d37a76 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Feb 2024 11:36:31 +0100 Subject: [PATCH 5/5] Bump github.com/gofiber/fiber/v2 from 2.47.0 to 2.52.1 in /app/api (#6) * Updated Readme (#5) * Working Build as per requirements (#1) * Working Build * Working Year Filter * Some cleaning * Year Filter Added (#4) * Working Build * Working Year Filter * Some cleaning * Optimization and Cleaning (#3) * Improvements to Data Response * Updated Github Actions * Update main.go * Update app/api/main.go * Update main.go * Update main.go * Update README.md * Bump github.com/gofiber/fiber/v2 from 2.47.0 to 2.52.1 in /app/api Bumps [github.com/gofiber/fiber/v2](https://github.com/gofiber/fiber) from 2.47.0 to 2.52.1. - [Release notes](https://github.com/gofiber/fiber/releases) - [Commits](https://github.com/gofiber/fiber/compare/v2.47.0...v2.52.1) --- updated-dependencies: - dependency-name: github.com/gofiber/fiber/v2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --------- Signed-off-by: dependabot[bot] Co-authored-by: Charaf ZELLOU Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- app/api/go.mod | 18 +++++------ app/api/go.sum | 81 +++++++++----------------------------------------- 2 files changed, 21 insertions(+), 78 deletions(-) diff --git a/app/api/go.mod b/app/api/go.mod index fcbe086..c7d2d00 100644 --- a/app/api/go.mod +++ b/app/api/go.mod @@ -3,24 +3,20 @@ module tzkt-delegations-api go 1.20 require ( - github.com/gofiber/fiber/v2 v2.47.0 + github.com/gofiber/fiber/v2 v2.52.1 github.com/lib/pq v1.10.9 ) require ( github.com/andybalholm/brotli v1.0.5 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/klauspost/compress v1.16.6 // indirect + github.com/google/uuid v1.5.0 // indirect + github.com/klauspost/compress v1.17.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect - github.com/philhofer/fwd v1.1.2 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect github.com/rivo/uniseg v0.4.4 // indirect - github.com/savsgio/dictpool v0.0.0-20221023140959-7bf2e61cea94 // indirect - github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee // indirect - github.com/tinylib/msgp v1.1.8 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasthttp v1.48.0 // indirect + github.com/valyala/fasthttp v1.51.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect - golang.org/x/sys v0.9.0 // indirect + golang.org/x/sys v0.15.0 // indirect ) diff --git a/app/api/go.sum b/app/api/go.sum index 0115584..6b7f612 100644 --- a/app/api/go.sum +++ b/app/api/go.sum @@ -1,83 +1,30 @@ github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/gofiber/fiber/v2 v2.47.0 h1:EN5lHVCc+Pyqh5OEsk8fzRiifgwpbrP0rulQ4iNf3fs= -github.com/gofiber/fiber/v2 v2.47.0/go.mod h1:mbFMVN1lQuzziTkkakgtKKdjfsXSw9BKR5lmcNksUoU= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/klauspost/compress v1.16.6 h1:91SKEy4K37vkp255cJ8QesJhjyRO0hn9i9G0GoUwLsk= -github.com/klauspost/compress v1.16.6/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/gofiber/fiber/v2 v2.52.1 h1:1RoU2NS+b98o1L77sdl5mboGPiW+0Ypsi5oLmcYlgHI= +github.com/gofiber/fiber/v2 v2.52.1/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= +github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= +github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= -github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= -github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/savsgio/dictpool v0.0.0-20221023140959-7bf2e61cea94 h1:rmMl4fXJhKMNWl+K+r/fq4FbbKI+Ia2m9hYBLm2h4G4= -github.com/savsgio/dictpool v0.0.0-20221023140959-7bf2e61cea94/go.mod h1:90zrgN3D/WJsDd1iXHT96alCoN2KJo6/4x1DZC3wZs8= -github.com/savsgio/gotils v0.0.0-20220530130905-52f3993e8d6d/go.mod h1:Gy+0tqhJvgGlqnTF8CVGP0AaGRjwBtXs/a5PA0Y3+A4= -github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee h1:8Iv5m6xEo1NR1AvpV+7XmhI4r39LGNzwUL4YpMuL5vk= -github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee/go.mod h1:qwtSXrKuJh/zsFQ12yEE89xfCrGKK63Rr7ctU/uCo4g= -github.com/tinylib/msgp v1.1.6/go.mod h1:75BAfg2hauQhs3qedfdDZmWAPcFMAvJE5b9rGOMufyw= -github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0= -github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.48.0 h1:oJWvHb9BIZToTQS3MuQ2R3bJZiNSa2KiNdeI8A+79Tc= -github.com/valyala/fasthttp v1.48.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= +github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1SqA= +github.com/valyala/fasthttp v1.51.0/go.mod h1:oI2XroL+lI7vdXyYoQk03bXBThfFl2cVdIA3Xl7cH8g= github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=