diff --git a/.github/workflows/informative-indexer-build.yml b/.github/workflows/informative-indexer-build.yml index 14fbf31b..472f4cd4 100644 --- a/.github/workflows/informative-indexer-build.yml +++ b/.github/workflows/informative-indexer-build.yml @@ -40,7 +40,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v5 with: - go-version: '1.22.7' + go-version: '1.23.7' cache: true - name: Run Tests @@ -88,4 +88,16 @@ jobs: body: '{ "event_type": "core_informative_indexer", "client_payload": { "network": "initia", "chain_id": "initiation-2", "sha_short": ${{ needs.push.outputs.sha_short }} } }' timeout: 10000 log-response: true - retries: 3 \ No newline at end of file + retries: 3 + + - id: dispatch-interwoven-1 + name: Dispatch to alleslabs/celatone-infrastructure for interwoven-1 + uses: indiesdev/curl@v1.1 + with: + url: https://api.github.com/repos/alleslabs/celatone-infrastructure/dispatches + method: "POST" + headers: '{ "Accept": "application/vnd.github.everest-preview+json", "Authorization": "token ${{ steps.token.outputs.github_token }}" }' + body: '{ "event_type": "core_informative_indexer", "client_payload": { "network": "initia", "chain_id": "interwoven-1", "sha_short": ${{ needs.push.outputs.sha_short }} } }' + timeout: 10000 + log-response: true + retries: 3 diff --git a/.github/workflows/unified-deployment.yml b/.github/workflows/unified-deployment.yml new file mode 100644 index 00000000..c80a25ce --- /dev/null +++ b/.github/workflows/unified-deployment.yml @@ -0,0 +1,65 @@ +name: Core Indexer Unified Deployment + +on: + workflow_dispatch: + push: + tags: + - "v*" + +env: + REGISTRY: ghcr.io + +jobs: + docker: + name: build-image + runs-on: ubuntu-latest + + strategy: + matrix: + service: + - { name: core-indexer-api, dockerfile: dockerfiles/Dockerfile.api } + - { name: event-indexer, dockerfile: dockerfiles/Dockerfile.event } + - { name: generic-indexer, dockerfile: dockerfiles/Dockerfile.generic } + - { name: informative-indexer, dockerfile: dockerfiles/Dockerfile.informative } + - { name: pruner, dockerfile: dockerfiles/Dockerfile.pruner } + - { name: sweeper, dockerfile: dockerfiles/Dockerfile.sweeper } + - { name: uploader, dockerfile: dockerfiles/Dockerfile.uploader } + + env: + IMAGE_NAME: ${{ matrix.service.name }} + DOCKERFILE_NAME: ${{ matrix.service.dockerfile }} + + permissions: + contents: read + packages: write + + outputs: + tags: ${{ steps.meta.outputs.tags }} + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Log in to the Container registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ env.IMAGE_NAME }} + + - name: Build and push + uses: docker/build-push-action@v6 + with: + context: . + file: ${{ env.DOCKERFILE_NAME }} + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + build-args: | + COMMIT_SHA=${{ github.sha }} diff --git a/.gitignore b/.gitignore index 75990d30..d6b4a499 100644 --- a/.gitignore +++ b/.gitignore @@ -56,3 +56,14 @@ __pycache__ venv *.bin .env + +tmp + +sweeper/sweeper +informative-indexer/informative-indexer +generic-indexer/generic-indexer + +# Go binaries (e.g. from go build in api/) +api/api +event-indexer/event-indexer +tx-response-uploader/tx-response-uploader diff --git a/README.md b/README.md index 8cf70d31..e500688d 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,117 @@ # Core Indexer -## Informative Indexer +## Components -### Components +### API +REST API service that provides endpoints for querying indexed blockchain data. Built with Fiber framework and includes comprehensive Swagger documentation. -**Sweeper** - Polls the RPC for new block data and submits it to the message queue. +**Features:** +- Account data queries +- Block information retrieval +- Module transaction tracking +- NFT data and transaction history +- Governance proposal information +- Transaction details and history +- Validator information and metrics +- Health check endpoints +- CORS support and request logging -**Flusher** - Consumes messages from the queue and processes them into the database. +### Event Indexer +Specialized indexer for blockchain events with comprehensive event tracking capabilities. Processes transaction events, block events, and Move smart contract events. -**Prunner** - Periodically prunes the database and stores backups in a cloud storage service. +**Features:** +- Transaction event processing and indexing +- Block finalization event capture +- Move smart contract event tracking +- Database migration management +- Data pruning with cloud storage backup +- Command-line interface with multiple modes -### Workflow Summary +**Commands:** +- `indexer` - Main indexing process +- `migrate` - Database migration operations +- `prunner` - Data pruning and archival -Each service runs continuously and must be executed together for the indexer to function properly. +### Generic Indexer +General-purpose blockchain data indexer with both continuous and scheduled processing capabilities. Handles comprehensive blockchain state tracking and account management. + +**Features:** +- Continuous block processing +- Cron-based batch operations +- Account data indexing +- Block result processing +- Validator state tracking +- Batch insertion optimization +- Multi-mode operation support + +**Commands:** +- `indexer` - Continuous indexing mode +- `indexercron` - Scheduled batch processing mode + +### Informative Indexer +Comprehensive blockchain data processor with specialized module processors for different blockchain components. Features advanced state tracking and caching mechanisms. + +**Features:** +- Modular processor architecture (auth, bank, IBC, move, OPinit, gov, staking) +- State tracking and management +- Data caching for performance optimization +- Genesis block processing +- Event processing utilities +- Validator uptime tracking +- Batch state updates + +**Commands:** +- `indexer` - Main processing engine +- `migrate` - Database schema management + +### Sweeper +High-performance data collection service that polls RPC endpoints for new blockchain data and distributes it via message queues. + +**Features:** +- RPC endpoint polling +- Block data retrieval +- Message queue publishing +- Database migration on startup +- Error handling and retry logic +- Configurable polling intervals + +### TX Response Uploader +Message queue consumer that processes transaction response data and uploads it to cloud storage systems with support for large message handling. + +**Features:** +- Kafka message consumption +- Cloud storage integration (GCS) +- Claim check pattern support for large messages +- Dead letter queue error handling +- Retry mechanisms with exponential backoff +- Transaction response archival +- Sentry integration for monitoring + +## Workflow Summary + +The indexer ecosystem consists of multiple specialized services that work together to provide comprehensive blockchain data indexing and querying capabilities. + +**Core Data Flow:** + +1. **Sweeper** retrieves new block data from RPC endpoints and publishes it to message queues +2. **Indexers** (Event, Generic, Informative) consume messages and process blockchain data into the database +3. **API** serves the indexed data through REST endpoints +4. **TX Response Uploader** handles transaction response storage in cloud services +5. **Pruners** manage data lifecycle and storage optimization **Sweeper** -1. Retrieves the latest indexed block from the database. -2. Fetches data for the next block using the RPC methods `/block` and `/block_results`. -3. Publishes the block data as a message to the message queue. +1. On startup, applies any pending database migrations. +2. Retrieves the latest indexed block from the database. +3. Fetches data for the next block using the RPC methods `/block` and `/block_results`. +4. Publishes the block data as a message to the message queue. -**Flusher** +**Indexers** -1. Subscribes to and reads messages from the queue. -2. Processes each message and inserts the data into the database. +1. Subscribe to and read messages from the queue. +2. Process each message using specialized processors for different blockchain modules. +3. Insert processed data into the database with batch operations for efficiency. +4. Handle state tracking and caching for optimized performance. **Prunner** @@ -34,6 +122,6 @@ Each service runs continuously and must be executed together for the indexer to 2. Uploads the data to a cloud storage service. 3. Deletes the fetched rows from the database. -### Running Locally +## Running Locally -Follow the guide for running the Informative Indexer with Docker: [dockerfiles/README.md](dockerfiles/README.md). +To run the Informative Indexer with Docker locally, follow this [guide](local/README.md). diff --git a/api/.env.example b/api/.env.example new file mode 100644 index 00000000..b58d06c0 --- /dev/null +++ b/api/.env.example @@ -0,0 +1,5 @@ +DB_CONNECTION_STRING_RO=postgres://readonly:password@localhost:5432/initiation-2?sslmode=disable +ENVIRONMENT=local +CHAIN_ID=initiation-2 +BUCKETS=newer-bucket-name,legacy-bucket-name +PORT=8080 diff --git a/api/README.md b/api/README.md new file mode 100644 index 00000000..23f72660 --- /dev/null +++ b/api/README.md @@ -0,0 +1,72 @@ +# Core Indexer API + +This is the API service for the Core Indexer project, built with Go Fiber. + +## Prerequisites + +- Go 1.21 or higher +- Git +- Air (for hot reloading) + +## Setup + +1. Install dependencies: + +```bash +go mod download +``` + +2. Create a `.env` file in the root directory (optional): + +```bash +PORT=8080 +``` + +## Running the Application + +### Development Mode (with Hot Reload) + +To run the application with hot reload (recommended for development): + +```bash +air +``` + +The server will automatically restart when you make changes to the code. + +### Production Mode + +To run the application without hot reload: + +```bash +go run main.go +``` + +The server will start on port 3000 by default (or the port specified in your .env file). + +## API Endpoints + +- `GET /`: Welcome message +- `GET /indexer/swagger/*`: Swagger documentation + +## Project Structure + +``` +api/ +├── main.go # Application entry point +├── routes/ # Route definitions +│ └── routes.go +├── dto/ # Data Transfer Objects +│ └── nft.go +├── go.mod # Go module file +├── .air.toml # Air configuration +└── README.md # This file +``` + +## Development + +To add new routes: + +1. Create new handler functions in the appropriate package +2. Add the routes in `routes/routes.go` +3. Import and use the handlers in your routes diff --git a/api/apperror/errors.go b/api/apperror/errors.go new file mode 100644 index 00000000..3fb7d545 --- /dev/null +++ b/api/apperror/errors.go @@ -0,0 +1,23 @@ +package apperror + +// Common error messages +const ( + ErrMsgBadRequest = "Invalid request" + ErrMsgUnauthorized = "Unauthorized" + ErrMsgNotFound = "Resource not found" + ErrMsgInternal = "Internal server error" + ErrMsgProposalId = "Proposal id is not a valid int32 integer" + ErrMsgBlocks = "Blocks argument is not a valid integer" + ErrMsgBlocksZero = "Blocks must be greater than 0" + ErrMsgBlocksRequired = "Blocks parameter is required" + ErrMsgModuleNotFound = "Module not found" + ErrMsgDuplicateStatus = "Duplicate status in query" + ErrMsgTxNotFound = "Transaction not found for hash %s" + ErrMsgNoValidTxFiles = "No valid transaction files found for hash %s" + ErrMsgInvalidLimit = "Limit must be between 1 and 1000" + ErrMsgLimitInteger = "Limit must be in integer format" + ErrMsgOffsetInteger = "Offset must be in integer format" + ErrMsgReverse = "Reverse must be a boolean" + ErrMsgCountTotal = "CountTotal must be a boolean" + ErrMsgHeightInteger = "Height must be in integer format" +) diff --git a/api/apperror/response.go b/api/apperror/response.go new file mode 100644 index 00000000..8197b1b5 --- /dev/null +++ b/api/apperror/response.go @@ -0,0 +1,136 @@ +package apperror + +import ( + "errors" + "fmt" + + "github.com/gofiber/fiber/v2" + "gorm.io/gorm" +) + +// Response represents a standardized error response +type Response struct { + Code ErrorCode `json:"status_code"` + Message string `json:"message"` +} + +// Error implements the error interface +func (e *Response) Error() string { + return e.Message +} + +type ErrorCode int + +// Common error codes +const ( + ErrCodeBadRequest ErrorCode = 400 + ErrCodeUnauthorized ErrorCode = 401 + ErrCodeNotFound ErrorCode = 404 + ErrCodeInternal ErrorCode = 500 +) + +// NewResponse creates a new error response +func NewResponse(code ErrorCode, message string) *Response { + return &Response{ + Code: code, + Message: message, + } +} + +// NewNotFound creates a not found error response +func NewNotFound() *Response { + return NewResponse(ErrCodeNotFound, ErrMsgNotFound) +} + +// NewBadRequest creates a bad request error response +func NewBadRequest() *Response { + return NewResponse(ErrCodeBadRequest, ErrMsgBadRequest) +} + +// NewValidationError creates a validation error response +func NewValidationError(message string) *Response { + return NewResponse(ErrCodeBadRequest, message) +} + +// NewInternal creates an internal server error response +func NewInternal() *Response { + return NewResponse(ErrCodeInternal, ErrMsgInternal) +} + +// NewUnauthorized creates an unauthorized error response +func NewUnauthorized() *Response { + return NewResponse(ErrCodeUnauthorized, ErrMsgUnauthorized) +} + +// NewDuplicateStatus creates a duplicate status error response +func NewDuplicateStatus() *Response { + return NewResponse(ErrCodeBadRequest, ErrMsgDuplicateStatus) +} + +// NewTxNotFound creates a transaction not found error response +func NewTxNotFound(hash string) *Response { + return NewResponse(ErrCodeNotFound, fmt.Sprintf(ErrMsgTxNotFound, hash)) +} + +// NewNoValidTxFiles creates a no valid transaction files error response +func NewNoValidTxFiles(hash string) *Response { + return NewResponse(ErrCodeNotFound, fmt.Sprintf(ErrMsgNoValidTxFiles, hash)) +} + +// NewInvalidLimit creates an invalid limit error response +func NewInvalidLimit() *Response { + return NewResponse(ErrCodeBadRequest, ErrMsgInvalidLimit) +} + +// NewLimitInteger creates a limit integer error response +func NewLimitInteger() *Response { + return NewResponse(ErrCodeBadRequest, ErrMsgLimitInteger) +} + +// NewOffsetInteger creates an offset integer error response +func NewOffsetInteger() *Response { + return NewResponse(ErrCodeBadRequest, ErrMsgOffsetInteger) +} + +// NewReverse creates a reverse boolean error response +func NewReverse() *Response { + return NewResponse(ErrCodeBadRequest, ErrMsgReverse) +} + +// NewCountTotal creates a count total boolean error response +func NewCountTotal() *Response { + return NewResponse(ErrCodeBadRequest, ErrMsgCountTotal) +} + +// NewHeightInteger creates a height integer error response +func NewHeightInteger() *Response { + return NewResponse(ErrCodeBadRequest, ErrMsgHeightInteger) +} + +// handleError transforms any error into a standardized error response +func handleError(err error) *Response { + var resp *Response + if errors.As(err, &resp) { + return resp + } + + // Handle GORM not found + if errors.Is(err, gorm.ErrRecordNotFound) { + return NewNotFound() + } + + // For other errors, wrap them in an internal error + return NewInternal() +} + +// HandleErrorResponse is a helper function that handles error responses in a standardized way +// It takes an error, converts it to a Response, and returns the appropriate HTTP response +func HandleErrorResponse(c *fiber.Ctx, err error) error { + errResp := handleError(err) + return c.Status(errResp.Code.Int()).JSON(errResp) +} + +// Int returns the error code as an int +func (e ErrorCode) Int() int { + return int(e) +} diff --git a/api/config/config.go b/api/config/config.go new file mode 100644 index 00000000..e5477543 --- /dev/null +++ b/api/config/config.go @@ -0,0 +1,175 @@ +package config + +import ( + "os" + "strconv" + "strings" + "time" +) + +// Config holds all configuration for the application +type Config struct { + // Server configuration + Server struct { + Port string + ReadTimeout time.Duration + WriteTimeout time.Duration + IdleTimeout time.Duration + } + + // Database configuration + Database struct { + ConnectionString string + MaxOpenConns int + MaxIdleConns int + ConnMaxLifetime time.Duration + ConnMaxIdleTime time.Duration + } + + // Repository configuration + Repository struct { + CountQueryTimeout time.Duration + } + + // Environment + Environment string + + // ChainID + ChainID string + + // Storage + Storage struct { + Buckets []string + TxResponseCacheBytes int64 + TxMaxWorkers int + } + + // Observability + Observability struct { + RuntimeMetricsEnabled bool + } +} + +// New creates a new Config instance with values from environment variables +func New() *Config { + config := &Config{} + + // Server configuration + config.Server.Port = getEnv("PORT", "8080") + config.Server.ReadTimeout = getDurationEnv("SERVER_READ_TIMEOUT", 15*time.Second) + config.Server.WriteTimeout = getDurationEnv("SERVER_WRITE_TIMEOUT", 30*time.Second) + config.Server.IdleTimeout = getDurationEnv("SERVER_IDLE_TIMEOUT", 60*time.Second) + + // Database configuration + config.Database.ConnectionString = getEnv("DB_CONNECTION_STRING_RO", "postgres://postgres:postgres@localhost:5432/core_indexer?sslmode=disable") + config.Database.MaxOpenConns = getIntEnv("DB_MAX_OPEN_CONNS", 10) + config.Database.MaxIdleConns = getIntEnv("DB_MAX_IDLE_CONNS", 5) + config.Database.ConnMaxLifetime = getDurationEnv("DB_CONN_MAX_LIFETIME", 30*time.Minute) + config.Database.ConnMaxIdleTime = getDurationEnv("DB_CONN_MAX_IDLE_TIME", 5*time.Minute) + + // Repository configuration + config.Repository.CountQueryTimeout = getDurationEnv("REPOSITORY_COUNT_QUERY_TIMEOUT", 5*time.Second) + + // Environment + config.Environment = getEnv("ENVIRONMENT", "local") + + // ChainID + config.ChainID = getEnv("CHAIN_ID", "initiation-2") + + // GCS Buckets + config.Storage.Buckets = strings.Split(getEnv("BUCKETS", ""), ",") + config.Storage.TxResponseCacheBytes = getBytesEnv("TX_RESPONSE_CACHE_BYTES", 64*1024*1024) + config.Storage.TxMaxWorkers = getIntEnv("TX_RESPONSE_MAX_WORKERS", 10) + + // Observability + config.Observability.RuntimeMetricsEnabled = getBoolEnv("ENABLE_RUNTIME_METRICS", false) + + return config +} + +// getEnv gets an environment variable or returns a default value +func getEnv(key, defaultValue string) string { + value := os.Getenv(key) + if value == "" { + return defaultValue + } + return value +} + +// getDurationEnv gets a duration environment variable or returns a default value +func getDurationEnv(key string, defaultValue time.Duration) time.Duration { + value := os.Getenv(key) + if value == "" { + return defaultValue + } + duration, err := time.ParseDuration(value) + if err != nil { + return defaultValue + } + return duration +} + +// getIntEnv gets an integer environment variable or returns a default value. +func getIntEnv(key string, defaultValue int) int { + value := os.Getenv(key) + if value == "" { + return defaultValue + } + parsed, err := strconv.Atoi(value) + if err != nil { + return defaultValue + } + return parsed +} + +// getBoolEnv gets a boolean environment variable or returns a default value. +func getBoolEnv(key string, defaultValue bool) bool { + value := os.Getenv(key) + if value == "" { + return defaultValue + } + parsed, err := strconv.ParseBool(value) + if err != nil { + return defaultValue + } + return parsed +} + +// getBytesEnv parses byte values with optional KiB/MiB/GiB or KB/MB/GB suffixes. +func getBytesEnv(key string, defaultValue int64) int64 { + value := strings.TrimSpace(os.Getenv(key)) + if value == "" { + return defaultValue + } + + unit := int64(1) + number := value + lower := strings.ToLower(value) + + units := []struct { + suffix string + multiplier int64 + }{ + {suffix: "gib", multiplier: 1024 * 1024 * 1024}, + {suffix: "gb", multiplier: 1000 * 1000 * 1000}, + {suffix: "mib", multiplier: 1024 * 1024}, + {suffix: "mb", multiplier: 1000 * 1000}, + {suffix: "kib", multiplier: 1024}, + {suffix: "kb", multiplier: 1000}, + {suffix: "b", multiplier: 1}, + } + + for _, candidate := range units { + if strings.HasSuffix(lower, candidate.suffix) { + unit = candidate.multiplier + number = strings.TrimSpace(value[:len(value)-len(candidate.suffix)]) + break + } + } + + parsed, err := strconv.ParseInt(number, 10, 64) + if err != nil || parsed < 0 { + return defaultValue + } + return parsed * unit +} diff --git a/api/docs/docs.go b/api/docs/docs.go new file mode 100644 index 00000000..742fe1d0 --- /dev/null +++ b/api/docs/docs.go @@ -0,0 +1,4581 @@ +// Package docs Code generated by swaggo/swag. DO NOT EDIT +package docs + +import "github.com/swaggo/swag" + +const docTemplate = `{ + "schemes": {{ marshal .Schemes }}, + "swagger": "2.0", + "info": { + "description": "{{escape .Description}}", + "title": "{{.Title}}", + "termsOfService": "http://swagger.io/terms/", + "contact": { + "name": "API Support", + "url": "http://www.swagger.io/support", + "email": "support@swagger.io" + }, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + }, + "version": "{{.Version}}" + }, + "host": "{{.Host}}", + "basePath": "{{.BasePath}}", + "paths": { + "/indexer/account/v1/{accountAddress}": { + "get": { + "description": "Retrieve account details by account address", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Account" + ], + "summary": "Get account by address", + "parameters": [ + { + "type": "string", + "description": "Account address", + "name": "accountAddress", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/db.Account" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/account/v1/{accountAddress}/proposals": { + "get": { + "description": "Retrieve proposals associated with an account", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Account" + ], + "summary": "Get account proposals", + "parameters": [ + { + "type": "string", + "description": "Account address", + "name": "accountAddress", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to count total Nfts", + "name": "pagination.count_total", + "in": "query" + }, + { + "type": "boolean", + "default": true, + "description": "Whether to reverse the order of transactions", + "name": "pagination.reverse", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.AccountProposalsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/account/v1/{accountAddress}/txs": { + "get": { + "description": "Retrieve transactions associated with an account", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Account" + ], + "summary": "Get account transactions", + "parameters": [ + { + "type": "string", + "description": "Account address", + "name": "accountAddress", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to count total transactions", + "name": "pagination.count_total", + "in": "query" + }, + { + "type": "boolean", + "default": true, + "description": "Whether to reverse the order of transactions", + "name": "pagination.reverse", + "in": "query" + }, + { + "type": "string", + "description": "Search term for transactions", + "name": "search", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Filter by sent transactions", + "name": "is_send", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Filter by IBC transactions", + "name": "is_ibc", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Filter by OPINIT transactions", + "name": "is_opinit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Filter by Move publish transactions", + "name": "is_move_publish", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Filter by Move upgrade transactions", + "name": "is_move_upgrade", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Filter by Move execute transactions", + "name": "is_move_execute", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Filter by Move script transactions", + "name": "is_move_script", + "in": "query" + }, + { + "type": "boolean", + "description": "Filter by transactions where the account is a signer", + "name": "is_signer", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.AccountTxsResponse" + } + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/block/v1/avg_block_time": { + "get": { + "description": "Retrieve the average time taken to mine a block", + "produces": [ + "application/json" + ], + "tags": [ + "Block" + ], + "summary": "Get average block time", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.BlockTimeAverageResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/block/v1/blocks": { + "get": { + "description": "Retrieve a list of blocks with pagination", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Block" + ], + "summary": "Get blocks", + "parameters": [ + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total number of transactions", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.BlocksResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/block/v1/blocks/{height}/info": { + "get": { + "description": "Retrieve detailed information about a block by its height", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Block" + ], + "summary": "Get block info by height", + "parameters": [ + { + "type": "integer", + "description": "Block height", + "name": "height", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.BlockInfoResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/block/v1/blocks/{height}/txs": { + "get": { + "description": "Retrieve transactions in a block by its height with pagination", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Block" + ], + "summary": "Get transactions in a block by height", + "parameters": [ + { + "type": "integer", + "description": "Block height", + "name": "height", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total number of transactions", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.BlockTxsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/block/v1/latest_block_height": { + "get": { + "description": "Retrieve the latest block height", + "produces": [ + "application/json" + ], + "tags": [ + "Block" + ], + "summary": "Get latest block height", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.BlockHeightLatestResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/block/v1/latest_informative_block_height": { + "get": { + "description": "Retrieve the latest informative block height", + "produces": [ + "application/json" + ], + "tags": [ + "Block" + ], + "summary": "Get latest informative block height", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.BlockHeightInformativeLatestResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/module/v1/modules": { + "get": { + "description": "Retrieve a list of modules with pagination", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Module" + ], + "summary": "Get modules", + "parameters": [ + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ModulesResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/module/v1/modules/{vmAddress}/{name}": { + "get": { + "description": "Retrieve a module by id", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Module" + ], + "summary": "Get module by id", + "parameters": [ + { + "type": "string", + "description": "VM address", + "name": "vmAddress", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Module name", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ModuleResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/module/v1/modules/{vmAddress}/{name}/histories": { + "get": { + "description": "Retrieve a list of module histories with pagination", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Module" + ], + "summary": "Get module histories", + "parameters": [ + { + "type": "string", + "description": "VM address", + "name": "vmAddress", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Module name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ModuleHistoriesResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/module/v1/modules/{vmAddress}/{name}/proposals": { + "get": { + "description": "Retrieve a module proposal", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Module" + ], + "summary": "Get module proposal", + "parameters": [ + { + "type": "string", + "description": "VM address", + "name": "vmAddress", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Module name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ModuleProposalsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/module/v1/modules/{vmAddress}/{name}/publish_info": { + "get": { + "description": "Retrieve a module publish info", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Module" + ], + "summary": "Get module publish info", + "parameters": [ + { + "type": "string", + "description": "VM address", + "name": "vmAddress", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Module name", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ModulePublishInfoResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/module/v1/modules/{vmAddress}/{name}/stats": { + "get": { + "description": "Retrieve a module stats", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Module" + ], + "summary": "Get module stats by module id", + "parameters": [ + { + "type": "string", + "description": "VM address", + "name": "vmAddress", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Module name", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ModuleStatsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/module/v1/modules/{vmAddress}/{name}/transactions": { + "get": { + "description": "Retrieve a module transaction", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Module" + ], + "summary": "Get module transaction", + "parameters": [ + { + "type": "string", + "description": "VM address", + "name": "vmAddress", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Module name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ModuleTxsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/nft/v1/collections": { + "get": { + "description": "Retrieve a list of Nft collections with optional search and pagination", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Nft" + ], + "summary": "Get Nft collections", + "parameters": [ + { + "type": "string", + "description": "Search term for filtering Nfts", + "name": "search", + "in": "query" + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to count total Nfts", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.NftCollectionsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/nft/v1/collections/by_account/{accountAddress}": { + "get": { + "description": "Retrieve a list of Nft collections owned by a specific account address", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Nft" + ], + "summary": "Get Nft collections by account address", + "parameters": [ + { + "type": "string", + "description": "Account address of the Nft owner", + "name": "accountAddress", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.NftCollectionsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/nft/v1/collections/{collectionAddress}": { + "get": { + "description": "Retrieve a specific Nft collection by its collection address", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Nft" + ], + "summary": "Get Nft collection by collection address", + "parameters": [ + { + "type": "string", + "description": "Collection address of the Nft", + "name": "collectionAddress", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.NftCollectionResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/nft/v1/collections/{collectionAddress}/activities": { + "get": { + "description": "Retrieve activities related to a specific Nft collection with optional search and pagination", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Nft" + ], + "summary": "Get Nft collection activities", + "parameters": [ + { + "type": "string", + "description": "Collection address of the Nft", + "name": "collectionAddress", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Search term for filtering activities", + "name": "search", + "in": "query" + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Reverse order for pagination", + "name": "pagination.reverse", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total number of transactions", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.CollectionActivitiesResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/nft/v1/collections/{collectionAddress}/creator": { + "get": { + "description": "Retrieve the creator of a specific Nft collection by its address", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Nft" + ], + "summary": "Get Nft collection creator", + "parameters": [ + { + "type": "string", + "description": "Collection address of the Nft", + "name": "collectionAddress", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.CollectionCreatorResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/nft/v1/collections/{collectionAddress}/mutate_events": { + "get": { + "description": "Retrieve mutate events for a specific Nft collection by its address with pagination", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Nft" + ], + "summary": "Get Nft collection mutate events", + "parameters": [ + { + "type": "string", + "description": "Collection address of the Nft", + "name": "collectionAddress", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to count total events", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.CollectionMutateEventsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/nft/v1/token/{nftAddress}/mint_info": { + "get": { + "description": "Retrieve mint information for a specific Nft by its address", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Nft" + ], + "summary": "Get Nft mint information", + "parameters": [ + { + "type": "string", + "description": "Nft address", + "name": "nftAddress", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.NftMintInfoResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/nft/v1/token/{nftAddress}/mutate_events": { + "get": { + "description": "Retrieve mutate events for a specific Nft by its address with pagination", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Nft" + ], + "summary": "Get Nft mutate events", + "parameters": [ + { + "type": "string", + "description": "Nft address", + "name": "nftAddress", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to count total Nfts", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.NftMutateEventsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/nft/v1/token/{nftAddress}/txs": { + "get": { + "description": "Retrieve transactions related to a specific Nft by its address with pagination", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Nft" + ], + "summary": "Get Nft transactions", + "parameters": [ + { + "type": "string", + "description": "Nft address", + "name": "nftAddress", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to count total Nfts", + "name": "pagination.count_total", + "in": "query" + }, + { + "type": "boolean", + "default": true, + "description": "Whether to reverse the order of transactions", + "name": "pagination.reverse", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.NftTxsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/nft/v1/tokens/by_account/{accountAddress}": { + "get": { + "description": "Retrieve a list of Nfts owned by a specific account address with optional search and collection filtering", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Nft" + ], + "summary": "Get Nfts by account address", + "parameters": [ + { + "type": "string", + "description": "Account address of the Nfts owner", + "name": "accountAddress", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Search term for filtering Nfts", + "name": "search", + "in": "query" + }, + { + "type": "string", + "description": "Collection address to filter Nfts", + "name": "collectionAddress", + "in": "query" + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to count total Nfts", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.NftsByAddressResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/nft/v1/tokens/by_collection/{collectionAddress}": { + "get": { + "description": "Retrieve a list of Nfts by their collection address with optional search and pagination", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Nft" + ], + "summary": "Get Nfts by collection address", + "parameters": [ + { + "type": "string", + "description": "Collection address of the Nfts", + "name": "collectionAddress", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Search term for filtering Nfts", + "name": "search", + "in": "query" + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to count total Nfts", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.NftsByAddressResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/nft/v1/tokens/by_collection/{collectionAddress}/{nftAddress}": { + "get": { + "description": "Retrieve a specific Nft by its collection address and Nft address", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Nft" + ], + "summary": "Get Nft by collection address and Nft address", + "parameters": [ + { + "type": "string", + "description": "Collection address of the Nft", + "name": "collectionAddress", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Nft address", + "name": "nftAddress", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.NftByAddressResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/proposal/v1/proposals": { + "get": { + "description": "Retrieve the list of all proposals", + "produces": [ + "application/json" + ], + "tags": [ + "Proposal" + ], + "summary": "Get list of proposals", + "parameters": [ + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Reverse order for pagination", + "name": "pagination.reverse", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total number of transactions", + "name": "pagination.count_total", + "in": "query" + }, + { + "type": "string", + "default": "", + "description": "Filter proposals by proposer", + "name": "proposer", + "in": "query" + }, + { + "type": "string", + "default": "", + "description": "Filter proposals by status(es)", + "name": "statuses", + "in": "query" + }, + { + "type": "string", + "default": "", + "description": "Filter proposals by proposal type", + "name": "types", + "in": "query" + }, + { + "type": "string", + "default": "", + "description": "Search proposals by title or exact proposal id", + "name": "search", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ProposalsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/proposal/v1/proposals/types": { + "get": { + "description": "Retrieve all submitted proposal types", + "produces": [ + "application/json" + ], + "tags": [ + "Proposal" + ], + "summary": "Get list of submitted proposal types", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/proposal/v1/proposals/{proposalId}/answer_counts": { + "get": { + "description": "Retrieve vote counts of a proposal by options", + "produces": [ + "application/json" + ], + "tags": [ + "Proposal" + ], + "summary": "Get votes count of a proposal", + "parameters": [ + { + "type": "string", + "description": "Proposal Id", + "name": "proposalId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ProposalAnswerCountsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/proposal/v1/proposals/{proposalId}/info": { + "get": { + "description": "Retrieve proposal details", + "produces": [ + "application/json" + ], + "tags": [ + "Proposal" + ], + "summary": "Get proposal info", + "parameters": [ + { + "type": "string", + "description": "Proposal Id", + "name": "proposalId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ProposalInfoResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/proposal/v1/proposals/{proposalId}/validator_votes": { + "get": { + "description": "Retrieve list of all proposal votes by validators", + "produces": [ + "application/json" + ], + "tags": [ + "Proposal" + ], + "summary": "Get validator votes of a proposal", + "parameters": [ + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Reverse order for pagination", + "name": "pagination.reverse", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total number of transactions", + "name": "pagination.count_total", + "in": "query" + }, + { + "type": "string", + "description": "Proposal Id", + "name": "proposalId", + "in": "path", + "required": true + }, + { + "type": "string", + "default": "", + "description": "Search proposal vote by validator moniker or address", + "name": "search", + "in": "query" + }, + { + "type": "string", + "default": "", + "description": "Search proposal votes by vote option", + "name": "answer", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ProposalValidatorVotesResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/proposal/v1/proposals/{proposalId}/votes": { + "get": { + "description": "Retrieve list of all proposal votes", + "produces": [ + "application/json" + ], + "tags": [ + "Proposal" + ], + "summary": "Get all proposal votes", + "parameters": [ + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Reverse order for pagination", + "name": "pagination.reverse", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total number of transactions", + "name": "pagination.count_total", + "in": "query" + }, + { + "type": "string", + "description": "Proposal Id", + "name": "proposalId", + "in": "path", + "required": true + }, + { + "type": "string", + "default": "", + "description": "Search proposal vote by voter address", + "name": "search", + "in": "query" + }, + { + "type": "string", + "default": "", + "description": "Search proposal votes by vote option", + "name": "answer", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ProposalVotesResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/tx/v1/txs": { + "get": { + "description": "Retrieve a list of transactions with pagination", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Transaction" + ], + "summary": "Get transactions", + "parameters": [ + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Reverse order for pagination", + "name": "pagination.reverse", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total number of transactions", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.TxsModelResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/tx/v1/txs/by_account/{accountAddress}": { + "get": { + "description": "Retrieve transactions by account address", + "produces": [ + "application/json" + ], + "tags": [ + "Transaction" + ], + "summary": "Get transactions by account address", + "parameters": [ + { + "type": "string", + "description": "Account address", + "name": "accountAddress", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Reverse order for pagination", + "name": "pagination.reverse", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total number of transactions", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.TxsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/tx/v1/txs/count": { + "get": { + "description": "Retrieve the total number of transactions", + "produces": [ + "application/json" + ], + "tags": [ + "Transaction" + ], + "summary": "Get transaction count", + "responses": { + "200": { + "description": "Transaction count", + "schema": { + "type": "integer" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/tx/v1/txs/{tx_hash}": { + "get": { + "description": "Retrieve transaction details by its hash", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Transaction" + ], + "summary": "Get transaction by hash", + "parameters": [ + { + "type": "string", + "description": "Transaction hash", + "name": "tx_hash", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.TxByHashResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/validator/v1/validators": { + "get": { + "description": "Retrieve the list of all validators", + "produces": [ + "application/json" + ], + "tags": [ + "Validator" + ], + "summary": "Get list of validators", + "parameters": [ + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Reverse order for pagination", + "name": "pagination.reverse", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total number of transactions", + "name": "pagination.count_total", + "in": "query" + }, + { + "type": "boolean", + "default": true, + "description": "Query for active validators", + "name": "is_active", + "in": "query" + }, + { + "type": "string", + "default": "", + "description": "Sort validators by field: 'uptime', 'commission', 'moniker' or empty for default (voting power)", + "name": "sort_by", + "in": "query" + }, + { + "type": "string", + "default": "", + "description": "Search validators by moniker or exact operator address", + "name": "search", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ValidatorsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/validator/v1/validators/{operatorAddr}/answer_counts": { + "get": { + "description": "Get validator voted governance proposal answers count", + "produces": [ + "application/json" + ], + "tags": [ + "Validator" + ], + "summary": "Get validator proposal answers count", + "parameters": [ + { + "type": "string", + "description": "Validator operator address", + "name": "operatorAddr", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ValidatorAnswerCountsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/validator/v1/validators/{operatorAddr}/delegation_related_txs": { + "get": { + "description": "Retrieves list of delegation related of a validator", + "produces": [ + "application/json" + ], + "tags": [ + "Validator" + ], + "summary": "Get delegation transactions of a validator", + "parameters": [ + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Reverse order for pagination", + "name": "pagination.reverse", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total number of transactions", + "name": "pagination.count_total", + "in": "query" + }, + { + "type": "string", + "description": "Validator operator address", + "name": "operatorAddr", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ValidatorDelegationRelatedTxsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/validator/v1/validators/{operatorAddr}/historical_powers": { + "get": { + "description": "Retrieves historical powers of a validator to be rendered", + "produces": [ + "application/json" + ], + "tags": [ + "Validator" + ], + "summary": "Get validator historical powers", + "parameters": [ + { + "type": "string", + "description": "Validator operator address", + "name": "operatorAddr", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ValidatorHistoricalPowersResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/validator/v1/validators/{operatorAddr}/info": { + "get": { + "description": "Get validator info from the operator address", + "produces": [ + "application/json" + ], + "tags": [ + "Validator" + ], + "summary": "Get validator info", + "parameters": [ + { + "type": "string", + "description": "Validator operator address", + "name": "operatorAddr", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ValidatorInfoResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/validator/v1/validators/{operatorAddr}/proposed_blocks": { + "get": { + "description": "Retrieves list of proposed blocks from a validator", + "produces": [ + "application/json" + ], + "tags": [ + "Validator" + ], + "summary": "Get validator proposed blocks", + "parameters": [ + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Reverse order for pagination", + "name": "pagination.reverse", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total number of transactions", + "name": "pagination.count_total", + "in": "query" + }, + { + "type": "string", + "description": "Validator operator address", + "name": "operatorAddr", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ValidatorProposedBlocksResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/validator/v1/validators/{operatorAddr}/uptime": { + "get": { + "description": "Get validator uptime from the operator address", + "produces": [ + "application/json" + ], + "tags": [ + "Validator" + ], + "summary": "Get validator uptime", + "parameters": [ + { + "type": "string", + "description": "Validator operator address", + "name": "operatorAddr", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "Blocks to be queried", + "name": "blocks", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ValidatorUptimeResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/validator/v1/validators/{operatorAddr}/voted_proposals": { + "get": { + "description": "Retrieves list of voted governance proposals from a validator", + "produces": [ + "application/json" + ], + "tags": [ + "Validator" + ], + "summary": "Get validator voted proposals", + "parameters": [ + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Reverse order for pagination", + "name": "pagination.reverse", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total number of transactions", + "name": "pagination.count_total", + "in": "query" + }, + { + "type": "string", + "description": "Validator operator address", + "name": "operatorAddr", + "in": "path", + "required": true + }, + { + "type": "string", + "default": "", + "description": "Search validators by moniker or exact operator address", + "name": "search", + "in": "query" + }, + { + "type": "string", + "default": "", + "description": "Filter by given answer", + "name": "answer", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ValidatorVotedProposalsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + } + }, + "definitions": { + "apperror.ErrorCode": { + "type": "integer", + "enum": [ + 400, + 401, + 404, + 500 + ], + "x-enum-varnames": [ + "ErrCodeBadRequest", + "ErrCodeUnauthorized", + "ErrCodeNotFound", + "ErrCodeInternal" + ] + }, + "apperror.Response": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "status_code": { + "$ref": "#/definitions/apperror.ErrorCode" + } + } + }, + "db.Account": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + }, + "vm_address_id": { + "type": "string" + } + } + }, + "dto.AccountProposal": { + "type": "object", + "properties": { + "deposit_end_time": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "is_emergency": { + "type": "boolean" + }, + "is_expedited": { + "type": "boolean" + }, + "proposer": { + "type": "string" + }, + "resolved_height": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "voting_end_time": { + "type": "string" + } + } + }, + "dto.AccountProposalsResponse": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "proposals": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.AccountProposal" + } + } + } + }, + "dto.AccountTx": { + "type": "object", + "properties": { + "created": { + "type": "string" + }, + "hash": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "is_ibc": { + "type": "boolean" + }, + "is_move_execute": { + "type": "boolean" + }, + "is_move_publish": { + "type": "boolean" + }, + "is_move_script": { + "type": "boolean" + }, + "is_opinit": { + "type": "boolean" + }, + "is_send": { + "type": "boolean" + }, + "is_signer": { + "type": "boolean" + }, + "messages": { + "type": "object" + }, + "sender": { + "type": "string" + }, + "success": { + "type": "boolean" + } + } + }, + "dto.AccountTxsResponse": { + "type": "object", + "properties": { + "account_txs": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.AccountTx" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + } + } + }, + "dto.AuthInfo": { + "type": "object", + "properties": { + "fee": { + "$ref": "#/definitions/dto.Fee" + }, + "signer_infos": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.SignerInfo" + } + } + } + }, + "dto.Block": { + "type": "object", + "properties": { + "hash": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "proposer": { + "$ref": "#/definitions/dto.BlockProposer" + }, + "timestamp": { + "type": "string" + }, + "tx_count": { + "type": "integer" + } + } + }, + "dto.BlockHeightInformativeLatestResponse": { + "type": "object", + "properties": { + "height": { + "type": "integer" + } + } + }, + "dto.BlockHeightLatestResponse": { + "type": "object", + "properties": { + "height": { + "type": "integer" + } + } + }, + "dto.BlockInfoResponse": { + "type": "object", + "properties": { + "gas_limit": { + "type": "integer" + }, + "gas_used": { + "type": "integer" + }, + "hash": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "proposer": { + "$ref": "#/definitions/dto.BlockProposer" + }, + "timestamp": { + "type": "string" + } + } + }, + "dto.BlockProposer": { + "type": "object", + "properties": { + "identity": { + "type": "string" + }, + "moniker": { + "type": "string" + }, + "operator_address": { + "type": "string" + } + } + }, + "dto.BlockTimeAverageResponse": { + "type": "object", + "properties": { + "avg_block_time": { + "type": "number" + } + } + }, + "dto.BlockTxModel": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "hash": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "is_ibc": { + "type": "boolean" + }, + "is_opinit": { + "type": "boolean" + }, + "is_send": { + "type": "boolean" + }, + "messages": { + "type": "object" + }, + "success": { + "type": "boolean" + }, + "timestamp": { + "type": "string" + } + } + }, + "dto.BlockTxsResponse": { + "type": "object", + "properties": { + "block_txs": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.BlockTxModel" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + } + } + }, + "dto.BlocksResponse": { + "type": "object", + "properties": { + "blocks": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.Block" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + } + } + }, + "dto.Body": { + "type": "object", + "properties": { + "extension_options": { + "type": "array", + "items": {} + }, + "memo": { + "type": "string" + }, + "messages": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": {} + } + }, + "non_critical_extension_options": { + "type": "array", + "items": {} + }, + "timeout_height": { + "type": "string" + } + } + }, + "dto.Coin": { + "type": "object", + "properties": { + "amount": { + "type": "string" + }, + "denom": { + "type": "string" + } + } + }, + "dto.CollectionActivitiesResponse": { + "type": "object", + "properties": { + "collection_activities": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.CollectionActivityModel" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + } + } + }, + "dto.CollectionActivityModel": { + "type": "object", + "properties": { + "hash": { + "type": "string" + }, + "is_collection_create": { + "type": "boolean" + }, + "is_nft_burn": { + "type": "boolean" + }, + "is_nft_mint": { + "type": "boolean" + }, + "is_nft_transfer": { + "type": "boolean" + }, + "nft_id": { + "type": "string" + }, + "timestamp": { + "type": "string" + }, + "token_id": { + "type": "string" + } + } + }, + "dto.CollectionCreatorModel": { + "type": "object", + "properties": { + "creator": { + "type": "string" + }, + "hash": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "timestamp": { + "type": "string" + } + } + }, + "dto.CollectionCreatorResponse": { + "type": "object", + "properties": { + "creator": { + "$ref": "#/definitions/dto.CollectionCreatorModel" + } + } + }, + "dto.CollectionMutateEventsResponse": { + "type": "object", + "properties": { + "collection_mutate_events": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.MutateEventModel" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + } + } + }, + "dto.Event": { + "type": "object", + "properties": { + "attributes": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.EventAttribute" + } + }, + "type": { + "type": "string" + } + } + }, + "dto.EventAttribute": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, + "dto.Fee": { + "type": "object", + "properties": { + "amount": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.Coin" + } + }, + "gas_limit": { + "type": "string" + }, + "granter": { + "type": "string" + }, + "payer": { + "type": "string" + } + } + }, + "dto.Log": { + "type": "object", + "properties": { + "events": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.Event" + } + }, + "log": { + "description": "Can be string or map[string]string" + }, + "msg_index": { + "type": "integer" + } + } + }, + "dto.MessageType": { + "type": "object", + "properties": { + "type": { + "type": "string" + } + } + }, + "dto.ModuleHistoriesResponse": { + "type": "object", + "properties": { + "module_histories": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ModuleHistoryResponse" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + } + } + }, + "dto.ModuleHistoryResponse": { + "type": "object", + "properties": { + "height": { + "type": "integer" + }, + "previous_policy": { + "type": "string" + }, + "remark": { + "type": "object" + }, + "timestamp": { + "type": "string" + }, + "upgrade_policy": { + "type": "string" + } + } + }, + "dto.ModuleProposalModel": { + "type": "object", + "properties": { + "deposit_end_time": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "is_emergency": { + "type": "boolean" + }, + "is_expedited": { + "type": "boolean" + }, + "proposer": { + "type": "string" + }, + "resolved_height": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "title": { + "type": "string" + }, + "types": { + "type": "object" + }, + "voting_end_time": { + "type": "string" + } + } + }, + "dto.ModuleProposalsResponse": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "proposals": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ModuleProposalModel" + } + } + } + }, + "dto.ModulePublishInfoResponse": { + "type": "object", + "properties": { + "is_republished": { + "type": "boolean" + }, + "recent_publish_block_height": { + "type": "integer" + }, + "recent_publish_block_timestamp": { + "type": "string" + }, + "recent_publish_proposal": { + "$ref": "#/definitions/dto.Proposal" + }, + "recent_publish_transaction": { + "type": "string" + } + } + }, + "dto.ModuleResponse": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "digest": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "is_republished": { + "type": "boolean" + }, + "is_verify": { + "type": "boolean" + }, + "latest_updated": { + "type": "string" + }, + "module_name": { + "type": "string" + } + } + }, + "dto.ModuleStatsResponse": { + "type": "object", + "properties": { + "total_histories": { + "type": "integer" + }, + "total_proposals": { + "type": "integer" + }, + "total_txs": { + "type": "integer" + } + } + }, + "dto.ModuleTxResponse": { + "type": "object", + "properties": { + "hash": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "is_ibc": { + "type": "boolean" + }, + "is_move_execute": { + "type": "boolean" + }, + "is_move_execute_event": { + "type": "boolean" + }, + "is_move_publish": { + "type": "boolean" + }, + "is_move_script": { + "type": "boolean" + }, + "is_move_upgrade": { + "type": "boolean" + }, + "is_opinit": { + "type": "boolean" + }, + "is_send": { + "type": "boolean" + }, + "messages": { + "type": "object" + }, + "sender": { + "type": "string" + }, + "success": { + "type": "boolean" + }, + "timestamp": { + "type": "string" + } + } + }, + "dto.ModuleTxsResponse": { + "type": "object", + "properties": { + "module_txs": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ModuleTxResponse" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + } + } + }, + "dto.ModulesResponse": { + "type": "object", + "properties": { + "modules": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ModuleResponse" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + } + } + }, + "dto.MutateEventModel": { + "type": "object", + "properties": { + "mutated_field_name": { + "type": "string" + }, + "new_value": { + "type": "string" + }, + "old_value": { + "type": "string" + }, + "remark": { + "type": "object" + }, + "timestamp": { + "type": "string" + } + } + }, + "dto.NftByAddressNft": { + "type": "object", + "properties": { + "collection": { + "$ref": "#/definitions/dto.NftByAddressNftCollection" + }, + "description": { + "type": "string" + }, + "is_burned": { + "type": "boolean" + }, + "token_id": { + "type": "string" + }, + "uri": { + "type": "string" + } + } + }, + "dto.NftByAddressNftCollection": { + "type": "object", + "properties": { + "inner": { + "type": "string" + } + } + }, + "dto.NftByAddressResponse": { + "type": "object", + "properties": { + "collection_addr": { + "type": "string" + }, + "collection_name": { + "type": "string" + }, + "nft": { + "$ref": "#/definitions/dto.NftByAddressNft" + }, + "object_addr": { + "type": "string" + }, + "owner_addr": { + "type": "string" + } + } + }, + "dto.NftCollectionCollection": { + "type": "object", + "properties": { + "creator": { + "type": "string" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "nft": { + "$ref": "#/definitions/dto.NftCollectionCollectionNft" + }, + "uri": { + "type": "string" + } + } + }, + "dto.NftCollectionCollectionNft": { + "type": "object", + "properties": { + "length": { + "type": "integer" + } + } + }, + "dto.NftCollectionResponse": { + "type": "object", + "properties": { + "collection": { + "$ref": "#/definitions/dto.NftCollectionCollection" + }, + "object_addr": { + "type": "string" + } + } + }, + "dto.NftCollectionsResponse": { + "type": "object", + "properties": { + "collections": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.NftCollectionResponse" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + } + } + }, + "dto.NftMintInfoResponse": { + "type": "object", + "properties": { + "height": { + "type": "integer" + }, + "minter": { + "type": "string" + }, + "timestamp": { + "type": "string" + }, + "txhash": { + "type": "string" + } + } + }, + "dto.NftMutateEventsResponse": { + "type": "object", + "properties": { + "nft_mutate_events": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.MutateEventModel" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + } + } + }, + "dto.NftTx": { + "type": "object", + "properties": { + "is_nft_burn": { + "type": "boolean" + }, + "is_nft_mint": { + "type": "boolean" + }, + "is_nft_transfer": { + "type": "boolean" + }, + "timestamp": { + "type": "string" + }, + "txhash": { + "type": "string" + } + } + }, + "dto.NftTxsResponse": { + "type": "object", + "properties": { + "nft_txs": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.NftTx" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + } + } + }, + "dto.NftsByAddressResponse": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "tokens": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.NftByAddressResponse" + } + } + } + }, + "dto.PaginationResponse": { + "type": "object", + "properties": { + "next_key": { + "type": "string" + }, + "previous_key": { + "type": "string" + }, + "total": { + "type": "string" + } + } + }, + "dto.Proposal": { + "type": "object", + "properties": { + "proposal_id": { + "type": "integer" + }, + "proposal_title": { + "type": "string" + } + } + }, + "dto.ProposalAnswerCounts": { + "type": "object", + "properties": { + "abstain": { + "type": "integer" + }, + "no": { + "type": "integer" + }, + "no_with_veto": { + "type": "integer" + }, + "total": { + "type": "integer" + }, + "weighted": { + "type": "integer" + }, + "yes": { + "type": "integer" + } + } + }, + "dto.ProposalAnswerCountsResponse": { + "type": "object", + "properties": { + "all": { + "$ref": "#/definitions/dto.ProposalAnswerCounts" + }, + "validator": { + "$ref": "#/definitions/dto.ProposalValidatorAnswerCounts" + } + } + }, + "dto.ProposalContent": { + "type": "object", + "properties": { + "messages": { + "type": "object" + }, + "metadata": { + "type": "string" + } + } + }, + "dto.ProposalDeposit": { + "type": "object", + "properties": { + "amount": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.Coin" + } + }, + "depositor": { + "type": "string" + }, + "timestamp": { + "type": "string" + }, + "tx_hash": { + "type": "string" + } + } + }, + "dto.ProposalInfo": { + "type": "object", + "properties": { + "abstain": { + "type": "string" + }, + "content": { + "$ref": "#/definitions/dto.ProposalContent" + }, + "created_height": { + "type": "integer" + }, + "created_timestamp": { + "type": "string" + }, + "created_tx_hash": { + "type": "string" + }, + "deposit_end_time": { + "type": "string" + }, + "description": { + "type": "string" + }, + "failed_reason": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "is_emergency": { + "type": "boolean" + }, + "is_expedited": { + "type": "boolean" + }, + "messages": { + "type": "array", + "items": { + "type": "integer" + } + }, + "metadata": { + "type": "string" + }, + "no": { + "type": "string" + }, + "no_with_veto": { + "type": "string" + }, + "proposal_deposits": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ProposalDeposit" + } + }, + "proposer": { + "type": "string" + }, + "resolved_height": { + "type": "integer" + }, + "resolved_timestamp": { + "type": "string" + }, + "resolved_total_voting_power": { + "type": "string" + }, + "status": { + "type": "string" + }, + "submit_time": { + "type": "string" + }, + "title": { + "type": "string" + }, + "total_deposit": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.Coin" + } + }, + "types": { + "type": "array", + "items": { + "type": "integer" + } + }, + "version": { + "type": "string" + }, + "voting_end_time": { + "type": "string" + }, + "voting_time": { + "type": "string" + }, + "yes": { + "type": "string" + } + } + }, + "dto.ProposalInfoResponse": { + "type": "object", + "properties": { + "info": { + "$ref": "#/definitions/dto.ProposalInfo" + } + } + }, + "dto.ProposalSummary": { + "type": "object", + "properties": { + "deposit_end_time": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "is_emergency": { + "type": "boolean" + }, + "is_expedited": { + "type": "boolean" + }, + "proposer": { + "type": "string" + }, + "resolved_height": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "title": { + "type": "string" + }, + "types": { + "type": "object" + }, + "voting_end_time": { + "type": "string" + } + } + }, + "dto.ProposalValidatorAnswerCounts": { + "type": "object", + "properties": { + "abstain": { + "type": "integer" + }, + "did_not_vote": { + "type": "integer" + }, + "no": { + "type": "integer" + }, + "no_with_veto": { + "type": "integer" + }, + "total": { + "type": "integer" + }, + "total_validators": { + "type": "integer" + }, + "weighted": { + "type": "integer" + }, + "yes": { + "type": "integer" + } + } + }, + "dto.ProposalValidatorVote": { + "type": "object", + "properties": { + "identity": { + "type": "string" + }, + "moniker": { + "type": "string" + }, + "validator_address": { + "type": "string" + } + } + }, + "dto.ProposalValidatorVotesResponse": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "votes": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ProposalVote" + } + } + } + }, + "dto.ProposalVote": { + "type": "object", + "properties": { + "abstain": { + "type": "number" + }, + "is_vote_weighted": { + "type": "boolean" + }, + "no": { + "type": "number" + }, + "no_with_veto": { + "type": "number" + }, + "proposal_id": { + "type": "integer" + }, + "timestamp": { + "type": "string" + }, + "tx_hash": { + "type": "string" + }, + "validator": { + "$ref": "#/definitions/dto.ProposalValidatorVote" + }, + "voter": { + "type": "string" + }, + "yes": { + "type": "number" + } + } + }, + "dto.ProposalVotesResponse": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "votes": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ProposalVote" + } + } + } + }, + "dto.ProposalsResponse": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "proposals": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ProposalSummary" + } + } + } + }, + "dto.PublicKey": { + "type": "object", + "properties": { + "@type": { + "type": "string" + }, + "key": { + "type": "string" + } + } + }, + "dto.SignerInfo": { + "type": "object", + "properties": { + "mode_info": {}, + "public_key": { + "$ref": "#/definitions/dto.PublicKey" + }, + "sequence": { + "type": "string" + } + } + }, + "dto.Tx": { + "type": "object", + "properties": { + "auth_info": { + "$ref": "#/definitions/dto.AuthInfo" + }, + "body": { + "$ref": "#/definitions/dto.Body" + }, + "signatures": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "dto.TxByHashResponse": { + "type": "object", + "properties": { + "tx": { + "$ref": "#/definitions/dto.Tx" + }, + "tx_response": { + "$ref": "#/definitions/dto.TxResponse" + } + } + }, + "dto.TxModel": { + "type": "object", + "properties": { + "hash": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "is_ibc": { + "type": "boolean" + }, + "is_opinit": { + "type": "boolean" + }, + "is_send": { + "type": "boolean" + }, + "messages": { + "type": "object" + }, + "sender": { + "type": "string" + }, + "success": { + "type": "boolean" + }, + "timestamp": { + "type": "string" + } + } + }, + "dto.TxResponse": { + "type": "object", + "properties": { + "code": { + "type": "integer" + }, + "codespace": { + "type": "string" + }, + "data": { + "type": "string" + }, + "events": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.Event" + } + }, + "gas_used": { + "type": "string" + }, + "gas_wanted": { + "type": "string" + }, + "height": { + "type": "string" + }, + "info": { + "type": "string" + }, + "logs": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.Log" + } + }, + "raw_log": { + "type": "string" + }, + "timestamp": { + "description": "unix time (GMT)", + "type": "string" + }, + "tx": { + "$ref": "#/definitions/dto.Tx" + }, + "txhash": { + "type": "string" + } + } + }, + "dto.TxsModelResponse": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "txs": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.TxModel" + } + } + } + }, + "dto.TxsResponse": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "txs": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.TxResponse" + } + } + } + }, + "dto.ValidatorAnswerCountsResponse": { + "type": "object", + "properties": { + "abstain": { + "type": "integer" + }, + "all": { + "type": "integer" + }, + "did_not_vote": { + "type": "integer" + }, + "no": { + "type": "integer" + }, + "no_with_veto": { + "type": "integer" + }, + "weighted": { + "type": "integer" + }, + "yes": { + "type": "integer" + } + } + }, + "dto.ValidatorBlockVoteModel": { + "type": "object", + "properties": { + "height": { + "type": "integer" + }, + "vote": { + "type": "string" + } + } + }, + "dto.ValidatorDelegationRelatedTx": { + "type": "object", + "properties": { + "height": { + "type": "integer" + }, + "messages": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.MessageType" + } + }, + "sender": { + "type": "string" + }, + "timestamp": { + "type": "string" + }, + "tokens": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.Coin" + } + }, + "tx_hash": { + "type": "string" + } + } + }, + "dto.ValidatorDelegationRelatedTxsResponse": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "validator_delegation_related_txs": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ValidatorDelegationRelatedTx" + } + } + } + }, + "dto.ValidatorHistoricalPowerModel": { + "type": "object", + "properties": { + "hour_rounded_timestamp": { + "type": "string" + }, + "timestamp": { + "type": "string" + }, + "voting_power": { + "type": "string" + } + } + }, + "dto.ValidatorHistoricalPowersResponse": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "validator_historical_powers": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ValidatorHistoricalPowerModel" + } + } + } + }, + "dto.ValidatorInfo": { + "type": "object", + "properties": { + "account_address": { + "type": "string" + }, + "commission_rate": { + "type": "string" + }, + "consensus_address": { + "type": "string" + }, + "details": { + "type": "string" + }, + "identity": { + "type": "string" + }, + "is_active": { + "type": "boolean" + }, + "is_jailed": { + "type": "boolean" + }, + "moniker": { + "type": "string" + }, + "rank": { + "type": "integer" + }, + "uptime": { + "type": "integer" + }, + "validator_address": { + "type": "string" + }, + "voting_power": { + "type": "string" + }, + "website": { + "type": "string" + } + } + }, + "dto.ValidatorInfoResponse": { + "type": "object", + "properties": { + "info": { + "$ref": "#/definitions/dto.ValidatorInfo" + }, + "total_voting_power": { + "type": "string" + } + } + }, + "dto.ValidatorProposedBlockModel": { + "type": "object", + "properties": { + "hash": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "timestamp": { + "type": "string" + }, + "transaction_count": { + "type": "integer" + }, + "validator": { + "$ref": "#/definitions/dto.BlockProposer" + } + } + }, + "dto.ValidatorProposedBlocksResponse": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "validators_proposed_blocks": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ValidatorProposedBlockModel" + } + } + } + }, + "dto.ValidatorUptimeEventModel": { + "type": "object", + "properties": { + "height": { + "type": "integer" + }, + "timestamp": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "dto.ValidatorUptimeResponse": { + "type": "object", + "properties": { + "events": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ValidatorUptimeEventModel" + } + }, + "recent_100_blocks": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ValidatorBlockVoteModel" + } + }, + "uptime": { + "$ref": "#/definitions/dto.ValidatorUptimeSummary" + } + } + }, + "dto.ValidatorUptimeSummary": { + "type": "object", + "properties": { + "missed_blocks": { + "type": "integer" + }, + "proposed_blocks": { + "type": "integer" + }, + "signed_blocks": { + "type": "integer" + }, + "total": { + "type": "integer" + } + } + }, + "dto.ValidatorVotedProposal": { + "type": "object", + "properties": { + "abstain": { + "type": "number" + }, + "is_emergency": { + "type": "boolean" + }, + "is_expedited": { + "type": "boolean" + }, + "is_vote_weighted": { + "type": "boolean" + }, + "no": { + "type": "number" + }, + "no_with_veto": { + "type": "number" + }, + "proposal_id": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "timestamp": { + "type": "string" + }, + "title": { + "type": "string" + }, + "tx_hash": { + "type": "string" + }, + "types": { + "type": "array", + "items": { + "type": "string" + } + }, + "yes": { + "type": "number" + } + } + }, + "dto.ValidatorVotedProposalsResponse": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "validator_voted_proposals": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ValidatorVotedProposal" + } + } + } + }, + "dto.ValidatorsMetadata": { + "type": "object", + "properties": { + "active_count": { + "type": "integer" + }, + "inactive_count": { + "type": "integer" + }, + "min_commission_rate": { + "type": "string" + }, + "percent_33_rank": { + "type": "integer" + }, + "percent_66_rank": { + "type": "integer" + }, + "total_voting_power": { + "type": "string" + } + } + }, + "dto.ValidatorsResponse": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/definitions/dto.ValidatorsMetadata" + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "validators_info": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ValidatorInfo" + } + } + } + } + }, + "tags": [ + { + "description": "Block related endpoints", + "name": "Block" + }, + { + "description": "Health check endpoints", + "name": "Health" + }, + { + "description": "Module related endpoints", + "name": "Module" + }, + { + "description": "Nft related endpoints", + "name": "Nft" + }, + { + "description": "Proposal related endpoints", + "name": "Proposal" + }, + { + "description": "Root endpoints", + "name": "Root" + }, + { + "description": "Transaction related endpoints", + "name": "Transaction" + }, + { + "description": "Validator related endpoints", + "name": "Validator" + } + ] +}` + +// SwaggerInfo holds exported Swagger Info so clients can modify it +var SwaggerInfo = &swag.Spec{ + Version: "1.0", + Host: "", + BasePath: "/", + Schemes: []string{}, + Title: "Core Indexer API", + Description: "This is the API service for the Core Indexer project", + InfoInstanceName: "swagger", + SwaggerTemplate: docTemplate, + LeftDelim: "{{", + RightDelim: "}}", +} + +func init() { + swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo) +} diff --git a/api/docs/swagger.go b/api/docs/swagger.go new file mode 100644 index 00000000..6323809d --- /dev/null +++ b/api/docs/swagger.go @@ -0,0 +1,74 @@ +package docs + +// @title Core Indexer API +// @version 1.0 +// @description Core Indexer API for NFT collections +// @host localhost:8080 +// @BasePath /api/v1 + +// @tag.name NFT +// @tag.description NFT collection operations + +// @schemes http https + +// @securityDefinitions.apikey BearerAuth +// @in header +// @name Authorization +// @description Type "Bearer" followed by a space and JWT token. + +// @query.collection.param.pagination.limit query int false "Limit the number of results (default: 10, max: 100)" default(10) minimum(1) maximum(100) +// @query.collection.param.pagination.offset query int false "Offset for pagination (default: 0)" default(0) minimum(0) +// @query.collection.param.pagination.key query string false "Base64 encoded key for cursor-based pagination" +// @query.collection.param.pagination.reverse query boolean false "Reverse the order of results (default: true)" default(true) +// @query.collection.param.pagination.count_total query boolean false "Count total number of results (default: false)" default(false) +// @query.collection.param.search query string false "Search term for filtering collections by name or ID" + +// @response.collection.success 200 {object} dto.NFTCollectionsResponse "Successfully retrieved NFT collections" +// @response.collection.error.400 {object} dto.ErrorResponse "Invalid request parameters" +// @response.collection.error.500 {object} dto.ErrorResponse "Internal server error" + +// @response.collection.single.success 200 {object} dto.NFTCollectionResponse "Successfully retrieved NFT collection" +// @response.collection.single.error.404 {object} dto.ErrorResponse "Collection not found" +// @response.collection.single.error.500 {object} dto.ErrorResponse "Internal server error" + +// @response.error.401 {object} dto.ErrorResponse "Unauthorized" +// @response.error.403 {object} dto.ErrorResponse "Forbidden" +// @response.error.404 {object} dto.ErrorResponse "Not found" +// @response.error.500 {object} dto.ErrorResponse "Internal server error" + +// @response.error.schema {object} dto.ErrorResponse +// @response.error.schema.example {"error":"Error message","code":400} + +// @response.collection.schema {object} dto.NFTCollectionsResponse +// @response.collection.schema.example { +// "collections": [ +// { +// "id": "collection1", +// "name": "My Collection", +// "uri": "https://example.com/collection1", +// "description": "A collection of NFTs", +// "creator": "creator1" +// } +// ], +// "pagination": { +// "next_key": "base64encodedkey", +// "total": 100 +// } +// } + +// @response.collection.single.schema {object} dto.NFTCollectionResponse +// @response.collection.single.schema.example { +// "collection": { +// "object_addr": "0x123", +// "collection": { +// "creator": "creator1", +// "description": "A collection of NFTs", +// "name": "My Collection", +// "uri": "https://example.com/collection1", +// "nfts": { +// "handle": "0x456", +// "length": "10" +// } +// } +// } +// } diff --git a/api/docs/swagger.json b/api/docs/swagger.json new file mode 100644 index 00000000..ea2f16a2 --- /dev/null +++ b/api/docs/swagger.json @@ -0,0 +1,4556 @@ +{ + "swagger": "2.0", + "info": { + "description": "This is the API service for the Core Indexer project", + "title": "Core Indexer API", + "termsOfService": "http://swagger.io/terms/", + "contact": { + "name": "API Support", + "url": "http://www.swagger.io/support", + "email": "support@swagger.io" + }, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + }, + "version": "1.0" + }, + "basePath": "/", + "paths": { + "/indexer/account/v1/{accountAddress}": { + "get": { + "description": "Retrieve account details by account address", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Account" + ], + "summary": "Get account by address", + "parameters": [ + { + "type": "string", + "description": "Account address", + "name": "accountAddress", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/db.Account" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/account/v1/{accountAddress}/proposals": { + "get": { + "description": "Retrieve proposals associated with an account", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Account" + ], + "summary": "Get account proposals", + "parameters": [ + { + "type": "string", + "description": "Account address", + "name": "accountAddress", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to count total Nfts", + "name": "pagination.count_total", + "in": "query" + }, + { + "type": "boolean", + "default": true, + "description": "Whether to reverse the order of transactions", + "name": "pagination.reverse", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.AccountProposalsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/account/v1/{accountAddress}/txs": { + "get": { + "description": "Retrieve transactions associated with an account", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Account" + ], + "summary": "Get account transactions", + "parameters": [ + { + "type": "string", + "description": "Account address", + "name": "accountAddress", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to count total transactions", + "name": "pagination.count_total", + "in": "query" + }, + { + "type": "boolean", + "default": true, + "description": "Whether to reverse the order of transactions", + "name": "pagination.reverse", + "in": "query" + }, + { + "type": "string", + "description": "Search term for transactions", + "name": "search", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Filter by sent transactions", + "name": "is_send", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Filter by IBC transactions", + "name": "is_ibc", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Filter by OPINIT transactions", + "name": "is_opinit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Filter by Move publish transactions", + "name": "is_move_publish", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Filter by Move upgrade transactions", + "name": "is_move_upgrade", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Filter by Move execute transactions", + "name": "is_move_execute", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Filter by Move script transactions", + "name": "is_move_script", + "in": "query" + }, + { + "type": "boolean", + "description": "Filter by transactions where the account is a signer", + "name": "is_signer", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.AccountTxsResponse" + } + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/block/v1/avg_block_time": { + "get": { + "description": "Retrieve the average time taken to mine a block", + "produces": [ + "application/json" + ], + "tags": [ + "Block" + ], + "summary": "Get average block time", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.BlockTimeAverageResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/block/v1/blocks": { + "get": { + "description": "Retrieve a list of blocks with pagination", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Block" + ], + "summary": "Get blocks", + "parameters": [ + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total number of transactions", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.BlocksResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/block/v1/blocks/{height}/info": { + "get": { + "description": "Retrieve detailed information about a block by its height", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Block" + ], + "summary": "Get block info by height", + "parameters": [ + { + "type": "integer", + "description": "Block height", + "name": "height", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.BlockInfoResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/block/v1/blocks/{height}/txs": { + "get": { + "description": "Retrieve transactions in a block by its height with pagination", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Block" + ], + "summary": "Get transactions in a block by height", + "parameters": [ + { + "type": "integer", + "description": "Block height", + "name": "height", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total number of transactions", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.BlockTxsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/block/v1/latest_block_height": { + "get": { + "description": "Retrieve the latest block height", + "produces": [ + "application/json" + ], + "tags": [ + "Block" + ], + "summary": "Get latest block height", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.BlockHeightLatestResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/block/v1/latest_informative_block_height": { + "get": { + "description": "Retrieve the latest informative block height", + "produces": [ + "application/json" + ], + "tags": [ + "Block" + ], + "summary": "Get latest informative block height", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.BlockHeightInformativeLatestResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/module/v1/modules": { + "get": { + "description": "Retrieve a list of modules with pagination", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Module" + ], + "summary": "Get modules", + "parameters": [ + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ModulesResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/module/v1/modules/{vmAddress}/{name}": { + "get": { + "description": "Retrieve a module by id", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Module" + ], + "summary": "Get module by id", + "parameters": [ + { + "type": "string", + "description": "VM address", + "name": "vmAddress", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Module name", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ModuleResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/module/v1/modules/{vmAddress}/{name}/histories": { + "get": { + "description": "Retrieve a list of module histories with pagination", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Module" + ], + "summary": "Get module histories", + "parameters": [ + { + "type": "string", + "description": "VM address", + "name": "vmAddress", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Module name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ModuleHistoriesResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/module/v1/modules/{vmAddress}/{name}/proposals": { + "get": { + "description": "Retrieve a module proposal", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Module" + ], + "summary": "Get module proposal", + "parameters": [ + { + "type": "string", + "description": "VM address", + "name": "vmAddress", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Module name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ModuleProposalsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/module/v1/modules/{vmAddress}/{name}/publish_info": { + "get": { + "description": "Retrieve a module publish info", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Module" + ], + "summary": "Get module publish info", + "parameters": [ + { + "type": "string", + "description": "VM address", + "name": "vmAddress", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Module name", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ModulePublishInfoResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/module/v1/modules/{vmAddress}/{name}/stats": { + "get": { + "description": "Retrieve a module stats", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Module" + ], + "summary": "Get module stats by module id", + "parameters": [ + { + "type": "string", + "description": "VM address", + "name": "vmAddress", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Module name", + "name": "name", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ModuleStatsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/module/v1/modules/{vmAddress}/{name}/transactions": { + "get": { + "description": "Retrieve a module transaction", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Module" + ], + "summary": "Get module transaction", + "parameters": [ + { + "type": "string", + "description": "VM address", + "name": "vmAddress", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Module name", + "name": "name", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ModuleTxsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/nft/v1/collections": { + "get": { + "description": "Retrieve a list of Nft collections with optional search and pagination", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Nft" + ], + "summary": "Get Nft collections", + "parameters": [ + { + "type": "string", + "description": "Search term for filtering Nfts", + "name": "search", + "in": "query" + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to count total Nfts", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.NftCollectionsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/nft/v1/collections/by_account/{accountAddress}": { + "get": { + "description": "Retrieve a list of Nft collections owned by a specific account address", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Nft" + ], + "summary": "Get Nft collections by account address", + "parameters": [ + { + "type": "string", + "description": "Account address of the Nft owner", + "name": "accountAddress", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.NftCollectionsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/nft/v1/collections/{collectionAddress}": { + "get": { + "description": "Retrieve a specific Nft collection by its collection address", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Nft" + ], + "summary": "Get Nft collection by collection address", + "parameters": [ + { + "type": "string", + "description": "Collection address of the Nft", + "name": "collectionAddress", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.NftCollectionResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/nft/v1/collections/{collectionAddress}/activities": { + "get": { + "description": "Retrieve activities related to a specific Nft collection with optional search and pagination", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Nft" + ], + "summary": "Get Nft collection activities", + "parameters": [ + { + "type": "string", + "description": "Collection address of the Nft", + "name": "collectionAddress", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Search term for filtering activities", + "name": "search", + "in": "query" + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Reverse order for pagination", + "name": "pagination.reverse", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total number of transactions", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.CollectionActivitiesResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/nft/v1/collections/{collectionAddress}/creator": { + "get": { + "description": "Retrieve the creator of a specific Nft collection by its address", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Nft" + ], + "summary": "Get Nft collection creator", + "parameters": [ + { + "type": "string", + "description": "Collection address of the Nft", + "name": "collectionAddress", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.CollectionCreatorResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/nft/v1/collections/{collectionAddress}/mutate_events": { + "get": { + "description": "Retrieve mutate events for a specific Nft collection by its address with pagination", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Nft" + ], + "summary": "Get Nft collection mutate events", + "parameters": [ + { + "type": "string", + "description": "Collection address of the Nft", + "name": "collectionAddress", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to count total events", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.CollectionMutateEventsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/nft/v1/token/{nftAddress}/mint_info": { + "get": { + "description": "Retrieve mint information for a specific Nft by its address", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Nft" + ], + "summary": "Get Nft mint information", + "parameters": [ + { + "type": "string", + "description": "Nft address", + "name": "nftAddress", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.NftMintInfoResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/nft/v1/token/{nftAddress}/mutate_events": { + "get": { + "description": "Retrieve mutate events for a specific Nft by its address with pagination", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Nft" + ], + "summary": "Get Nft mutate events", + "parameters": [ + { + "type": "string", + "description": "Nft address", + "name": "nftAddress", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to count total Nfts", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.NftMutateEventsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/nft/v1/token/{nftAddress}/txs": { + "get": { + "description": "Retrieve transactions related to a specific Nft by its address with pagination", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Nft" + ], + "summary": "Get Nft transactions", + "parameters": [ + { + "type": "string", + "description": "Nft address", + "name": "nftAddress", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to count total Nfts", + "name": "pagination.count_total", + "in": "query" + }, + { + "type": "boolean", + "default": true, + "description": "Whether to reverse the order of transactions", + "name": "pagination.reverse", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.NftTxsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/nft/v1/tokens/by_account/{accountAddress}": { + "get": { + "description": "Retrieve a list of Nfts owned by a specific account address with optional search and collection filtering", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Nft" + ], + "summary": "Get Nfts by account address", + "parameters": [ + { + "type": "string", + "description": "Account address of the Nfts owner", + "name": "accountAddress", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Search term for filtering Nfts", + "name": "search", + "in": "query" + }, + { + "type": "string", + "description": "Collection address to filter Nfts", + "name": "collectionAddress", + "in": "query" + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to count total Nfts", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.NftsByAddressResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/nft/v1/tokens/by_collection/{collectionAddress}": { + "get": { + "description": "Retrieve a list of Nfts by their collection address with optional search and pagination", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Nft" + ], + "summary": "Get Nfts by collection address", + "parameters": [ + { + "type": "string", + "description": "Collection address of the Nfts", + "name": "collectionAddress", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Search term for filtering Nfts", + "name": "search", + "in": "query" + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Whether to count total Nfts", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.NftsByAddressResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/nft/v1/tokens/by_collection/{collectionAddress}/{nftAddress}": { + "get": { + "description": "Retrieve a specific Nft by its collection address and Nft address", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Nft" + ], + "summary": "Get Nft by collection address and Nft address", + "parameters": [ + { + "type": "string", + "description": "Collection address of the Nft", + "name": "collectionAddress", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Nft address", + "name": "nftAddress", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.NftByAddressResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/proposal/v1/proposals": { + "get": { + "description": "Retrieve the list of all proposals", + "produces": [ + "application/json" + ], + "tags": [ + "Proposal" + ], + "summary": "Get list of proposals", + "parameters": [ + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Reverse order for pagination", + "name": "pagination.reverse", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total number of transactions", + "name": "pagination.count_total", + "in": "query" + }, + { + "type": "string", + "default": "", + "description": "Filter proposals by proposer", + "name": "proposer", + "in": "query" + }, + { + "type": "string", + "default": "", + "description": "Filter proposals by status(es)", + "name": "statuses", + "in": "query" + }, + { + "type": "string", + "default": "", + "description": "Filter proposals by proposal type", + "name": "types", + "in": "query" + }, + { + "type": "string", + "default": "", + "description": "Search proposals by title or exact proposal id", + "name": "search", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ProposalsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/proposal/v1/proposals/types": { + "get": { + "description": "Retrieve all submitted proposal types", + "produces": [ + "application/json" + ], + "tags": [ + "Proposal" + ], + "summary": "Get list of submitted proposal types", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/proposal/v1/proposals/{proposalId}/answer_counts": { + "get": { + "description": "Retrieve vote counts of a proposal by options", + "produces": [ + "application/json" + ], + "tags": [ + "Proposal" + ], + "summary": "Get votes count of a proposal", + "parameters": [ + { + "type": "string", + "description": "Proposal Id", + "name": "proposalId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ProposalAnswerCountsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/proposal/v1/proposals/{proposalId}/info": { + "get": { + "description": "Retrieve proposal details", + "produces": [ + "application/json" + ], + "tags": [ + "Proposal" + ], + "summary": "Get proposal info", + "parameters": [ + { + "type": "string", + "description": "Proposal Id", + "name": "proposalId", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ProposalInfoResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/proposal/v1/proposals/{proposalId}/validator_votes": { + "get": { + "description": "Retrieve list of all proposal votes by validators", + "produces": [ + "application/json" + ], + "tags": [ + "Proposal" + ], + "summary": "Get validator votes of a proposal", + "parameters": [ + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Reverse order for pagination", + "name": "pagination.reverse", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total number of transactions", + "name": "pagination.count_total", + "in": "query" + }, + { + "type": "string", + "description": "Proposal Id", + "name": "proposalId", + "in": "path", + "required": true + }, + { + "type": "string", + "default": "", + "description": "Search proposal vote by validator moniker or address", + "name": "search", + "in": "query" + }, + { + "type": "string", + "default": "", + "description": "Search proposal votes by vote option", + "name": "answer", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ProposalValidatorVotesResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/proposal/v1/proposals/{proposalId}/votes": { + "get": { + "description": "Retrieve list of all proposal votes", + "produces": [ + "application/json" + ], + "tags": [ + "Proposal" + ], + "summary": "Get all proposal votes", + "parameters": [ + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Reverse order for pagination", + "name": "pagination.reverse", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total number of transactions", + "name": "pagination.count_total", + "in": "query" + }, + { + "type": "string", + "description": "Proposal Id", + "name": "proposalId", + "in": "path", + "required": true + }, + { + "type": "string", + "default": "", + "description": "Search proposal vote by voter address", + "name": "search", + "in": "query" + }, + { + "type": "string", + "default": "", + "description": "Search proposal votes by vote option", + "name": "answer", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ProposalVotesResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/tx/v1/txs": { + "get": { + "description": "Retrieve a list of transactions with pagination", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Transaction" + ], + "summary": "Get transactions", + "parameters": [ + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Reverse order for pagination", + "name": "pagination.reverse", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total number of transactions", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.TxsModelResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/tx/v1/txs/by_account/{accountAddress}": { + "get": { + "description": "Retrieve transactions by account address", + "produces": [ + "application/json" + ], + "tags": [ + "Transaction" + ], + "summary": "Get transactions by account address", + "parameters": [ + { + "type": "string", + "description": "Account address", + "name": "accountAddress", + "in": "path", + "required": true + }, + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Reverse order for pagination", + "name": "pagination.reverse", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total number of transactions", + "name": "pagination.count_total", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.TxsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/tx/v1/txs/count": { + "get": { + "description": "Retrieve the total number of transactions", + "produces": [ + "application/json" + ], + "tags": [ + "Transaction" + ], + "summary": "Get transaction count", + "responses": { + "200": { + "description": "Transaction count", + "schema": { + "type": "integer" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/tx/v1/txs/{tx_hash}": { + "get": { + "description": "Retrieve transaction details by its hash", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Transaction" + ], + "summary": "Get transaction by hash", + "parameters": [ + { + "type": "string", + "description": "Transaction hash", + "name": "tx_hash", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.TxByHashResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/validator/v1/validators": { + "get": { + "description": "Retrieve the list of all validators", + "produces": [ + "application/json" + ], + "tags": [ + "Validator" + ], + "summary": "Get list of validators", + "parameters": [ + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Reverse order for pagination", + "name": "pagination.reverse", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total number of transactions", + "name": "pagination.count_total", + "in": "query" + }, + { + "type": "boolean", + "default": true, + "description": "Query for active validators", + "name": "is_active", + "in": "query" + }, + { + "type": "string", + "default": "", + "description": "Sort validators by field: 'uptime', 'commission', 'moniker' or empty for default (voting power)", + "name": "sort_by", + "in": "query" + }, + { + "type": "string", + "default": "", + "description": "Search validators by moniker or exact operator address", + "name": "search", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ValidatorsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/validator/v1/validators/{operatorAddr}/answer_counts": { + "get": { + "description": "Get validator voted governance proposal answers count", + "produces": [ + "application/json" + ], + "tags": [ + "Validator" + ], + "summary": "Get validator proposal answers count", + "parameters": [ + { + "type": "string", + "description": "Validator operator address", + "name": "operatorAddr", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ValidatorAnswerCountsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/validator/v1/validators/{operatorAddr}/delegation_related_txs": { + "get": { + "description": "Retrieves list of delegation related of a validator", + "produces": [ + "application/json" + ], + "tags": [ + "Validator" + ], + "summary": "Get delegation transactions of a validator", + "parameters": [ + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Reverse order for pagination", + "name": "pagination.reverse", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total number of transactions", + "name": "pagination.count_total", + "in": "query" + }, + { + "type": "string", + "description": "Validator operator address", + "name": "operatorAddr", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ValidatorDelegationRelatedTxsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/validator/v1/validators/{operatorAddr}/historical_powers": { + "get": { + "description": "Retrieves historical powers of a validator to be rendered", + "produces": [ + "application/json" + ], + "tags": [ + "Validator" + ], + "summary": "Get validator historical powers", + "parameters": [ + { + "type": "string", + "description": "Validator operator address", + "name": "operatorAddr", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ValidatorHistoricalPowersResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/validator/v1/validators/{operatorAddr}/info": { + "get": { + "description": "Get validator info from the operator address", + "produces": [ + "application/json" + ], + "tags": [ + "Validator" + ], + "summary": "Get validator info", + "parameters": [ + { + "type": "string", + "description": "Validator operator address", + "name": "operatorAddr", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ValidatorInfoResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/validator/v1/validators/{operatorAddr}/proposed_blocks": { + "get": { + "description": "Retrieves list of proposed blocks from a validator", + "produces": [ + "application/json" + ], + "tags": [ + "Validator" + ], + "summary": "Get validator proposed blocks", + "parameters": [ + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Reverse order for pagination", + "name": "pagination.reverse", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total number of transactions", + "name": "pagination.count_total", + "in": "query" + }, + { + "type": "string", + "description": "Validator operator address", + "name": "operatorAddr", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ValidatorProposedBlocksResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/validator/v1/validators/{operatorAddr}/uptime": { + "get": { + "description": "Get validator uptime from the operator address", + "produces": [ + "application/json" + ], + "tags": [ + "Validator" + ], + "summary": "Get validator uptime", + "parameters": [ + { + "type": "string", + "description": "Validator operator address", + "name": "operatorAddr", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "Blocks to be queried", + "name": "blocks", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ValidatorUptimeResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + }, + "/indexer/validator/v1/validators/{operatorAddr}/voted_proposals": { + "get": { + "description": "Retrieves list of voted governance proposals from a validator", + "produces": [ + "application/json" + ], + "tags": [ + "Validator" + ], + "summary": "Get validator voted proposals", + "parameters": [ + { + "type": "integer", + "default": 0, + "description": "Offset for pagination", + "name": "pagination.offset", + "in": "query" + }, + { + "type": "integer", + "default": 10, + "description": "Limit for pagination", + "name": "pagination.limit", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Reverse order for pagination", + "name": "pagination.reverse", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "Count total number of transactions", + "name": "pagination.count_total", + "in": "query" + }, + { + "type": "string", + "description": "Validator operator address", + "name": "operatorAddr", + "in": "path", + "required": true + }, + { + "type": "string", + "default": "", + "description": "Search validators by moniker or exact operator address", + "name": "search", + "in": "query" + }, + { + "type": "string", + "default": "", + "description": "Filter by given answer", + "name": "answer", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.ValidatorVotedProposalsResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/apperror.Response" + } + } + } + } + } + }, + "definitions": { + "apperror.ErrorCode": { + "type": "integer", + "enum": [ + 400, + 401, + 404, + 500 + ], + "x-enum-varnames": [ + "ErrCodeBadRequest", + "ErrCodeUnauthorized", + "ErrCodeNotFound", + "ErrCodeInternal" + ] + }, + "apperror.Response": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "status_code": { + "$ref": "#/definitions/apperror.ErrorCode" + } + } + }, + "db.Account": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + }, + "vm_address_id": { + "type": "string" + } + } + }, + "dto.AccountProposal": { + "type": "object", + "properties": { + "deposit_end_time": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "is_emergency": { + "type": "boolean" + }, + "is_expedited": { + "type": "boolean" + }, + "proposer": { + "type": "string" + }, + "resolved_height": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "voting_end_time": { + "type": "string" + } + } + }, + "dto.AccountProposalsResponse": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "proposals": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.AccountProposal" + } + } + } + }, + "dto.AccountTx": { + "type": "object", + "properties": { + "created": { + "type": "string" + }, + "hash": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "is_ibc": { + "type": "boolean" + }, + "is_move_execute": { + "type": "boolean" + }, + "is_move_publish": { + "type": "boolean" + }, + "is_move_script": { + "type": "boolean" + }, + "is_opinit": { + "type": "boolean" + }, + "is_send": { + "type": "boolean" + }, + "is_signer": { + "type": "boolean" + }, + "messages": { + "type": "object" + }, + "sender": { + "type": "string" + }, + "success": { + "type": "boolean" + } + } + }, + "dto.AccountTxsResponse": { + "type": "object", + "properties": { + "account_txs": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.AccountTx" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + } + } + }, + "dto.AuthInfo": { + "type": "object", + "properties": { + "fee": { + "$ref": "#/definitions/dto.Fee" + }, + "signer_infos": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.SignerInfo" + } + } + } + }, + "dto.Block": { + "type": "object", + "properties": { + "hash": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "proposer": { + "$ref": "#/definitions/dto.BlockProposer" + }, + "timestamp": { + "type": "string" + }, + "tx_count": { + "type": "integer" + } + } + }, + "dto.BlockHeightInformativeLatestResponse": { + "type": "object", + "properties": { + "height": { + "type": "integer" + } + } + }, + "dto.BlockHeightLatestResponse": { + "type": "object", + "properties": { + "height": { + "type": "integer" + } + } + }, + "dto.BlockInfoResponse": { + "type": "object", + "properties": { + "gas_limit": { + "type": "integer" + }, + "gas_used": { + "type": "integer" + }, + "hash": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "proposer": { + "$ref": "#/definitions/dto.BlockProposer" + }, + "timestamp": { + "type": "string" + } + } + }, + "dto.BlockProposer": { + "type": "object", + "properties": { + "identity": { + "type": "string" + }, + "moniker": { + "type": "string" + }, + "operator_address": { + "type": "string" + } + } + }, + "dto.BlockTimeAverageResponse": { + "type": "object", + "properties": { + "avg_block_time": { + "type": "number" + } + } + }, + "dto.BlockTxModel": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "hash": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "is_ibc": { + "type": "boolean" + }, + "is_opinit": { + "type": "boolean" + }, + "is_send": { + "type": "boolean" + }, + "messages": { + "type": "object" + }, + "success": { + "type": "boolean" + }, + "timestamp": { + "type": "string" + } + } + }, + "dto.BlockTxsResponse": { + "type": "object", + "properties": { + "block_txs": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.BlockTxModel" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + } + } + }, + "dto.BlocksResponse": { + "type": "object", + "properties": { + "blocks": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.Block" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + } + } + }, + "dto.Body": { + "type": "object", + "properties": { + "extension_options": { + "type": "array", + "items": {} + }, + "memo": { + "type": "string" + }, + "messages": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": {} + } + }, + "non_critical_extension_options": { + "type": "array", + "items": {} + }, + "timeout_height": { + "type": "string" + } + } + }, + "dto.Coin": { + "type": "object", + "properties": { + "amount": { + "type": "string" + }, + "denom": { + "type": "string" + } + } + }, + "dto.CollectionActivitiesResponse": { + "type": "object", + "properties": { + "collection_activities": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.CollectionActivityModel" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + } + } + }, + "dto.CollectionActivityModel": { + "type": "object", + "properties": { + "hash": { + "type": "string" + }, + "is_collection_create": { + "type": "boolean" + }, + "is_nft_burn": { + "type": "boolean" + }, + "is_nft_mint": { + "type": "boolean" + }, + "is_nft_transfer": { + "type": "boolean" + }, + "nft_id": { + "type": "string" + }, + "timestamp": { + "type": "string" + }, + "token_id": { + "type": "string" + } + } + }, + "dto.CollectionCreatorModel": { + "type": "object", + "properties": { + "creator": { + "type": "string" + }, + "hash": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "timestamp": { + "type": "string" + } + } + }, + "dto.CollectionCreatorResponse": { + "type": "object", + "properties": { + "creator": { + "$ref": "#/definitions/dto.CollectionCreatorModel" + } + } + }, + "dto.CollectionMutateEventsResponse": { + "type": "object", + "properties": { + "collection_mutate_events": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.MutateEventModel" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + } + } + }, + "dto.Event": { + "type": "object", + "properties": { + "attributes": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.EventAttribute" + } + }, + "type": { + "type": "string" + } + } + }, + "dto.EventAttribute": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, + "dto.Fee": { + "type": "object", + "properties": { + "amount": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.Coin" + } + }, + "gas_limit": { + "type": "string" + }, + "granter": { + "type": "string" + }, + "payer": { + "type": "string" + } + } + }, + "dto.Log": { + "type": "object", + "properties": { + "events": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.Event" + } + }, + "log": { + "description": "Can be string or map[string]string" + }, + "msg_index": { + "type": "integer" + } + } + }, + "dto.MessageType": { + "type": "object", + "properties": { + "type": { + "type": "string" + } + } + }, + "dto.ModuleHistoriesResponse": { + "type": "object", + "properties": { + "module_histories": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ModuleHistoryResponse" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + } + } + }, + "dto.ModuleHistoryResponse": { + "type": "object", + "properties": { + "height": { + "type": "integer" + }, + "previous_policy": { + "type": "string" + }, + "remark": { + "type": "object" + }, + "timestamp": { + "type": "string" + }, + "upgrade_policy": { + "type": "string" + } + } + }, + "dto.ModuleProposalModel": { + "type": "object", + "properties": { + "deposit_end_time": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "is_emergency": { + "type": "boolean" + }, + "is_expedited": { + "type": "boolean" + }, + "proposer": { + "type": "string" + }, + "resolved_height": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "title": { + "type": "string" + }, + "types": { + "type": "object" + }, + "voting_end_time": { + "type": "string" + } + } + }, + "dto.ModuleProposalsResponse": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "proposals": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ModuleProposalModel" + } + } + } + }, + "dto.ModulePublishInfoResponse": { + "type": "object", + "properties": { + "is_republished": { + "type": "boolean" + }, + "recent_publish_block_height": { + "type": "integer" + }, + "recent_publish_block_timestamp": { + "type": "string" + }, + "recent_publish_proposal": { + "$ref": "#/definitions/dto.Proposal" + }, + "recent_publish_transaction": { + "type": "string" + } + } + }, + "dto.ModuleResponse": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "digest": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "is_republished": { + "type": "boolean" + }, + "is_verify": { + "type": "boolean" + }, + "latest_updated": { + "type": "string" + }, + "module_name": { + "type": "string" + } + } + }, + "dto.ModuleStatsResponse": { + "type": "object", + "properties": { + "total_histories": { + "type": "integer" + }, + "total_proposals": { + "type": "integer" + }, + "total_txs": { + "type": "integer" + } + } + }, + "dto.ModuleTxResponse": { + "type": "object", + "properties": { + "hash": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "is_ibc": { + "type": "boolean" + }, + "is_move_execute": { + "type": "boolean" + }, + "is_move_execute_event": { + "type": "boolean" + }, + "is_move_publish": { + "type": "boolean" + }, + "is_move_script": { + "type": "boolean" + }, + "is_move_upgrade": { + "type": "boolean" + }, + "is_opinit": { + "type": "boolean" + }, + "is_send": { + "type": "boolean" + }, + "messages": { + "type": "object" + }, + "sender": { + "type": "string" + }, + "success": { + "type": "boolean" + }, + "timestamp": { + "type": "string" + } + } + }, + "dto.ModuleTxsResponse": { + "type": "object", + "properties": { + "module_txs": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ModuleTxResponse" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + } + } + }, + "dto.ModulesResponse": { + "type": "object", + "properties": { + "modules": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ModuleResponse" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + } + } + }, + "dto.MutateEventModel": { + "type": "object", + "properties": { + "mutated_field_name": { + "type": "string" + }, + "new_value": { + "type": "string" + }, + "old_value": { + "type": "string" + }, + "remark": { + "type": "object" + }, + "timestamp": { + "type": "string" + } + } + }, + "dto.NftByAddressNft": { + "type": "object", + "properties": { + "collection": { + "$ref": "#/definitions/dto.NftByAddressNftCollection" + }, + "description": { + "type": "string" + }, + "is_burned": { + "type": "boolean" + }, + "token_id": { + "type": "string" + }, + "uri": { + "type": "string" + } + } + }, + "dto.NftByAddressNftCollection": { + "type": "object", + "properties": { + "inner": { + "type": "string" + } + } + }, + "dto.NftByAddressResponse": { + "type": "object", + "properties": { + "collection_addr": { + "type": "string" + }, + "collection_name": { + "type": "string" + }, + "nft": { + "$ref": "#/definitions/dto.NftByAddressNft" + }, + "object_addr": { + "type": "string" + }, + "owner_addr": { + "type": "string" + } + } + }, + "dto.NftCollectionCollection": { + "type": "object", + "properties": { + "creator": { + "type": "string" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "nft": { + "$ref": "#/definitions/dto.NftCollectionCollectionNft" + }, + "uri": { + "type": "string" + } + } + }, + "dto.NftCollectionCollectionNft": { + "type": "object", + "properties": { + "length": { + "type": "integer" + } + } + }, + "dto.NftCollectionResponse": { + "type": "object", + "properties": { + "collection": { + "$ref": "#/definitions/dto.NftCollectionCollection" + }, + "object_addr": { + "type": "string" + } + } + }, + "dto.NftCollectionsResponse": { + "type": "object", + "properties": { + "collections": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.NftCollectionResponse" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + } + } + }, + "dto.NftMintInfoResponse": { + "type": "object", + "properties": { + "height": { + "type": "integer" + }, + "minter": { + "type": "string" + }, + "timestamp": { + "type": "string" + }, + "txhash": { + "type": "string" + } + } + }, + "dto.NftMutateEventsResponse": { + "type": "object", + "properties": { + "nft_mutate_events": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.MutateEventModel" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + } + } + }, + "dto.NftTx": { + "type": "object", + "properties": { + "is_nft_burn": { + "type": "boolean" + }, + "is_nft_mint": { + "type": "boolean" + }, + "is_nft_transfer": { + "type": "boolean" + }, + "timestamp": { + "type": "string" + }, + "txhash": { + "type": "string" + } + } + }, + "dto.NftTxsResponse": { + "type": "object", + "properties": { + "nft_txs": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.NftTx" + } + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + } + } + }, + "dto.NftsByAddressResponse": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "tokens": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.NftByAddressResponse" + } + } + } + }, + "dto.PaginationResponse": { + "type": "object", + "properties": { + "next_key": { + "type": "string" + }, + "previous_key": { + "type": "string" + }, + "total": { + "type": "string" + } + } + }, + "dto.Proposal": { + "type": "object", + "properties": { + "proposal_id": { + "type": "integer" + }, + "proposal_title": { + "type": "string" + } + } + }, + "dto.ProposalAnswerCounts": { + "type": "object", + "properties": { + "abstain": { + "type": "integer" + }, + "no": { + "type": "integer" + }, + "no_with_veto": { + "type": "integer" + }, + "total": { + "type": "integer" + }, + "weighted": { + "type": "integer" + }, + "yes": { + "type": "integer" + } + } + }, + "dto.ProposalAnswerCountsResponse": { + "type": "object", + "properties": { + "all": { + "$ref": "#/definitions/dto.ProposalAnswerCounts" + }, + "validator": { + "$ref": "#/definitions/dto.ProposalValidatorAnswerCounts" + } + } + }, + "dto.ProposalContent": { + "type": "object", + "properties": { + "messages": { + "type": "object" + }, + "metadata": { + "type": "string" + } + } + }, + "dto.ProposalDeposit": { + "type": "object", + "properties": { + "amount": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.Coin" + } + }, + "depositor": { + "type": "string" + }, + "timestamp": { + "type": "string" + }, + "tx_hash": { + "type": "string" + } + } + }, + "dto.ProposalInfo": { + "type": "object", + "properties": { + "abstain": { + "type": "string" + }, + "content": { + "$ref": "#/definitions/dto.ProposalContent" + }, + "created_height": { + "type": "integer" + }, + "created_timestamp": { + "type": "string" + }, + "created_tx_hash": { + "type": "string" + }, + "deposit_end_time": { + "type": "string" + }, + "description": { + "type": "string" + }, + "failed_reason": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "is_emergency": { + "type": "boolean" + }, + "is_expedited": { + "type": "boolean" + }, + "messages": { + "type": "array", + "items": { + "type": "integer" + } + }, + "metadata": { + "type": "string" + }, + "no": { + "type": "string" + }, + "no_with_veto": { + "type": "string" + }, + "proposal_deposits": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ProposalDeposit" + } + }, + "proposer": { + "type": "string" + }, + "resolved_height": { + "type": "integer" + }, + "resolved_timestamp": { + "type": "string" + }, + "resolved_total_voting_power": { + "type": "string" + }, + "status": { + "type": "string" + }, + "submit_time": { + "type": "string" + }, + "title": { + "type": "string" + }, + "total_deposit": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.Coin" + } + }, + "types": { + "type": "array", + "items": { + "type": "integer" + } + }, + "version": { + "type": "string" + }, + "voting_end_time": { + "type": "string" + }, + "voting_time": { + "type": "string" + }, + "yes": { + "type": "string" + } + } + }, + "dto.ProposalInfoResponse": { + "type": "object", + "properties": { + "info": { + "$ref": "#/definitions/dto.ProposalInfo" + } + } + }, + "dto.ProposalSummary": { + "type": "object", + "properties": { + "deposit_end_time": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "is_emergency": { + "type": "boolean" + }, + "is_expedited": { + "type": "boolean" + }, + "proposer": { + "type": "string" + }, + "resolved_height": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "title": { + "type": "string" + }, + "types": { + "type": "object" + }, + "voting_end_time": { + "type": "string" + } + } + }, + "dto.ProposalValidatorAnswerCounts": { + "type": "object", + "properties": { + "abstain": { + "type": "integer" + }, + "did_not_vote": { + "type": "integer" + }, + "no": { + "type": "integer" + }, + "no_with_veto": { + "type": "integer" + }, + "total": { + "type": "integer" + }, + "total_validators": { + "type": "integer" + }, + "weighted": { + "type": "integer" + }, + "yes": { + "type": "integer" + } + } + }, + "dto.ProposalValidatorVote": { + "type": "object", + "properties": { + "identity": { + "type": "string" + }, + "moniker": { + "type": "string" + }, + "validator_address": { + "type": "string" + } + } + }, + "dto.ProposalValidatorVotesResponse": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "votes": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ProposalVote" + } + } + } + }, + "dto.ProposalVote": { + "type": "object", + "properties": { + "abstain": { + "type": "number" + }, + "is_vote_weighted": { + "type": "boolean" + }, + "no": { + "type": "number" + }, + "no_with_veto": { + "type": "number" + }, + "proposal_id": { + "type": "integer" + }, + "timestamp": { + "type": "string" + }, + "tx_hash": { + "type": "string" + }, + "validator": { + "$ref": "#/definitions/dto.ProposalValidatorVote" + }, + "voter": { + "type": "string" + }, + "yes": { + "type": "number" + } + } + }, + "dto.ProposalVotesResponse": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "votes": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ProposalVote" + } + } + } + }, + "dto.ProposalsResponse": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "proposals": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ProposalSummary" + } + } + } + }, + "dto.PublicKey": { + "type": "object", + "properties": { + "@type": { + "type": "string" + }, + "key": { + "type": "string" + } + } + }, + "dto.SignerInfo": { + "type": "object", + "properties": { + "mode_info": {}, + "public_key": { + "$ref": "#/definitions/dto.PublicKey" + }, + "sequence": { + "type": "string" + } + } + }, + "dto.Tx": { + "type": "object", + "properties": { + "auth_info": { + "$ref": "#/definitions/dto.AuthInfo" + }, + "body": { + "$ref": "#/definitions/dto.Body" + }, + "signatures": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "dto.TxByHashResponse": { + "type": "object", + "properties": { + "tx": { + "$ref": "#/definitions/dto.Tx" + }, + "tx_response": { + "$ref": "#/definitions/dto.TxResponse" + } + } + }, + "dto.TxModel": { + "type": "object", + "properties": { + "hash": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "is_ibc": { + "type": "boolean" + }, + "is_opinit": { + "type": "boolean" + }, + "is_send": { + "type": "boolean" + }, + "messages": { + "type": "object" + }, + "sender": { + "type": "string" + }, + "success": { + "type": "boolean" + }, + "timestamp": { + "type": "string" + } + } + }, + "dto.TxResponse": { + "type": "object", + "properties": { + "code": { + "type": "integer" + }, + "codespace": { + "type": "string" + }, + "data": { + "type": "string" + }, + "events": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.Event" + } + }, + "gas_used": { + "type": "string" + }, + "gas_wanted": { + "type": "string" + }, + "height": { + "type": "string" + }, + "info": { + "type": "string" + }, + "logs": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.Log" + } + }, + "raw_log": { + "type": "string" + }, + "timestamp": { + "description": "unix time (GMT)", + "type": "string" + }, + "tx": { + "$ref": "#/definitions/dto.Tx" + }, + "txhash": { + "type": "string" + } + } + }, + "dto.TxsModelResponse": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "txs": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.TxModel" + } + } + } + }, + "dto.TxsResponse": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "txs": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.TxResponse" + } + } + } + }, + "dto.ValidatorAnswerCountsResponse": { + "type": "object", + "properties": { + "abstain": { + "type": "integer" + }, + "all": { + "type": "integer" + }, + "did_not_vote": { + "type": "integer" + }, + "no": { + "type": "integer" + }, + "no_with_veto": { + "type": "integer" + }, + "weighted": { + "type": "integer" + }, + "yes": { + "type": "integer" + } + } + }, + "dto.ValidatorBlockVoteModel": { + "type": "object", + "properties": { + "height": { + "type": "integer" + }, + "vote": { + "type": "string" + } + } + }, + "dto.ValidatorDelegationRelatedTx": { + "type": "object", + "properties": { + "height": { + "type": "integer" + }, + "messages": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.MessageType" + } + }, + "sender": { + "type": "string" + }, + "timestamp": { + "type": "string" + }, + "tokens": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.Coin" + } + }, + "tx_hash": { + "type": "string" + } + } + }, + "dto.ValidatorDelegationRelatedTxsResponse": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "validator_delegation_related_txs": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ValidatorDelegationRelatedTx" + } + } + } + }, + "dto.ValidatorHistoricalPowerModel": { + "type": "object", + "properties": { + "hour_rounded_timestamp": { + "type": "string" + }, + "timestamp": { + "type": "string" + }, + "voting_power": { + "type": "string" + } + } + }, + "dto.ValidatorHistoricalPowersResponse": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "validator_historical_powers": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ValidatorHistoricalPowerModel" + } + } + } + }, + "dto.ValidatorInfo": { + "type": "object", + "properties": { + "account_address": { + "type": "string" + }, + "commission_rate": { + "type": "string" + }, + "consensus_address": { + "type": "string" + }, + "details": { + "type": "string" + }, + "identity": { + "type": "string" + }, + "is_active": { + "type": "boolean" + }, + "is_jailed": { + "type": "boolean" + }, + "moniker": { + "type": "string" + }, + "rank": { + "type": "integer" + }, + "uptime": { + "type": "integer" + }, + "validator_address": { + "type": "string" + }, + "voting_power": { + "type": "string" + }, + "website": { + "type": "string" + } + } + }, + "dto.ValidatorInfoResponse": { + "type": "object", + "properties": { + "info": { + "$ref": "#/definitions/dto.ValidatorInfo" + }, + "total_voting_power": { + "type": "string" + } + } + }, + "dto.ValidatorProposedBlockModel": { + "type": "object", + "properties": { + "hash": { + "type": "string" + }, + "height": { + "type": "integer" + }, + "timestamp": { + "type": "string" + }, + "transaction_count": { + "type": "integer" + }, + "validator": { + "$ref": "#/definitions/dto.BlockProposer" + } + } + }, + "dto.ValidatorProposedBlocksResponse": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "validators_proposed_blocks": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ValidatorProposedBlockModel" + } + } + } + }, + "dto.ValidatorUptimeEventModel": { + "type": "object", + "properties": { + "height": { + "type": "integer" + }, + "timestamp": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "dto.ValidatorUptimeResponse": { + "type": "object", + "properties": { + "events": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ValidatorUptimeEventModel" + } + }, + "recent_100_blocks": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ValidatorBlockVoteModel" + } + }, + "uptime": { + "$ref": "#/definitions/dto.ValidatorUptimeSummary" + } + } + }, + "dto.ValidatorUptimeSummary": { + "type": "object", + "properties": { + "missed_blocks": { + "type": "integer" + }, + "proposed_blocks": { + "type": "integer" + }, + "signed_blocks": { + "type": "integer" + }, + "total": { + "type": "integer" + } + } + }, + "dto.ValidatorVotedProposal": { + "type": "object", + "properties": { + "abstain": { + "type": "number" + }, + "is_emergency": { + "type": "boolean" + }, + "is_expedited": { + "type": "boolean" + }, + "is_vote_weighted": { + "type": "boolean" + }, + "no": { + "type": "number" + }, + "no_with_veto": { + "type": "number" + }, + "proposal_id": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "timestamp": { + "type": "string" + }, + "title": { + "type": "string" + }, + "tx_hash": { + "type": "string" + }, + "types": { + "type": "array", + "items": { + "type": "string" + } + }, + "yes": { + "type": "number" + } + } + }, + "dto.ValidatorVotedProposalsResponse": { + "type": "object", + "properties": { + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "validator_voted_proposals": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ValidatorVotedProposal" + } + } + } + }, + "dto.ValidatorsMetadata": { + "type": "object", + "properties": { + "active_count": { + "type": "integer" + }, + "inactive_count": { + "type": "integer" + }, + "min_commission_rate": { + "type": "string" + }, + "percent_33_rank": { + "type": "integer" + }, + "percent_66_rank": { + "type": "integer" + }, + "total_voting_power": { + "type": "string" + } + } + }, + "dto.ValidatorsResponse": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/definitions/dto.ValidatorsMetadata" + }, + "pagination": { + "$ref": "#/definitions/dto.PaginationResponse" + }, + "validators_info": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.ValidatorInfo" + } + } + } + } + }, + "tags": [ + { + "description": "Block related endpoints", + "name": "Block" + }, + { + "description": "Health check endpoints", + "name": "Health" + }, + { + "description": "Module related endpoints", + "name": "Module" + }, + { + "description": "Nft related endpoints", + "name": "Nft" + }, + { + "description": "Proposal related endpoints", + "name": "Proposal" + }, + { + "description": "Root endpoints", + "name": "Root" + }, + { + "description": "Transaction related endpoints", + "name": "Transaction" + }, + { + "description": "Validator related endpoints", + "name": "Validator" + } + ] +} \ No newline at end of file diff --git a/api/docs/swagger.yaml b/api/docs/swagger.yaml new file mode 100644 index 00000000..f2b13dfb --- /dev/null +++ b/api/docs/swagger.yaml @@ -0,0 +1,3033 @@ +basePath: / +definitions: + apperror.ErrorCode: + enum: + - 400 + - 401 + - 404 + - 500 + type: integer + x-enum-varnames: + - ErrCodeBadRequest + - ErrCodeUnauthorized + - ErrCodeNotFound + - ErrCodeInternal + apperror.Response: + properties: + message: + type: string + status_code: + $ref: '#/definitions/apperror.ErrorCode' + type: object + db.Account: + properties: + address: + type: string + name: + type: string + type: + type: string + vm_address_id: + type: string + type: object + dto.AccountProposal: + properties: + deposit_end_time: + type: string + id: + type: integer + is_emergency: + type: boolean + is_expedited: + type: boolean + proposer: + type: string + resolved_height: + type: integer + status: + type: string + title: + type: string + type: + type: string + voting_end_time: + type: string + type: object + dto.AccountProposalsResponse: + properties: + pagination: + $ref: '#/definitions/dto.PaginationResponse' + proposals: + items: + $ref: '#/definitions/dto.AccountProposal' + type: array + type: object + dto.AccountTx: + properties: + created: + type: string + hash: + type: string + height: + type: integer + is_ibc: + type: boolean + is_move_execute: + type: boolean + is_move_publish: + type: boolean + is_move_script: + type: boolean + is_opinit: + type: boolean + is_send: + type: boolean + is_signer: + type: boolean + messages: + type: object + sender: + type: string + success: + type: boolean + type: object + dto.AccountTxsResponse: + properties: + account_txs: + items: + $ref: '#/definitions/dto.AccountTx' + type: array + pagination: + $ref: '#/definitions/dto.PaginationResponse' + type: object + dto.AuthInfo: + properties: + fee: + $ref: '#/definitions/dto.Fee' + signer_infos: + items: + $ref: '#/definitions/dto.SignerInfo' + type: array + type: object + dto.Block: + properties: + hash: + type: string + height: + type: integer + proposer: + $ref: '#/definitions/dto.BlockProposer' + timestamp: + type: string + tx_count: + type: integer + type: object + dto.BlockHeightInformativeLatestResponse: + properties: + height: + type: integer + type: object + dto.BlockHeightLatestResponse: + properties: + height: + type: integer + type: object + dto.BlockInfoResponse: + properties: + gas_limit: + type: integer + gas_used: + type: integer + hash: + type: string + height: + type: integer + proposer: + $ref: '#/definitions/dto.BlockProposer' + timestamp: + type: string + type: object + dto.BlockProposer: + properties: + identity: + type: string + moniker: + type: string + operator_address: + type: string + type: object + dto.BlockTimeAverageResponse: + properties: + avg_block_time: + type: number + type: object + dto.BlockTxModel: + properties: + address: + type: string + hash: + type: string + height: + type: integer + is_ibc: + type: boolean + is_opinit: + type: boolean + is_send: + type: boolean + messages: + type: object + success: + type: boolean + timestamp: + type: string + type: object + dto.BlockTxsResponse: + properties: + block_txs: + items: + $ref: '#/definitions/dto.BlockTxModel' + type: array + pagination: + $ref: '#/definitions/dto.PaginationResponse' + type: object + dto.BlocksResponse: + properties: + blocks: + items: + $ref: '#/definitions/dto.Block' + type: array + pagination: + $ref: '#/definitions/dto.PaginationResponse' + type: object + dto.Body: + properties: + extension_options: + items: {} + type: array + memo: + type: string + messages: + items: + additionalProperties: {} + type: object + type: array + non_critical_extension_options: + items: {} + type: array + timeout_height: + type: string + type: object + dto.Coin: + properties: + amount: + type: string + denom: + type: string + type: object + dto.CollectionActivitiesResponse: + properties: + collection_activities: + items: + $ref: '#/definitions/dto.CollectionActivityModel' + type: array + pagination: + $ref: '#/definitions/dto.PaginationResponse' + type: object + dto.CollectionActivityModel: + properties: + hash: + type: string + is_collection_create: + type: boolean + is_nft_burn: + type: boolean + is_nft_mint: + type: boolean + is_nft_transfer: + type: boolean + nft_id: + type: string + timestamp: + type: string + token_id: + type: string + type: object + dto.CollectionCreatorModel: + properties: + creator: + type: string + hash: + type: string + height: + type: integer + timestamp: + type: string + type: object + dto.CollectionCreatorResponse: + properties: + creator: + $ref: '#/definitions/dto.CollectionCreatorModel' + type: object + dto.CollectionMutateEventsResponse: + properties: + collection_mutate_events: + items: + $ref: '#/definitions/dto.MutateEventModel' + type: array + pagination: + $ref: '#/definitions/dto.PaginationResponse' + type: object + dto.Event: + properties: + attributes: + items: + $ref: '#/definitions/dto.EventAttribute' + type: array + type: + type: string + type: object + dto.EventAttribute: + properties: + key: + type: string + value: + type: string + type: object + dto.Fee: + properties: + amount: + items: + $ref: '#/definitions/dto.Coin' + type: array + gas_limit: + type: string + granter: + type: string + payer: + type: string + type: object + dto.Log: + properties: + events: + items: + $ref: '#/definitions/dto.Event' + type: array + log: + description: Can be string or map[string]string + msg_index: + type: integer + type: object + dto.MessageType: + properties: + type: + type: string + type: object + dto.ModuleHistoriesResponse: + properties: + module_histories: + items: + $ref: '#/definitions/dto.ModuleHistoryResponse' + type: array + pagination: + $ref: '#/definitions/dto.PaginationResponse' + type: object + dto.ModuleHistoryResponse: + properties: + height: + type: integer + previous_policy: + type: string + remark: + type: object + timestamp: + type: string + upgrade_policy: + type: string + type: object + dto.ModuleProposalModel: + properties: + deposit_end_time: + type: string + id: + type: integer + is_emergency: + type: boolean + is_expedited: + type: boolean + proposer: + type: string + resolved_height: + type: integer + status: + type: string + title: + type: string + types: + type: object + voting_end_time: + type: string + type: object + dto.ModuleProposalsResponse: + properties: + pagination: + $ref: '#/definitions/dto.PaginationResponse' + proposals: + items: + $ref: '#/definitions/dto.ModuleProposalModel' + type: array + type: object + dto.ModulePublishInfoResponse: + properties: + is_republished: + type: boolean + recent_publish_block_height: + type: integer + recent_publish_block_timestamp: + type: string + recent_publish_proposal: + $ref: '#/definitions/dto.Proposal' + recent_publish_transaction: + type: string + type: object + dto.ModuleResponse: + properties: + address: + type: string + digest: + type: string + height: + type: integer + is_republished: + type: boolean + is_verify: + type: boolean + latest_updated: + type: string + module_name: + type: string + type: object + dto.ModuleStatsResponse: + properties: + total_histories: + type: integer + total_proposals: + type: integer + total_txs: + type: integer + type: object + dto.ModuleTxResponse: + properties: + hash: + type: string + height: + type: integer + is_ibc: + type: boolean + is_move_execute: + type: boolean + is_move_execute_event: + type: boolean + is_move_publish: + type: boolean + is_move_script: + type: boolean + is_move_upgrade: + type: boolean + is_opinit: + type: boolean + is_send: + type: boolean + messages: + type: object + sender: + type: string + success: + type: boolean + timestamp: + type: string + type: object + dto.ModuleTxsResponse: + properties: + module_txs: + items: + $ref: '#/definitions/dto.ModuleTxResponse' + type: array + pagination: + $ref: '#/definitions/dto.PaginationResponse' + type: object + dto.ModulesResponse: + properties: + modules: + items: + $ref: '#/definitions/dto.ModuleResponse' + type: array + pagination: + $ref: '#/definitions/dto.PaginationResponse' + type: object + dto.MutateEventModel: + properties: + mutated_field_name: + type: string + new_value: + type: string + old_value: + type: string + remark: + type: object + timestamp: + type: string + type: object + dto.NftByAddressNft: + properties: + collection: + $ref: '#/definitions/dto.NftByAddressNftCollection' + description: + type: string + is_burned: + type: boolean + token_id: + type: string + uri: + type: string + type: object + dto.NftByAddressNftCollection: + properties: + inner: + type: string + type: object + dto.NftByAddressResponse: + properties: + collection_addr: + type: string + collection_name: + type: string + nft: + $ref: '#/definitions/dto.NftByAddressNft' + object_addr: + type: string + owner_addr: + type: string + type: object + dto.NftCollectionCollection: + properties: + creator: + type: string + description: + type: string + name: + type: string + nft: + $ref: '#/definitions/dto.NftCollectionCollectionNft' + uri: + type: string + type: object + dto.NftCollectionCollectionNft: + properties: + length: + type: integer + type: object + dto.NftCollectionResponse: + properties: + collection: + $ref: '#/definitions/dto.NftCollectionCollection' + object_addr: + type: string + type: object + dto.NftCollectionsResponse: + properties: + collections: + items: + $ref: '#/definitions/dto.NftCollectionResponse' + type: array + pagination: + $ref: '#/definitions/dto.PaginationResponse' + type: object + dto.NftMintInfoResponse: + properties: + height: + type: integer + minter: + type: string + timestamp: + type: string + txhash: + type: string + type: object + dto.NftMutateEventsResponse: + properties: + nft_mutate_events: + items: + $ref: '#/definitions/dto.MutateEventModel' + type: array + pagination: + $ref: '#/definitions/dto.PaginationResponse' + type: object + dto.NftTx: + properties: + is_nft_burn: + type: boolean + is_nft_mint: + type: boolean + is_nft_transfer: + type: boolean + timestamp: + type: string + txhash: + type: string + type: object + dto.NftTxsResponse: + properties: + nft_txs: + items: + $ref: '#/definitions/dto.NftTx' + type: array + pagination: + $ref: '#/definitions/dto.PaginationResponse' + type: object + dto.NftsByAddressResponse: + properties: + pagination: + $ref: '#/definitions/dto.PaginationResponse' + tokens: + items: + $ref: '#/definitions/dto.NftByAddressResponse' + type: array + type: object + dto.PaginationResponse: + properties: + next_key: + type: string + previous_key: + type: string + total: + type: string + type: object + dto.Proposal: + properties: + proposal_id: + type: integer + proposal_title: + type: string + type: object + dto.ProposalAnswerCounts: + properties: + abstain: + type: integer + "no": + type: integer + no_with_veto: + type: integer + total: + type: integer + weighted: + type: integer + "yes": + type: integer + type: object + dto.ProposalAnswerCountsResponse: + properties: + all: + $ref: '#/definitions/dto.ProposalAnswerCounts' + validator: + $ref: '#/definitions/dto.ProposalValidatorAnswerCounts' + type: object + dto.ProposalContent: + properties: + messages: + type: object + metadata: + type: string + type: object + dto.ProposalDeposit: + properties: + amount: + items: + $ref: '#/definitions/dto.Coin' + type: array + depositor: + type: string + timestamp: + type: string + tx_hash: + type: string + type: object + dto.ProposalInfo: + properties: + abstain: + type: string + content: + $ref: '#/definitions/dto.ProposalContent' + created_height: + type: integer + created_timestamp: + type: string + created_tx_hash: + type: string + deposit_end_time: + type: string + description: + type: string + failed_reason: + type: string + id: + type: integer + is_emergency: + type: boolean + is_expedited: + type: boolean + messages: + items: + type: integer + type: array + metadata: + type: string + "no": + type: string + no_with_veto: + type: string + proposal_deposits: + items: + $ref: '#/definitions/dto.ProposalDeposit' + type: array + proposer: + type: string + resolved_height: + type: integer + resolved_timestamp: + type: string + resolved_total_voting_power: + type: string + status: + type: string + submit_time: + type: string + title: + type: string + total_deposit: + items: + $ref: '#/definitions/dto.Coin' + type: array + types: + items: + type: integer + type: array + version: + type: string + voting_end_time: + type: string + voting_time: + type: string + "yes": + type: string + type: object + dto.ProposalInfoResponse: + properties: + info: + $ref: '#/definitions/dto.ProposalInfo' + type: object + dto.ProposalSummary: + properties: + deposit_end_time: + type: string + id: + type: integer + is_emergency: + type: boolean + is_expedited: + type: boolean + proposer: + type: string + resolved_height: + type: integer + status: + type: string + title: + type: string + types: + type: object + voting_end_time: + type: string + type: object + dto.ProposalValidatorAnswerCounts: + properties: + abstain: + type: integer + did_not_vote: + type: integer + "no": + type: integer + no_with_veto: + type: integer + total: + type: integer + total_validators: + type: integer + weighted: + type: integer + "yes": + type: integer + type: object + dto.ProposalValidatorVote: + properties: + identity: + type: string + moniker: + type: string + validator_address: + type: string + type: object + dto.ProposalValidatorVotesResponse: + properties: + pagination: + $ref: '#/definitions/dto.PaginationResponse' + votes: + items: + $ref: '#/definitions/dto.ProposalVote' + type: array + type: object + dto.ProposalVote: + properties: + abstain: + type: number + is_vote_weighted: + type: boolean + "no": + type: number + no_with_veto: + type: number + proposal_id: + type: integer + timestamp: + type: string + tx_hash: + type: string + validator: + $ref: '#/definitions/dto.ProposalValidatorVote' + voter: + type: string + "yes": + type: number + type: object + dto.ProposalVotesResponse: + properties: + pagination: + $ref: '#/definitions/dto.PaginationResponse' + votes: + items: + $ref: '#/definitions/dto.ProposalVote' + type: array + type: object + dto.ProposalsResponse: + properties: + pagination: + $ref: '#/definitions/dto.PaginationResponse' + proposals: + items: + $ref: '#/definitions/dto.ProposalSummary' + type: array + type: object + dto.PublicKey: + properties: + '@type': + type: string + key: + type: string + type: object + dto.SignerInfo: + properties: + mode_info: {} + public_key: + $ref: '#/definitions/dto.PublicKey' + sequence: + type: string + type: object + dto.Tx: + properties: + auth_info: + $ref: '#/definitions/dto.AuthInfo' + body: + $ref: '#/definitions/dto.Body' + signatures: + items: + type: string + type: array + type: object + dto.TxByHashResponse: + properties: + tx: + $ref: '#/definitions/dto.Tx' + tx_response: + $ref: '#/definitions/dto.TxResponse' + type: object + dto.TxModel: + properties: + hash: + type: string + height: + type: integer + is_ibc: + type: boolean + is_opinit: + type: boolean + is_send: + type: boolean + messages: + type: object + sender: + type: string + success: + type: boolean + timestamp: + type: string + type: object + dto.TxResponse: + properties: + code: + type: integer + codespace: + type: string + data: + type: string + events: + items: + $ref: '#/definitions/dto.Event' + type: array + gas_used: + type: string + gas_wanted: + type: string + height: + type: string + info: + type: string + logs: + items: + $ref: '#/definitions/dto.Log' + type: array + raw_log: + type: string + timestamp: + description: unix time (GMT) + type: string + tx: + $ref: '#/definitions/dto.Tx' + txhash: + type: string + type: object + dto.TxsModelResponse: + properties: + pagination: + $ref: '#/definitions/dto.PaginationResponse' + txs: + items: + $ref: '#/definitions/dto.TxModel' + type: array + type: object + dto.TxsResponse: + properties: + pagination: + $ref: '#/definitions/dto.PaginationResponse' + txs: + items: + $ref: '#/definitions/dto.TxResponse' + type: array + type: object + dto.ValidatorAnswerCountsResponse: + properties: + abstain: + type: integer + all: + type: integer + did_not_vote: + type: integer + "no": + type: integer + no_with_veto: + type: integer + weighted: + type: integer + "yes": + type: integer + type: object + dto.ValidatorBlockVoteModel: + properties: + height: + type: integer + vote: + type: string + type: object + dto.ValidatorDelegationRelatedTx: + properties: + height: + type: integer + messages: + items: + $ref: '#/definitions/dto.MessageType' + type: array + sender: + type: string + timestamp: + type: string + tokens: + items: + $ref: '#/definitions/dto.Coin' + type: array + tx_hash: + type: string + type: object + dto.ValidatorDelegationRelatedTxsResponse: + properties: + pagination: + $ref: '#/definitions/dto.PaginationResponse' + validator_delegation_related_txs: + items: + $ref: '#/definitions/dto.ValidatorDelegationRelatedTx' + type: array + type: object + dto.ValidatorHistoricalPowerModel: + properties: + hour_rounded_timestamp: + type: string + timestamp: + type: string + voting_power: + type: string + type: object + dto.ValidatorHistoricalPowersResponse: + properties: + pagination: + $ref: '#/definitions/dto.PaginationResponse' + validator_historical_powers: + items: + $ref: '#/definitions/dto.ValidatorHistoricalPowerModel' + type: array + type: object + dto.ValidatorInfo: + properties: + account_address: + type: string + commission_rate: + type: string + consensus_address: + type: string + details: + type: string + identity: + type: string + is_active: + type: boolean + is_jailed: + type: boolean + moniker: + type: string + rank: + type: integer + uptime: + type: integer + validator_address: + type: string + voting_power: + type: string + website: + type: string + type: object + dto.ValidatorInfoResponse: + properties: + info: + $ref: '#/definitions/dto.ValidatorInfo' + total_voting_power: + type: string + type: object + dto.ValidatorProposedBlockModel: + properties: + hash: + type: string + height: + type: integer + timestamp: + type: string + transaction_count: + type: integer + validator: + $ref: '#/definitions/dto.BlockProposer' + type: object + dto.ValidatorProposedBlocksResponse: + properties: + pagination: + $ref: '#/definitions/dto.PaginationResponse' + validators_proposed_blocks: + items: + $ref: '#/definitions/dto.ValidatorProposedBlockModel' + type: array + type: object + dto.ValidatorUptimeEventModel: + properties: + height: + type: integer + timestamp: + type: string + type: + type: string + type: object + dto.ValidatorUptimeResponse: + properties: + events: + items: + $ref: '#/definitions/dto.ValidatorUptimeEventModel' + type: array + recent_100_blocks: + items: + $ref: '#/definitions/dto.ValidatorBlockVoteModel' + type: array + uptime: + $ref: '#/definitions/dto.ValidatorUptimeSummary' + type: object + dto.ValidatorUptimeSummary: + properties: + missed_blocks: + type: integer + proposed_blocks: + type: integer + signed_blocks: + type: integer + total: + type: integer + type: object + dto.ValidatorVotedProposal: + properties: + abstain: + type: number + is_emergency: + type: boolean + is_expedited: + type: boolean + is_vote_weighted: + type: boolean + "no": + type: number + no_with_veto: + type: number + proposal_id: + type: integer + status: + type: string + timestamp: + type: string + title: + type: string + tx_hash: + type: string + types: + items: + type: string + type: array + "yes": + type: number + type: object + dto.ValidatorVotedProposalsResponse: + properties: + pagination: + $ref: '#/definitions/dto.PaginationResponse' + validator_voted_proposals: + items: + $ref: '#/definitions/dto.ValidatorVotedProposal' + type: array + type: object + dto.ValidatorsMetadata: + properties: + active_count: + type: integer + inactive_count: + type: integer + min_commission_rate: + type: string + percent_33_rank: + type: integer + percent_66_rank: + type: integer + total_voting_power: + type: string + type: object + dto.ValidatorsResponse: + properties: + metadata: + $ref: '#/definitions/dto.ValidatorsMetadata' + pagination: + $ref: '#/definitions/dto.PaginationResponse' + validators_info: + items: + $ref: '#/definitions/dto.ValidatorInfo' + type: array + type: object +info: + contact: + email: support@swagger.io + name: API Support + url: http://www.swagger.io/support + description: This is the API service for the Core Indexer project + license: + name: Apache 2.0 + url: http://www.apache.org/licenses/LICENSE-2.0.html + termsOfService: http://swagger.io/terms/ + title: Core Indexer API + version: "1.0" +paths: + /indexer/account/v1/{accountAddress}: + get: + consumes: + - application/json + description: Retrieve account details by account address + parameters: + - description: Account address + in: path + name: accountAddress + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/db.Account' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get account by address + tags: + - Account + /indexer/account/v1/{accountAddress}/proposals: + get: + consumes: + - application/json + description: Retrieve proposals associated with an account + parameters: + - description: Account address + in: path + name: accountAddress + required: true + type: string + - default: 0 + description: Offset for pagination + in: query + name: pagination.offset + type: integer + - default: 10 + description: Limit for pagination + in: query + name: pagination.limit + type: integer + - default: false + description: Whether to count total Nfts + in: query + name: pagination.count_total + type: boolean + - default: true + description: Whether to reverse the order of transactions + in: query + name: pagination.reverse + type: boolean + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.AccountProposalsResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get account proposals + tags: + - Account + /indexer/account/v1/{accountAddress}/txs: + get: + consumes: + - application/json + description: Retrieve transactions associated with an account + parameters: + - description: Account address + in: path + name: accountAddress + required: true + type: string + - default: 0 + description: Offset for pagination + in: query + name: pagination.offset + type: integer + - default: 10 + description: Limit for pagination + in: query + name: pagination.limit + type: integer + - default: false + description: Whether to count total transactions + in: query + name: pagination.count_total + type: boolean + - default: true + description: Whether to reverse the order of transactions + in: query + name: pagination.reverse + type: boolean + - description: Search term for transactions + in: query + name: search + type: string + - default: false + description: Filter by sent transactions + in: query + name: is_send + type: boolean + - default: false + description: Filter by IBC transactions + in: query + name: is_ibc + type: boolean + - default: false + description: Filter by OPINIT transactions + in: query + name: is_opinit + type: boolean + - default: false + description: Filter by Move publish transactions + in: query + name: is_move_publish + type: boolean + - default: false + description: Filter by Move upgrade transactions + in: query + name: is_move_upgrade + type: boolean + - default: false + description: Filter by Move execute transactions + in: query + name: is_move_execute + type: boolean + - default: false + description: Filter by Move script transactions + in: query + name: is_move_script + type: boolean + - description: Filter by transactions where the account is a signer + in: query + name: is_signer + type: boolean + produces: + - application/json + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/dto.AccountTxsResponse' + type: array + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get account transactions + tags: + - Account + /indexer/block/v1/avg_block_time: + get: + description: Retrieve the average time taken to mine a block + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.BlockTimeAverageResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get average block time + tags: + - Block + /indexer/block/v1/blocks: + get: + consumes: + - application/json + description: Retrieve a list of blocks with pagination + parameters: + - default: 0 + description: Offset for pagination + in: query + name: pagination.offset + type: integer + - default: 10 + description: Limit for pagination + in: query + name: pagination.limit + type: integer + - default: false + description: Count total number of transactions + in: query + name: pagination.count_total + type: boolean + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.BlocksResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get blocks + tags: + - Block + /indexer/block/v1/blocks/{height}/info: + get: + consumes: + - application/json + description: Retrieve detailed information about a block by its height + parameters: + - description: Block height + in: path + name: height + required: true + type: integer + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.BlockInfoResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get block info by height + tags: + - Block + /indexer/block/v1/blocks/{height}/txs: + get: + consumes: + - application/json + description: Retrieve transactions in a block by its height with pagination + parameters: + - description: Block height + in: path + name: height + required: true + type: integer + - default: 0 + description: Offset for pagination + in: query + name: pagination.offset + type: integer + - default: 10 + description: Limit for pagination + in: query + name: pagination.limit + type: integer + - default: false + description: Count total number of transactions + in: query + name: pagination.count_total + type: boolean + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.BlockTxsResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get transactions in a block by height + tags: + - Block + /indexer/block/v1/latest_block_height: + get: + description: Retrieve the latest block height + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.BlockHeightLatestResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get latest block height + tags: + - Block + /indexer/block/v1/latest_informative_block_height: + get: + description: Retrieve the latest informative block height + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.BlockHeightInformativeLatestResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get latest informative block height + tags: + - Block + /indexer/module/v1/modules: + get: + consumes: + - application/json + description: Retrieve a list of modules with pagination + parameters: + - default: 0 + description: Offset for pagination + in: query + name: pagination.offset + type: integer + - default: 10 + description: Limit for pagination + in: query + name: pagination.limit + type: integer + - default: false + description: Count total + in: query + name: pagination.count_total + type: boolean + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.ModulesResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get modules + tags: + - Module + /indexer/module/v1/modules/{vmAddress}/{name}: + get: + consumes: + - application/json + description: Retrieve a module by id + parameters: + - description: VM address + in: path + name: vmAddress + required: true + type: string + - description: Module name + in: path + name: name + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.ModuleResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get module by id + tags: + - Module + /indexer/module/v1/modules/{vmAddress}/{name}/histories: + get: + consumes: + - application/json + description: Retrieve a list of module histories with pagination + parameters: + - description: VM address + in: path + name: vmAddress + required: true + type: string + - description: Module name + in: path + name: name + required: true + type: string + - default: 0 + description: Offset for pagination + in: query + name: pagination.offset + type: integer + - default: 10 + description: Limit for pagination + in: query + name: pagination.limit + type: integer + - default: false + description: Count total + in: query + name: pagination.count_total + type: boolean + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.ModuleHistoriesResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get module histories + tags: + - Module + /indexer/module/v1/modules/{vmAddress}/{name}/proposals: + get: + consumes: + - application/json + description: Retrieve a module proposal + parameters: + - description: VM address + in: path + name: vmAddress + required: true + type: string + - description: Module name + in: path + name: name + required: true + type: string + - default: 0 + description: Offset for pagination + in: query + name: pagination.offset + type: integer + - default: 10 + description: Limit for pagination + in: query + name: pagination.limit + type: integer + - default: false + description: Count total + in: query + name: pagination.count_total + type: boolean + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.ModuleProposalsResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get module proposal + tags: + - Module + /indexer/module/v1/modules/{vmAddress}/{name}/publish_info: + get: + consumes: + - application/json + description: Retrieve a module publish info + parameters: + - description: VM address + in: path + name: vmAddress + required: true + type: string + - description: Module name + in: path + name: name + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.ModulePublishInfoResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get module publish info + tags: + - Module + /indexer/module/v1/modules/{vmAddress}/{name}/stats: + get: + consumes: + - application/json + description: Retrieve a module stats + parameters: + - description: VM address + in: path + name: vmAddress + required: true + type: string + - description: Module name + in: path + name: name + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.ModuleStatsResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get module stats by module id + tags: + - Module + /indexer/module/v1/modules/{vmAddress}/{name}/transactions: + get: + consumes: + - application/json + description: Retrieve a module transaction + parameters: + - description: VM address + in: path + name: vmAddress + required: true + type: string + - description: Module name + in: path + name: name + required: true + type: string + - default: 0 + description: Offset for pagination + in: query + name: pagination.offset + type: integer + - default: 10 + description: Limit for pagination + in: query + name: pagination.limit + type: integer + - default: false + description: Count total + in: query + name: pagination.count_total + type: boolean + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.ModuleTxsResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get module transaction + tags: + - Module + /indexer/nft/v1/collections: + get: + consumes: + - application/json + description: Retrieve a list of Nft collections with optional search and pagination + parameters: + - description: Search term for filtering Nfts + in: query + name: search + type: string + - default: 0 + description: Offset for pagination + in: query + name: pagination.offset + type: integer + - default: 10 + description: Limit for pagination + in: query + name: pagination.limit + type: integer + - default: false + description: Whether to count total Nfts + in: query + name: pagination.count_total + type: boolean + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.NftCollectionsResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get Nft collections + tags: + - Nft + /indexer/nft/v1/collections/{collectionAddress}: + get: + consumes: + - application/json + description: Retrieve a specific Nft collection by its collection address + parameters: + - description: Collection address of the Nft + in: path + name: collectionAddress + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.NftCollectionResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get Nft collection by collection address + tags: + - Nft + /indexer/nft/v1/collections/{collectionAddress}/activities: + get: + consumes: + - application/json + description: Retrieve activities related to a specific Nft collection with optional + search and pagination + parameters: + - description: Collection address of the Nft + in: path + name: collectionAddress + required: true + type: string + - description: Search term for filtering activities + in: query + name: search + type: string + - default: 0 + description: Offset for pagination + in: query + name: pagination.offset + type: integer + - default: 10 + description: Limit for pagination + in: query + name: pagination.limit + type: integer + - default: false + description: Reverse order for pagination + in: query + name: pagination.reverse + type: boolean + - default: false + description: Count total number of transactions + in: query + name: pagination.count_total + type: boolean + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.CollectionActivitiesResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get Nft collection activities + tags: + - Nft + /indexer/nft/v1/collections/{collectionAddress}/creator: + get: + consumes: + - application/json + description: Retrieve the creator of a specific Nft collection by its address + parameters: + - description: Collection address of the Nft + in: path + name: collectionAddress + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.CollectionCreatorResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get Nft collection creator + tags: + - Nft + /indexer/nft/v1/collections/{collectionAddress}/mutate_events: + get: + consumes: + - application/json + description: Retrieve mutate events for a specific Nft collection by its address + with pagination + parameters: + - description: Collection address of the Nft + in: path + name: collectionAddress + required: true + type: string + - default: 0 + description: Offset for pagination + in: query + name: pagination.offset + type: integer + - default: 10 + description: Limit for pagination + in: query + name: pagination.limit + type: integer + - default: false + description: Whether to count total events + in: query + name: pagination.count_total + type: boolean + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.CollectionMutateEventsResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get Nft collection mutate events + tags: + - Nft + /indexer/nft/v1/collections/by_account/{accountAddress}: + get: + consumes: + - application/json + description: Retrieve a list of Nft collections owned by a specific account + address + parameters: + - description: Account address of the Nft owner + in: path + name: accountAddress + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.NftCollectionsResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get Nft collections by account address + tags: + - Nft + /indexer/nft/v1/token/{nftAddress}/mint_info: + get: + consumes: + - application/json + description: Retrieve mint information for a specific Nft by its address + parameters: + - description: Nft address + in: path + name: nftAddress + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.NftMintInfoResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get Nft mint information + tags: + - Nft + /indexer/nft/v1/token/{nftAddress}/mutate_events: + get: + consumes: + - application/json + description: Retrieve mutate events for a specific Nft by its address with pagination + parameters: + - description: Nft address + in: path + name: nftAddress + required: true + type: string + - default: 0 + description: Offset for pagination + in: query + name: pagination.offset + type: integer + - default: 10 + description: Limit for pagination + in: query + name: pagination.limit + type: integer + - default: false + description: Whether to count total Nfts + in: query + name: pagination.count_total + type: boolean + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.NftMutateEventsResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get Nft mutate events + tags: + - Nft + /indexer/nft/v1/token/{nftAddress}/txs: + get: + consumes: + - application/json + description: Retrieve transactions related to a specific Nft by its address + with pagination + parameters: + - description: Nft address + in: path + name: nftAddress + required: true + type: string + - default: 0 + description: Offset for pagination + in: query + name: pagination.offset + type: integer + - default: 10 + description: Limit for pagination + in: query + name: pagination.limit + type: integer + - default: false + description: Whether to count total Nfts + in: query + name: pagination.count_total + type: boolean + - default: true + description: Whether to reverse the order of transactions + in: query + name: pagination.reverse + type: boolean + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.NftTxsResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get Nft transactions + tags: + - Nft + /indexer/nft/v1/tokens/by_account/{accountAddress}: + get: + consumes: + - application/json + description: Retrieve a list of Nfts owned by a specific account address with + optional search and collection filtering + parameters: + - description: Account address of the Nfts owner + in: path + name: accountAddress + required: true + type: string + - description: Search term for filtering Nfts + in: query + name: search + type: string + - description: Collection address to filter Nfts + in: query + name: collectionAddress + type: string + - default: 0 + description: Offset for pagination + in: query + name: pagination.offset + type: integer + - default: 10 + description: Limit for pagination + in: query + name: pagination.limit + type: integer + - default: false + description: Whether to count total Nfts + in: query + name: pagination.count_total + type: boolean + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.NftsByAddressResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get Nfts by account address + tags: + - Nft + /indexer/nft/v1/tokens/by_collection/{collectionAddress}: + get: + consumes: + - application/json + description: Retrieve a list of Nfts by their collection address with optional + search and pagination + parameters: + - description: Collection address of the Nfts + in: path + name: collectionAddress + required: true + type: string + - description: Search term for filtering Nfts + in: query + name: search + type: string + - default: 0 + description: Offset for pagination + in: query + name: pagination.offset + type: integer + - default: 10 + description: Limit for pagination + in: query + name: pagination.limit + type: integer + - default: false + description: Whether to count total Nfts + in: query + name: pagination.count_total + type: boolean + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.NftsByAddressResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get Nfts by collection address + tags: + - Nft + /indexer/nft/v1/tokens/by_collection/{collectionAddress}/{nftAddress}: + get: + consumes: + - application/json + description: Retrieve a specific Nft by its collection address and Nft address + parameters: + - description: Collection address of the Nft + in: path + name: collectionAddress + required: true + type: string + - description: Nft address + in: path + name: nftAddress + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.NftByAddressResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get Nft by collection address and Nft address + tags: + - Nft + /indexer/proposal/v1/proposals: + get: + description: Retrieve the list of all proposals + parameters: + - default: 0 + description: Offset for pagination + in: query + name: pagination.offset + type: integer + - default: 10 + description: Limit for pagination + in: query + name: pagination.limit + type: integer + - default: false + description: Reverse order for pagination + in: query + name: pagination.reverse + type: boolean + - default: false + description: Count total number of transactions + in: query + name: pagination.count_total + type: boolean + - default: "" + description: Filter proposals by proposer + in: query + name: proposer + type: string + - default: "" + description: Filter proposals by status(es) + in: query + name: statuses + type: string + - default: "" + description: Filter proposals by proposal type + in: query + name: types + type: string + - default: "" + description: Search proposals by title or exact proposal id + in: query + name: search + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.ProposalsResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get list of proposals + tags: + - Proposal + /indexer/proposal/v1/proposals/{proposalId}/answer_counts: + get: + description: Retrieve vote counts of a proposal by options + parameters: + - description: Proposal Id + in: path + name: proposalId + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.ProposalAnswerCountsResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get votes count of a proposal + tags: + - Proposal + /indexer/proposal/v1/proposals/{proposalId}/info: + get: + description: Retrieve proposal details + parameters: + - description: Proposal Id + in: path + name: proposalId + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.ProposalInfoResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get proposal info + tags: + - Proposal + /indexer/proposal/v1/proposals/{proposalId}/validator_votes: + get: + description: Retrieve list of all proposal votes by validators + parameters: + - default: 0 + description: Offset for pagination + in: query + name: pagination.offset + type: integer + - default: 10 + description: Limit for pagination + in: query + name: pagination.limit + type: integer + - default: false + description: Reverse order for pagination + in: query + name: pagination.reverse + type: boolean + - default: false + description: Count total number of transactions + in: query + name: pagination.count_total + type: boolean + - description: Proposal Id + in: path + name: proposalId + required: true + type: string + - default: "" + description: Search proposal vote by validator moniker or address + in: query + name: search + type: string + - default: "" + description: Search proposal votes by vote option + in: query + name: answer + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.ProposalValidatorVotesResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get validator votes of a proposal + tags: + - Proposal + /indexer/proposal/v1/proposals/{proposalId}/votes: + get: + description: Retrieve list of all proposal votes + parameters: + - default: 0 + description: Offset for pagination + in: query + name: pagination.offset + type: integer + - default: 10 + description: Limit for pagination + in: query + name: pagination.limit + type: integer + - default: false + description: Reverse order for pagination + in: query + name: pagination.reverse + type: boolean + - default: false + description: Count total number of transactions + in: query + name: pagination.count_total + type: boolean + - description: Proposal Id + in: path + name: proposalId + required: true + type: string + - default: "" + description: Search proposal vote by voter address + in: query + name: search + type: string + - default: "" + description: Search proposal votes by vote option + in: query + name: answer + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.ProposalVotesResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get all proposal votes + tags: + - Proposal + /indexer/proposal/v1/proposals/types: + get: + description: Retrieve all submitted proposal types + produces: + - application/json + responses: + "200": + description: OK + schema: + items: + type: string + type: array + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get list of submitted proposal types + tags: + - Proposal + /indexer/tx/v1/txs: + get: + consumes: + - application/json + description: Retrieve a list of transactions with pagination + parameters: + - default: 0 + description: Offset for pagination + in: query + name: pagination.offset + type: integer + - default: 10 + description: Limit for pagination + in: query + name: pagination.limit + type: integer + - default: false + description: Reverse order for pagination + in: query + name: pagination.reverse + type: boolean + - default: false + description: Count total number of transactions + in: query + name: pagination.count_total + type: boolean + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.TxsModelResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get transactions + tags: + - Transaction + /indexer/tx/v1/txs/{tx_hash}: + get: + consumes: + - application/json + description: Retrieve transaction details by its hash + parameters: + - description: Transaction hash + in: path + name: tx_hash + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.TxByHashResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get transaction by hash + tags: + - Transaction + /indexer/tx/v1/txs/by_account/{accountAddress}: + get: + description: Retrieve transactions by account address + parameters: + - description: Account address + in: path + name: accountAddress + required: true + type: string + - default: 0 + description: Offset for pagination + in: query + name: pagination.offset + type: integer + - default: 10 + description: Limit for pagination + in: query + name: pagination.limit + type: integer + - default: false + description: Reverse order for pagination + in: query + name: pagination.reverse + type: boolean + - default: false + description: Count total number of transactions + in: query + name: pagination.count_total + type: boolean + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.TxsResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get transactions by account address + tags: + - Transaction + /indexer/tx/v1/txs/count: + get: + description: Retrieve the total number of transactions + produces: + - application/json + responses: + "200": + description: Transaction count + schema: + type: integer + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get transaction count + tags: + - Transaction + /indexer/validator/v1/validators: + get: + description: Retrieve the list of all validators + parameters: + - default: 0 + description: Offset for pagination + in: query + name: pagination.offset + type: integer + - default: 10 + description: Limit for pagination + in: query + name: pagination.limit + type: integer + - default: false + description: Reverse order for pagination + in: query + name: pagination.reverse + type: boolean + - default: false + description: Count total number of transactions + in: query + name: pagination.count_total + type: boolean + - default: true + description: Query for active validators + in: query + name: is_active + type: boolean + - default: "" + description: 'Sort validators by field: ''uptime'', ''commission'', ''moniker'' + or empty for default (voting power)' + in: query + name: sort_by + type: string + - default: "" + description: Search validators by moniker or exact operator address + in: query + name: search + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.ValidatorsResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get list of validators + tags: + - Validator + /indexer/validator/v1/validators/{operatorAddr}/answer_counts: + get: + description: Get validator voted governance proposal answers count + parameters: + - description: Validator operator address + in: path + name: operatorAddr + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.ValidatorAnswerCountsResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get validator proposal answers count + tags: + - Validator + /indexer/validator/v1/validators/{operatorAddr}/delegation_related_txs: + get: + description: Retrieves list of delegation related of a validator + parameters: + - default: 0 + description: Offset for pagination + in: query + name: pagination.offset + type: integer + - default: 10 + description: Limit for pagination + in: query + name: pagination.limit + type: integer + - default: false + description: Reverse order for pagination + in: query + name: pagination.reverse + type: boolean + - default: false + description: Count total number of transactions + in: query + name: pagination.count_total + type: boolean + - description: Validator operator address + in: path + name: operatorAddr + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.ValidatorDelegationRelatedTxsResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get delegation transactions of a validator + tags: + - Validator + /indexer/validator/v1/validators/{operatorAddr}/historical_powers: + get: + description: Retrieves historical powers of a validator to be rendered + parameters: + - description: Validator operator address + in: path + name: operatorAddr + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.ValidatorHistoricalPowersResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get validator historical powers + tags: + - Validator + /indexer/validator/v1/validators/{operatorAddr}/info: + get: + description: Get validator info from the operator address + parameters: + - description: Validator operator address + in: path + name: operatorAddr + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.ValidatorInfoResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get validator info + tags: + - Validator + /indexer/validator/v1/validators/{operatorAddr}/proposed_blocks: + get: + description: Retrieves list of proposed blocks from a validator + parameters: + - default: 0 + description: Offset for pagination + in: query + name: pagination.offset + type: integer + - default: 10 + description: Limit for pagination + in: query + name: pagination.limit + type: integer + - default: false + description: Reverse order for pagination + in: query + name: pagination.reverse + type: boolean + - default: false + description: Count total number of transactions + in: query + name: pagination.count_total + type: boolean + - description: Validator operator address + in: path + name: operatorAddr + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.ValidatorProposedBlocksResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get validator proposed blocks + tags: + - Validator + /indexer/validator/v1/validators/{operatorAddr}/uptime: + get: + description: Get validator uptime from the operator address + parameters: + - description: Validator operator address + in: path + name: operatorAddr + required: true + type: string + - description: Blocks to be queried + in: query + name: blocks + required: true + type: integer + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.ValidatorUptimeResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get validator uptime + tags: + - Validator + /indexer/validator/v1/validators/{operatorAddr}/voted_proposals: + get: + description: Retrieves list of voted governance proposals from a validator + parameters: + - default: 0 + description: Offset for pagination + in: query + name: pagination.offset + type: integer + - default: 10 + description: Limit for pagination + in: query + name: pagination.limit + type: integer + - default: false + description: Reverse order for pagination + in: query + name: pagination.reverse + type: boolean + - default: false + description: Count total number of transactions + in: query + name: pagination.count_total + type: boolean + - description: Validator operator address + in: path + name: operatorAddr + required: true + type: string + - default: "" + description: Search validators by moniker or exact operator address + in: query + name: search + type: string + - default: "" + description: Filter by given answer + in: query + name: answer + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.ValidatorVotedProposalsResponse' + "400": + description: Bad Request + schema: + $ref: '#/definitions/apperror.Response' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/apperror.Response' + summary: Get validator voted proposals + tags: + - Validator +swagger: "2.0" +tags: +- description: Block related endpoints + name: Block +- description: Health check endpoints + name: Health +- description: Module related endpoints + name: Module +- description: Nft related endpoints + name: Nft +- description: Proposal related endpoints + name: Proposal +- description: Root endpoints + name: Root +- description: Transaction related endpoints + name: Transaction +- description: Validator related endpoints + name: Validator diff --git a/api/dto/account.go b/api/dto/account.go new file mode 100644 index 00000000..a09043af --- /dev/null +++ b/api/dto/account.go @@ -0,0 +1,62 @@ +package dto + +import ( + "encoding/json" + "time" +) + +type AccountTxModel struct { + Height int64 `json:"height"` + Timestamp string `json:"timestamp"` + Sender string `json:"sender"` + Hash string `json:"hash"` + Success bool `json:"success"` + Messages json.RawMessage `json:"messages" swaggertype:"object"` + IsSend bool `json:"is_send"` + IsIbc bool `json:"is_ibc"` + IsMovePublish bool `json:"is_move_publish"` + IsMoveUpgrade bool `json:"is_move_upgrade"` + IsMoveExecute bool `json:"is_move_execute"` + IsMoveScript bool `json:"is_move_script"` + IsOpinit bool `json:"is_opinit"` + IsSigner bool `json:"is_signer"` +} + +type AccountTx struct { + Created string `json:"created"` + Hash string `json:"hash"` + Height int64 `json:"height"` + IsIbc bool `json:"is_ibc"` + IsSend bool `json:"is_send"` + IsSigner bool `json:"is_signer"` + Messages json.RawMessage `json:"messages" swaggertype:"object"` + Sender string `json:"sender"` + Success bool `json:"success"` + IsMoveExecute bool `json:"is_move_execute"` + IsMovePublish bool `json:"is_move_publish"` + IsMoveScript bool `json:"is_move_script"` + IsOpinit bool `json:"is_opinit"` +} + +type AccountTxsResponse struct { + AccountTxs []AccountTx `json:"account_txs"` + Pagination PaginationResponse `json:"pagination"` +} + +type AccountProposal struct { + DepositEndTime time.Time `json:"deposit_end_time"` + ID int64 `json:"id"` + IsEmergency bool `json:"is_emergency"` + IsExpedited bool `json:"is_expedited"` + Proposer string `json:"proposer"` + ResolvedHeight *int64 `json:"resolved_height"` + Status string `json:"status"` + Title string `json:"title"` + Type string `json:"type"` + VotingEndTime *time.Time `json:"voting_end_time"` +} + +type AccountProposalsResponse struct { + Proposals []AccountProposal `json:"proposals"` + Pagination PaginationResponse `json:"pagination"` +} diff --git a/api/dto/block.go b/api/dto/block.go new file mode 100644 index 00000000..23331f15 --- /dev/null +++ b/api/dto/block.go @@ -0,0 +1,81 @@ +package dto + +import "encoding/json" + +type BlockHeightLatestResponse struct { + Height int64 `json:"height"` +} + +type BlockHeightInformativeLatestResponse struct { + Height int64 `json:"height"` +} + +type BlockTimeAverageResponse struct { + AverageBlockTime float64 `json:"avg_block_time"` +} + +type BlockModel struct { + Hash string `json:"hash"` + Height int64 `json:"height"` + Timestamp string `json:"timestamp"` + OperatorAddress string `json:"operator_address"` + Moniker string `json:"moniker"` + Identity string `json:"identity"` + TxCount int64 `json:"tx_count"` +} + +type BlockProposer struct { + Identity string `json:"identity"` + Moniker string `json:"moniker"` + OperatorAddress string `json:"operator_address"` +} + +type Block struct { + Hash string `json:"hash"` + Height int64 `json:"height"` + Timestamp string `json:"timestamp"` + TxCount int64 `json:"tx_count"` + Proposer BlockProposer `json:"proposer"` +} + +type BlocksResponse struct { + Blocks []Block `json:"blocks"` + Pagination PaginationResponse `json:"pagination"` +} + +type BlockInfoModel struct { + Hash string `json:"hash"` + Height int64 `json:"height"` + Timestamp string `json:"timestamp"` + OperatorAddress string `json:"operator_address"` + Moniker string `json:"moniker"` + Identity string `json:"identity"` + GasUsed int64 `json:"gas_used"` + GasLimit int64 `json:"gas_limit"` +} + +type BlockInfoResponse struct { + GasLimit int64 `json:"gas_limit"` + GasUsed int64 `json:"gas_used"` + Hash string `json:"hash"` + Height int64 `json:"height"` + Timestamp string `json:"timestamp"` + Proposer BlockProposer `json:"proposer"` +} + +type BlockTxModel struct { + Height int64 `json:"height"` + Timestamp string `json:"timestamp"` + Address string `json:"address"` + Hash string `json:"hash"` + Success bool `json:"success"` + Messages json.RawMessage `json:"messages" swaggertype:"object"` + IsSend bool `json:"is_send"` + IsIbc bool `json:"is_ibc"` + IsOpinit bool `json:"is_opinit"` +} + +type BlockTxsResponse struct { + BlockTxs []BlockTxModel `json:"block_txs"` + Pagination PaginationResponse `json:"pagination"` +} diff --git a/api/dto/module.go b/api/dto/module.go new file mode 100644 index 00000000..d669c7d8 --- /dev/null +++ b/api/dto/module.go @@ -0,0 +1,108 @@ +package dto + +import ( + "encoding/json" +) + +// ModuleResponse represents the response for a module +type ModuleResponse struct { + ModuleName string `json:"module_name"` + Digest string `json:"digest"` + IsVerify bool `json:"is_verify"` + Address string `json:"address"` + Height int64 `json:"height"` + LatestUpdated string `json:"latest_updated"` + IsRepublished bool `json:"is_republished"` +} + +// ModulesResponse represents the response for a list of modules +type ModulesResponse struct { + Modules []ModuleResponse `json:"modules"` + Pagination PaginationResponse `json:"pagination"` +} + +// ModuleHistoryResponse represents the response for a module history +type ModuleHistoryResponse struct { + Height int64 `json:"height"` + Remark json.RawMessage `json:"remark" swaggertype:"object"` + UpgradePolicy string `json:"upgrade_policy"` + Timestamp string `json:"timestamp"` + PreviousPolicy *string `json:"previous_policy"` +} + +// ModuleHistoriesResponse represents the response for a list of module histories +type ModuleHistoriesResponse struct { + ModuleHistories []ModuleHistoryResponse `json:"module_histories"` + Pagination PaginationResponse `json:"pagination"` +} + +type Proposal struct { + ProposalID int32 `json:"proposal_id"` + ProposalTitle string `json:"proposal_title"` +} + +type ModulePublishInfoModel struct { + Height int64 `json:"height"` + Proposal *Proposal `gorm:"embedded;embeddedPrefix:proposal_" json:"proposal"` + Timestamp string `json:"timestamp"` + TransactionHash *string `json:"transaction_hash"` +} + +// ModulePublishInfoResponse represents the response for a module publish info +type ModulePublishInfoResponse struct { + RecentPublishTransaction *string `json:"recent_publish_transaction"` + IsRepublished bool `json:"is_republished"` + RecentPublishBlockHeight int64 `json:"recent_publish_block_height"` + RecentPublishBlockTimestamp string `json:"recent_publish_block_timestamp"` + RecentPublishProposal *Proposal `json:"recent_publish_proposal"` +} + +type ModuleProposalModel struct { + ID int32 `json:"id"` + Title string `json:"title"` + Status string `json:"status"` + VotingEndTime string `json:"voting_end_time"` + DepositEndTime string `json:"deposit_end_time"` + Types json.RawMessage `json:"types" swaggertype:"object"` + IsExpedited bool `json:"is_expedited"` + IsEmergency bool `json:"is_emergency"` + ResolvedHeight int64 `json:"resolved_height"` + Proposer string `json:"proposer"` +} + +// ModuleProposalsResponse represents the response for a module proposal +type ModuleProposalsResponse struct { + Proposals []ModuleProposalModel `json:"proposals"` + Pagination PaginationResponse `json:"pagination"` +} + +// ModuleTxResponse represents the response for a module tx +type ModuleTxResponse struct { + Height int64 `json:"height"` + Timestamp string `json:"timestamp"` + Sender string `json:"sender"` + TxHash string `json:"hash" gorm:"column:hash"` + Success bool `json:"success"` + Messages json.RawMessage `json:"messages" swaggertype:"object"` + IsSend bool `json:"is_send"` + IsIBC bool `json:"is_ibc"` + IsMoveExecute bool `json:"is_move_execute"` + IsMoveExecuteEvent bool `json:"is_move_execute_event"` + IsMovePublish bool `json:"is_move_publish"` + IsMoveScript bool `json:"is_move_script"` + IsMoveUpgrade bool `json:"is_move_upgrade"` + IsOpinit bool `json:"is_opinit"` +} + +// ModuleTxsResponse represents the response for a list of module txs +type ModuleTxsResponse struct { + ModuleTxs []ModuleTxResponse `json:"module_txs"` + Pagination PaginationResponse `json:"pagination"` +} + +// ModuleStatsResponse represents the response for a module stats +type ModuleStatsResponse struct { + TotalHistories int64 `json:"total_histories"` + TotalProposals *int64 `json:"total_proposals"` + TotalTxs int64 `json:"total_txs"` +} diff --git a/api/dto/nft.go b/api/dto/nft.go new file mode 100644 index 00000000..7dc395cf --- /dev/null +++ b/api/dto/nft.go @@ -0,0 +1,152 @@ +package dto + +import "encoding/json" + +type NftCollectionCollectionNft struct { + Length int64 `json:"length"` +} + +type NftCollectionCollection struct { + Creator string `json:"creator"` + Description string `json:"description"` + Name string `json:"name"` + URI string `json:"uri"` + Nft *NftCollectionCollectionNft `json:"nft,omitempty"` +} + +type NftCollectionResponse struct { + ObjectAddr string `json:"object_addr"` + Collection NftCollectionCollection `json:"collection"` +} + +// NftCollectionsResponse represents the response for Nft collections list +type NftCollectionsResponse struct { + Collections []NftCollectionResponse `json:"collections"` + Pagination PaginationResponse `json:"pagination"` +} + +type NftByAddressModel struct { + TokenID string `json:"token_id"` + URI string `json:"uri"` + Description string `json:"description"` + IsBurned bool `json:"is_burned"` + Owner string `json:"owner"` + ID string `json:"id"` + Collection string `json:"collection"` + CollectionName string `json:"collection_name"` +} + +type NftByAddressNftCollection struct { + Inner string `json:"inner"` +} + +type NftByAddressNft struct { + Collection NftByAddressNftCollection `json:"collection"` + Description string `json:"description"` + TokenID string `json:"token_id"` + URI string `json:"uri"` + IsBurned bool `json:"is_burned"` +} + +type NftByAddressResponse struct { + ObjectAddr string `json:"object_addr"` + CollectionAddr string `json:"collection_addr"` + CollectionName string `json:"collection_name"` + OwnerAddr string `json:"owner_addr"` + Nft NftByAddressNft `json:"nft"` +} + +type NftsByAddressResponse struct { + Tokens []NftByAddressResponse `json:"tokens"` + Pagination PaginationResponse `json:"pagination"` +} + +type NftMintInfoModel struct { + Address string `json:"address"` + Hash string `json:"hash"` + Height int64 `json:"height"` + Timestamp string `json:"timestamp"` +} + +type NftMintInfoResponse struct { + Height int64 `json:"height"` + Minter string `json:"minter"` + Timestamp string `json:"timestamp"` + TxHash string `json:"txhash"` +} + +type MutateEventModel struct { + MutatedFieldName string `json:"mutated_field_name"` + NewValue string `json:"new_value"` + OldValue string `json:"old_value"` + Remark json.RawMessage `json:"remark" swaggertype:"object"` + Timestamp string `json:"timestamp"` +} + +type NftMutateEventsResponse struct { + NftMutateEvents []MutateEventModel `json:"nft_mutate_events"` + Pagination PaginationResponse `json:"pagination"` +} + +type NftTxModel struct { + IsNftBurn bool `json:"is_nft_burn"` + IsNftMint bool `json:"is_nft_mint"` + IsNftTransfer bool `json:"is_nft_transfer"` + Hash string `json:"hash"` + Height int64 `json:"height"` + Timestamp string `json:"timestamp"` +} + +type NftTx struct { + IsNftBurn bool `json:"is_nft_burn"` + IsNftMint bool `json:"is_nft_mint"` + IsNftTransfer bool `json:"is_nft_transfer"` + Timestamp string `json:"timestamp"` + TxHash string `json:"txhash"` +} + +type NftTxsResponse struct { + NftTxs []NftTx `json:"nft_txs"` + Pagination PaginationResponse `json:"pagination"` +} + +type CollectionByAccountAddressModel struct { + Name string `json:"name"` + URI string `json:"uri"` + Description string `json:"description"` + ID string `json:"id"` + Count int64 `json:"count"` + Creator string `json:"creator"` +} + +type CollectionActivityModel struct { + Hash string `json:"hash"` + Timestamp string `json:"timestamp"` + IsNftBurn bool `json:"is_nft_burn"` + IsNftMint bool `json:"is_nft_mint"` + IsNftTransfer bool `json:"is_nft_transfer"` + NftID string `json:"nft_id"` + TokenID string `json:"token_id"` + IsCollectionCreate bool `json:"is_collection_create"` +} + +type CollectionActivitiesResponse struct { + CollectionActivities []CollectionActivityModel `json:"collection_activities"` + Pagination PaginationResponse `json:"pagination"` +} + +type CollectionCreatorModel struct { + Height int64 `json:"height"` + Timestamp string `json:"timestamp"` + Creator string `json:"creator"` + Hash string `json:"hash"` +} + +type CollectionCreatorResponse struct { + Creator CollectionCreatorModel `json:"creator"` +} + +type CollectionMutateEventsResponse struct { + CollectionMutateEvents []MutateEventModel `json:"collection_mutate_events"` + Pagination PaginationResponse `json:"pagination"` +} diff --git a/api/dto/pagination.go b/api/dto/pagination.go new file mode 100644 index 00000000..e379fbea --- /dev/null +++ b/api/dto/pagination.go @@ -0,0 +1,149 @@ +package dto + +import ( + "bytes" + "encoding/base64" + "errors" + "fmt" + "strconv" + "strings" + + "github.com/gofiber/fiber/v2" + "github.com/initia-labs/core-indexer/api/apperror" +) + +// PaginationQuery represents pagination parameters for list requests +type PaginationQuery struct { + Limit int `validate:"required,min=1,max=1000"` + Offset int `validate:"min=0"` + Key string `validate:"omitempty,base64"` + Reverse bool `validate:"omitempty"` + CountTotal bool `validate:"omitempty"` +} + +func PaginationFromQuery(c *fiber.Ctx) (*PaginationQuery, error) { + p := &PaginationQuery{ + Limit: 10, // default + Offset: 0, // default + Reverse: true, + CountTotal: true, + } + + // Parse limit + if limitStr := c.Query("pagination.limit"); limitStr != "" { + limit, err := strconv.Atoi(limitStr) + if err != nil { + return nil, apperror.NewLimitInteger() + } + + if limit < 1 || limit > 1000 { + return nil, apperror.NewInvalidLimit() + } + + p.Limit = limit + } + + // Parse offset + if offsetStr := c.Query("pagination.offset"); offsetStr != "" { + offset, err := strconv.Atoi(offsetStr) + if err != nil { + return nil, apperror.NewOffsetInteger() + } + + if offset < 0 { + return nil, apperror.NewOffsetInteger() + } + + p.Offset = offset + } + + // Parse key + key := c.Query("pagination.key") + if key != "" { + p.Key = key + if err := parsePaginationKey(key, p); err != nil { + return nil, err + } + } + + // Parse reverse + if reverseStr := c.Query("pagination.reverse"); reverseStr != "" { + val, err := strconv.ParseBool(reverseStr) + if err != nil { + return nil, apperror.NewReverse() + } + p.Reverse = val + + } + + // Parse count_total + if countTotalStr := c.Query("pagination.count_total"); countTotalStr != "" { + val, err := strconv.ParseBool(countTotalStr) + if err != nil { + return nil, apperror.NewCountTotal() + } + p.CountTotal = val + } + + return p, nil +} + +// PaginationResponse represents pagination metadata in list responses +type PaginationResponse struct { + PreviousKey *string `json:"previous_key" ` + NextKey *string `json:"next_key"` + Total string `json:"total"` +} + +func NewPaginationResponse(offset int, limit int, total int64) (res PaginationResponse) { + if total == -1 || total > int64(offset+limit) { + nextKey := base64.StdEncoding.EncodeToString([]byte(strconv.Itoa(offset + limit))) + res.NextKey = &nextKey + } + // if offset is greater than or equal to limit, previousKey can be set + if offset > 0 && offset >= limit { + previousKey := base64.StdEncoding.EncodeToString([]byte(strconv.Itoa(offset - limit))) + res.PreviousKey = &previousKey + } + res.Total = fmt.Sprintf("%d", total) + return +} + +// parsePaginationKey parses the pagination key and updates pagination accordingly +func parsePaginationKey(key string, pagination *PaginationQuery) error { + decoded, err := base64.StdEncoding.DecodeString(key) + if err != nil { + return errors.New("pagination.key must be a valid base64 encoded string") + } + + // Try JSON cursor format first + if strings.HasPrefix(string(bytes.TrimSpace(decoded)), "{") { + return parseJSONCursor(decoded, pagination) + } + + // Fallback to traditional integer approach + return parseIntegerCursor(string(decoded), pagination) +} + +// parseJSONCursor attempts to parse JSON cursor format +func parseJSONCursor(decoded []byte, pagination *PaginationQuery) error { + // JSON parsing failed, try fallback to integer with appropriate error message + parsedOffset, err := strconv.Atoi(string(decoded)) + if err != nil || parsedOffset < 0 { + return errors.New("invalid pagination.key format") + } + + pagination.Offset = parsedOffset + return nil +} + +// parseIntegerCursor parses traditional integer cursor format +func parseIntegerCursor(decodedStr string, pagination *PaginationQuery) error { + parsedOffset, err := strconv.Atoi(decodedStr) + if err != nil || parsedOffset < 0 { + return errors.New("pagination.key must decode to a nonnegative integer") + } + + pagination.Offset = parsedOffset + return nil +} diff --git a/api/dto/pagination_test.go b/api/dto/pagination_test.go new file mode 100644 index 00000000..f4ec8900 --- /dev/null +++ b/api/dto/pagination_test.go @@ -0,0 +1,182 @@ +package dto + +import ( + "testing" + + "github.com/gofiber/fiber/v2" + "github.com/initia-labs/core-indexer/api/apperror" + "github.com/stretchr/testify/assert" + "github.com/valyala/fasthttp" +) + +func TestPaginationFromQuery(t *testing.T) { + + // Table-driven tests for various scenarios + testCases := []struct { + name string + queryString string + expectError bool + expectedError *apperror.Response + expectedResult *PaginationQuery + }{ + { + name: "valid custom values", + queryString: "pagination.limit=50&pagination.offset=100&pagination.key=MjAw&pagination.reverse=false&pagination.count_total=true", + expectError: false, + expectedResult: &PaginationQuery{ + Limit: 50, + Offset: 200, + Key: "MjAw", + Reverse: false, + CountTotal: true, + }, + }, + { + name: "partial parameters", + queryString: "pagination.limit=25&pagination.offset=50", + expectError: false, + expectedResult: &PaginationQuery{ + Limit: 25, + Offset: 50, + Key: "", + Reverse: true, + CountTotal: true, + }, + }, + { + name: "invalid limit - not integer", + queryString: "pagination.limit=abc", + expectError: true, + expectedError: apperror.NewLimitInteger(), + }, + { + name: "invalid limit - too small", + queryString: "pagination.limit=0", + expectError: true, + expectedError: apperror.NewInvalidLimit(), + }, + { + name: "invalid limit - too large", + queryString: "pagination.limit=1001", + expectError: true, + expectedError: apperror.NewInvalidLimit(), + }, + { + name: "invalid offset - not integer", + queryString: "pagination.offset=xyz", + expectError: true, + expectedError: apperror.NewOffsetInteger(), + }, + { + name: "invalid offset - negative", + queryString: "pagination.offset=-10", + expectError: true, + expectedError: apperror.NewOffsetInteger(), + }, + { + name: "invalid reverse - not boolean", + queryString: "pagination.reverse=maybe", + expectError: true, + expectedError: apperror.NewReverse(), + }, + { + name: "invalid count_total - not boolean", + queryString: "pagination.count_total=perhaps", + expectError: true, + expectedError: apperror.NewCountTotal(), + }, + { + name: "valid boolean values", + queryString: "pagination.reverse=true&pagination.count_total=false", + expectError: false, + expectedResult: &PaginationQuery{ + Limit: 10, + Offset: 0, + Key: "", + Reverse: true, + CountTotal: false, + }, + }, + { + name: "edge case - limit at minimum", + queryString: "pagination.limit=1", + expectError: false, + expectedResult: &PaginationQuery{ + Limit: 1, + Offset: 0, + Key: "", + Reverse: true, + CountTotal: true, + }, + }, + { + name: "edge case - limit at maximum", + queryString: "pagination.limit=1000", + expectError: false, + expectedResult: &PaginationQuery{ + Limit: 1000, + Offset: 0, + Key: "", + Reverse: true, + CountTotal: true, + }, + }, + { + name: "edge case - offset at minimum", + queryString: "pagination.offset=0", + expectError: false, + expectedResult: &PaginationQuery{ + Limit: 10, + Offset: 0, + Key: "", + Reverse: true, + CountTotal: true, + }, + }, + { + name: "large offset", + queryString: "pagination.offset=999999", + expectError: false, + expectedResult: &PaginationQuery{ + Limit: 10, + Offset: 999999, + Key: "", + Reverse: true, + CountTotal: true, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + app := fiber.New() + req := &fasthttp.RequestCtx{} + req.URI().SetQueryString(tc.queryString) + c := app.AcquireCtx(req) + defer app.ReleaseCtx(c) + + result, err := PaginationFromQuery(c) + + if tc.expectError { + assert.Error(t, err) + assert.Nil(t, result) + + // Assert specific error type and message + if tc.expectedError != nil { + var appErr *apperror.Response + assert.ErrorAs(t, err, &appErr) + assert.Equal(t, tc.expectedError.Code, appErr.Code) + assert.Equal(t, tc.expectedError.Message, appErr.Message) + } + } else { + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Equal(t, tc.expectedResult.Limit, result.Limit) + assert.Equal(t, tc.expectedResult.Offset, result.Offset) + assert.Equal(t, tc.expectedResult.Key, result.Key) + assert.Equal(t, tc.expectedResult.Reverse, result.Reverse) + assert.Equal(t, tc.expectedResult.CountTotal, result.CountTotal) + } + }) + } +} diff --git a/api/dto/proposal.go b/api/dto/proposal.go new file mode 100644 index 00000000..b1669188 --- /dev/null +++ b/api/dto/proposal.go @@ -0,0 +1,212 @@ +package dto + +import ( + "encoding/json" + "time" +) + +// /indexer/proposal/v1/proposals + +type ProposalsResponse struct { + Proposals []ProposalSummary `json:"proposals"` + Pagination PaginationResponse `json:"pagination"` +} + +type ProposalSummary struct { + DepositEndTime time.Time `json:"deposit_end_time"` + Id int `json:"id"` + IsEmergency bool `json:"is_emergency"` + IsExpedited bool `json:"is_expedited"` + Proposer string `json:"proposer"` + ResolvedHeight int `json:"resolved_height"` + Status string `json:"status"` + Title string `json:"title"` + Types json.RawMessage `json:"types" swaggertype:"object"` + VotingEndTime *time.Time `json:"voting_end_time"` +} + +// /indexer/proposal/v1/proposals/types + +type ProposalsTypesResponse []string + +// /indexer/proposal/v1/proposals/{proposalId}/info + +type ProposalInfoResponse struct { + Info ProposalInfo `json:"info"` +} + +type ProposalInfo struct { + Abstain string `json:"abstain"` + Content ProposalContent `json:"content"` + CreatedHeight int `json:"created_height"` + CreatedTimestamp time.Time `json:"created_timestamp"` + CreatedTxHash string `json:"created_tx_hash"` + DepositEndTime time.Time `json:"deposit_end_time"` + Description string `json:"description"` + FailedReason string `json:"failed_reason"` + Id int `json:"id"` + IsEmergency bool `json:"is_emergency"` + IsExpedited bool `json:"is_expedited"` + Messages json.RawMessage `json:"messages"` + Metadata string `json:"metadata"` + No string `json:"no"` + NoWithVeto string `json:"no_with_veto"` + ProposalDeposits []ProposalDeposit `json:"proposal_deposits"` + Proposer string `json:"proposer"` + ResolvedHeight *int `json:"resolved_height"` + ResolvedTimestamp *time.Time `json:"resolved_timestamp"` + ResolvedTotalVotingPower *string `json:"resolved_total_voting_power"` + Status string `json:"status"` + SubmitTime time.Time `json:"submit_time"` + Title string `json:"title"` + TotalDeposit Coins `json:"total_deposit"` + Types json.RawMessage `json:"types"` + Version string `json:"version"` + VotingEndTime *time.Time `json:"voting_end_time"` + VotingTime *time.Time `json:"voting_time"` + Yes string `json:"yes"` +} + +type ProposalContent struct { + Messages json.RawMessage `json:"messages" swaggertype:"object"` + Metadata string `json:"metadata"` +} + +type ProposalDeposit struct { + Amount Coins `json:"amount"` + Depositor string `json:"depositor"` + Timestamp time.Time `json:"timestamp"` + TxHash string `json:"tx_hash"` +} + +type ProposalInfoModel struct { + Id int `gorm:"column:id"` + Proposer string `gorm:"column:proposer_address"` + Types string `gorm:"column:types"` + Title string `gorm:"column:title"` + Description string `gorm:"column:description"` + Status string `gorm:"column:status"` + FailedReason string `gorm:"column:failed_reason"` + SubmitTime time.Time `gorm:"column:submit_time"` + DepositEndTime time.Time `gorm:"column:deposit_end_time"` + VotingTime *time.Time `gorm:"column:voting_time"` + VotingEndTime *time.Time `gorm:"column:voting_end_time"` + Content *string `gorm:"column:content"` + Messages string `gorm:"column:messages"` + IsExpedited bool `gorm:"column:is_expedited"` + IsEmergency bool `gorm:"column:is_emergency"` + TotalDeposit string `gorm:"column:total_deposit"` + Version string `gorm:"column:version"` + CreatedTxHash string `gorm:"column:created_tx_hash"` + CreatedHeight int `gorm:"column:created_height"` + CreatedTimestamp time.Time `gorm:"column:created_timestamp"` + ResolvedHeight *int `gorm:"column:resolved_height"` + ResolvedTimestamp *time.Time `gorm:"column:resolved_timestamp"` + Metadata string `gorm:"column:metadata"` + Yes string `gorm:"column:yes"` + Abstain string `gorm:"column:abstain"` + No string `gorm:"column:no"` + NoWithVeto string `gorm:"column:no_with_veto"` + ResolvedTotalVotingPower *string `gorm:"column:resolved_total_voting_power"` +} + +type ProposalDepositModel struct { + Amount json.RawMessage `gorm:"column:amount" swaggertype:"object"` + Depositor string `gorm:"column:depositor"` + TxHash string `gorm:"column:tx_hash"` + Timestamp time.Time `gorm:"column:timestamp"` +} + +// /indexer/proposal/v1/proposals/{proposalId}/votes + +type ProposalVotesResponse struct { + Votes []ProposalVote `json:"votes"` + Pagination PaginationResponse `json:"pagination"` +} + +type ProposalVote struct { + Abstain float64 `json:"abstain"` + IsVoteWeighted bool `json:"is_vote_weighted"` + No float64 `json:"no"` + NoWithVeto float64 `json:"no_with_veto"` + ProposalId int `json:"proposal_id"` + Timestamp *time.Time `json:"timestamp"` + TxHash *string `json:"tx_hash"` + Validator *ProposalValidatorVote `json:"validator"` + Voter string `json:"voter"` + Yes float64 `json:"yes"` +} + +type ProposalValidatorVote struct { + Identity string `json:"identity"` + Moniker string `json:"moniker"` + ValidatorAddress string `json:"validator_address"` +} + +type ProposalVoteModel struct { + ProposalID int `gorm:"column:proposal_id"` + Yes float64 `gorm:"column:yes"` + No float64 `gorm:"column:no"` + NoWithVeto float64 `gorm:"column:no_with_veto"` + Abstain float64 `gorm:"column:abstain"` + IsVoteWeighted bool `gorm:"column:is_vote_weighted"` + Voter string `gorm:"column:voter"` + TxHash string `gorm:"column:tx_hash"` + Timestamp time.Time `gorm:"column:timestamp"` + ValidatorAddr *string `gorm:"column:validator_address"` + ValidatorMoniker *string `gorm:"column:validator_moniker"` + ValidatorIdentity *string `gorm:"column:validator_identity"` +} + +// /indexer/proposal/v1/proposals/{proposalId}/validator_votes + +type ProposalValidatorVotesResponse ProposalVotesResponse + +type ProposalVoteValidatorInfoModel struct { + OperatorAddress string `gorm:"column:operator_address"` + Moniker string `gorm:"column:moniker"` + Identity string `gorm:"column:identity"` +} + +type ProposalValidatorVoteModel struct { + ValidatorAddress string `gorm:"column:validator_address"` + Yes float64 `gorm:"column:yes"` + No float64 `gorm:"column:no"` + NoWithVeto float64 `gorm:"column:no_with_veto"` + Abstain float64 `gorm:"column:abstain"` + IsVoteWeighted bool `gorm:"column:is_vote_weighted"` + Voter string `gorm:"column:voter"` + TxHash *string `gorm:"column:tx_hash"` + Timestamp *time.Time `gorm:"column:timestamp"` +} + +// /indexer/proposal/v1/proposals/{proposalId}/answer_counts + +type ProposalAnswerCountsResponse struct { + All ProposalAnswerCounts `json:"all"` + Validator ProposalValidatorAnswerCounts `json:"validator"` +} + +type ProposalAnswerCounts struct { + Abstain int `json:"abstain"` + No int `json:"no"` + NoWithVeto int `json:"no_with_veto"` + Total int `json:"total"` + Weighted int `json:"weighted"` + Yes int `json:"yes"` +} + +type ProposalValidatorAnswerCounts struct { + ProposalAnswerCounts + DidNotVote int `json:"did_not_vote"` + TotalValidators int `json:"total_validators"` +} + +type ProposalAnswerCountsModel struct { + Yes float64 `gorm:"column:yes"` + No float64 `gorm:"column:no"` + NoWithVeto float64 `gorm:"column:no_with_veto"` + Abstain float64 `gorm:"column:abstain"` + IsVoteWeighted bool `gorm:"column:is_vote_weighted"` + IsValidator bool `gorm:"column:is_validator"` +} diff --git a/api/dto/tx.go b/api/dto/tx.go new file mode 100644 index 00000000..e7504fa0 --- /dev/null +++ b/api/dto/tx.go @@ -0,0 +1,127 @@ +package dto + +import ( + "encoding/json" + "time" +) + +// Coins represents a list of coin amounts +type Coins []Coin + +// Coin represents a single coin amount +type Coin struct { + Denom string `json:"denom"` + Amount string `json:"amount"` +} + +// Log represents a transaction log +type Log struct { + MsgIndex int64 `json:"msg_index"` + Log interface{} `json:"log"` // Can be string or map[string]string + Events []Event `json:"events,omitempty"` +} + +// Event represents a transaction event +type Event struct { + Type string `json:"type"` + Attributes []EventAttribute `json:"attributes"` +} + +// EventAttribute represents a key-value pair in an event +type EventAttribute struct { + Key string `json:"key"` + Value string `json:"value"` +} + +// Body represents the transaction body +type Body struct { + Messages []map[string]any `json:"messages"` + Memo string `json:"memo"` + TimeoutHeight string `json:"timeout_height"` + ExtensionOptions []any `json:"extension_options"` + NonCriticalExtenionOptions []any `json:"non_critical_extension_options"` +} + +// Fee represents the transaction fee +type Fee struct { + Amount Coins `json:"amount"` + GasLimit string `json:"gas_limit"` + Payer string `json:"payer"` + Granter string `json:"granter"` +} + +// PublicKey represents a public key +type PublicKey struct { + Type string `json:"@type"` + Key string `json:"key"` +} + +// SignerInfo represents information about a transaction signer +type SignerInfo struct { + PublicKey PublicKey `json:"public_key"` + Sequence string `json:"sequence"` + ModeInfo any `json:"mode_info"` +} + +// AuthInfo represents the transaction authentication information +type AuthInfo struct { + SignerInfos []SignerInfo `json:"signer_infos"` + Fee Fee `json:"fee"` +} + +// RestTx represents the raw transaction data +type Tx struct { + Body Body `json:"body"` + AuthInfo AuthInfo `json:"auth_info"` + Signatures []string `json:"signatures"` +} + +// RestTxResponse represents the complete transaction response +type TxByHashResponse struct { + Tx Tx `json:"tx"` + TxResponse TxResponse `json:"tx_response"` + CacheSizeBytes int64 `json:"-"` +} + +// TxResponse represents the response structure for a transaction +type TxResponse struct { + Height string `json:"height"` + TxHash string `json:"txhash"` + Codespace string `json:"codespace"` + Code int `json:"code"` + RawLog string `json:"raw_log"` + Logs []Log `json:"logs"` + GasWanted string `json:"gas_wanted"` + GasUsed string `json:"gas_used"` + Tx Tx `json:"tx"` + Timestamp string `json:"timestamp"` // unix time (GMT) + Events []Event `json:"events"` + Data string `json:"data"` + Info string `json:"info"` +} + +type TxsModelResponse struct { + Txs []TxModel `json:"txs"` + Pagination PaginationResponse `json:"pagination"` +} + +type TxsResponse struct { + Txs []TxResponse `json:"txs"` + Pagination PaginationResponse `json:"pagination"` +} + +type TxModel struct { + Sender string `json:"sender"` + Hash string `json:"hash"` + Success bool `json:"success"` + Messages json.RawMessage `json:"messages" swaggertype:"object"` + IsSend bool `json:"is_send"` + IsIbc bool `json:"is_ibc"` + IsOpinit bool `json:"is_opinit"` + Height int64 `json:"height"` + Timestamp time.Time `json:"timestamp"` +} + +type TxCountResponse struct { + Count int64 `json:"count"` +} diff --git a/api/dto/validator.go b/api/dto/validator.go new file mode 100644 index 00000000..74455dce --- /dev/null +++ b/api/dto/validator.go @@ -0,0 +1,181 @@ +package dto + +import ( + "time" + + "github.com/initia-labs/core-indexer/pkg/db" +) + +// ValidatorStatusFilter represents the status filter for querying validators +type ValidatorStatusFilter string + +const ( + ValidatorStatusFilterActive ValidatorStatusFilter = "active" + ValidatorStatusFilterInactive ValidatorStatusFilter = "inactive" + ValidatorStatusFilterAll ValidatorStatusFilter = "all" +) + +// /indexer/validator/v1/all + +type AllValidatorsResponse struct { + Infos []ValidatorInfo `json:"infos"` +} + +// /indexer/validator/v1/validators + +type ValidatorsResponse struct { + ValidatorsInfo []ValidatorInfo `json:"validators_info"` + Metadata ValidatorsMetadata `json:"metadata"` + Pagination PaginationResponse `json:"pagination"` +} + +type ValidatorInfo struct { + AccountAddress string `json:"account_address"` + CommissionRate string `json:"commission_rate"` + ConsensusAddress string `json:"consensus_address"` + Details string `json:"details"` + Identity string `json:"identity"` + Image string `json:"image"` + IsActive bool `json:"is_active"` + IsJailed bool `json:"is_jailed"` + Moniker string `json:"moniker"` + Rank int `json:"rank"` + SignedBlocks int64 `json:"signed_blocks"` + TotalBlocks int64 `json:"total_blocks"` + Uptime int32 `json:"uptime"` + ValidatorAddress string `json:"validator_address"` + VotingPower string `json:"voting_power"` + Website string `json:"website"` +} + +type ValidatorsMetadata struct { + ActiveCount int `json:"active_count"` + InactiveCount int `json:"inactive_count"` + MinCommissionRate string `json:"min_commission_rate"` + Percent33Rank int `json:"percent_33_rank"` + Percent66Rank int `json:"percent_66_rank"` + TotalVotingPower string `json:"total_voting_power"` +} + +// /indexer/validator/v1/validators/{operatorAddr}/info + +type ValidatorInfoResponse struct { + Info ValidatorInfo `json:"info"` + TotalVotingPower string `json:"total_voting_power"` +} + +// /indexer/validator/v1/validators/{operatorAddr}/uptime + +type ValidatorUptimeResponse struct { + Events []ValidatorUptimeEventModel `json:"events"` + Recent100Blocks []ValidatorBlockVoteModel `json:"recent_100_blocks"` + Uptime ValidatorUptimeSummary `json:"uptime"` +} + +type ValidatorUptimeEventModel struct { + Height int64 `json:"height"` + Timestamp time.Time `json:"timestamp"` + Type string `json:"type"` +} + +type ValidatorBlockVoteModel struct { + Height int64 `json:"height"` + Vote string `json:"vote"` +} + +type ValidatorUptimeSummary struct { + MissedBlocks int `json:"missed_blocks"` + ProposedBlocks int `json:"proposed_blocks"` + SignedBlocks int `json:"signed_blocks"` + Total int `json:"total"` +} + +// /indexer/validator/v1/validators/{operatorAddr}/delegation-related-txs + +type ValidatorDelegationRelatedTxsResponse struct { + ValidatorDelegationRelatedTxs []ValidatorDelegationRelatedTx `json:"validator_delegation_related_txs"` + Pagination PaginationResponse `json:"pagination"` +} + +type ValidatorDelegationRelatedTx struct { + Height int `json:"height"` + Messages []MessageType `json:"messages"` + Sender string `json:"sender"` + Timestamp time.Time `json:"timestamp"` + Tokens Coins `json:"tokens"` + TxHash string `json:"tx_hash"` +} + +type MessageType struct { + Type string `json:"type"` +} + +// /indexer/validator/v1/validators/{operatorAddr}/proposed-blocks + +type ValidatorProposedBlocksResponse struct { + ValidatorProposedBlocks []ValidatorProposedBlockModel `json:"validators_proposed_blocks"` + Pagination PaginationResponse `json:"pagination"` +} + +type ValidatorProposedBlockModel struct { + Hash string `json:"hash"` + Height int `json:"height"` + Timestamp time.Time `json:"timestamp"` + TransactionCount int `json:"transaction_count"` + Validator BlockProposer `json:"validator"` +} + +// /indexer/validator/v1/validators/{operatorAddr}/historical-powers + +type ValidatorHistoricalPowersResponse struct { + ValidatorHistoricalPowers []ValidatorHistoricalPowerModel `json:"validator_historical_powers"` + Pagination PaginationResponse `json:"pagination"` +} + +type ValidatorHistoricalPowerModel struct { + HourRoundedTimestamp time.Time `json:"hour_rounded_timestamp"` + Timestamp time.Time `json:"timestamp"` + VotingPower string `json:"voting_power"` +} + +// /indexer/validator/v1/validators/{operatorAddr}/voted-proposals + +type ValidatorVotedProposalsResponse struct { + ValidatorVotedProposals []ValidatorVotedProposal `json:"validator_voted_proposals"` + Pagination PaginationResponse `json:"pagination"` +} + +type ValidatorVotedProposal struct { + Abstain float64 `json:"abstain"` + IsEmergency bool `json:"is_emergency"` + IsExpedited bool `json:"is_expedited"` + IsVoteWeighted bool `json:"is_vote_weighted"` + No float64 `json:"no"` + NoWithVeto float64 `json:"no_with_veto"` + ProposalId int `json:"proposal_id"` + Status string `json:"status"` + Timestamp *time.Time `json:"timestamp"` + Title string `json:"title"` + TxHash string `json:"tx_hash"` + Types []string `json:"types"` + Yes float64 `json:"yes"` +} + +// /indexer/validator/v1/validators/{operatorAddr}/answer-counts + +type ValidatorAnswerCountsResponse struct { + Abstain int `json:"abstain"` + All int `json:"all"` + DidNotVote int `json:"did_not_vote"` + No int `json:"no"` + NoWithVeto int `json:"no_with_veto"` + Weighted int `json:"weighted"` + Yes int `json:"yes"` +} + +// Models + +type ValidatorWithVoteCountModel struct { + db.Validator + db.ValidatorVoteCount +} diff --git a/api/go.mod b/api/go.mod new file mode 100644 index 00000000..4555d2f9 --- /dev/null +++ b/api/go.mod @@ -0,0 +1,324 @@ +module github.com/initia-labs/core-indexer/api + +go 1.25.8 + +require ( + github.com/gofiber/fiber/v2 v2.52.12 + github.com/gofiber/swagger v0.1.14 + github.com/initia-labs/core-indexer/pkg v0.0.0 + github.com/joho/godotenv v1.5.1 + github.com/lib/pq v1.10.9 + github.com/rs/zerolog v1.33.0 + github.com/stretchr/testify v1.11.1 + github.com/swaggo/swag v1.16.3 + github.com/valyala/fasthttp v1.52.0 + gocloud.dev v0.41.0 + golang.org/x/sync v0.20.0 + gorm.io/gorm v1.30.0 +) + +replace github.com/initia-labs/core-indexer/pkg => ../pkg + +require ( + ariga.io/atlas v0.33.1 // indirect + ariga.io/atlas-go-sdk v0.6.8 // indirect + ariga.io/atlas-provider-gorm v0.5.2 // indirect + cel.dev/expr v0.25.1 // indirect + cloud.google.com/go v0.123.0 // indirect + cloud.google.com/go/auth v0.18.2 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect + cloud.google.com/go/compute/metadata v0.9.0 // indirect + cloud.google.com/go/iam v1.5.3 // indirect + cloud.google.com/go/monitoring v1.24.3 // indirect + cloud.google.com/go/storage v1.61.3 // indirect + cosmossdk.io/api v0.7.6 // indirect + cosmossdk.io/client/v2 v2.0.0-beta.4 // indirect + cosmossdk.io/collections v0.4.0 // indirect + cosmossdk.io/core v0.11.1 // indirect + cosmossdk.io/depinject v1.1.0 // indirect + cosmossdk.io/errors v1.0.1 // indirect + cosmossdk.io/log v1.4.1 // indirect + cosmossdk.io/math v1.4.0 // indirect + cosmossdk.io/store v1.1.1 // indirect + cosmossdk.io/x/evidence v0.1.1 // indirect + cosmossdk.io/x/feegrant v0.1.1 // indirect + cosmossdk.io/x/tx v0.13.7 // indirect + cosmossdk.io/x/upgrade v0.1.4 // indirect + filippo.io/edwards25519 v1.1.1 // indirect + github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect + github.com/99designs/keyring v1.2.2 // indirect + github.com/DataDog/datadog-go v3.2.0+incompatible // indirect + github.com/DataDog/zstd v1.5.5 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 // indirect + github.com/IGLOU-EU/go-wildcard v1.0.3 // indirect + github.com/KyleBanks/depth v1.2.1 // indirect + github.com/agext/levenshtein v1.2.3 // indirect + github.com/alitto/pond v1.8.3 // indirect + github.com/andybalholm/brotli v1.1.0 // indirect + github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect + github.com/aptos-labs/serde-reflection/serde-generate/runtime/golang v0.0.0-20231213012317-73b6bbf74833 // indirect + github.com/aws/aws-sdk-go-v2 v1.41.4 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 // indirect + github.com/aws/aws-sdk-go-v2/config v1.32.12 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.12 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 // indirect + github.com/aws/smithy-go v1.24.2 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect + github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect + github.com/bits-and-blooms/bitset v1.20.0 // indirect + github.com/bmatcuk/doublestar v1.3.4 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/chzyer/readline v1.5.1 // indirect + github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 // indirect + github.com/cockroachdb/apd/v2 v2.0.2 // indirect + github.com/cockroachdb/errors v1.11.3 // indirect + github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v1.1.5 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/cometbft/cometbft v0.38.20 // indirect + github.com/cometbft/cometbft-db v0.15.0 // indirect + github.com/cosmos/btcutil v1.0.5 // indirect + github.com/cosmos/cosmos-db v1.1.1 // indirect + github.com/cosmos/cosmos-proto v1.0.0-beta.5 // indirect + github.com/cosmos/cosmos-sdk v0.50.14 // indirect + github.com/cosmos/go-bip39 v1.0.0 // indirect + github.com/cosmos/gogogateway v1.2.0 // indirect + github.com/cosmos/gogoproto v1.7.0 // indirect + github.com/cosmos/iavl v1.2.6 // indirect + github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.2.0 // indirect + github.com/cosmos/ibc-apps/modules/rate-limiting/v8 v8.0.0 // indirect + github.com/cosmos/ibc-go/modules/capability v1.0.1 // indirect + github.com/cosmos/ibc-go/v8 v8.7.0 // indirect + github.com/cosmos/ics23/go v0.11.0 // indirect + github.com/cosmos/interchain-security/v6 v6.3.0 // indirect + github.com/cosmos/ledger-cosmos-go v0.14.0 // indirect + github.com/danieljoos/wincred v1.1.2 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect + github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect + github.com/dgraph-io/badger/v4 v4.3.0 // indirect + github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/dvsekhvalnov/jose2go v1.7.0 // indirect + github.com/emicklei/dot v1.6.2 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.36.0 // indirect + github.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect + github.com/ethereum/go-ethereum v1.16.9 // indirect + github.com/fatih/color v1.18.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/getsentry/sentry-go v0.29.1 // indirect + github.com/go-jose/go-jose/v4 v4.1.3 // indirect + github.com/go-kit/kit v0.13.0 // indirect + github.com/go-kit/log v0.2.1 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-openapi/inflect v0.19.0 // indirect + github.com/go-openapi/jsonpointer v0.20.0 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/spec v0.20.9 // indirect + github.com/go-openapi/swag v0.22.4 // indirect + github.com/go-sql-driver/mysql v1.9.1 // indirect + github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect + github.com/gogo/googleapis v1.4.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-migrate/migrate/v4 v4.18.3 // indirect + github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect + github.com/golang-sql/sqlexp v0.1.0 // indirect + github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect + github.com/golang/mock v1.6.0 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/google/btree v1.1.3 // indirect + github.com/google/flatbuffers v23.5.26+incompatible // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/google/orderedcode v0.0.1 // indirect + github.com/google/s2a-go v0.1.9 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/google/wire v0.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect + github.com/googleapis/gax-go/v2 v2.17.0 // indirect + github.com/gorilla/handlers v1.5.2 // indirect + github.com/gorilla/mux v1.8.1 // indirect + github.com/gorilla/websocket v1.5.3 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect + github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect + github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect + github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-getter v1.8.6 // indirect + github.com/hashicorp/go-hclog v1.6.3 // indirect + github.com/hashicorp/go-immutable-radix v1.3.1 // indirect + github.com/hashicorp/go-metrics v0.5.3 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-plugin v1.5.2 // indirect + github.com/hashicorp/go-version v1.8.0 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hashicorp/hcl/v2 v2.18.1 // indirect + github.com/hashicorp/yamux v0.1.1 // indirect + github.com/hdevalence/ed25519consensus v0.1.0 // indirect + github.com/holiman/uint256 v1.3.2 // indirect + github.com/huandu/skiplist v1.2.0 // indirect + github.com/iancoleman/orderedmap v0.3.0 // indirect + github.com/iancoleman/strcase v0.3.0 // indirect + github.com/improbable-eng/grpc-web v0.15.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/initia-labs/OPinit v1.3.0 // indirect + github.com/initia-labs/OPinit/api v1.3.0 // indirect + github.com/initia-labs/initia v1.4.3 // indirect + github.com/initia-labs/initia/api v1.4.0 // indirect + github.com/initia-labs/movevm v1.2.0 // indirect + github.com/initia-labs/store v0.1.1 // indirect + github.com/initia-labs/store/memiavl v0.1.1 // indirect + github.com/initia-labs/store/versiondb v0.1.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/pgx/v5 v5.9.2 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/jmhodges/levigo v1.0.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/klauspost/compress v1.18.5 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/ledgerwatch/erigon-lib v0.0.0-20230210071639-db0e7ed11263 // indirect + github.com/linxGnu/grocksdb v1.10.3 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/manifoldco/promptui v0.9.0 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/mattn/go-sqlite3 v1.14.22 // indirect + github.com/microsoft/go-mssqldb v1.7.2 // indirect + github.com/minio/highwayhash v1.0.3 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/go-testing-interface v1.14.1 // indirect + github.com/mitchellh/go-wordwrap v1.0.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mtibben/percent v0.2.1 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/noble-assets/forwarding/v2 v2.0.3 // indirect + github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a // indirect + github.com/oklog/run v1.1.0 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/client_golang v1.21.0 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.62.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/rakyll/statik v0.1.7 // indirect + github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect + github.com/rs/cors v1.11.1 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sasha-s/go-deadlock v0.3.5 // indirect + github.com/skip-mev/connect/v2 v2.3.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.7.1 // indirect + github.com/spf13/cobra v1.9.1 // indirect + github.com/spf13/pflag v1.0.6 // indirect + github.com/spf13/viper v1.19.0 // indirect + github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + github.com/swaggo/files/v2 v2.0.0 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect + github.com/tendermint/go-amino v0.16.0 // indirect + github.com/tidwall/btree v1.7.0 // indirect + github.com/tidwall/gjson v1.18.0 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.0 // indirect + github.com/tidwall/tinylru v1.1.0 // indirect + github.com/tidwall/wal v1.1.7 // indirect + github.com/ulikunitz/xz v0.5.15 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/tcplisten v1.0.0 // indirect + github.com/zbiljic/go-filelock v0.0.0-20170914061330-1dbf7103ab7d // indirect + github.com/zclconf/go-cty v1.14.4 // indirect + github.com/zclconf/go-cty-yaml v1.1.0 // indirect + github.com/zondax/hid v0.9.2 // indirect + github.com/zondax/ledger-go v0.14.3 // indirect + go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.39.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect + go.opentelemetry.io/otel v1.43.0 // indirect + go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/otel/sdk v1.43.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect + go.opentelemetry.io/otel/trace v1.43.0 // indirect + go.uber.org/atomic v1.10.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/crypto v0.49.0 // indirect + golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect + golang.org/x/net v0.52.0 // indirect + golang.org/x/oauth2 v0.36.0 // indirect + golang.org/x/sys v0.42.0 // indirect + golang.org/x/term v0.41.0 // indirect + golang.org/x/text v0.35.0 // indirect + golang.org/x/time v0.15.0 // indirect + golang.org/x/tools v0.42.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect + google.golang.org/api v0.271.0 // indirect + google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 // indirect + google.golang.org/grpc v1.79.3 // indirect + google.golang.org/protobuf v1.36.11 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + gorm.io/driver/mysql v1.5.7 // indirect + gorm.io/driver/postgres v1.6.0 // indirect + gorm.io/driver/sqlite v1.5.7 // indirect + gorm.io/driver/sqlserver v1.5.4 // indirect + gotest.tools/v3 v3.5.1 // indirect + nhooyr.io/websocket v1.8.6 // indirect + pgregory.net/rapid v1.1.0 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect +) + +// initia custom +replace ( + github.com/99designs/keyring => github.com/cosmos/keyring v1.2.0 + github.com/cometbft/cometbft => github.com/initia-labs/cometbft v0.38.21-initia.2 + github.com/cosmos/cosmos-sdk => github.com/initia-labs/cosmos-sdk v0.50.15-initia.0 + github.com/cosmos/iavl => github.com/initia-labs/iavl v1.2.6-initia.1 + github.com/noble-assets/forwarding/simapp => github.com/initia-labs/forwarding/simapp v1.0.0 + github.com/noble-assets/forwarding/v2 => github.com/initia-labs/forwarding/v2 v2.0.3-initia.3 + github.com/skip-mev/connect/v2 => github.com/initia-labs/connect/v2 v2.3.1 + github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 +) diff --git a/api/go.sum b/api/go.sum new file mode 100644 index 00000000..597d45e9 --- /dev/null +++ b/api/go.sum @@ -0,0 +1,1493 @@ +ariga.io/atlas v0.33.1 h1:m3rn+m2jkfOZDqdZrgTDvDWh9G3Ldr77IElFDGEwDPk= +ariga.io/atlas v0.33.1/go.mod h1:WJesu2UCpGQvgUh3oVP94EiRT61nNy1W/VN5g+vqP1I= +ariga.io/atlas-go-sdk v0.6.8 h1:wonvcyOiXdrQnMrSNigLbMSaFV8yIxgA4Tb8EY2UGGE= +ariga.io/atlas-go-sdk v0.6.8/go.mod h1:9Q+/04PVyJHUse1lEE9Kp6E18xj/6mIzaUTcWYSjSnQ= +ariga.io/atlas-provider-gorm v0.5.2 h1:KuBY1PUmo6tzx3tpNjBypKJia3XrCXimjHDsxbYr9NE= +ariga.io/atlas-provider-gorm v0.5.2/go.mod h1:3a7Y0ZrenuGgoVXmGfn8q8U9qB7fJ5CprrXHMriMb0s= +cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= +cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= +cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= +cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM= +cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M= +cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= +cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= +cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= +cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= +cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= +cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= +cloud.google.com/go/logging v1.13.1 h1:O7LvmO0kGLaHY/gq8cV7T0dyp6zJhYAOtZPX4TF3QtY= +cloud.google.com/go/logging v1.13.1/go.mod h1:XAQkfkMBxQRjQek96WLPNze7vsOmay9H5PqfsNYDqvw= +cloud.google.com/go/longrunning v0.8.0 h1:LiKK77J3bx5gDLi4SMViHixjD2ohlkwBi+mKA7EhfW8= +cloud.google.com/go/longrunning v0.8.0/go.mod h1:UmErU2Onzi+fKDg2gR7dusz11Pe26aknR4kHmJJqIfk= +cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= +cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= +cloud.google.com/go/storage v1.61.3 h1:VS//ZfBuPGDvakfD9xyPW1RGF1Vy3BWUoVZXgW1KMOg= +cloud.google.com/go/storage v1.61.3/go.mod h1:JtqK8BBB7TWv0HVGHubtUdzYYrakOQIsMLffZ2Z/HWk= +cloud.google.com/go/trace v1.11.7 h1:kDNDX8JkaAG3R2nq1lIdkb7FCSi1rCmsEtKVsty7p+U= +cloud.google.com/go/trace v1.11.7/go.mod h1:TNn9d5V3fQVf6s4SCveVMIBS2LJUqo73GACmq/Tky0s= +cosmossdk.io/api v0.7.6 h1:PC20PcXy1xYKH2KU4RMurVoFjjKkCgYRbVAD4PdqUuY= +cosmossdk.io/api v0.7.6/go.mod h1:IcxpYS5fMemZGqyYtErK7OqvdM0C8kdW3dq8Q/XIG38= +cosmossdk.io/client/v2 v2.0.0-beta.4 h1:LGIzWbVTOof/IHQZeoWwxPX0fq607ONXhsfA7eUrQIg= +cosmossdk.io/client/v2 v2.0.0-beta.4/go.mod h1:c753d0sBv3AQRx6X+BOKL1aGpKjZMTZAHGiLPbVi5TE= +cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= +cosmossdk.io/collections v0.4.0/go.mod h1:oa5lUING2dP+gdDquow+QjlF45eL1t4TJDypgGd+tv0= +cosmossdk.io/core v0.11.1 h1:h9WfBey7NAiFfIcUhDVNS503I2P2HdZLebJlUIs8LPA= +cosmossdk.io/core v0.11.1/go.mod h1:OJzxcdC+RPrgGF8NJZR2uoQr56tc7gfBKhiKeDO7hH0= +cosmossdk.io/depinject v1.1.0 h1:wLan7LG35VM7Yo6ov0jId3RHWCGRhe8E8bsuARorl5E= +cosmossdk.io/depinject v1.1.0/go.mod h1:kkI5H9jCGHeKeYWXTqYdruogYrEeWvBQCw1Pj4/eCFI= +cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= +cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= +cosmossdk.io/log v1.4.1 h1:wKdjfDRbDyZRuWa8M+9nuvpVYxrEOwbD/CA8hvhU8QM= +cosmossdk.io/log v1.4.1/go.mod h1:k08v0Pyq+gCP6phvdI6RCGhLf/r425UT6Rk/m+o74rU= +cosmossdk.io/math v1.4.0 h1:XbgExXFnXmF/CccPPEto40gOO7FpWu9yWNAZPN3nkNQ= +cosmossdk.io/math v1.4.0/go.mod h1:O5PkD4apz2jZs4zqFdTr16e1dcaQCc5z6lkEnrrppuk= +cosmossdk.io/store v1.1.1 h1:NA3PioJtWDVU7cHHeyvdva5J/ggyLDkyH0hGHl2804Y= +cosmossdk.io/store v1.1.1/go.mod h1:8DwVTz83/2PSI366FERGbWSH7hL6sB7HbYp8bqksNwM= +cosmossdk.io/x/circuit v0.1.1 h1:KPJCnLChWrxD4jLwUiuQaf5mFD/1m7Omyo7oooefBVQ= +cosmossdk.io/x/circuit v0.1.1/go.mod h1:B6f/urRuQH8gjt4eLIXfZJucrbreuYrKh5CSjaOxr+Q= +cosmossdk.io/x/evidence v0.1.1 h1:Ks+BLTa3uftFpElLTDp9L76t2b58htjVbSZ86aoK/E4= +cosmossdk.io/x/evidence v0.1.1/go.mod h1:OoDsWlbtuyqS70LY51aX8FBTvguQqvFrt78qL7UzeNc= +cosmossdk.io/x/feegrant v0.1.1 h1:EKFWOeo/pup0yF0svDisWWKAA9Zags6Zd0P3nRvVvw8= +cosmossdk.io/x/feegrant v0.1.1/go.mod h1:2GjVVxX6G2fta8LWj7pC/ytHjryA6MHAJroBWHFNiEQ= +cosmossdk.io/x/tx v0.13.7 h1:8WSk6B/OHJLYjiZeMKhq7DK7lHDMyK0UfDbBMxVmeOI= +cosmossdk.io/x/tx v0.13.7/go.mod h1:V6DImnwJMTq5qFjeGWpXNiT/fjgE4HtmclRmTqRVM3w= +cosmossdk.io/x/upgrade v0.1.4 h1:/BWJim24QHoXde8Bc64/2BSEB6W4eTydq0X/2f8+g38= +cosmossdk.io/x/upgrade v0.1.4/go.mod h1:9v0Aj+fs97O+Ztw+tG3/tp5JSlrmT7IcFhAebQHmOPo= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +filippo.io/edwards25519 v1.1.1 h1:YpjwWWlNmGIDyXOn8zLzqiD+9TyIlPhGFG96P39uBpw= +filippo.io/edwards25519 v1.1.1/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1/go.mod h1:RKUqNu35KJYcVG/fqTRqmuXJZYNhYkBrnC/hX7yGbTA= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1 h1:DSDNVxqkoXJiko6x8a90zidoYqnYYa6c1MTzDKzKkTo= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1/go.mod h1:zGqV2R4Cr/k8Uye5w+dgQ06WJtEcbQG/8J7BB6hnCr4= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1/go.mod h1:uE9zaUfEQT/nbQjVi2IblCG9iaLtZsuYZ8ne+PuQ02M= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1/go.mod h1:h8hyGFDsU5HMivxiS2iYFZsgDbU9OnnJ163x5UGVKYo= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 h1:F0gBpfdPLGsw+nsgk6aqqkZS1jiixa5WwFe3fk/T3Ys= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2/go.mod h1:SqINnQ9lVVdRlyC8cd1lCI0SdX4n2paeABd2K8ggfnE= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1 h1:MyVTgWR8qd/Jw1Le0NZebGBUCLbtak3bJ3z1OlqZBpw= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1/go.mod h1:GpPjLhVR9dnUoJMyHWSPy71xY9/lcmpzIPZXmF0FCVY= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 h1:D3occbWoio4EBLkbkevetNMAVX197GkzbUMtqjGWn80= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 h1:oygO0locgZJe7PpYPXT5A29ZkwJaPqcva7BVeemZOZs= +github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= +github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= +github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 h1:sBEjpZlNHzK1voKq9695PJSX2o5NEXl7/OL3coiIY0c= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 h1:UnDZ/zFfG1JhH/DqxIZYU/1CUAlTUScoXD/LcM2Ykk8= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0/go.mod h1:IA1C1U7jO/ENqm/vhi7V9YYpBsp+IMyqNrEN94N7tVc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0 h1:7t/qx5Ost0s0wbA/VDrByOooURhp+ikYwv20i9Y07TQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0/go.mod h1:vB2GH9GAYYJTO3mEn8oYwzEdhlayZIdQz6zdzgUIRvA= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 h1:0s6TxfCu2KHkkZPnBfsQ2y5qia0jl3MMrmBhu3nCOYk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= +github.com/IGLOU-EU/go-wildcard v1.0.3 h1:r8T46+8/9V1STciXJomTWRpPEv4nGJATDbJkdU0Nou0= +github.com/IGLOU-EU/go-wildcard v1.0.3/go.mod h1:/qeV4QLmydCbwH0UMQJmXDryrFKJknWi/jjO8IiuQfY= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= +github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= +github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alitto/pond v1.8.3 h1:ydIqygCLVPqIX/USe5EaV/aSRXTRXDEI9JwuDdu+/xs= +github.com/alitto/pond v1.8.3/go.mod h1:CmvIIGd5jKLasGI3D87qDkQxjzChdKMmnXMg3fG6M6Q= +github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= +github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= +github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= +github.com/aptos-labs/serde-reflection/serde-generate/runtime/golang v0.0.0-20231213012317-73b6bbf74833 h1:/OtHsUoaVegyyGQ9/Ycm5vrC3xTTyj4+N/HsJ0wwAGA= +github.com/aptos-labs/serde-reflection/serde-generate/runtime/golang v0.0.0-20231213012317-73b6bbf74833/go.mod h1:zUz5maIUAS+tl1lC+lJR7HUf0vVnHk6W7bCvN+DzjME= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.55.6 h1:cSg4pvZ3m8dgYcgqB97MrcdjUmZ1BeMYKUxMMB89IPk= +github.com/aws/aws-sdk-go v1.55.6/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/aws/aws-sdk-go-v2 v1.41.4 h1:10f50G7WyU02T56ox1wWXq+zTX9I1zxG46HYuG1hH/k= +github.com/aws/aws-sdk-go-v2 v1.41.4/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 h1:3kGOqnh1pPeddVa/E37XNTaWJ8W6vrbYV9lJEkCnhuY= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI= +github.com/aws/aws-sdk-go-v2/config v1.32.12 h1:O3csC7HUGn2895eNrLytOJQdoL2xyJy0iYXhoZ1OmP0= +github.com/aws/aws-sdk-go-v2/config v1.32.12/go.mod h1:96zTvoOFR4FURjI+/5wY1vc1ABceROO4lWgWJuxgy0g= +github.com/aws/aws-sdk-go-v2/credentials v1.19.12 h1:oqtA6v+y5fZg//tcTWahyN9PEn5eDU/Wpvc2+kJ4aY8= +github.com/aws/aws-sdk-go-v2/credentials v1.19.12/go.mod h1:U3R1RtSHx6NB0DvEQFGyf/0sbrpJrluENHdPy1j/3TE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 h1:zOgq3uezl5nznfoK3ODuqbhVg1JzAGDUhXOsU0IDCAo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20/go.mod h1:z/MVwUARehy6GAg/yQ1GO2IMl0k++cu1ohP9zo887wE= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.69 h1:6VFPH/Zi9xYFMJKPQOX5URYkQoXRWeJ7V/7Y6ZDYoms= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.69/go.mod h1:GJj8mmO6YT6EqgduWocwhMoxTLFitkhIrK+owzrYL2I= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 h1:CNXO7mvgThFGqOFgbNAP2nol2qAWBOGfqR/7tQlvLmc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20/go.mod h1:oydPDJKcfMhgfcgBUZaG+toBbwy8yPWubJXBVERtI4o= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 h1:tN6W/hg+pkM+tf9XDkWUbDEjGLb+raoBMFsTodcoYKw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20/go.mod h1:YJ898MhD067hSHA6xYCx5ts/jEd8BSOLtQDL3iZsvbc= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21 h1:SwGMTMLIlvDNyhMteQ6r8IJSBPlRdXX5d4idhIGbkXA= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21/go.mod h1:UUxgWxofmOdAMuqEsSppbDtGKLfR04HGsD0HXzvhI1k= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 h1:qtJZ70afD3ISKWnoX3xB0J2otEqu3LqicRcDBqsj0hQ= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12/go.mod h1:v2pNpJbRNl4vEUWEh5ytQok0zACAKfdmKS51Hotc3pQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 h1:2HvVAIq+YqgGotK6EkMf+KIEqTISmTYh5zLpYyeTo1Y= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20/go.mod h1:V4X406Y666khGa8ghKmphma/7C0DAtEQYhkq9z4vpbk= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 h1:siU1A6xjUZ2N8zjTHSXFhB9L/2OY8Dqs0xXiLjF30jA= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20/go.mod h1:4TLZCmVJDM3FOu5P5TJP0zOlu9zWgDWU7aUxWbr+rcw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1 h1:csi9NLpFZXb9fxY7rS1xVzgPRGMt7MSNWeQ6eo247kE= +github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1/go.mod h1:qXVal5H0ChqXP63t6jze5LmFalc7+ZE7wOdLtZ0LCP0= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 h1:0GFOLzEbOyZABS3PhYfBIx2rNBACYcKty+XGkTgw1ow= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.8/go.mod h1:LXypKvk85AROkKhOG6/YEcHFPoX+prKTowKnVdcaIxE= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 h1:kiIDLZ005EcKomYYITtfsjn7dtOwHDOFy7IbPXKek2o= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.13/go.mod h1:2h/xGEowcW/g38g06g3KpRWDlT+OTfxxI0o1KqayAB8= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 h1:jzKAXIlhZhJbnYwHbvUQZEB8KfgAEuG0dc08Bkda7NU= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17/go.mod h1:Al9fFsXjv4KfbzQHGe6V4NZSZQXecFcvaIF4e70FoRA= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 h1:Cng+OOwCHmFljXIxpEVXAGMnBia8MSU6Ch5i9PgBkcU= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.9/go.mod h1:LrlIndBDdjA/EeXeyNBle+gyCwTlizzW5ycgWnvIxkk= +github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng= +github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= +github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bits-and-blooms/bitset v1.20.0 h1:2F+rfL86jE2d/bmw7OhqUg2Sj/1rURkBn3MdfoPyRVU= +github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bmatcuk/doublestar v1.3.4 h1:gPypJ5xD31uhX6Tf54sDPUOBXTqKH4c9aPY66CyQrS0= +github.com/bmatcuk/doublestar v1.3.4/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/btcutil v1.1.6 h1:zFL2+c3Lb9gEgqKNzowKUPQNb8jV7v5Oaodi/AYFd6c= +github.com/btcsuite/btcd/btcutil v1.1.6/go.mod h1:9dFymx8HpuLqBnsPELrImQeTQfKBQqzqGbbV3jK55aE= +github.com/bufbuild/protocompile v0.6.0 h1:Uu7WiSQ6Yj9DbkdnOe7U4mNKp58y9WDMKDn28/ZlunY= +github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= +github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= +github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 h1:6xNmx7iTtyBRev0+D/Tv1FZd4SCg8axKApyNyRsAt/w= +github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/BuvyMxRnYBlmVaq4OLiKW6iRQfvC62cvdkI= +github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= +github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v1.1.5 h1:5AAWCBWbat0uE0blr8qzufZP5tBjkRyy/jWe1QWLnvw= +github.com/cockroachdb/pebble v1.1.5/go.mod h1:17wO9el1YEigxkP/YtV8NtCivQDgoCyBg5c4VR/eOWo= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/cometbft/cometbft-db v0.15.0 h1:VLtsRt8udD4jHCyjvrsTBpgz83qne5hnL245AcPJVRk= +github.com/cometbft/cometbft-db v0.15.0/go.mod h1:EBrFs1GDRiTqrWXYi4v90Awf/gcdD5ExzdPbg4X8+mk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= +github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= +github.com/cosmos/cosmos-db v1.1.1 h1:FezFSU37AlBC8S98NlSagL76oqBRWq/prTPvFcEJNCM= +github.com/cosmos/cosmos-db v1.1.1/go.mod h1:AghjcIPqdhSLP/2Z0yha5xPH3nLnskz81pBx3tcVSAw= +github.com/cosmos/cosmos-proto v1.0.0-beta.5 h1:eNcayDLpip+zVLRLYafhzLvQlSmyab+RC5W7ZfmxJLA= +github.com/cosmos/cosmos-proto v1.0.0-beta.5/go.mod h1:hQGLpiIUloJBMdQMMWb/4wRApmI9hjHH05nefC0Ojec= +github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= +github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= +github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= +github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= +github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= +github.com/cosmos/gogoproto v1.7.0 h1:79USr0oyXAbxg3rspGh/m4SWNyoz/GLaAh0QlCe2fro= +github.com/cosmos/gogoproto v1.7.0/go.mod h1:yWChEv5IUEYURQasfyBW5ffkMHR/90hiHgbNgrtp4j0= +github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.2.0 h1:rM+S14DFiqmu6Rc3PuhvWqwywPsnt/CbIslSnBftPFs= +github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.2.0/go.mod h1:O5H9Ic3Pe6cmJn1eqlj5N48sLb8WQ1VWmDP4/11g/4E= +github.com/cosmos/ibc-apps/modules/rate-limiting/v8 v8.0.0 h1:AQO9NIAP3RFqvBCj7IqM/V1LCxmuvcvGUdu0RIEz/c0= +github.com/cosmos/ibc-apps/modules/rate-limiting/v8 v8.0.0/go.mod h1:/ZpKJSW/SKPkFS7jTqkPVn7kOHUUfRNzu+8aS7YOL8o= +github.com/cosmos/ibc-go/modules/capability v1.0.1 h1:ibwhrpJ3SftEEZRxCRkH0fQZ9svjthrX2+oXdZvzgGI= +github.com/cosmos/ibc-go/modules/capability v1.0.1/go.mod h1:rquyOV262nGJplkumH+/LeYs04P3eV8oB7ZM4Ygqk4E= +github.com/cosmos/ibc-go/v8 v8.7.0 h1:HqhVOkO8bDpClXE81DFQgFjroQcTvtpm0tCS7SQVKVY= +github.com/cosmos/ibc-go/v8 v8.7.0/go.mod h1:G2z+Q6ZQSMcyHI2+BVcJdvfOupb09M2h/tgpXOEdY6k= +github.com/cosmos/ics23/go v0.11.0 h1:jk5skjT0TqX5e5QJbEnwXIS2yI2vnmLOgpQPeM5RtnU= +github.com/cosmos/ics23/go v0.11.0/go.mod h1:A8OjxPE67hHST4Icw94hOxxFEJMBG031xIGF/JHNIY0= +github.com/cosmos/interchain-security/v6 v6.3.0 h1:AIsfxLUDtUGVfaqJ1WPwnYIOT5AxoSO58469iw9vNH4= +github.com/cosmos/interchain-security/v6 v6.3.0/go.mod h1:6DSiV2w+DuPkxP1KGFtaxpiwf8Xt2iusj8O53KCx96Q= +github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo= +github.com/cosmos/keyring v1.2.0/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= +github.com/cosmos/ledger-cosmos-go v0.14.0 h1:WfCHricT3rPbkPSVKRH+L4fQGKYHuGOK9Edpel8TYpE= +github.com/cosmos/ledger-cosmos-go v0.14.0/go.mod h1:E07xCWSBl3mTGofZ2QnL4cIUzMbbGVyik84QYKbX3RA= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= +github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.1.0 h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U0x++OzVrdms8= +github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= +github.com/dgraph-io/badger/v4 v4.3.0 h1:lcsCE1/1qrRhqP+zYx6xDZb8n7U+QlwNicpc676Ub40= +github.com/dgraph-io/badger/v4 v4.3.0/go.mod h1:Sc0T595g8zqAQRDf44n+z3wG4BOqLwceaFntt8KPxUM= +github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91 h1:Pux6+xANi0I7RRo5E1gflI4EZ2yx3BGZ75JkAIvGEOA= +github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91/go.mod h1:swkazRqnUf1N62d0Nutz7KIj2UKqsm/H8tD0nBJAXqM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dhui/dktest v0.4.5 h1:uUfYBIVREmj/Rw6MvgmqNAYzTiKOHJak+enB5Di73MM= +github.com/dhui/dktest v0.4.5/go.mod h1:tmcyeHDKagvlDrz7gDKq4UAJOLIfVZYkfD5OnHDwcCo= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/docker/docker v27.2.0+incompatible h1:Rk9nIVdfH3+Vz4cyI/uhbINhEZ/oLmc+CBXmH6fbNk4= +github.com/docker/docker v27.2.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/dvsekhvalnov/jose2go v1.7.0 h1:bnQc8+GMnidJZA8zc6lLEAb4xNrIqHwO+9TzqvtQZPo= +github.com/dvsekhvalnov/jose2go v1.7.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/emicklei/dot v1.6.2 h1:08GN+DD79cy/tzN6uLCT84+2Wk9u+wvqP+Hkx/dIR8A= +github.com/emicklei/dot v1.6.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= +github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= +github.com/envoyproxy/go-control-plane/envoy v1.36.0 h1:yg/JjO5E7ubRyKX3m07GF3reDNEnfOboJ0QySbH736g= +github.com/envoyproxy/go-control-plane/envoy v1.36.0/go.mod h1:ty89S1YCCVruQAm9OtKeEkQLTb+Lkz0k8v9W0Oxsv98= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4= +github.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA= +github.com/ethereum/go-ethereum v1.16.9 h1:UTJ93yoXD7BEMWg+9lSZ8/Zvf0oZfy2ZUmv0Gn0ZclE= +github.com/ethereum/go-ethereum v1.16.9/go.mod h1:Fs6QebQbavneQTYcA39PEKv2+zIjX7rPUZ14DER46wk= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/getsentry/sentry-go v0.29.1 h1:DyZuChN8Hz3ARxGVV8ePaNXh1dQ7d76AiB117xcREwA= +github.com/getsentry/sentry-go v0.29.1/go.mod h1:x3AtIzN01d6SiWkderzaH28Tm0lgkafpJ5Bm3li39O0= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= +github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= +github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU= +github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= +github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ= +github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= +github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= +github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= +github.com/go-openapi/spec v0.20.9 h1:xnlYNQAwKd2VQRRfwTEI0DcK+2cbuvI/0c7jx3gA8/8= +github.com/go-openapi/spec v0.20.9/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= +github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.9.1 h1:FrjNGn/BsJQjVRuSa8CBrM5BWA9BWoXXat3KrtSb/iI= +github.com/go-sql-driver/mysql v1.9.1/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= +github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/gobwas/ws v1.1.0 h1:7RFti/xnNkMJnrK7D1yQ/iCIB5OrrY/54/H930kIbHA= +github.com/gobwas/ws v1.1.0/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofiber/fiber/v2 v2.50.0/go.mod h1:21eytvay9Is7S6z+OgPi7c7n4++tnClWmhpimVHMimw= +github.com/gofiber/fiber/v2 v2.52.12 h1:0LdToKclcPOj8PktUdIKo9BUohjjwfnQl42Dhw8/WUw= +github.com/gofiber/fiber/v2 v2.52.12/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= +github.com/gofiber/swagger v0.1.14 h1:o524wh4QaS4eKhUCpj7M0Qhn8hvtzcyxDsfZLXuQcRI= +github.com/gofiber/swagger v0.1.14/go.mod h1:DCk1fUPsj+P07CKaZttBbV1WzTZSQcSxfub8y9/BFr8= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= +github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-migrate/migrate/v4 v4.18.3 h1:EYGkoOsvgHHfm5U/naS1RP/6PL/Xv3S4B/swMiAmDLs= +github.com/golang-migrate/migrate/v4 v4.18.3/go.mod h1:99BKpIi6ruaaXRM1A77eqZ+FWPQ3cfRa+ZVy5bmWMaY= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg= +github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/go-replayers/grpcreplay v1.3.0 h1:1Keyy0m1sIpqstQmgz307zhiJ1pV4uIlFds5weTmxbo= +github.com/google/go-replayers/grpcreplay v1.3.0/go.mod h1:v6NgKtkijC0d3e3RW8il6Sy5sqRVUwoQa4mHOGEy8DI= +github.com/google/go-replayers/httpreplay v1.2.0 h1:VM1wEyyjaoU53BwrOnaf9VhAyQQEEioJvFYxYcLRKzk= +github.com/google/go-replayers/httpreplay v1.2.0/go.mod h1:WahEFFZZ7a1P4VM1qEeHy+tME4bwyqPcwWbNlUI1Mcg= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= +github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= +github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= +github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/wire v0.6.0 h1:HBkoIh4BdSxoyo9PveV8giw7ZsaBOvzWKfcg/6MrVwI= +github.com/google/wire v0.6.0/go.mod h1:F4QhpQ9EDIdJ1Mbop/NZBRB+5yrR6qg3BnctaoUk6NA= +github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8= +github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= +github.com/googleapis/gax-go/v2 v2.17.0 h1:RksgfBpxqff0EZkDWYuz9q/uWsTVz+kf43LsZ1J6SMc= +github.com/googleapis/gax-go/v2 v2.17.0/go.mod h1:mzaqghpQp4JDh3HvADwrat+6M3MOIDp5YKHhb9PAgDY= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= +github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 h1:vTCWu1wbdYo7PEZFem/rlr01+Un+wwVmI7wiegFdRLk= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72/go.mod h1:Vn+BBgKQHVQYdVQ4NZDICE1Brb+JfaONyDHr3q07oQc= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk131ebY= +github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-metrics v0.5.3 h1:M5uADWMOGCTUNU1YuC4hfknOeHNaX54LDm4oYSucoNE= +github.com/hashicorp/go-metrics v0.5.3/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-plugin v1.5.2 h1:aWv8eimFqWlsEiMrYZdPYl+FdHaBJSN4AWwGWfT1G2Y= +github.com/hashicorp/go-plugin v1.5.2/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.8.0 h1:KAkNb1HAiZd1ukkxDFGmokVZe1Xy9HG6NUp+bPle2i4= +github.com/hashicorp/go-version v1.8.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/hcl/v2 v2.18.1 h1:6nxnOJFku1EuSawSD81fuviYUV8DxFr3fp2dUi3ZYSo= +github.com/hashicorp/hcl/v2 v2.18.1/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+JtMeeGErHE= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= +github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= +github.com/holiman/uint256 v1.3.2 h1:a9EgMPSC1AAaj1SZL5zIQD3WbwTuHrMGOerLjGmM/TA= +github.com/holiman/uint256 v1.3.2/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= +github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= +github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= +github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/iancoleman/orderedmap v0.3.0 h1:5cbR2grmZR/DiVt+VJopEhtVs9YGInGIxAoMJn+Ichc= +github.com/iancoleman/orderedmap v0.3.0/go.mod h1:XuLcCUkdL5owUCQeF2Ue9uuw1EptkJDkXXS7VoV7XGE= +github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= +github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/initia-labs/OPinit v1.3.0 h1:cGxJpzVOfxGO8Ql/Z6SVJCSpokkqB4jFBjo6kx9Uax8= +github.com/initia-labs/OPinit v1.3.0/go.mod h1:VZG+/Wd/9cVDbzCwZld/tve6kcJC1zemeeQvp5FKKCI= +github.com/initia-labs/OPinit/api v1.3.0 h1:MAu4XEJ2uibDVKBo0jB6b6/BGaoXjDUJC+dwhU530ag= +github.com/initia-labs/OPinit/api v1.3.0/go.mod h1:sWDfvmcxd7KD59ukB/Wz0BSpyimyptDEzz1Epe/ET+Y= +github.com/initia-labs/cometbft v0.38.21-initia.2 h1:sFFc6JnbPKFd4XdH3EXZ7TBfi3uVv34HdyHVX5gvvlQ= +github.com/initia-labs/cometbft v0.38.21-initia.2/go.mod h1:CQ/VkJXRdaWxDLyKT+JYAWV0m215oRFtymtIr7skA6o= +github.com/initia-labs/connect/v2 v2.3.1 h1:Y32LCwUHDBgUzzQHqPBJeWeItYoNu2oYD57JKbZCtjw= +github.com/initia-labs/connect/v2 v2.3.1/go.mod h1:35hM7xSgI0h3GMUTgspzKY8Ff2yCXNGNwmAdjqo3z8s= +github.com/initia-labs/cosmos-sdk v0.50.15-initia.0 h1:cgKCqzXBm8md5Q5C9VAyIGCheHhNcOGK/BwpFbett2g= +github.com/initia-labs/cosmos-sdk v0.50.15-initia.0/go.mod h1:/dinzXHi7qK0dEPZjS3LI5gMHueKQdqyjbB9chwswo0= +github.com/initia-labs/forwarding/simapp v1.0.0 h1:MNHLACO0053BAMO3+Ra2ZTlTTB5WieFElguDQH5d8fc= +github.com/initia-labs/forwarding/simapp v1.0.0/go.mod h1:MOIDS73NjoIvTZ3OxUmJXY+Ry7xxXumrXPVZrAeJOhY= +github.com/initia-labs/forwarding/v2 v2.0.3-initia.3 h1:Uu1VqRsSwX7rgS2A4M3Snzyzk9mJRq2v/ZD4xKHTJkM= +github.com/initia-labs/forwarding/v2 v2.0.3-initia.3/go.mod h1:N3OzYf14ton71zCxomBmpR7tOxZ2dKwhsMxUmtuJuVQ= +github.com/initia-labs/iavl v1.2.6-initia.1 h1:4vf9eiccLkob2eiM8YAM8Gf/UBniEFUKpvncM/hVoO8= +github.com/initia-labs/iavl v1.2.6-initia.1/go.mod h1:GiM43q0pB+uG53mLxLDzimxM9l/5N9UuSY3/D0huuVw= +github.com/initia-labs/initia v1.4.3 h1:cEnENL26T7hsa0oDm4hf953tUQYc1cQ3fll84jBfoa0= +github.com/initia-labs/initia v1.4.3/go.mod h1:Y7ir28A0RmL3AQpvTK/mXzyvF6RtijgH/v520xvrk3s= +github.com/initia-labs/initia/api v1.4.0 h1:1DOUBxugC9ZdtMnmmN3qFWnNjlW7I6sssvvu4/ohVtU= +github.com/initia-labs/initia/api v1.4.0/go.mod h1:YQAtPknqt4tZSj+AK0OfZ83XXah2MCna/Ko74/VQe6Q= +github.com/initia-labs/movevm v1.2.0 h1:IbpipjRIZe851FJZZzP3RGIqrOCcNsI6bDF9VC0K0do= +github.com/initia-labs/movevm v1.2.0/go.mod h1:sj/kXD7mUQASqogPTjqltIr4Uid3xxnlcbfiFvvqeXA= +github.com/initia-labs/store v0.1.1 h1:sc4PTv30oS99t0EWgFPy0pCFPYJsHngB2QfZS5XY/Xo= +github.com/initia-labs/store v0.1.1/go.mod h1:8Hgv+JpqjFYy2335pHLnMq6LmVdXyF1G17yi6uWl76M= +github.com/initia-labs/store/memiavl v0.1.1 h1:aymS3es9pPY7ysizK2K+r4TImR0W5N1C5Ld75HRMvXc= +github.com/initia-labs/store/memiavl v0.1.1/go.mod h1:510W4Nf6QAWmFLYPhqhOhO1tagdeocM0b89a/M0zMRk= +github.com/initia-labs/store/versiondb v0.1.0 h1:8lQK7Q6GUwwAc8R3IIBbj9MOlIkKCq0nwnRpjT20Ahc= +github.com/initia-labs/store/versiondb v0.1.0/go.mod h1:fP27G3qPUluu7yM8j2xcW05Brmj0QBT7nlTTFvEszNc= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.9.2 h1:3ZhOzMWnR4yJ+RW1XImIPsD1aNSz4T4fyP7zlQb56hw= +github.com/jackc/pgx/v5 v5.9.2/go.mod h1:mal1tBGAFfLHvZzaYh77YS/eC6IX9OWbRV1QIIM0Jn4= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jhump/protoreflect v1.15.3 h1:6SFRuqU45u9hIZPJAoZ8c28T3nK64BNdp9w6jFonzls= +github.com/jhump/protoreflect v1.15.3/go.mod h1:4ORHmSBmlCW8fh3xHmJMGyul1zNqZK4Elxc8qKP+p1k= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= +github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE= +github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/ledgerwatch/erigon-lib v0.0.0-20230210071639-db0e7ed11263 h1:LGEzZvf33Y1NhuP5+jI/ni9l1TFS6oYPDilgy74NusM= +github.com/ledgerwatch/erigon-lib v0.0.0-20230210071639-db0e7ed11263/go.mod h1:OXgMDuUo2lZ3NpH29ZvMYbk+LxFd5ffDl2Z2mGMuY/I= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/linxGnu/grocksdb v1.10.3 h1:0laII9AQ6kFxo5SjhdTfSh9EgF20piD6TMHK6YuDm+4= +github.com/linxGnu/grocksdb v1.10.3/go.mod h1:OLQKZwiKwaJiAVCsOzWKvwiLwfZ5Vz8Md5TYR7t7pM8= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= +github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +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.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/microsoft/go-mssqldb v1.7.2 h1:CHkFJiObW7ItKTJfHo1QX7QBBD1iV+mn1eOyRP3b/PA= +github.com/microsoft/go-mssqldb v1.7.2/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q= +github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= +github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= +github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= +github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a h1:dlRvE5fWabOchtH7znfiFCcOvmIYgOeAS5ifBXBlh9Q= +github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= +github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA= +github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= +github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= +github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= +github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sasha-s/go-deadlock v0.3.5 h1:tNCOEEDG6tBqrNDOX35j/7hL5FcFViG6awUGROb2NsU= +github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6vCBBsiChJQ5U= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610 h1:4JlsiRVt/YZOvrKH525T7sZXgEWUEjqSDMwE6fXNbdo= +github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610/go.mod h1:kB8gFZX07CyJnw8q9iEZijI3qJTIe1K/Y++P5VGkrcg= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= +github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= +github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/swaggo/files/v2 v2.0.0 h1:hmAt8Dkynw7Ssz46F6pn8ok6YmGZqHSVLZ+HQM7i0kw= +github.com/swaggo/files/v2 v2.0.0/go.mod h1:24kk2Y9NYEJ5lHuCra6iVwkMjIekMCaFq/0JQj66kyM= +github.com/swaggo/swag v1.16.2/go.mod h1:6YzXnDcpr0767iOejs318CwYkCQqyGer6BizOg03f+E= +github.com/swaggo/swag v1.16.3 h1:PnCYjPCah8FK4I26l2F/KQ4yz3sILcVUN3cTlBFA9Pg= +github.com/swaggo/swag v1.16.3/go.mod h1:DImHIuOFXKpMFAQjcC7FG4m3Dg4+QuUgUzJmKjI/gRk= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= +github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= +github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= +github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= +github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/tinylru v1.1.0 h1:XY6IUfzVTU9rpwdhKUF6nQdChgCdGjkMfLzbWyiau6I= +github.com/tidwall/tinylru v1.1.0/go.mod h1:3+bX+TJ2baOLMWTnlyNWHh4QMnFyARg2TLTQ6OFbzw8= +github.com/tidwall/wal v1.1.7 h1:emc1TRjIVsdKKSnpwGBAcsAGg0767SvUk8+ygx7Bb+4= +github.com/tidwall/wal v1.1.7/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E= +github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= +github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +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.50.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= +github.com/valyala/fasthttp v1.52.0 h1:wqBQpxH71XW0e2g+Og4dzQM8pk34aFYlA1Ga8db7gU0= +github.com/valyala/fasthttp v1.52.0/go.mod h1:hf5C4QnVMkNXMspnsUlfM3WitlgYflyhHYoKol/szxQ= +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/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zbiljic/go-filelock v0.0.0-20170914061330-1dbf7103ab7d h1:XQyeLr7N9iY9mi+TGgsBFkj54+j3fdoo8e2u6zrGP5A= +github.com/zbiljic/go-filelock v0.0.0-20170914061330-1dbf7103ab7d/go.mod h1:hoMeDjlNXTNqVwrCk8YDyaBS2g5vFfEX2ezMi4vb6CY= +github.com/zclconf/go-cty v1.14.4 h1:uXXczd9QDGsgu0i/QFR/hzI5NYCHLf6NQw/atrbnhq8= +github.com/zclconf/go-cty v1.14.4/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +github.com/zclconf/go-cty-yaml v1.1.0 h1:nP+jp0qPHv2IhUVqmQSzjvqAWcObN0KBkUl2rWBdig0= +github.com/zclconf/go-cty-yaml v1.1.0/go.mod h1:9YLUH4g7lOhVWqUbctnVlZ5KLpg7JAprQNgxSZ1Gyxs= +github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= +github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= +github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1UpHb342ycI= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5 h1:qxen9oVGzDdIRP6ejyAJc760RwW4SnVDiTYTzwnXuxo= +go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5/go.mod h1:eW0HG9/oHQhvRCvb1/pIXW4cOvtDqeQK+XSi3TnwaXY= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/contrib/detectors/gcp v1.39.0 h1:kWRNZMsfBHZ+uHjiH4y7Etn2FK26LAGkNFw7RHv1DhE= +go.opentelemetry.io/contrib/detectors/gcp v1.39.0/go.mod h1:t/OGqzHBa5v6RHZwrDBJ2OirWc+4q/w2fTbLZwAKjTk= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 h1:YH4g8lQroajqUwWbq/tr2QX1JFmEXaDLgG+ew9bLMWo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0/go.mod h1:fvPi2qXDqFs8M4B4fmJhE92TyQs9Ydjlg3RvfUp+NbQ= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0 h1:ZrPRak/kS4xI3AVXy8F7pipuDXmDsrO8Lg+yQjBLjw0= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0/go.mod h1:3y6kQCWztq6hyW8Z9YxQDDm0Je9AJoFar2G0yDcmhRk= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= +go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= +go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +gocloud.dev v0.41.0 h1:qBKd9jZkBKEghYbP/uThpomhedK5s2Gy6Lz7h/zYYrM= +gocloud.dev v0.41.0/go.mod h1:IetpBcWLUwroOOxKr90lhsZ8vWxeSkuszBnW62sbcf0= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +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-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= +golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/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/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8= +golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/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-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +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/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= +golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= +golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/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-20210220032951-036812b2e83c/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/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/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-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/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.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +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/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.41.0 h1:QCgPso/Q3RTJx2Th4bDLqML4W6iJiaXFq2/ftQF13YU= +golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/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/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= +golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= +golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +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/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/tools v0.42.0 h1:uNgphsn75Tdz5Ji2q36v/nsFSfR/9BRFvqhGBaJGd5k= +golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= +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-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.271.0 h1:cIPN4qcUc61jlh7oXu6pwOQqbJW2GqYh5PS6rB2C/JY= +google.golang.org/api v0.271.0/go.mod h1:CGT29bhwkbF+i11qkRUJb2KMKqcJ1hdFceEIRd9u64Q= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 h1:VQZ/yAbAtjkHgH80teYd2em3xtIkkHd7ZhqfH2N9CsM= +google.golang.org/genproto v0.0.0-20260128011058-8636f8732409/go.mod h1:rxKD3IEILWEu3P44seeNOAwZN4SaoKaQ/2eTg4mM6EM= +google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20 h1:7ei4lp52gK1uSejlA8AZl5AJjeLUOHBQscRQZUgAcu0= +google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20/go.mod h1:ZdbssH/1SOVnjnDlXzxDHK2MCidiqXtbYccJNzNYPEE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 h1:ggcbiqK8WWh6l1dnltU4BgWGIGo+EVYxCaAPih/zQXQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= +google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo= +gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= +gorm.io/driver/postgres v1.6.0 h1:2dxzU8xJ+ivvqTRph34QX+WrRaJlmfyPqXmoGVjMBa4= +gorm.io/driver/postgres v1.6.0/go.mod h1:vUw0mrGgrTK+uPHEhAdV4sfFELrByKVGnaVRkXDhtWo= +gorm.io/driver/sqlite v1.5.7 h1:8NvsrhP0ifM7LX9G4zPB97NwovUakUxc+2V2uuf3Z1I= +gorm.io/driver/sqlite v1.5.7/go.mod h1:U+J8craQU6Fzkcvu8oLeAQmi50TkwPEhHDEjQZXDah4= +gorm.io/driver/sqlserver v1.5.4 h1:xA+Y1KDNspv79q43bPyjDMUgHoYHLhXYmdFcYPobg8g= +gorm.io/driver/sqlserver v1.5.4/go.mod h1:+frZ/qYmuna11zHPlh5oc2O6ZA/lS88Keb0XSH1Zh/g= +gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.30.0 h1:qbT5aPv1UH8gI99OsRlvDToLxW5zR7FzS9acZDOZcgs= +gorm.io/gorm v1.30.0/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= +nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= +pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/api/handlers/account.go b/api/handlers/account.go new file mode 100644 index 00000000..5d21d2a4 --- /dev/null +++ b/api/handlers/account.go @@ -0,0 +1,155 @@ +package handlers + +import ( + "github.com/gofiber/fiber/v2" + + "github.com/initia-labs/core-indexer/pkg/parser" + + "github.com/initia-labs/core-indexer/api/apperror" + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/api/services" +) + +type AccountHandler struct { + service services.AccountService +} + +func NewAccountHandler(service services.AccountService) *AccountHandler { + return &AccountHandler{ + service: service, + } +} + +// GetAccountByAccountAddress godoc +// +// @Summary Get account by address +// @Description Retrieve account details by account address +// @Tags Account +// @Accept json +// @Produce json +// @Param accountAddress path string true "Account address" +// @Success 200 {object} db.Account +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/account/v1/{accountAddress} [get] +func (h *AccountHandler) GetAccountByAccountAddress(c *fiber.Ctx) error { + accountAddress, err := parser.AccAddressFromString(c.Params("accountAddress")) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + response, err := h.service.GetAccountByAccountAddress(accountAddress.String()) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetAccountProposals godoc +// +// @Summary Get account proposals +// @Description Retrieve proposals associated with an account +// @Tags Account +// @Accept json +// @Produce json +// @Param accountAddress path string true "Account address" +// @Param pagination.offset query integer false "Offset for pagination" default(0) +// @Param pagination.limit query integer false "Limit for pagination" default(10) +// @Param pagination.count_total query boolean false "Whether to count total Nfts" default(false) +// @Param pagination.reverse query boolean false "Whether to reverse the order of transactions" default(true) +// @Success 200 {object} dto.AccountProposalsResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/account/v1/{accountAddress}/proposals [get] +func (h *AccountHandler) GetAccountProposals(c *fiber.Ctx) error { + accountAddress, err := parser.AccAddressFromString(c.Params("accountAddress")) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + pagination, err := dto.PaginationFromQuery(c) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + response, err := h.service.GetAccountProposals(*pagination, accountAddress.String()) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetAccountTxs godoc +// +// @Summary Get account transactions +// @Description Retrieve transactions associated with an account +// @Tags Account +// @Accept json +// @Produce json +// @Param accountAddress path string true "Account address" +// @Param pagination.offset query integer false "Offset for pagination" default(0) +// @Param pagination.limit query integer false "Limit for pagination" default(10) +// @Param pagination.count_total query boolean false "Whether to count total transactions" default(false) +// @Param pagination.reverse query boolean false "Whether to reverse the order of transactions" default(true) +// @Param search query string false "Search term for transactions" +// @Param is_send query boolean false "Filter by sent transactions" default(false) +// @Param is_ibc query boolean false "Filter by IBC transactions" default(false) +// @Param is_opinit query boolean false "Filter by OPINIT transactions" default(false) +// @Param is_move_publish query boolean false "Filter by Move publish transactions" default(false) +// @Param is_move_upgrade query boolean false "Filter by Move upgrade transactions" default(false) +// @Param is_move_execute query boolean false "Filter by Move execute transactions" default(false) +// @Param is_move_script query boolean false "Filter by Move script transactions" default(false) +// @Param is_signer query boolean false "Filter by transactions where the account is a signer" +// @Success 200 {array} dto.AccountTxsResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/account/v1/{accountAddress}/txs [get] +func (h *AccountHandler) GetAccountTxs(c *fiber.Ctx) error { + accountAddress, err := parser.AccAddressFromString(c.Params("accountAddress")) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + pagination, err := dto.PaginationFromQuery(c) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + search := c.Query("search") + isSend := c.Query("is_send") == "true" + isIbc := c.Query("is_ibc") == "true" + isOpinit := c.Query("is_opinit") == "true" + isMovePublish := c.Query("is_move_publish") == "true" + isMoveUpgrade := c.Query("is_move_upgrade") == "true" + isMoveExecute := c.Query("is_move_execute") == "true" + isMoveScript := c.Query("is_move_script") == "true" + isSignerStr := c.Query("is_signer") + + var isSigner *bool + + if isSignerStr != "" { + isSignerValue := isSignerStr == "true" + isSigner = &isSignerValue + } + + response, err := h.service.GetAccountTxs( + *pagination, + accountAddress.String(), + search, + isSend, + isIbc, + isOpinit, + isMovePublish, + isMoveUpgrade, + isMoveExecute, + isMoveScript, + isSigner, + ) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} diff --git a/api/handlers/block.go b/api/handlers/block.go new file mode 100644 index 00000000..876d4ea2 --- /dev/null +++ b/api/handlers/block.go @@ -0,0 +1,170 @@ +package handlers + +import ( + "strconv" + + "github.com/gofiber/fiber/v2" + + "github.com/initia-labs/core-indexer/api/apperror" + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/api/services" +) + +type BlockHandler struct { + service services.BlockService +} + +func NewBlockHandler(service services.BlockService) *BlockHandler { + return &BlockHandler{ + service: service, + } +} + +// GetBlockHeightLatest godoc +// +// @Summary Get latest block height +// @Description Retrieve the latest block height +// @Tags Block +// @Produce json +// @Success 200 {object} dto.BlockHeightLatestResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/block/v1/latest_block_height [get] +func (h *BlockHandler) GetBlockHeightLatest(c *fiber.Ctx) error { + response, err := h.service.GetBlockHeightLatest() + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetBlockHeightInformativeLatest godoc +// +// @Summary Get latest informative block height +// @Description Retrieve the latest informative block height +// @Tags Block +// @Produce json +// @Success 200 {object} dto.BlockHeightInformativeLatestResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/block/v1/latest_informative_block_height [get] +func (h *BlockHandler) GetBlockHeightInformativeLatest(c *fiber.Ctx) error { + response, err := h.service.GetBlockHeightInformativeLatest() + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetBlockTimeAverage godoc +// +// @Summary Get average block time +// @Description Retrieve the average time taken to mine a block +// @Tags Block +// @Produce json +// @Success 200 {object} dto.BlockTimeAverageResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/block/v1/avg_block_time [get] +func (h *BlockHandler) GetBlockTimeAverage(c *fiber.Ctx) error { + response, err := h.service.GetBlockTimeAverage() + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetBlocks godoc +// +// @Summary Get blocks +// @Description Retrieve a list of blocks with pagination +// @Tags Block +// @Accept json +// @Produce json +// @Param pagination.offset query integer false "Offset for pagination" default(0) +// @Param pagination.limit query integer false "Limit for pagination" default(10) +// @Param pagination.count_total query boolean false "Count total number of transactions" default(false) +// @Success 200 {object} dto.BlocksResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/block/v1/blocks [get] +func (h *BlockHandler) GetBlocks(c *fiber.Ctx) error { + pagination, err := dto.PaginationFromQuery(c) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + response, err := h.service.GetBlocks(*pagination) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetBlockInfo godoc +// +// @Summary Get block info by height +// @Description Retrieve detailed information about a block by its height +// @Tags Block +// @Accept json +// @Produce json +// @Param height path int true "Block height" +// @Success 200 {object} dto.BlockInfoResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/block/v1/blocks/{height}/info [get] +func (h *BlockHandler) GetBlockInfo(c *fiber.Ctx) error { + heightStr := c.Params("height") + + height, err := strconv.ParseInt(heightStr, 10, 64) + if err != nil { + return apperror.HandleErrorResponse(c, apperror.NewHeightInteger()) + } + + response, err := h.service.GetBlockInfo(height) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetBlockTxs godoc +// +// @Summary Get transactions in a block by height +// @Description Retrieve transactions in a block by its height with pagination +// @Tags Block +// @Accept json +// @Produce json +// @Param height path int true "Block height" +// @Param pagination.offset query integer false "Offset for pagination" default(0) +// @Param pagination.limit query integer false "Limit for pagination" default(10) +// @Param pagination.count_total query boolean false "Count total number of transactions" default(false) +// @Success 200 {object} dto.BlockTxsResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/block/v1/blocks/{height}/txs [get] +func (h *BlockHandler) GetBlockTxs(c *fiber.Ctx) error { + heightStr := c.Params("height") + + height, err := strconv.ParseInt(heightStr, 10, 64) + if err != nil { + return apperror.HandleErrorResponse(c, apperror.NewHeightInteger()) + } + + pagination, err := dto.PaginationFromQuery(c) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + response, err := h.service.GetBlockTxs(*pagination, height) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} diff --git a/api/handlers/module.go b/api/handlers/module.go new file mode 100644 index 00000000..d8ff5077 --- /dev/null +++ b/api/handlers/module.go @@ -0,0 +1,248 @@ +package handlers + +import ( + "github.com/gofiber/fiber/v2" + + "github.com/initia-labs/core-indexer/pkg/parser" + + "github.com/initia-labs/core-indexer/api/apperror" + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/api/services" +) + +// ModuleHandler handles module-related HTTP requests +type ModuleHandler struct { + service services.ModuleService +} + +func NewModuleHandler(service services.ModuleService) *ModuleHandler { + return &ModuleHandler{ + service: service, + } +} + +// GetModules godoc +// +// @Summary Get modules +// @Description Retrieve a list of modules with pagination +// @Tags Module +// @Accept json +// @Produce json +// @Param pagination.offset query integer false "Offset for pagination" default(0) +// @Param pagination.limit query integer false "Limit for pagination" default(10) +// @Param pagination.count_total query boolean false "Count total" default(false) +// @Success 200 {object} dto.ModulesResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/module/v1/modules [get] +func (h *ModuleHandler) GetModules(c *fiber.Ctx) error { + // Parse pagination parameters manually + pagination, err := dto.PaginationFromQuery(c) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + // Get modules from service + response, err := h.service.GetModules(*pagination) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetModuleById godoc +// +// @Summary Get module by id +// @Description Retrieve a module by id +// @Tags Module +// @Accept json +// @Produce json +// @Param vmAddress path string true "VM address" +// @Param name path string true "Module name" +// @Success 200 {object} dto.ModuleResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/module/v1/modules/{vmAddress}/{name} [get] +func (h *ModuleHandler) GetModuleById(c *fiber.Ctx) error { + vmAddress, err := parser.AccAddressFromString(c.Params("vmAddress")) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + name := c.Params("name") + + response, err := h.service.GetModuleById(parser.BytesToHexWithPrefix(vmAddress), name) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetModuleHistories godoc +// +// @Summary Get module histories +// @Description Retrieve a list of module histories with pagination +// @Tags Module +// @Accept json +// @Produce json +// @Param vmAddress path string true "VM address" +// @Param name path string true "Module name" +// @Param pagination.offset query integer false "Offset for pagination" default(0) +// @Param pagination.limit query integer false "Limit for pagination" default(10) +// @Param pagination.count_total query boolean false "Count total" default(false) +// @Success 200 {object} dto.ModuleHistoriesResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/module/v1/modules/{vmAddress}/{name}/histories [get] +func (h *ModuleHandler) GetModuleHistories(c *fiber.Ctx) error { + vmAddress, err := parser.AccAddressFromString(c.Params("vmAddress")) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + name := c.Params("name") + + // Parse pagination parameters manually + pagination, err := dto.PaginationFromQuery(c) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + // Get module histories from service + response, err := h.service.GetModuleHistories(*pagination, parser.BytesToHexWithPrefix(vmAddress), name) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetModulePublishInfo godoc +// +// @Summary Get module publish info +// @Description Retrieve a module publish info +// @Tags Module +// @Accept json +// @Produce json +// @Param vmAddress path string true "VM address" +// @Param name path string true "Module name" +// @Success 200 {object} dto.ModulePublishInfoResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/module/v1/modules/{vmAddress}/{name}/publish_info [get] +func (h *ModuleHandler) GetModulePublishInfo(c *fiber.Ctx) error { + vmAddress, err := parser.AccAddressFromString(c.Params("vmAddress")) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + name := c.Params("name") + + response, err := h.service.GetModulePublishInfo(parser.BytesToHexWithPrefix(vmAddress), name) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetModuleProposals godoc +// +// @Summary Get module proposal +// @Description Retrieve a module proposal +// @Tags Module +// @Accept json +// @Produce json +// @Param vmAddress path string true "VM address" +// @Param name path string true "Module name" +// @Param pagination.offset query integer false "Offset for pagination" default(0) +// @Param pagination.limit query integer false "Limit for pagination" default(10) +// @Param pagination.count_total query boolean false "Count total" default(false) +// @Success 200 {object} dto.ModuleProposalsResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/module/v1/modules/{vmAddress}/{name}/proposals [get] +func (h *ModuleHandler) GetModuleProposals(c *fiber.Ctx) error { + vmAddress, err := parser.AccAddressFromString(c.Params("vmAddress")) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + name := c.Params("name") + + // Parse pagination parameters manually + pagination, err := dto.PaginationFromQuery(c) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + response, err := h.service.GetModuleProposals(*pagination, parser.BytesToHexWithPrefix(vmAddress), name) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetModuleTransactions godoc +// +// @Summary Get module transaction +// @Description Retrieve a module transaction +// @Tags Module +// @Accept json +// @Produce json +// @Param vmAddress path string true "VM address" +// @Param name path string true "Module name" +// @Param pagination.offset query integer false "Offset for pagination" default(0) +// @Param pagination.limit query integer false "Limit for pagination" default(10) +// @Param pagination.count_total query boolean false "Count total" default(false) +// @Success 200 {object} dto.ModuleTxsResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/module/v1/modules/{vmAddress}/{name}/transactions [get] +func (h *ModuleHandler) GetModuleTransactions(c *fiber.Ctx) error { + vmAddress, err := parser.AccAddressFromString(c.Params("vmAddress")) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + name := c.Params("name") + + // Parse pagination parameters manually + pagination, err := dto.PaginationFromQuery(c) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + response, err := h.service.GetModuleTransactions(*pagination, parser.BytesToHexWithPrefix(vmAddress), name) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetModuleStats godoc +// +// @Summary Get module stats by module id +// @Description Retrieve a module stats +// @Tags Module +// @Accept json +// @Produce json +// @Param vmAddress path string true "VM address" +// @Param name path string true "Module name" +// @Success 200 {object} dto.ModuleStatsResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/module/v1/modules/{vmAddress}/{name}/stats [get] +func (h *ModuleHandler) GetModuleStats(c *fiber.Ctx) error { + vmAddress, err := parser.AccAddressFromString(c.Params("vmAddress")) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + name := c.Params("name") + + response, err := h.service.GetModuleStats(parser.BytesToHexWithPrefix(vmAddress), name) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} diff --git a/api/handlers/nft.go b/api/handlers/nft.go new file mode 100644 index 00000000..9f70c26b --- /dev/null +++ b/api/handlers/nft.go @@ -0,0 +1,416 @@ +package handlers + +import ( + "github.com/gofiber/fiber/v2" + + "github.com/initia-labs/core-indexer/pkg/parser" + + "github.com/initia-labs/core-indexer/api/apperror" + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/api/services" +) + +// NftHandler handles Nft-related HTTP requests +type NftHandler struct { + service services.NftService +} + +// NewNftHandler creates a new instance of NftHandler +func NewNftHandler(service services.NftService) *NftHandler { + return &NftHandler{ + service: service, + } +} + +// GetCollections godoc +// +// @Summary Get Nft collections +// @Description Retrieve a list of Nft collections with optional search and pagination +// @Tags Nft +// @Accept json +// @Produce json +// @Param search query string false "Search term for filtering Nfts" +// @Param pagination.offset query integer false "Offset for pagination" default(0) +// @Param pagination.limit query integer false "Limit for pagination" default(10) +// @Param pagination.count_total query boolean false "Whether to count total Nfts" default(false) +// @Success 200 {object} dto.NftCollectionsResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/nft/v1/collections [get] +func (h *NftHandler) GetCollections(c *fiber.Ctx) error { + // Parse pagination parameters manually + pagination, err := dto.PaginationFromQuery(c) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + // Get search parameter + search := c.Query("search") + + // Get collections from service + response, err := h.service.GetCollections(*pagination, search) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetCollectionsByAccountAddress godoc +// +// @Summary Get Nft collections by account address +// @Description Retrieve a list of Nft collections owned by a specific account address +// @Tags Nft +// @Accept json +// @Produce json +// @Param accountAddress path string true "Account address of the Nft owner" +// @Success 200 {object} dto.NftCollectionsResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/nft/v1/collections/by_account/{accountAddress} [get] +func (h *NftHandler) GetCollectionsByAccountAddress(c *fiber.Ctx) error { + accountAddress, err := parser.AccAddressFromString(c.Params("accountAddress")) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + response, err := h.service.GetCollectionsByAccountAddress(parser.BytesToHexWithPrefix(accountAddress)) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetCollectionsByCollectionAddress godoc +// +// @Summary Get Nft collection by collection address +// @Description Retrieve a specific Nft collection by its collection address +// @Tags Nft +// @Accept json +// @Produce json +// @Param collectionAddress path string true "Collection address of the Nft" +// @Success 200 {object} dto.NftCollectionResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/nft/v1/collections/{collectionAddress} [get] +func (h *NftHandler) GetCollectionsByCollectionAddress(c *fiber.Ctx) error { + collectionAddress, err := parser.AccAddressFromString(c.Params("collectionAddress")) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + response, err := h.service.GetCollectionsByCollectionAddress(parser.BytesToHexWithPrefix(collectionAddress)) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetCollectionActivities godoc +// +// @Summary Get Nft collection activities +// @Description Retrieve activities related to a specific Nft collection with optional search and pagination +// @Tags Nft +// @Accept json +// @Produce json +// @Param collectionAddress path string true "Collection address of the Nft" +// @Param search query string false "Search term for filtering activities" +// @Param pagination.offset query integer false "Offset for pagination" default(0) +// @Param pagination.limit query integer false "Limit for pagination" default(10) +// @Param pagination.reverse query boolean false "Reverse order for pagination" default(false) +// @Param pagination.count_total query boolean false "Count total number of transactions" default(false) +// @Success 200 {object} dto.CollectionActivitiesResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/nft/v1/collections/{collectionAddress}/activities [get] +func (h *NftHandler) GetCollectionActivities(c *fiber.Ctx) error { + collectionAddress, err := parser.AccAddressFromString(c.Params("collectionAddress")) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + search := c.Query("search") + + pagination, err := dto.PaginationFromQuery(c) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + response, err := h.service.GetCollectionActivities(*pagination, parser.BytesToHexWithPrefix(collectionAddress), search) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetCollectionCreator godoc +// +// @Summary Get Nft collection creator +// @Description Retrieve the creator of a specific Nft collection by its address +// @Tags Nft +// @Accept json +// @Produce json +// @Param collectionAddress path string true "Collection address of the Nft" +// @Success 200 {object} dto.CollectionCreatorResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/nft/v1/collections/{collectionAddress}/creator [get] +func (h *NftHandler) GetCollectionCreator(c *fiber.Ctx) error { + collectionAddress, err := parser.AccAddressFromString(c.Params("collectionAddress")) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + response, err := h.service.GetCollectionCreator(parser.BytesToHexWithPrefix(collectionAddress)) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetCollectionMutateEvents godoc +// +// @Summary Get Nft collection mutate events +// @Description Retrieve mutate events for a specific Nft collection by its address with pagination +// @Tags Nft +// @Accept json +// @Produce json +// @Param collectionAddress path string true "Collection address of the Nft" +// @Param pagination.offset query integer false "Offset for pagination" default(0) +// @Param pagination.limit query integer false "Limit for pagination" default(10) +// @Param pagination.count_total query boolean false "Whether to count total events" default(false) +// @Success 200 {object} dto.CollectionMutateEventsResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/nft/v1/collections/{collectionAddress}/mutate_events [get] +func (h *NftHandler) GetCollectionMutateEvents(c *fiber.Ctx) error { + collectionAddress, err := parser.AccAddressFromString(c.Params("collectionAddress")) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + pagination, err := dto.PaginationFromQuery(c) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + response, err := h.service.GetCollectionMutateEvents(*pagination, parser.BytesToHexWithPrefix(collectionAddress)) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetNftByNftAddress godoc +// +// @Summary Get Nft by collection address and Nft address +// @Description Retrieve a specific Nft by its collection address and Nft address +// @Tags Nft +// @Accept json +// @Produce json +// @Param collectionAddress path string true "Collection address of the Nft" +// @Param nftAddress path string true "Nft address" +// @Success 200 {object} dto.NftByAddressResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/nft/v1/tokens/by_collection/{collectionAddress}/{nftAddress} [get] +func (h *NftHandler) GetNftByNftAddress(c *fiber.Ctx) error { + collectionAddress, err := parser.AccAddressFromString(c.Params("collectionAddress")) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + nftAddress, err := parser.AccAddressFromString(c.Params("nftAddress")) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + response, err := h.service.GetNftByNftAddress(parser.BytesToHexWithPrefix(collectionAddress), parser.BytesToHexWithPrefix(nftAddress)) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetNftsByCollectionAddress godoc +// +// @Summary Get Nfts by collection address +// @Description Retrieve a list of Nfts by their collection address with optional search and pagination +// @Tags Nft +// @Accept json +// @Produce json +// @Param collectionAddress path string true "Collection address of the Nfts" +// @Param search query string false "Search term for filtering Nfts" +// @Param pagination.offset query integer false "Offset for pagination" default(0) +// @Param pagination.limit query integer false "Limit for pagination" default(10) +// @Param pagination.count_total query boolean false "Whether to count total Nfts" default(false) +// @Success 200 {object} dto.NftsByAddressResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/nft/v1/tokens/by_collection/{collectionAddress} [get] +func (h *NftHandler) GetNftsByCollectionAddress(c *fiber.Ctx) error { + collectionAddress, err := parser.AccAddressFromString(c.Params("collectionAddress")) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + search := c.Query("search") + + pagination, err := dto.PaginationFromQuery(c) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + response, err := h.service.GetNftsByCollectionAddress(*pagination, parser.BytesToHexWithPrefix(collectionAddress), search) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetNftsByAccountAddress godoc +// +// @Summary Get Nfts by account address +// @Description Retrieve a list of Nfts owned by a specific account address with optional search and collection filtering +// @Tags Nft +// @Accept json +// @Produce json +// @Param accountAddress path string true "Account address of the Nfts owner" +// @Param search query string false "Search term for filtering Nfts" +// @Param collectionAddress query string false "Collection address to filter Nfts" +// @Param pagination.offset query integer false "Offset for pagination" default(0) +// @Param pagination.limit query integer false "Limit for pagination" default(10) +// @Param pagination.count_total query boolean false "Whether to count total Nfts" default(false) +// @Success 200 {object} dto.NftsByAddressResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/nft/v1/tokens/by_account/{accountAddress} [get] +func (h *NftHandler) GetNftsByAccountAddress(c *fiber.Ctx) error { + accountAddress, err := parser.AccAddressFromString(c.Params("accountAddress")) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + search := c.Query("search") + collectionAddressStr := c.Query("collectionAddress") + if collectionAddressStr != "" { + if collectionAddress, err := parser.AccAddressFromString(collectionAddressStr); err != nil { + return apperror.HandleErrorResponse(c, err) + } else { + collectionAddressStr = parser.BytesToHexWithPrefix(collectionAddress) + } + } + + pagination, err := dto.PaginationFromQuery(c) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + response, err := h.service.GetNftsByAccountAddress(*pagination, parser.BytesToHexWithPrefix(accountAddress), collectionAddressStr, search) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetNftMintInfo godoc +// +// @Summary Get Nft mint information +// @Description Retrieve mint information for a specific Nft by its address +// @Tags Nft +// @Accept json +// @Produce json +// @Param nftAddress path string true "Nft address" +// @Success 200 {object} dto.NftMintInfoResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/nft/v1/token/{nftAddress}/mint_info [get] +func (h *NftHandler) GetNftMintInfo(c *fiber.Ctx) error { + nftAddress, err := parser.AccAddressFromString(c.Params("nftAddress")) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + response, err := h.service.GetNftMintInfo(parser.BytesToHexWithPrefix(nftAddress)) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetNftMutateEvents godoc +// +// @Summary Get Nft mutate events +// @Description Retrieve mutate events for a specific Nft by its address with pagination +// @Tags Nft +// @Accept json +// @Produce json +// @Param nftAddress path string true "Nft address" +// @Param pagination.offset query integer false "Offset for pagination" default(0) +// @Param pagination.limit query integer false "Limit for pagination" default(10) +// @Param pagination.count_total query boolean false "Whether to count total Nfts" default(false) +// @Success 200 {object} dto.NftMutateEventsResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/nft/v1/token/{nftAddress}/mutate_events [get] +func (h *NftHandler) GetNftMutateEvents(c *fiber.Ctx) error { + nftAddress, err := parser.AccAddressFromString(c.Params("nftAddress")) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + pagination, err := dto.PaginationFromQuery(c) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + response, err := h.service.GetNftMutateEvents(*pagination, parser.BytesToHexWithPrefix(nftAddress)) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetNftTxs godoc +// +// @Summary Get Nft transactions +// @Description Retrieve transactions related to a specific Nft by its address with pagination +// @Tags Nft +// @Accept json +// @Produce json +// @Param nftAddress path string true "Nft address" +// @Param pagination.offset query integer false "Offset for pagination" default(0) +// @Param pagination.limit query integer false "Limit for pagination" default(10) +// @Param pagination.count_total query boolean false "Whether to count total Nfts" default(false) +// @Param pagination.reverse query boolean false "Whether to reverse the order of transactions" default(true) +// @Success 200 {object} dto.NftTxsResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/nft/v1/token/{nftAddress}/txs [get] +func (h *NftHandler) GetNftTxs(c *fiber.Ctx) error { + nftAddress, err := parser.AccAddressFromString(c.Params("nftAddress")) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + pagination, err := dto.PaginationFromQuery(c) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + response, err := h.service.GetNftTxs(*pagination, parser.BytesToHexWithPrefix(nftAddress)) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} diff --git a/api/handlers/proposal.go b/api/handlers/proposal.go new file mode 100644 index 00000000..f93f7113 --- /dev/null +++ b/api/handlers/proposal.go @@ -0,0 +1,218 @@ +package handlers + +import ( + "strconv" + + "github.com/gofiber/fiber/v2" + + "github.com/initia-labs/core-indexer/pkg/parser" + + "github.com/initia-labs/core-indexer/api/apperror" + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/api/services" +) + +type ProposalHandler struct { + service services.ProposalService +} + +func NewProposalHandler(service services.ProposalService) *ProposalHandler { + return &ProposalHandler{ + service: service, + } +} + +// GetProposals godoc +// +// @Summary Get list of proposals +// @Description Retrieve the list of all proposals +// @Tags Proposal +// @Produce json +// @Param pagination.offset query integer false "Offset for pagination" default(0) +// @Param pagination.limit query integer false "Limit for pagination" default(10) +// @Param pagination.reverse query boolean false "Reverse order for pagination" default(false) +// @Param pagination.count_total query boolean false "Count total number of transactions" default(false) +// @Param proposer query string false "Filter proposals by proposer" default() +// @Param statuses query string false "Filter proposals by status(es)" default() +// @Param types query string false "Filter proposals by proposal type" default() +// @Param search query string false "Search proposals by title or exact proposal id" default() +// @Success 200 {object} dto.ProposalsResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/proposal/v1/proposals [get] +func (h *ProposalHandler) GetProposals(c *fiber.Ctx) error { + pagination, err := dto.PaginationFromQuery(c) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + proposerStr := c.Query("proposer") + if proposerStr != "" { + if proposer, err := parser.AccAddressFromString(proposerStr); err != nil { + return apperror.HandleErrorResponse(c, err) + } else { + proposerStr = proposer.String() + } + } + statuses := c.Query("statuses") + types := c.Query("types") + search := c.Query("search") + + proposals, err := h.service.GetProposals(*pagination, proposerStr, statuses, types, search) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(proposals) +} + +// GetProposalsTypes godoc +// +// @Summary Get list of submitted proposal types +// @Description Retrieve all submitted proposal types +// @Tags Proposal +// @Produce json +// @Success 200 {object} dto.ProposalsTypesResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/proposal/v1/proposals/types [get] +func (h *ProposalHandler) GetProposalsTypes(c *fiber.Ctx) error { + types, err := h.service.GetProposalsTypes() + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(types) +} + +// GetProposalInfo godoc +// +// @Summary Get proposal info +// @Description Retrieve proposal details +// @Tags Proposal +// @Produce json +// @Param proposalId path string true "Proposal Id" +// @Success 200 {object} dto.ProposalInfoResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/proposal/v1/proposals/{proposalId}/info [get] +func (h *ProposalHandler) GetProposalInfo(c *fiber.Ctx) error { + parsedId, err := strconv.ParseInt(c.Params("proposalId"), 10, 32) + if err != nil { + return apperror.HandleErrorResponse(c, apperror.NewValidationError(apperror.ErrMsgProposalId)) + } + + id := int(parsedId) + proposal, err := h.service.GetProposalInfo(id) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(proposal) +} + +// GetProposalVotes godoc +// +// @Summary Get all proposal votes +// @Description Retrieve list of all proposal votes +// @Tags Proposal +// @Produce json +// @Param pagination.offset query integer false "Offset for pagination" default(0) +// @Param pagination.limit query integer false "Limit for pagination" default(10) +// @Param pagination.reverse query boolean false "Reverse order for pagination" default(false) +// @Param pagination.count_total query boolean false "Count total number of transactions" default(false) +// @Param proposalId path string true "Proposal Id" +// @Param search query string false "Search proposal vote by voter address" default() +// @Param answer query string false "Search proposal votes by vote option" default() +// @Success 200 {object} dto.ProposalVotesResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/proposal/v1/proposals/{proposalId}/votes [get] +func (h *ProposalHandler) GetProposalVotes(c *fiber.Ctx) error { + pagination, err := dto.PaginationFromQuery(c) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + parsedId, err := strconv.ParseInt(c.Params("proposalId"), 10, 32) + if err != nil { + return apperror.HandleErrorResponse(c, apperror.NewValidationError(apperror.ErrMsgProposalId)) + } + + search := c.Query("search") + answer := c.Query("answer") + + id := int(parsedId) + proposals, err := h.service.GetProposalVotes(*pagination, id, search, answer) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(proposals) +} + +// GetProposalValidatorVotes godoc +// +// @Summary Get validator votes of a proposal +// @Description Retrieve list of all proposal votes by validators +// @Tags Proposal +// @Produce json +// @Param pagination.offset query integer false "Offset for pagination" default(0) +// @Param pagination.limit query integer false "Limit for pagination" default(10) +// @Param pagination.reverse query boolean false "Reverse order for pagination" default(false) +// @Param pagination.count_total query boolean false "Count total number of transactions" default(false) +// @Param proposalId path string true "Proposal Id" +// @Param search query string false "Search proposal vote by validator moniker or address" default() +// @Param answer query string false "Search proposal votes by vote option" default() +// @Success 200 {object} dto.ProposalValidatorVotesResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/proposal/v1/proposals/{proposalId}/validator_votes [get] +func (h *ProposalHandler) GetProposalValidatorVotes(c *fiber.Ctx) error { + pagination, err := dto.PaginationFromQuery(c) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + parsedId, err := strconv.ParseInt(c.Params("proposalId"), 10, 32) + if err != nil { + return apperror.HandleErrorResponse(c, apperror.NewValidationError(apperror.ErrMsgProposalId)) + } + + search := c.Query("search") + answer := c.Query("answer") + + id := int(parsedId) + proposals, err := h.service.GetProposalValidatorVotes(*pagination, id, search, answer) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(proposals) +} + +// GetProposalAnswerCounts godoc +// +// @Summary Get votes count of a proposal +// @Description Retrieve vote counts of a proposal by options +// @Tags Proposal +// @Produce json +// @Param proposalId path string true "Proposal Id" +// @Success 200 {object} dto.ProposalAnswerCountsResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/proposal/v1/proposals/{proposalId}/answer_counts [get] +func (h *ProposalHandler) GetProposalAnswerCounts(c *fiber.Ctx) error { + parsedId, err := strconv.ParseInt(c.Params("proposalId"), 10, 32) + if err != nil { + return apperror.HandleErrorResponse(c, apperror.NewValidationError(apperror.ErrMsgProposalId)) + } + + id := int(parsedId) + counts, err := h.service.GetProposalAnswerCounts(id) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(counts) +} diff --git a/api/handlers/tx.go b/api/handlers/tx.go new file mode 100644 index 00000000..63a76d99 --- /dev/null +++ b/api/handlers/tx.go @@ -0,0 +1,127 @@ +package handlers + +import ( + "github.com/gofiber/fiber/v2" + + "github.com/initia-labs/core-indexer/api/apperror" + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/api/services" + "github.com/initia-labs/core-indexer/pkg/parser" +) + +type TxHandler struct { + service services.TxService +} + +func NewTxHandler(service services.TxService) *TxHandler { + return &TxHandler{ + service: service, + } +} + +// GetTxCount godoc +// +// @Summary Get transaction count +// @Description Retrieve the total number of transactions +// @Tags Transaction +// @Produce json +// @Success 200 {integer} int64 "Transaction count" +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/tx/v1/txs/count [get] +func (h *TxHandler) GetTxCount(c *fiber.Ctx) error { + txCount, err := h.service.GetTxCount() + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(txCount) +} + +// GetTxsByAccountAddress godoc +// +// @Summary Get transactions by account address +// @Description Retrieve transactions by account address +// @Tags Transaction +// @Produce json +// @Param accountAddress path string true "Account address" +// @Param pagination.offset query integer false "Offset for pagination" default(0) +// @Param pagination.limit query integer false "Limit for pagination" default(10) +// @Param pagination.reverse query boolean false "Reverse order for pagination" default(false) +// @Param pagination.count_total query boolean false "Count total number of transactions" default(false) +// @Success 200 {object} dto.TxsResponse "OK" +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/tx/v1/txs/by_account/{accountAddress} [get] +func (h *TxHandler) GetTxsByAccountAddress(c *fiber.Ctx) error { + pagination, err := dto.PaginationFromQuery(c) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + accountAddress, err := parser.AccAddressFromString(c.Params("accountAddress")) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + response, err := h.service.GetTxsByAccountAddress(c.UserContext(), *pagination, accountAddress.String()) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +func (h *TxHandler) GetTxsByBlockHeight(c *fiber.Ctx) error { + return nil +} + +// GetTxByHash godoc +// +// @Summary Get transaction by hash +// @Description Retrieve transaction details by its hash +// @Tags Transaction +// @Accept json +// @Produce json +// @Param tx_hash path string true "Transaction hash" +// @Success 200 {object} dto.TxByHashResponse "OK" +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/tx/v1/txs/{tx_hash} [get] +func (h *TxHandler) GetTxByHash(c *fiber.Ctx) error { + hash := c.Params("tx_hash") + tx, err := h.service.GetTxByHash(c.UserContext(), hash) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + return c.JSON(tx) +} + +// GetTxs godoc +// +// @Summary Get transactions +// @Description Retrieve a list of transactions with pagination +// @Tags Transaction +// @Accept json +// @Produce json +// @Param pagination.offset query integer false "Offset for pagination" default(0) +// @Param pagination.limit query integer false "Limit for pagination" default(10) +// @Param pagination.reverse query boolean false "Reverse order for pagination" default(false) +// @Param pagination.count_total query boolean false "Count total number of transactions" default(false) +// @Success 200 {object} dto.TxsModelResponse "OK" +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/tx/v1/txs [get] +func (h *TxHandler) GetTxs(c *fiber.Ctx) error { + pagination, err := dto.PaginationFromQuery(c) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + response, err := h.service.GetTxs(pagination) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} diff --git a/api/handlers/validator.go b/api/handlers/validator.go new file mode 100644 index 00000000..19a0731a --- /dev/null +++ b/api/handlers/validator.go @@ -0,0 +1,291 @@ +package handlers + +import ( + "strconv" + + "github.com/gofiber/fiber/v2" + + "github.com/initia-labs/core-indexer/api/apperror" + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/api/services" +) + +type ValidatorHandler struct { + service services.ValidatorService +} + +func NewValidatorHandler(service services.ValidatorService) *ValidatorHandler { + return &ValidatorHandler{ + service: service, + } +} + +// GetAllValidators godoc +// +// @Summary Get all validators (simplified) +// @Description Retrieve a simplified list of all validators (active and inactive) with basic info +// @Tags Validator +// @Produce json +// @Success 200 {object} dto.AllValidatorsResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/validator/v1/all [get] +func (h *ValidatorHandler) GetAllValidators(c *fiber.Ctx) error { + // Use a large limit to get all validators + pagination := dto.PaginationQuery{ + Offset: 0, + Limit: 1000, + Reverse: false, + CountTotal: false, + } + + response, err := h.service.GetValidators(pagination, dto.ValidatorStatusFilterAll, "", "") + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + // Return simplified response format + return c.JSON(dto.AllValidatorsResponse{ + Infos: response.ValidatorsInfo, + }) +} + +// GetValidators godoc +// +// @Summary Get list of validators +// @Description Retrieve the list of all validators +// @Tags Validator +// @Produce json +// @Param pagination.offset query integer false "Offset for pagination" default(0) +// @Param pagination.limit query integer false "Limit for pagination" default(10) +// @Param pagination.reverse query boolean false "Reverse order for pagination" default(false) +// @Param pagination.count_total query boolean false "Count total number of transactions" default(false) +// @Param status query string false "Filter validators by status: 'active', 'inactive', or 'all'" default(active) +// @Param is_active query boolean false "(Deprecated: use status) Query for active validators" default(true) +// @Param sort_by query string false "Sort validators by field: 'uptime', 'commission', 'moniker' or empty for default (voting power)" default() +// @Param search query string false "Search validators by moniker or exact operator address" default() +// @Success 200 {object} dto.ValidatorsResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/validator/v1/validators [get] +func (h *ValidatorHandler) GetValidators(c *fiber.Ctx) error { + pagination, err := dto.PaginationFromQuery(c) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + // Determine status - support both new 'status' param and legacy 'is_active' param + status := dto.ValidatorStatusFilter(c.Query("status")) + if status == "" { + // Backward compatibility: check legacy is_active parameter + isActive := true + if isActiveStr := c.Query("is_active"); isActiveStr != "" { + isActive = isActiveStr == "true" + } + if isActive { + status = dto.ValidatorStatusFilterActive + } else { + status = dto.ValidatorStatusFilterInactive + } + } + + sortBy := c.Query("sort_by") + search := c.Query("search") + + response, err := h.service.GetValidators(*pagination, status, sortBy, search) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetValidatorInfo godoc +// +// @Summary Get validator info +// @Description Get validator info from the operator address +// @Tags Validator +// @Produce json +// @Param operatorAddr path string true "Validator operator address" +// @Success 200 {object} dto.ValidatorInfoResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/validator/v1/validators/{operatorAddr}/info [get] +func (h *ValidatorHandler) GetValidatorInfo(c *fiber.Ctx) error { + addr := c.Params("operatorAddr") + val, err := h.service.GetValidatorInfo(addr) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + return c.JSON(val) +} + +// GetValidatorUptime godoc +// +// @Summary Get validator uptime +// @Description Get validator uptime from the operator address +// @Tags Validator +// @Produce json +// @Param operatorAddr path string true "Validator operator address" +// @Param blocks query integer true "Blocks to be queried" default() +// @Success 200 {object} dto.ValidatorUptimeResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/validator/v1/validators/{operatorAddr}/uptime [get] +func (h *ValidatorHandler) GetValidatorUptime(c *fiber.Ctx) error { + addr := c.Params("operatorAddr") + blocks := 0 + if blocksStr := c.Query("blocks"); blocksStr != "" { + if block, err := strconv.Atoi(blocksStr); err != nil { + return apperror.HandleErrorResponse(c, apperror.NewValidationError(apperror.ErrMsgBlocks)) + } else if block <= 0 { + return apperror.HandleErrorResponse(c, apperror.NewValidationError(apperror.ErrMsgBlocksZero)) + } else { + blocks = block + } + } else { + return apperror.HandleErrorResponse(c, apperror.NewValidationError(apperror.ErrMsgBlocksRequired)) + } + + uptime, err := h.service.GetValidatorUptime(addr, blocks) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + return c.JSON(uptime) +} + +// GetValidatorDelegationRelatedTxs godoc +// +// @Summary Get delegation transactions of a validator +// @Description Retrieves list of delegation related of a validator +// @Tags Validator +// @Produce json +// @Param pagination.offset query integer false "Offset for pagination" default(0) +// @Param pagination.limit query integer false "Limit for pagination" default(10) +// @Param pagination.reverse query boolean false "Reverse order for pagination" default(false) +// @Param pagination.count_total query boolean false "Count total number of transactions" default(false) +// @Param operatorAddr path string true "Validator operator address" +// @Success 200 {object} dto.ValidatorDelegationRelatedTxsResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/validator/v1/validators/{operatorAddr}/delegation_related_txs [get] +func (h *ValidatorHandler) GetValidatorDelegationRelatedTxs(c *fiber.Ctx) error { + pagination, err := dto.PaginationFromQuery(c) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + addr := c.Params("operatorAddr") + response, err := h.service.GetValidatorDelegationTxs(*pagination, addr) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetValidatorProposedBlocks godoc +// +// @Summary Get validator proposed blocks +// @Description Retrieves list of proposed blocks from a validator +// @Tags Validator +// @Produce json +// @Param pagination.offset query integer false "Offset for pagination" default(0) +// @Param pagination.limit query integer false "Limit for pagination" default(10) +// @Param pagination.reverse query boolean false "Reverse order for pagination" default(false) +// @Param pagination.count_total query boolean false "Count total number of transactions" default(false) +// @Param operatorAddr path string true "Validator operator address" +// @Success 200 {object} dto.ValidatorProposedBlocksResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/validator/v1/validators/{operatorAddr}/proposed_blocks [get] +func (h *ValidatorHandler) GetValidatorProposedBlocks(c *fiber.Ctx) error { + pagination, err := dto.PaginationFromQuery(c) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + addr := c.Params("operatorAddr") + response, err := h.service.GetValidatorProposedBlocks(*pagination, addr) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetValidatorHistoricalPowers godoc +// +// @Summary Get validator historical powers +// @Description Retrieves historical powers of a validator to be rendered +// @Tags Validator +// @Produce json +// @Param operatorAddr path string true "Validator operator address" +// @Success 200 {object} dto.ValidatorHistoricalPowersResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/validator/v1/validators/{operatorAddr}/historical_powers [get] +func (h *ValidatorHandler) GetValidatorHistoricalPowers(c *fiber.Ctx) error { + addr := c.Params("operatorAddr") + response, err := h.service.GetValidatorHistoricalPowers(addr) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + return c.JSON(response) +} + +// GetValidatorVotedProposals godoc +// +// @Summary Get validator voted proposals +// @Description Retrieves list of voted governance proposals from a validator +// @Tags Validator +// @Produce json +// @Param pagination.offset query integer false "Offset for pagination" default(0) +// @Param pagination.limit query integer false "Limit for pagination" default(10) +// @Param pagination.reverse query boolean false "Reverse order for pagination" default(false) +// @Param pagination.count_total query boolean false "Count total number of transactions" default(false) +// @Param operatorAddr path string true "Validator operator address" +// @Param search query string false "Search validators by moniker or exact operator address" default() +// @Param answer query string false "Filter by given answer" default() +// @Success 200 {object} dto.ValidatorVotedProposalsResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/validator/v1/validators/{operatorAddr}/voted_proposals [get] +func (h *ValidatorHandler) GetValidatorVotedProposals(c *fiber.Ctx) error { + pagination, err := dto.PaginationFromQuery(c) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + + addr := c.Params("operatorAddr") + search := c.Query("search") + answer := c.Query("answer") + + proposals, err := h.service.GetValidatorVotedProposals(*pagination, addr, search, answer) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + return c.JSON(proposals) +} + +// GetValidatorAnswerCounts godoc +// +// @Summary Get validator proposal answers count +// @Description Get validator voted governance proposal answers count +// @Tags Validator +// @Produce json +// @Param operatorAddr path string true "Validator operator address" +// @Success 200 {object} dto.ValidatorAnswerCountsResponse +// @Failure 400 {object} apperror.Response +// @Failure 500 {object} apperror.Response +// @Router /indexer/validator/v1/validators/{operatorAddr}/answer_counts [get] +func (h *ValidatorHandler) GetValidatorAnswerCounts(c *fiber.Ctx) error { + addr := c.Params("operatorAddr") + + counts, err := h.service.GetValidatorAnswerCounts(addr) + if err != nil { + return apperror.HandleErrorResponse(c, err) + } + return c.JSON(counts) +} diff --git a/api/main.go b/api/main.go new file mode 100644 index 00000000..c4bfee71 --- /dev/null +++ b/api/main.go @@ -0,0 +1,211 @@ +package main + +import ( + "context" + "strings" + + "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v2/middleware/cors" + "github.com/gofiber/fiber/v2/middleware/recover" + "github.com/gofiber/swagger" + "github.com/joho/godotenv" + _ "github.com/lib/pq" + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" + "gocloud.dev/blob" + "gocloud.dev/blob/gcsblob" + "gocloud.dev/gcp" + "gorm.io/gorm" + + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/logger" + "github.com/initia-labs/core-indexer/pkg/sdkconfig" + + "github.com/initia-labs/core-indexer/api/config" + "github.com/initia-labs/core-indexer/api/docs" + "github.com/initia-labs/core-indexer/api/middleware" + "github.com/initia-labs/core-indexer/api/routes" +) + +// @title Core Indexer API +// @version 1.0 +// @description This is the API service for the Core Indexer project +// @termsOfService http://swagger.io/terms/ + +// @contact.name API Support +// @contact.url http://www.swagger.io/support +// @contact.email support@swagger.io + +// @license.name Apache 2.0 +// @license.url http://www.apache.org/licenses/LICENSE-2.0.html + +// @BasePath / + +// @tag.name Block +// @tag.description Block related endpoints + +// @tag.name Health +// @tag.description Health check endpoints + +// @tag.name Module +// @tag.description Module related endpoints + +// @tag.name Nft +// @tag.description Nft related endpoints + +// @tag.name Proposal +// @tag.description Proposal related endpoints + +// @tag.name Root +// @tag.description Root endpoints + +// @tag.name Transaction +// @tag.description Transaction related endpoints + +// @tag.name Validator +// @tag.description Validator related endpoints + +// initDatabase initializes and returns a database connection +func initDatabase(cfg *config.Config) *gorm.DB { + dbClient, err := db.NewClient(cfg.Database.ConnectionString) + if err != nil { + log.Fatal().Err(err).Msg("Failed to connect to database") + } + + sqlDB, err := dbClient.DB() + if err != nil { + log.Fatal().Err(err).Msg("Failed to get database pool") + } + sqlDB.SetMaxOpenConns(cfg.Database.MaxOpenConns) + sqlDB.SetMaxIdleConns(cfg.Database.MaxIdleConns) + sqlDB.SetConnMaxLifetime(cfg.Database.ConnMaxLifetime) + sqlDB.SetConnMaxIdleTime(cfg.Database.ConnMaxIdleTime) + + // Test database connection + if err := db.Ping(context.Background(), dbClient); err != nil { + log.Fatal().Err(err).Msg("Failed to ping database") + } + + return dbClient +} + +// initStorage initializes and returns a storage bucket +func initStorage(cfg *config.Config) []*blob.Bucket { + creds, err := gcp.DefaultCredentials(context.Background()) + if err != nil { + log.Fatal().Err(err).Msg("Failed to create credentials") + } + + client, err := gcp.NewHTTPClient( + gcp.DefaultTransport(), + gcp.CredentialsTokenSource(creds)) + if err != nil { + log.Fatal().Err(err).Msg("Failed to create HTTP client") + } + + var buckets []*blob.Bucket + + for _, bucketName := range cfg.Storage.Buckets { + bucketName = strings.TrimSpace(bucketName) + if bucketName == "" { + continue + } + + bucket, err := gcsblob.OpenBucket(context.Background(), client, bucketName, nil) + if err != nil { + log.Fatal().Err(err).Str("bucket", bucketName).Msg("Failed to open bucket") + } + + log.Info().Str("bucket", bucketName).Msg("Successfully connected to bucket") + buckets = append(buckets, bucket) + } + + log.Info().Int("connected_buckets", len(buckets)).Msg("Storage initialization complete") + + return buckets +} + +func main() { + // Load environment variables + if err := godotenv.Load(); err != nil { + log.Warn().Msg("No .env file found") + } + + // Load configuration + cfg := config.New() + + // Initialize logger + log := logger.Init(logger.Config{ + Component: "core-indexer-api", + ChainID: cfg.ChainID, + Environment: cfg.Environment, + Level: zerolog.InfoLevel, + }) + + // Initialize database + dbClient := initDatabase(cfg) + sqlDB, err := dbClient.DB() + if err == nil { + defer sqlDB.Close() + } + + // Initialize storage + buckets := initStorage(cfg) + defer func() { + for _, bucket := range buckets { + bucket.Close() + } + }() + + sdkconfig.ConfigureSDK() + + // Create Fiber app + app := fiber.New(fiber.Config{ + AppName: "Core Indexer API", + ReadTimeout: cfg.Server.ReadTimeout, + WriteTimeout: cfg.Server.WriteTimeout, + IdleTimeout: cfg.Server.IdleTimeout, + }) + + // Middleware + app.Use(recover.New()) + app.Use(cors.New()) + app.Use(middleware.RequestLogger(log)) + + // Swagger documentation + swaggerConfig := swagger.Config{ + URL: "/indexer/swagger/doc.json", + DeepLinking: true, + } + app.Get("/indexer/swagger/*", swagger.New(swaggerConfig)) + + // Update Swagger host with actual port + docs.SwaggerInfo.Host = "" + + // Routes + app.Get("/", func(c *fiber.Ctx) error { + return c.JSON(fiber.Map{ + "message": "Welcome to Core Indexer API", + }) + }) + + // Health check endpoint + app.Get("/health", func(c *fiber.Ctx) error { + return c.JSON(fiber.Map{ + "status": "OK", + }) + }) + + if cfg.Observability.RuntimeMetricsEnabled { + routes.SetupRuntimeMetricsRoute(app, dbClient) + } + + // Setup routes + routes.SetupRoutes(app, dbClient, buckets, cfg) + + // Start server + log.Info().Str("port", cfg.Server.Port).Msg("Starting server") + if err := app.Listen(":" + cfg.Server.Port); err != nil { + log.Fatal().Err(err).Msg("Failed to start server") + } +} diff --git a/api/middleware/logger.go b/api/middleware/logger.go new file mode 100644 index 00000000..52bbeb0b --- /dev/null +++ b/api/middleware/logger.go @@ -0,0 +1,42 @@ +package middleware + +import ( + "time" + + "github.com/gofiber/fiber/v2" + "github.com/rs/zerolog" +) + +// RequestLogger returns a middleware that logs HTTP request information using zerolog +func RequestLogger(log *zerolog.Logger) fiber.Handler { + return func(c *fiber.Ctx) error { + start := time.Now() + path := c.Path() + method := c.Method() + + // Process request + err := c.Next() + + // Get status code + status := c.Response().StatusCode() + + // Create log event + event := log.Info(). + Str("method", method). + Str("path", path). + Int("status", status). + Dur("latency", time.Since(start)). + Str("ip", c.IP()). + Str("user_agent", c.Get("User-Agent")) + + // Add error if any + if err != nil { + event.Err(err) + } + + // Log the request + event.Send() + + return err + } +} diff --git a/api/repositories/account.go b/api/repositories/account.go new file mode 100644 index 00000000..9f717396 --- /dev/null +++ b/api/repositories/account.go @@ -0,0 +1,192 @@ +package repositories + +import ( + "fmt" + "strings" + "time" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/api/utils" + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/logger" +) + +var _ AccountRepositoryI = &AccountRepository{} + +type AccountRepository struct { + db *gorm.DB + countQueryTimeout time.Duration +} + +func NewAccountRepository(db *gorm.DB, countQueryTimeout time.Duration) *AccountRepository { + return &AccountRepository{ + db: db, + countQueryTimeout: countQueryTimeout, + } +} + +func (r *AccountRepository) GetAccountByAccountAddress(accountAddress string) (*db.Account, error) { + var record db.Account + + if err := r.db.Model(&db.Account{}). + Where("address = ?", accountAddress). + First(&record).Error; err != nil { + logger.Get().Error().Err(err).Msg("GetAccountType: failed to fetch account type") + return nil, err + } + + return &record, nil +} + +func (r *AccountRepository) GetAccountProposals(pagination dto.PaginationQuery, accountAddress string) ([]db.Proposal, int64, error) { + record := make([]db.Proposal, 0) + total := int64(0) + + if err := r.db.Model(&db.Proposal{}). + Select(` + proposals.title, + proposals.status, + proposals.voting_end_time, + proposals.deposit_end_time, + proposals.type, + proposals.id, + proposals.proposer_id, + proposals.is_expedited, + proposals.is_emergency, + proposals.resolved_height + `). + Where("proposals.proposer_id = ?", accountAddress). + Order(clause.OrderByColumn{ + Column: clause.Column{ + Name: "proposals.id", + }, + Desc: pagination.Reverse, + }). + Limit(pagination.Limit). + Offset(pagination.Offset). + Find(&record).Error; err != nil { + logger.Get().Error().Err(err).Msg("GetAccountProposals: failed to fetch proposals") + return nil, 0, err + } + + if pagination.CountTotal { + var err error + total, err = db.CountWithTimeout(r.db.Model(&db.Proposal{}).Where("proposals.proposer_id = ?", accountAddress), r.countQueryTimeout) + if err != nil { + logger.Get().Error().Err(err).Msg("GetAccountProposals: failed to count proposals") + return nil, 0, err + } + } + + return record, total, nil +} + +func (r *AccountRepository) GetAccountTxs( + pagination dto.PaginationQuery, + accountAddress string, + search string, + isSend bool, + isIbc bool, + isOpinit bool, + isMovePublish bool, + isMoveUpgrade bool, + isMoveExecute bool, + isMoveScript bool, + isSigner *bool, +) ([]dto.AccountTxModel, int64, error) { + record := make([]dto.AccountTxModel, 0) + total := int64(0) + + query := r.db.Model(&db.AccountTransaction{}). + Select(` + blocks.height, + blocks.timestamp, + accounts.address as sender, + transactions.hash, + transactions.success, + transactions.messages, + transactions.is_send, + transactions.is_ibc, + transactions.is_move_publish, + transactions.is_move_upgrade, + transactions.is_move_execute, + transactions.is_move_script, + transactions.is_opinit, + account_transactions.is_signer + `). + Joins("LEFT JOIN blocks ON account_transactions.block_height = blocks.height"). + Joins("LEFT JOIN transactions ON account_transactions.transaction_id = transactions.id"). + Joins("LEFT JOIN accounts ON transactions.sender = accounts.address"). + Where("account_transactions.account_id = ?", accountAddress). + Order((clause.OrderByColumn{ + Column: clause.Column{ + Name: "account_transactions.block_height", + }, + Desc: pagination.Reverse, + })). + Limit(pagination.Limit). + Offset(pagination.Offset) + + countQuery := r.db.Model(&db.AccountTransaction{}). + Joins("LEFT JOIN transactions ON account_transactions.transaction_id = transactions.id"). + Where("account_transactions.account_id = ?", accountAddress) + + if isSigner != nil { + query = query.Where("account_transactions.is_signer = ?", *isSigner) + countQuery = countQuery.Where("account_transactions.is_signer = ?", *isSigner) + } + + filters := map[string]bool{ + "transactions.is_send": isSend, + "transactions.is_ibc": isIbc, + "transactions.is_opinit": isOpinit, + "transactions.is_move_publish": isMovePublish, + "transactions.is_move_upgrade": isMoveUpgrade, + "transactions.is_move_execute": isMoveExecute, + "transactions.is_move_script": isMoveScript, + } + orConditions := make([]string, 0) + orParams := make([]any, 0) + + for col, val := range filters { + if val { + orConditions = append(orConditions, fmt.Sprintf("%s = ?", col)) + orParams = append(orParams, true) + } + } + + if len(orConditions) > 0 { + combined := "(" + strings.Join(orConditions, " OR ") + ")" + query = query.Where(combined, orParams...) + countQuery = countQuery.Where(combined, orParams...) + } + + search = strings.TrimSpace(search) + + if search != "" { + if utils.IsTxHash(search) { + query = query.Where("transactions.hash = ?", fmt.Sprintf("\\x%s", search)) + countQuery = countQuery.Where("transactions.hash = ?", fmt.Sprintf("\\x%s", search)) + } else { + return record, 0, nil + } + } + + if err := query.Find(&record).Error; err != nil { + logger.Get().Error().Err(err).Msg("GetAccountTxs: failed to fetch account transactions") + return nil, 0, err + } + + if pagination.CountTotal { + var err error + total, err = db.CountWithTimeout(countQuery, r.countQueryTimeout) + if err != nil { + logger.Get().Error().Err(err).Msg("GetAccountTxs: failed to count account transactions") + return nil, 0, err + } + } + return record, total, nil +} diff --git a/api/repositories/block.go b/api/repositories/block.go new file mode 100644 index 00000000..03cc70ab --- /dev/null +++ b/api/repositories/block.go @@ -0,0 +1,257 @@ +package repositories + +import ( + "time" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/logger" +) + +var _ BlockRepositoryI = &BlockRepository{} + +type BlockRepository struct { + db *gorm.DB + countQueryTimeout time.Duration +} + +func NewBlockRepository(db *gorm.DB, countQueryTimeout time.Duration) *BlockRepository { + return &BlockRepository{ + db: db, + countQueryTimeout: countQueryTimeout, + } +} + +func (r *BlockRepository) GetBlockHeightLatest() (*int64, error) { + var record db.Block + + if err := r.db. + Model(&db.Block{}). + Select("height"). + Order(clause.OrderByColumn{ + Column: clause.Column{ + Name: "height", + }, + Desc: true, + }). + First(&record).Error; err != nil { + logger.Get().Error().Err(err).Msg("GetBlockHeightLatest: failed to fetch latest informative block height") + return nil, err + } + + latestHeight := int64(record.Height) + + return &latestHeight, nil +} + +func (r *BlockRepository) GetBlockHeightInformativeLatest() (*int64, error) { + var record db.Tracking + + if err := r.db. + Model(&db.Tracking{}). + Select("latest_informative_block_height"). + First(&record).Error; err != nil { + logger.Get().Error().Err(err).Msg("GetBlockHeightLatest: failed to fetch latest informative block height") + return nil, err + } + + latestHeight := int64(record.LatestInformativeBlockHeight) + + return &latestHeight, nil +} + +func (r *BlockRepository) GetBlockTimestamp(latestBlockHeight int64) ([]time.Time, error) { + var record []db.Block + + if err := r.db.Model(&db.Block{}). + Select("timestamp"). + Where("height <= ?", latestBlockHeight). + Order(clause.OrderByColumn{ + Column: clause.Column{ + Name: "height", + }, + Desc: true, + }). + Limit(100).Find(&record).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to query block timestamps") + return nil, err + } + + timestamps := make([]time.Time, len(record)) + for idx, b := range record { + timestamps[idx] = b.Timestamp + } + + return timestamps, nil +} + +func (r *BlockRepository) GetBlocks(pagination dto.PaginationQuery) ([]dto.BlockModel, int64, error) { + record := make([]dto.BlockModel, 0) + total := int64(0) + + if err := r.db.Model(&db.Block{}). + Select(` + blocks.hash, + blocks.height, + blocks.timestamp, + validators.moniker, + validators.operator_address, + validators.identity + `). + Joins("LEFT JOIN validators ON blocks.proposer = validators.operator_address"). + Where("blocks.height >= ?", 1). + Order(clause.OrderByColumn{ + Column: clause.Column{ + Name: "blocks.height", + }, + Desc: pagination.Reverse, + }). + Limit(pagination.Limit). + Offset(pagination.Offset). + Find(&record).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to query blocks") + return nil, 0, err + } + + if pagination.CountTotal { + latestHeight, err := r.GetBlockHeightLatest() + if err != nil { + logger.Get().Error().Err(err).Msg("Failed to get total block count") + return nil, 0, err + } + total = *latestHeight + } + + // Get transaction counts separately for better performance + if len(record) > 0 { + heights := make([]int64, len(record)) + for idx, block := range record { + heights[idx] = block.Height + } + + var txCounts []struct { + BlockHeight int64 `gorm:"column:block_height"` + TxCount int64 `gorm:"column:tx_count"` + } + + if err := r.db.Model(&db.Transaction{}). + Select("block_height, COUNT(*) as tx_count"). + Where("block_height IN ?", heights). + Group("block_height"). + Find(&txCounts).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to get transaction counts") + } + + txCountMap := make(map[int64]int64) + for _, tc := range txCounts { + txCountMap[tc.BlockHeight] = tc.TxCount + } + + for idx := range record { + record[idx].TxCount = txCountMap[record[idx].Height] + } + } + + return record, total, nil +} + +func (r *BlockRepository) GetBlockInfo(height int64) (*dto.BlockInfoModel, error) { + var record dto.BlockInfoModel + + if err := r.db.Model(&db.Block{}). + Select(` + blocks.hash, + blocks.height, + blocks.timestamp, + validators.moniker, + validators.operator_address, + validators.identity, + COALESCE(SUM(transactions.gas_used), 0) AS gas_used, + COALESCE(SUM(transactions.gas_limit), 0) AS gas_limit + `). + Joins("LEFT JOIN validators ON blocks.proposer = validators.operator_address"). + Joins("LEFT JOIN transactions ON blocks.height = transactions.block_height"). + Where("blocks.height = ?", height). + Clauses(clause.GroupBy{ + Columns: []clause.Column{ + {Name: "blocks.hash"}, + {Name: "blocks.height"}, + {Name: "blocks.timestamp"}, + {Name: "validators.moniker"}, + {Name: "validators.operator_address"}, + {Name: "validators.identity"}, + }, + }). + First(&record).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to query block info") + return nil, err + } + + return &record, nil +} + +func (r *BlockRepository) GetBlockTxs(pagination dto.PaginationQuery, height int64) ([]dto.BlockTxModel, int64, error) { + record := make([]dto.BlockTxModel, 0) + total := int64(0) + + if err := r.db.Model(&db.Transaction{}). + Select(` + blocks.height, + blocks.timestamp, + accounts.address, + transactions.hash, + transactions.success, + transactions.messages, + transactions.is_send, + transactions.is_ibc, + transactions.is_opinit + `). + Joins("LEFT JOIN blocks ON blocks.height = transactions.block_height"). + Joins("LEFT JOIN accounts ON accounts.address = transactions.sender"). + Where("blocks.height = ?", height). + Order(clause.OrderByColumn{ + Column: clause.Column{ + Name: "transactions.block_index", + }, + Desc: pagination.Reverse, + }). + Limit(pagination.Limit). + Offset(pagination.Offset). + Find(&record).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to query block transactions") + return nil, 0, err + } + + if pagination.CountTotal { + var err error + total, err = db.CountWithTimeout(r.db.Model(&db.Transaction{}).Joins("LEFT JOIN blocks ON blocks.height = transactions.block_height").Where("blocks.height = ?", height), r.countQueryTimeout) + if err != nil { + logger.Get().Error().Err(err).Msg("Failed to get total block transaction count") + return nil, 0, err + } + } + + return record, total, nil +} + +func (r *BlockRepository) GetLatestBlock() (*db.Block, error) { + var block db.Block + + if err := r.db.Model(&db.Block{}). + Limit(1). + Order(clause.OrderByColumn{ + Column: clause.Column{ + Name: "height", + }, + Desc: true, + }). + First(&block).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to query latest block") + return nil, err + } + + return &block, nil +} diff --git a/api/repositories/mocks/account.go b/api/repositories/mocks/account.go new file mode 100644 index 00000000..9b5cacb2 --- /dev/null +++ b/api/repositories/mocks/account.go @@ -0,0 +1,61 @@ +package mocks + +import ( + "github.com/stretchr/testify/mock" + + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/api/repositories" + "github.com/initia-labs/core-indexer/pkg/db" +) + +// MockAccountRepository is a mock implementation of AccountRepositoryI +type MockAccountRepository struct { + mock.Mock +} + +// Ensure MockAccountRepository implements AccountRepositoryI interface +var _ repositories.AccountRepositoryI = (*MockAccountRepository)(nil) + +// NewMockAccountRepository creates a new mock account repository +func NewMockAccountRepository() *MockAccountRepository { + return &MockAccountRepository{} +} + +// GetAccountByAccountAddress mocks the GetAccountByAccountAddress method +func (m *MockAccountRepository) GetAccountByAccountAddress(accountAddress string) (*db.Account, error) { + args := m.Called(accountAddress) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).(*db.Account), args.Error(1) +} + +// GetAccountProposals mocks the GetAccountProposals method +func (m *MockAccountRepository) GetAccountProposals(pagination dto.PaginationQuery, accountAddress string) ([]db.Proposal, int64, error) { + args := m.Called(pagination, accountAddress) + if args.Get(0) == nil { + return nil, args.Get(1).(int64), args.Error(2) + } + return args.Get(0).([]db.Proposal), args.Get(1).(int64), args.Error(2) +} + +// GetAccountTxs mocks the GetAccountTxs method +func (m *MockAccountRepository) GetAccountTxs( + pagination dto.PaginationQuery, + accountAddress string, + search string, + isSend bool, + isIbc bool, + isOpinit bool, + isMovePublish bool, + isMoveUpgrade bool, + isMoveExecute bool, + isMoveScript bool, + isSigner *bool, +) ([]dto.AccountTxModel, int64, error) { + args := m.Called(pagination, accountAddress, search, isSend, isIbc, isOpinit, isMovePublish, isMoveUpgrade, isMoveExecute, isMoveScript, isSigner) + if args.Get(0) == nil { + return nil, args.Get(1).(int64), args.Error(2) + } + return args.Get(0).([]dto.AccountTxModel), args.Get(1).(int64), args.Error(2) +} diff --git a/api/repositories/mocks/block.go b/api/repositories/mocks/block.go new file mode 100644 index 00000000..c521587b --- /dev/null +++ b/api/repositories/mocks/block.go @@ -0,0 +1,59 @@ +package mocks + +import ( + "time" + + "github.com/stretchr/testify/mock" + + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/pkg/db" +) + +type BlockRepository struct { + mock.Mock +} + +func NewMockBlockRepository() *BlockRepository { + return &BlockRepository{} +} + +func (m *BlockRepository) GetBlockHeightLatest() (*int64, error) { + args := m.Called() + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).(*int64), args.Error(1) +} + +func (m *BlockRepository) GetBlockHeightInformativeLatest() (*int64, error) { + args := m.Called() + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).(*int64), args.Error(1) +} + +func (m *BlockRepository) GetBlockTimestamp(latestBlockHeight int64) ([]time.Time, error) { + args := m.Called(latestBlockHeight) + return args.Get(0).([]time.Time), args.Error(1) +} + +func (m *BlockRepository) GetBlocks(pagination dto.PaginationQuery) ([]dto.BlockModel, int64, error) { + args := m.Called(pagination) + return args.Get(0).([]dto.BlockModel), args.Get(1).(int64), args.Error(2) +} + +func (m *BlockRepository) GetBlockInfo(height int64) (*dto.BlockInfoModel, error) { + args := m.Called(height) + return args.Get(0).(*dto.BlockInfoModel), args.Error(1) +} + +func (m *BlockRepository) GetBlockTxs(pagination dto.PaginationQuery, height int64) ([]dto.BlockTxModel, int64, error) { + args := m.Called(pagination, height) + return args.Get(0).([]dto.BlockTxModel), args.Get(1).(int64), args.Error(2) +} + +func (m *BlockRepository) GetLatestBlock() (*db.Block, error) { + args := m.Called() + return args.Get(0).(*db.Block), args.Error(1) +} diff --git a/api/repositories/mocks/module.go b/api/repositories/mocks/module.go new file mode 100644 index 00000000..595ff8c5 --- /dev/null +++ b/api/repositories/mocks/module.go @@ -0,0 +1,84 @@ +package mocks + +import ( + "github.com/stretchr/testify/mock" + + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/api/repositories" +) + +// MockModuleRepository is a mock implementation of ModuleRepositoryI +type MockModuleRepository struct { + mock.Mock +} + +// Ensure MockModuleRepository implements ModuleRepositoryI interface +var _ repositories.ModuleRepositoryI = (*MockModuleRepository)(nil) + +// NewMockModuleRepository creates a new mock module repository +func NewMockModuleRepository() *MockModuleRepository { + return &MockModuleRepository{} +} + +// GetModules mocks the GetModules method +func (m *MockModuleRepository) GetModules(pagination dto.PaginationQuery) ([]dto.ModuleResponse, int64, error) { + args := m.Called(pagination) + if args.Get(0) == nil { + return nil, args.Get(1).(int64), args.Error(2) + } + return args.Get(0).([]dto.ModuleResponse), args.Get(1).(int64), args.Error(2) +} + +// GetModuleById mocks the GetModuleById method +func (m *MockModuleRepository) GetModuleById(vmAddress string, name string) (*dto.ModuleResponse, error) { + args := m.Called(vmAddress, name) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).(*dto.ModuleResponse), args.Error(1) +} + +// GetModuleHistories mocks the GetModuleHistories method +func (m *MockModuleRepository) GetModuleHistories(pagination dto.PaginationQuery, vmAddress string, name string) ([]dto.ModuleHistoryResponse, int64, error) { + args := m.Called(pagination, vmAddress, name) + if args.Get(0) == nil { + return nil, args.Get(1).(int64), args.Error(2) + } + return args.Get(0).([]dto.ModuleHistoryResponse), args.Get(1).(int64), args.Error(2) +} + +// GetModulePublishInfo mocks the GetModulePublishInfo method +func (m *MockModuleRepository) GetModulePublishInfo(vmAddress string, name string) ([]dto.ModulePublishInfoModel, error) { + args := m.Called(vmAddress, name) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).([]dto.ModulePublishInfoModel), args.Error(1) +} + +// GetModuleProposals mocks the GetModuleProposals method +func (m *MockModuleRepository) GetModuleProposals(pagination dto.PaginationQuery, vmAddress string, name string) ([]dto.ModuleProposalModel, int64, error) { + args := m.Called(pagination, vmAddress, name) + if args.Get(0) == nil { + return nil, args.Get(1).(int64), args.Error(2) + } + return args.Get(0).([]dto.ModuleProposalModel), args.Get(1).(int64), args.Error(2) +} + +// GetModuleTransactions mocks the GetModuleTransactions method +func (m *MockModuleRepository) GetModuleTransactions(pagination dto.PaginationQuery, vmAddress string, name string) ([]dto.ModuleTxResponse, int64, error) { + args := m.Called(pagination, vmAddress, name) + if args.Get(0) == nil { + return nil, args.Get(1).(int64), args.Error(2) + } + return args.Get(0).([]dto.ModuleTxResponse), args.Get(1).(int64), args.Error(2) +} + +// GetModuleStats mocks the GetModuleStats method +func (m *MockModuleRepository) GetModuleStats(vmAddress string, name string) (*dto.ModuleStatsResponse, error) { + args := m.Called(vmAddress, name) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).(*dto.ModuleStatsResponse), args.Error(1) +} diff --git a/api/repositories/mocks/nft.go b/api/repositories/mocks/nft.go new file mode 100644 index 00000000..2d5f0676 --- /dev/null +++ b/api/repositories/mocks/nft.go @@ -0,0 +1,130 @@ +package mocks + +import ( + "github.com/stretchr/testify/mock" + + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/api/repositories" + "github.com/initia-labs/core-indexer/pkg/db" +) + +// MockNftRepository is a mock implementation of NftRepositoryI +type MockNftRepository struct { + mock.Mock +} + +// Ensure MockNftRepository implements NftRepositoryI interface +var _ repositories.NftRepositoryI = (*MockNftRepository)(nil) + +// NewMockNftRepository creates a new mock NFT repository +func NewMockNftRepository() *MockNftRepository { + return &MockNftRepository{} +} + +// GetCollections mocks the GetCollections method +func (m *MockNftRepository) GetCollections(pagination dto.PaginationQuery, search string) ([]db.Collection, int64, error) { + args := m.Called(pagination, search) + if args.Get(0) == nil { + return nil, args.Get(1).(int64), args.Error(2) + } + return args.Get(0).([]db.Collection), args.Get(1).(int64), args.Error(2) +} + +// GetCollectionsByAccountAddress mocks the GetCollectionsByAccountAddress method +func (m *MockNftRepository) GetCollectionsByAccountAddress(accountAddress string) ([]dto.CollectionByAccountAddressModel, error) { + args := m.Called(accountAddress) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).([]dto.CollectionByAccountAddressModel), args.Error(1) +} + +// GetCollectionsByCollectionAddress mocks the GetCollectionsByCollectionAddress method +func (m *MockNftRepository) GetCollectionsByCollectionAddress(collectionAddress string) (*db.Collection, error) { + args := m.Called(collectionAddress) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).(*db.Collection), args.Error(1) +} + +// GetCollectionActivities mocks the GetCollectionActivities method +func (m *MockNftRepository) GetCollectionActivities(pagination dto.PaginationQuery, collectionAddress string, search string) ([]dto.CollectionActivityModel, int64, error) { + args := m.Called(pagination, collectionAddress, search) + if args.Get(0) == nil { + return nil, args.Get(1).(int64), args.Error(2) + } + return args.Get(0).([]dto.CollectionActivityModel), args.Get(1).(int64), args.Error(2) +} + +// GetCollectionCreator mocks the GetCollectionCreator method +func (m *MockNftRepository) GetCollectionCreator(collectionAddress string) (*dto.CollectionCreatorModel, error) { + args := m.Called(collectionAddress) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).(*dto.CollectionCreatorModel), args.Error(1) +} + +// GetCollectionMutateEvents mocks the GetCollectionMutateEvents method +func (m *MockNftRepository) GetCollectionMutateEvents(pagination dto.PaginationQuery, collectionAddress string) ([]dto.MutateEventModel, int64, error) { + args := m.Called(pagination, collectionAddress) + if args.Get(0) == nil { + return nil, args.Get(1).(int64), args.Error(2) + } + return args.Get(0).([]dto.MutateEventModel), args.Get(1).(int64), args.Error(2) +} + +// GetNftByNftAddress mocks the GetNftByNftAddress method +func (m *MockNftRepository) GetNftByNftAddress(collectionAddress string, nftAddress string) (*dto.NftByAddressModel, error) { + args := m.Called(collectionAddress, nftAddress) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).(*dto.NftByAddressModel), args.Error(1) +} + +// GetNftsByAccountAddress mocks the GetNftsByAccountAddress method +func (m *MockNftRepository) GetNftsByAccountAddress(pagination dto.PaginationQuery, accountAddress string, collectionAddress string, search string) ([]dto.NftByAddressModel, int64, error) { + args := m.Called(pagination, accountAddress, collectionAddress, search) + if args.Get(0) == nil { + return nil, args.Get(1).(int64), args.Error(2) + } + return args.Get(0).([]dto.NftByAddressModel), args.Get(1).(int64), args.Error(2) +} + +// GetNftsByCollectionAddress mocks the GetNftsByCollectionAddress method +func (m *MockNftRepository) GetNftsByCollectionAddress(pagination dto.PaginationQuery, collectionAddress string, search string) ([]dto.NftByAddressModel, int64, error) { + args := m.Called(pagination, collectionAddress, search) + if args.Get(0) == nil { + return nil, args.Get(1).(int64), args.Error(2) + } + return args.Get(0).([]dto.NftByAddressModel), args.Get(1).(int64), args.Error(2) +} + +// GetNftMintInfo mocks the GetNftMintInfo method +func (m *MockNftRepository) GetNftMintInfo(nftAddress string) (*dto.NftMintInfoModel, error) { + args := m.Called(nftAddress) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).(*dto.NftMintInfoModel), args.Error(1) +} + +// GetNftMutateEvents mocks the GetNftMutateEvents method +func (m *MockNftRepository) GetNftMutateEvents(pagination dto.PaginationQuery, nftAddress string) ([]dto.MutateEventModel, int64, error) { + args := m.Called(pagination, nftAddress) + if args.Get(0) == nil { + return nil, args.Get(1).(int64), args.Error(2) + } + return args.Get(0).([]dto.MutateEventModel), args.Get(1).(int64), args.Error(2) +} + +// GetNftTxs mocks the GetNftTxs method +func (m *MockNftRepository) GetNftTxs(pagination dto.PaginationQuery, nftAddress string) ([]dto.NftTxModel, int64, error) { + args := m.Called(pagination, nftAddress) + if args.Get(0) == nil { + return nil, args.Get(1).(int64), args.Error(2) + } + return args.Get(0).([]dto.NftTxModel), args.Get(1).(int64), args.Error(2) +} diff --git a/api/repositories/mocks/proposal.go b/api/repositories/mocks/proposal.go new file mode 100644 index 00000000..487bc08b --- /dev/null +++ b/api/repositories/mocks/proposal.go @@ -0,0 +1,94 @@ +package mocks + +import ( + "github.com/stretchr/testify/mock" + + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/api/repositories" + "github.com/initia-labs/core-indexer/pkg/db" +) + +// MockProposalRepository is a mock implementation of ProposalRepositoryI +type MockProposalRepository struct { + mock.Mock +} + +// Ensure MockProposalRepository implements ProposalRepositoryI interface +var _ repositories.ProposalRepositoryI = (*MockProposalRepository)(nil) + +// NewMockProposalRepository creates a new mock proposal repository +func NewMockProposalRepository() *MockProposalRepository { + return &MockProposalRepository{} +} + +// GetProposals mocks the GetProposals method +func (m *MockProposalRepository) GetProposals(pagination *dto.PaginationQuery) ([]db.Proposal, error) { + args := m.Called(pagination) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).([]db.Proposal), args.Error(1) +} + +// GetProposalVotesByValidator mocks the GetProposalVotesByValidator method +func (m *MockProposalRepository) GetProposalVotesByValidator(operatorAddr string) ([]db.ProposalVote, error) { + args := m.Called(operatorAddr) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).([]db.ProposalVote), args.Error(1) +} + +// SearchProposals mocks the SearchProposals method +func (m *MockProposalRepository) SearchProposals(pagination dto.PaginationQuery, proposer, search string, statuses, types []string) ([]dto.ProposalSummary, int64, error) { + args := m.Called(pagination, proposer, search, statuses, types) + if args.Get(0) == nil { + return nil, args.Get(1).(int64), args.Error(2) + } + return args.Get(0).([]dto.ProposalSummary), args.Get(1).(int64), args.Error(2) +} + +// GetAllProposalTypes mocks the GetAllProposalTypes method +func (m *MockProposalRepository) GetAllProposalTypes() (*dto.ProposalsTypesResponse, error) { + args := m.Called() + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).(*dto.ProposalsTypesResponse), args.Error(1) +} + +// GetProposalInfo mocks the GetProposalInfo method +func (m *MockProposalRepository) GetProposalInfo(id int) (*dto.ProposalInfo, error) { + args := m.Called(id) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).(*dto.ProposalInfo), args.Error(1) +} + +// GetProposalVotes mocks the GetProposalVotes method +func (m *MockProposalRepository) GetProposalVotes(id int, limit, offset int64, search, answer string) ([]dto.ProposalVote, int64, error) { + args := m.Called(id, limit, offset, search, answer) + if args.Get(0) == nil { + return nil, args.Get(1).(int64), args.Error(2) + } + return args.Get(0).([]dto.ProposalVote), args.Get(1).(int64), args.Error(2) +} + +// GetProposalValidatorVotes mocks the GetProposalValidatorVotes method +func (m *MockProposalRepository) GetProposalValidatorVotes(id int) ([]dto.ProposalVote, error) { + args := m.Called(id) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).([]dto.ProposalVote), args.Error(1) +} + +// GetProposalAnswerCounts mocks the GetProposalAnswerCounts method +func (m *MockProposalRepository) GetProposalAnswerCounts(id int) (*dto.ProposalAnswerCountsResponse, error) { + args := m.Called(id) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).(*dto.ProposalAnswerCountsResponse), args.Error(1) +} diff --git a/api/repositories/module.go b/api/repositories/module.go new file mode 100644 index 00000000..b9df8951 --- /dev/null +++ b/api/repositories/module.go @@ -0,0 +1,269 @@ +package repositories + +import ( + "errors" + "fmt" + "time" + + "gorm.io/gorm" + + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/logger" +) + +var _ ModuleRepositoryI = &ModuleRepository{} + +type ModuleRepository struct { + db *gorm.DB + countQueryTimeout time.Duration +} + +func NewModuleRepository(db *gorm.DB, countQueryTimeout time.Duration) *ModuleRepository { + return &ModuleRepository{ + db: db, + countQueryTimeout: countQueryTimeout, + } +} + +// GetModules retrieves modules with pagination +func (r *ModuleRepository) GetModules(pagination dto.PaginationQuery) ([]dto.ModuleResponse, int64, error) { + var modules []dto.ModuleResponse + var total int64 + + // TODO: Consider optimizing this query + if err := r.db.Model(&db.Module{}). + Select( + "name AS module_name", + "digest", + "is_verify", + "publisher_id AS address", + "block_info.height", + "block_info.timestamp AS latest_updated", + "(SELECT COUNT(*) > 1 FROM module_histories WHERE module_histories.module_id = modules.id) AS is_republished", + ). + Joins( + "LEFT JOIN LATERAL (SELECT blocks.height, blocks.timestamp FROM module_histories JOIN blocks ON blocks.height = module_histories.block_height WHERE module_histories.module_id = modules.id ORDER BY module_histories.block_height DESC LIMIT 1) AS block_info ON true", + ). + Order("(SELECT MAX(block_height) FROM module_histories WHERE module_histories.module_id = modules.id) DESC"). + Limit(pagination.Limit). + Offset(pagination.Offset). + Find(&modules).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to query modules") + return nil, 0, err + } + + // Get total count if requested + if pagination.CountTotal { + var err error + total, err = db.CountWithTimeout(r.db.Model(&db.Module{}), r.countQueryTimeout) + if err != nil { + logger.Get().Error().Err(err).Msg("Failed to count modules") + return nil, 0, err + } + } + + return modules, total, nil +} + +func (r *ModuleRepository) GetModuleById(vmAddress string, name string) (*dto.ModuleResponse, error) { + var module dto.ModuleResponse + + query := r.db.Model(&db.Module{}) + + // TODO: Consider optimizing this query + err := query. + Select( + "name AS module_name", + "digest", + "is_verify", + "publisher_id AS address", + "block_info.height", + "block_info.timestamp AS latest_updated", + "(SELECT COUNT(*) > 1 FROM module_histories WHERE module_histories.module_id = modules.id) AS is_republished", + ). + Joins( + "LEFT JOIN LATERAL (SELECT blocks.height, blocks.timestamp FROM module_histories JOIN blocks ON blocks.height = module_histories.block_height WHERE module_histories.module_id = modules.id ORDER BY module_histories.block_height DESC LIMIT 1) AS block_info ON true", + ). + Where("modules.id = ?", vmAddress+"::"+name). + First(&module).Error + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, fmt.Errorf("module %s::%s not found", vmAddress, name) + } + logger.Get().Error().Err(err).Msg("Failed to query module") + return nil, err + } + + return &module, nil +} + +func (r *ModuleRepository) GetModuleHistories(pagination dto.PaginationQuery, vmAddress string, name string) ([]dto.ModuleHistoryResponse, int64, error) { + var histories []dto.ModuleHistoryResponse + var total int64 + + moduleId := fmt.Sprintf("%s::%s", vmAddress, name) + + err := r.db.Model(&db.ModuleHistory{}). + Select( + "module_histories.remark", + "module_histories.upgrade_policy", + "block_height AS height", + "blocks.timestamp", + ). + Joins("LEFT JOIN blocks ON blocks.height = module_histories.block_height"). + Where("module_histories.module_id = ?", moduleId). + Order("module_histories.block_height DESC"). + Limit(pagination.Limit). + Offset(pagination.Offset). + Find(&histories).Error + if err != nil { + logger.Get().Error().Err(err).Msg("Failed to query module histories") + return nil, 0, err + } + + if pagination.CountTotal { + var err error + total, err = db.CountWithTimeout(r.db.Model(&db.ModuleHistory{}).Where("module_histories.module_id = ?", moduleId), r.countQueryTimeout) + if err != nil { + logger.Get().Error().Err(err).Msg("Failed to count module histories") + return nil, 0, err + } + } + + return histories, total, nil +} + +func (r *ModuleRepository) GetModulePublishInfo(vmAddress string, name string) ([]dto.ModulePublishInfoModel, error) { + var modulePublishInfos []dto.ModulePublishInfoModel + + moduleId := fmt.Sprintf("%s::%s", vmAddress, name) + + err := r.db.Model(&db.ModuleHistory{}). + Select( + "transactions.hash", + "blocks.timestamp", + "proposals.id AS proposal_proposal_id", + "proposals.title AS proposal_proposal_title", + "module_histories.block_height AS height", + ). + Joins("LEFT JOIN transactions ON transactions.id = module_histories.tx_id"). + Joins("LEFT JOIN blocks ON blocks.height = module_histories.block_height"). + Joins("LEFT JOIN proposals ON proposals.id = module_histories.proposal_id"). + Where("module_histories.module_id = ?", moduleId). + Limit(2). + Order("module_histories.block_height DESC"). + Find(&modulePublishInfos).Error + if err != nil { + logger.Get().Error().Err(err).Msg("Failed to query module publish info") + return nil, err + } + + return modulePublishInfos, nil +} + +func (r *ModuleRepository) GetModuleProposals(pagination dto.PaginationQuery, vmAddress string, name string) ([]dto.ModuleProposalModel, int64, error) { + var proposals []dto.ModuleProposalModel + var total int64 + + moduleId := fmt.Sprintf("%s::%s", vmAddress, name) + err := r.db.Model(&db.ModuleProposal{}). + Select( + "proposals.id", + "proposals.title", + "proposals.status", + "proposals.voting_end_time", + "proposals.deposit_end_time", + "proposals.types", + "proposals.is_expedited", + "proposals.is_emergency", + "proposals.resolved_height", + "proposals.proposer_id AS proposer", + ). + Joins("LEFT JOIN proposals ON proposals.id = module_proposals.proposal_id"). + Where("module_proposals.module_id = ?", moduleId). + Order("module_proposals.proposal_id DESC"). + Limit(pagination.Limit). + Offset(pagination.Offset). + Find(&proposals).Error + if err != nil { + logger.Get().Error().Err(err).Msg("Failed to query module proposal") + return nil, 0, err + } + + if pagination.CountTotal { + var err error + total, err = db.CountWithTimeout(r.db.Model(&db.ModuleProposal{}).Where("module_proposals.module_id = ?", moduleId), r.countQueryTimeout) + if err != nil { + logger.Get().Error().Err(err).Msg("Failed to count module proposal") + return nil, 0, err + } + } + + return proposals, total, nil +} + +func (r *ModuleRepository) GetModuleTransactions(pagination dto.PaginationQuery, vmAddress string, name string) ([]dto.ModuleTxResponse, int64, error) { + var txs []dto.ModuleTxResponse + var total int64 + + moduleId := fmt.Sprintf("%s::%s", vmAddress, name) + + err := r.db.Model(&db.ModuleTransaction{}). + Select( + "blocks.height", + "blocks.timestamp", + "transactions.sender", + "transactions.hash", + "transactions.success", + "transactions.messages", + "transactions.is_send", + "transactions.is_ibc", + "transactions.is_move_execute", + "transactions.is_move_execute_event", + "transactions.is_move_publish", + "transactions.is_move_script", + "transactions.is_move_upgrade", + "transactions.is_opinit", + ). + Joins("LEFT JOIN blocks ON blocks.height = module_transactions.block_height"). + Joins("LEFT JOIN transactions ON transactions.id = module_transactions.tx_id"). + Where("module_transactions.module_id = ?", moduleId). + Order("module_transactions.block_height DESC"). + Limit(pagination.Limit). + Offset(pagination.Offset). + Find(&txs).Error + if err != nil { + logger.Get().Error().Err(err).Msg("Failed to query module txs") + return nil, 0, err + } + + if pagination.CountTotal { + var err error + total, err = db.CountWithTimeout(r.db.Model(&db.ModuleTransaction{}).Where("module_transactions.module_id = ?", moduleId), r.countQueryTimeout) + if err != nil { + logger.Get().Error().Err(err).Msg("Failed to count module txs") + return nil, 0, err + } + } + + return txs, total, nil +} + +func (r *ModuleRepository) GetModuleStats(vmAddress string, name string) (*dto.ModuleStatsResponse, error) { + var stats dto.ModuleStatsResponse + moduleId := fmt.Sprintf("%s::%s", vmAddress, name) + + err := r.db.Raw(` + SELECT + (SELECT COUNT(*) FROM module_transactions WHERE module_id = ?) AS total_txs, + (SELECT COUNT(*) FROM module_histories WHERE module_id = ?) AS total_histories, + (SELECT COUNT(*) FROM module_proposals WHERE module_id = ?) AS total_proposals + `, moduleId, moduleId, moduleId).Scan(&stats).Error + if err != nil { + logger.Get().Error().Err(err).Msg("Failed to get module stats") + return nil, err + } + + return &stats, nil +} diff --git a/api/repositories/nft.go b/api/repositories/nft.go new file mode 100644 index 00000000..476b5b6a --- /dev/null +++ b/api/repositories/nft.go @@ -0,0 +1,481 @@ +package repositories + +import ( + "regexp" + "strings" + "time" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/api/utils" + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/logger" +) + +var _ NftRepositoryI = &NftRepository{} + +// NftRepository implements NftRepositoryI +type NftRepository struct { + countQueryTimeout time.Duration + db *gorm.DB +} + +// NewNftRepository creates a new SQL-based Nft repository +func NewNftRepository(db *gorm.DB, countQueryTimeout time.Duration) *NftRepository { + return &NftRepository{ + db: db, + countQueryTimeout: countQueryTimeout, + } +} + +// GetCollections retrieves Nft collections with pagination and search +func (r *NftRepository) GetCollections(pagination dto.PaginationQuery, search string) ([]db.Collection, int64, error) { + record := make([]db.Collection, 0) + total := int64(0) + + query := r.db.Model(&db.Collection{}). + Select("name, uri, description, id, creator"). + Order(clause.OrderByColumn{ + Column: clause.Column{ + Name: "name", + }, + Desc: pagination.Reverse, + }). + Limit(pagination.Limit). + Offset(pagination.Offset) + + search = strings.TrimSpace(search) + if search != "" { + safeSearch := regexp.QuoteMeta(search) + query = query.Where(`name ~* ? OR id = ?`, safeSearch, strings.ToLower(safeSearch)) + } + + if err := query. + Find(&record). + Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to query Nft collections") + return nil, 0, err + } + + // Get total count if requested + if pagination.CountTotal { + var err error + safeSearch := regexp.QuoteMeta(search) + total, err = db.CountWithTimeout(r.db.Model(&db.Collection{}).Where("name ~* ? OR id = ?", safeSearch, strings.ToLower(safeSearch)), r.countQueryTimeout) + if err != nil { + logger.Get().Error().Err(err).Msg("Failed to count Nft collections") + return nil, 0, err + } + } + + return record, total, nil +} + +func (r *NftRepository) GetCollectionsByAccountAddress(accountAddress string) ([]dto.CollectionByAccountAddressModel, error) { + record := make([]dto.CollectionByAccountAddressModel, 0) + + if err := r.db.Model(&db.Collection{}). + Select("collections.name, collections.creator, collections.uri, collections.description, collections.id, COUNT(nfts.id) AS count"). + Joins("JOIN nfts ON nfts.collection = collections.id AND nfts.owner = ? AND nfts.is_burned = false", accountAddress). + Clauses( + clause.GroupBy{ + Columns: []clause.Column{ + {Name: "collections.id"}, + }, + }, + clause.OrderBy{ + Columns: []clause.OrderByColumn{ + {Column: clause.Column{Name: "collections.name"}, Desc: false}, + }, + }, + ). + Find(&record).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to get collections by account address") + return nil, err + } + + return record, nil +} + +func (r *NftRepository) GetCollectionsByCollectionAddress(collectionAddress string) (*db.Collection, error) { + var record db.Collection + + if err := r.db.Model(&db.Collection{}). + Select("name, uri, description, id, creator"). + Where("id = ?", collectionAddress). + First(&record).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to get collection by address") + return nil, err + } + + return &record, nil +} + +func (r *NftRepository) GetCollectionActivities(pagination dto.PaginationQuery, collectionAddress string, search string) ([]dto.CollectionActivityModel, int64, error) { + record := make([]dto.CollectionActivityModel, 0) + total := int64(0) + + query := r.db.Model(&db.CollectionTransaction{}). + Joins("LEFT JOIN transactions ON collection_transactions.tx_id = transactions.id"). + Joins("LEFT JOIN blocks ON transactions.block_height = blocks.height"). + Joins("LEFT JOIN nfts ON collection_transactions.nft_id = nfts.id"). + Select(` + transactions.hash, + blocks.timestamp, + collection_transactions.is_nft_burn, + collection_transactions.is_nft_mint, + collection_transactions.is_nft_transfer, + collection_transactions.nft_id, + nfts.token_id, + collection_transactions.is_collection_create + `). + Where("collection_transactions.collection_id = ?", collectionAddress). + Clauses(clause.OrderBy{ + Columns: []clause.OrderByColumn{ + {Column: clause.Column{Name: "collection_transactions.block_height"}, Desc: pagination.Reverse}, + {Column: clause.Column{Name: "nfts.token_id"}, Desc: pagination.Reverse}, + {Column: clause.Column{Name: "collection_transactions.is_nft_burn"}, Desc: pagination.Reverse}, + {Column: clause.Column{Name: "collection_transactions.is_nft_transfer"}, Desc: pagination.Reverse}, + {Column: clause.Column{Name: "collection_transactions.is_nft_mint"}, Desc: pagination.Reverse}, + {Column: clause.Column{Name: "collection_transactions.is_collection_create"}, Desc: pagination.Reverse}, + }, + }). + Limit(pagination.Limit). + Offset(pagination.Offset) + + countQuery := r.db.Model(&db.CollectionTransaction{}). + Joins("LEFT JOIN transactions ON collection_transactions.tx_id = transactions.id"). + Joins("LEFT JOIN nfts ON collection_transactions.nft_id = nfts.id"). + Where("collection_transactions.collection_id = ?", collectionAddress) + + search = strings.TrimSpace(search) + + if search != "" { + if utils.IsTxHash(search) { + query = query.Where("transactions.hash = ?", "\\x"+search) + countQuery = countQuery.Where("transactions.hash = ?", "\\x"+search) + } else { + if utils.IsHex(search) { + query = query.Where("nfts.token_id = ? OR collection_transactions.nft_id = ?", search, strings.ToLower(search)) + countQuery = countQuery.Where("nfts.token_id = ? OR collection_transactions.nft_id = ?", search, strings.ToLower(search)) + } else { + safeSearch := regexp.QuoteMeta(search) + query = query.Where("nfts.token_id ~* ?", safeSearch) + countQuery = countQuery.Where("nfts.token_id ~* ?", safeSearch) + } + } + } + + if err := query.Find(&record).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to query collection activities") + return nil, 0, err + } + + if pagination.CountTotal { + var err error + total, err = db.CountWithTimeout(countQuery, r.countQueryTimeout) + if err != nil { + logger.Get().Error().Err(err).Msg("Failed to count collection activities") + return nil, 0, err + } + } + + return record, total, nil +} + +func (r *NftRepository) GetCollectionCreator(collectionAddress string) (*dto.CollectionCreatorModel, error) { + var record dto.CollectionCreatorModel + + if err := r.db.Model(&db.CollectionTransaction{}). + Select(` + blocks.height, + blocks.timestamp, + collections.creator, + transactions.hash + `). + Joins("LEFT JOIN blocks ON collection_transactions.block_height = blocks.height"). + Joins("LEFT JOIN transactions ON collection_transactions.tx_id = transactions.id"). + Joins("LEFT JOIN collections ON collection_transactions.collection_id = collections.id"). + Where("collection_transactions.collection_id = ?", collectionAddress). + Clauses(clause.OrderBy{ + Columns: []clause.OrderByColumn{ + {Column: clause.Column{Name: "collection_transactions.block_height"}, Desc: false}, + {Column: clause.Column{Name: "transactions.block_index"}, Desc: false}, + }, + }). + First(&record).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to get collection creator") + return nil, err + } + + return &record, nil +} + +func (r *NftRepository) GetCollectionMutateEvents(pagination dto.PaginationQuery, collectionAddress string) ([]dto.MutateEventModel, int64, error) { + record := make([]dto.MutateEventModel, 0) + total := int64(0) + + if err := r.db.Model(&db.CollectionMutationEvent{}). + Select(` + collection_mutation_events.mutated_field_name, + collection_mutation_events.new_value, + collection_mutation_events.old_value, + collection_mutation_events.remark, + blocks.timestamp + `). + Joins("LEFT JOIN blocks ON collection_mutation_events.block_height = blocks.height"). + Where("collection_mutation_events.collection_id = ?", collectionAddress). + Clauses(clause.OrderBy{ + Columns: []clause.OrderByColumn{ + {Column: clause.Column{Name: "collection_mutation_events.block_height"}, Desc: pagination.Reverse}, + }, + }). + Limit(pagination.Limit). + Offset(pagination.Offset). + Find(&record).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to query collection mutate events") + return nil, 0, err + } + + if pagination.CountTotal { + var err error + total, err = db.CountWithTimeout(r.db.Model(&db.CollectionMutationEvent{}).Where("collection_mutation_events.collection_id = ?", collectionAddress), r.countQueryTimeout) + if err != nil { + logger.Get().Error().Err(err).Msg("Failed to count collection mutate events") + return nil, 0, err + } + } + + return record, total, nil +} + +func (r *NftRepository) GetNftByNftAddress(collectionAddress string, nftAddress string) (*dto.NftByAddressModel, error) { + var record dto.NftByAddressModel + + if err := r.db.Model(&db.Nft{}). + Select(` + nfts.token_id, + nfts.uri, + nfts.description, + nfts.is_burned, + nfts.owner, + nfts.id, + nfts.collection, + collections.name AS collection_name + `). + Joins("LEFT JOIN collections ON nfts.collection = collections.id"). + Where("nfts.collection = ? AND nfts.id = ?", collectionAddress, nftAddress). + First(&record).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to get Nft by address") + return nil, err + } + + return &record, nil +} + +func (r *NftRepository) GetNftsByAccountAddress(pagination dto.PaginationQuery, accountAddress string, collectionAddress string, search string) ([]dto.NftByAddressModel, int64, error) { + record := make([]dto.NftByAddressModel, 0) + total := int64(0) + + query := r.db.Model(&db.Nft{}). + Select(` + nfts.token_id, + nfts.uri, + nfts.description, + nfts.is_burned, + nfts.owner, + nfts.id, + nfts.collection, + collections.name AS collection_name + `). + Joins("LEFT JOIN collections ON nfts.collection = collections.id"). + Where("nfts.owner = ? AND nfts.is_burned = false", accountAddress). + Limit(pagination.Limit). + Offset(pagination.Offset) + + countQuery := r.db.Model(&db.Nft{}). + Where("nfts.owner = ? AND nfts.is_burned = false", accountAddress) + + applyNftFilters(query, collectionAddress, search) + applyNftFilters(countQuery, collectionAddress, search) + + if err := query.Find(&record).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to query Nfts by account address") + return nil, 0, err + } + + if pagination.CountTotal { + var err error + total, err = db.CountWithTimeout(countQuery, r.countQueryTimeout) + if err != nil { + logger.Get().Error().Err(err).Msg("Failed to count Nfts by account address") + return nil, 0, err + } + } + + return record, total, nil +} + +func (r *NftRepository) GetNftsByCollectionAddress(pagination dto.PaginationQuery, collectionAddress string, search string) ([]dto.NftByAddressModel, int64, error) { + record := make([]dto.NftByAddressModel, 0) + total := int64(0) + + query := r.db.Model(&db.Nft{}). + Select(` + nfts.token_id, + nfts.uri, + nfts.description, + nfts.is_burned, + nfts.owner, + nfts.id, + nfts.collection, + collections.name AS collection_name + `). + Joins("LEFT JOIN collections ON nfts.collection = collections.id"). + Where("nfts.collection = ? AND nfts.is_burned = false", collectionAddress). + Limit(pagination.Limit). + Offset(pagination.Offset) + + countQuery := r.db.Model(&db.Nft{}). + Where("nfts.collection = ? AND nfts.is_burned = false", collectionAddress) + + applyNftFilters(query, collectionAddress, search) + applyNftFilters(countQuery, collectionAddress, search) + + if err := query.Find(&record).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to query Nfts by collection address") + return nil, 0, err + } + + if pagination.CountTotal { + var err error + total, err = db.CountWithTimeout(countQuery, r.countQueryTimeout) + if err != nil { + logger.Get().Error().Err(err).Msg("Failed to count Nfts by collection address") + return nil, 0, err + } + } + + return record, total, nil +} + +func (r *NftRepository) GetNftMintInfo(nftAddress string) (*dto.NftMintInfoModel, error) { + var record dto.NftMintInfoModel + + query := r.db.Model(&db.NftTransaction{}). + Select(` + accounts.address, + transactions.hash, + blocks.height, + blocks.timestamp + `). + Joins("LEFT JOIN transactions ON nft_transactions.tx_id = transactions.id"). + Joins("LEFT JOIN blocks ON transactions.block_height = blocks.height"). + Joins("LEFT JOIN accounts ON transactions.sender = accounts.address"). + Where("nft_transactions.is_nft_mint = true AND nft_transactions.nft_id = ?", nftAddress) + + if err := query.First(&record).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to get Nft mint info") + return nil, err + } + + return &record, nil +} + +func (r *NftRepository) GetNftMutateEvents(pagination dto.PaginationQuery, nftAddress string) ([]dto.MutateEventModel, int64, error) { + record := make([]dto.MutateEventModel, 0) + total := int64(0) + + if err := r.db.Model(&db.NftMutationEvent{}). + Select(` + nft_mutation_events.old_value, + nft_mutation_events.new_value, + nft_mutation_events.remark, + nft_mutation_events.mutated_field_name, + blocks.timestamp + `). + Joins("LEFT JOIN blocks ON nft_mutation_events.block_height = blocks.height"). + Where("nft_mutation_events.nft_id = ?", nftAddress). + Limit(pagination.Limit). + Offset(pagination.Offset). + Find(&record).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to query Nft mutate events") + return nil, 0, err + } + + if pagination.CountTotal { + var err error + total, err = db.CountWithTimeout(r.db.Model(&db.NftMutationEvent{}).Where("nft_mutation_events.nft_id = ?", nftAddress), r.countQueryTimeout) + if err != nil { + logger.Get().Error().Err(err).Msg("Failed to count Nft mutate events") + return nil, 0, err + } + } + + return record, total, nil +} + +func (r *NftRepository) GetNftTxs(pagination dto.PaginationQuery, nftAddress string) ([]dto.NftTxModel, int64, error) { + record := make([]dto.NftTxModel, 0) + total := int64(0) + + if err := r.db.Model(&db.NftTransaction{}). + Select(` + nft_transactions.is_nft_burn, + nft_transactions.is_nft_mint, + nft_transactions.is_nft_transfer, + transactions.hash, + blocks.height, + blocks.timestamp + `). + Joins("LEFT JOIN nfts ON nft_transactions.nft_id = nfts.id"). + Joins("LEFT JOIN transactions ON nft_transactions.tx_id = transactions.id"). + Joins("LEFT JOIN blocks ON transactions.block_height = blocks.height"). + Where("nft_transactions.nft_id = ?", nftAddress). + Clauses(clause.OrderBy{ + Columns: []clause.OrderByColumn{ + {Column: clause.Column{Name: "nft_transactions.block_height"}, Desc: pagination.Reverse}, + {Column: clause.Column{Name: "nfts.token_id"}, Desc: pagination.Reverse}, + {Column: clause.Column{Name: "nft_transactions.is_nft_burn"}, Desc: pagination.Reverse}, + {Column: clause.Column{Name: "nft_transactions.is_nft_transfer"}, Desc: pagination.Reverse}, + {Column: clause.Column{Name: "nft_transactions.is_nft_mint"}, Desc: pagination.Reverse}, + }, + }). + Limit(pagination.Limit). + Offset(pagination.Offset). + Find(&record).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to query Nft transactions") + return nil, 0, err + } + + if pagination.CountTotal { + var err error + total, err = db.CountWithTimeout(r.db.Model(&db.NftTransaction{}).Where("nft_transactions.nft_id = ?", nftAddress), r.countQueryTimeout) + if err != nil { + logger.Get().Error().Err(err).Msg("Failed to count Nft transactions") + return nil, 0, err + } + } + + return record, total, nil +} + +func applyNftFilters(query *gorm.DB, collectionAddress string, search string) *gorm.DB { + if collectionAddress != "" { + query = query.Where("nfts.collection = ?", collectionAddress) + } + + search = strings.TrimSpace(search) + if search != "" { + safeSearch := regexp.QuoteMeta(search) + if utils.IsHex(search) { + query = query.Where(`("nfts"."token_id" ~* ? OR "nfts"."id" = ?)`, safeSearch, strings.ToLower(safeSearch)) + } else { + query = query.Where(`"nfts"."token_id" ~* ?`, safeSearch) + } + } + + return query +} diff --git a/api/repositories/proposal.go b/api/repositories/proposal.go new file mode 100644 index 00000000..08c3ccb1 --- /dev/null +++ b/api/repositories/proposal.go @@ -0,0 +1,543 @@ +package repositories + +import ( + "encoding/json" + "errors" + "fmt" + "sort" + "strconv" + "strings" + "time" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/logger" +) + +var _ ProposalRepositoryI = &ProposalRepository{} + +// ProposalRepository implements ProposalRepositoryI +type ProposalRepository struct { + db *gorm.DB + countQueryTimeout time.Duration +} + +func NewProposalRepository(db *gorm.DB, countQueryTimeout time.Duration) *ProposalRepository { + return &ProposalRepository{ + db: db, + countQueryTimeout: countQueryTimeout, + } +} + +func (r *ProposalRepository) GetProposals(pagination *dto.PaginationQuery) ([]db.Proposal, error) { + var proposals []db.Proposal + + desc := false + if pagination != nil { + desc = pagination.Reverse + } + + if err := r.db.Model(&db.Proposal{}). + Order(clause.OrderByColumn{ + Column: clause.Column{ + Name: "id", + }, + Desc: desc, + }). + Find(&proposals).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to query all proposals") + return nil, err + } + + return proposals, nil +} + +func (r *ProposalRepository) GetProposalVotesByValidator(operatorAddr string) ([]db.ProposalVote, error) { + var votes []db.ProposalVote + + if err := r.db.Model(&db.ProposalVote{}). + Preload("Proposal"). + Preload("Validator"). + Preload("Transaction"). + Preload("Transaction.Block"). + Where("validator_address = ?", operatorAddr). + Order(clause.OrderByColumn{ + Column: clause.Column{ + Name: "transaction_id", + }, + Desc: true, + }).Find(&votes).Error; err != nil { + logger.Get().Error().Err(err).Msgf("Failed to query proposal votes for %s", operatorAddr) + return nil, err + } + + return votes, nil +} + +func (r *ProposalRepository) SearchProposals(pagination dto.PaginationQuery, proposer, search string, statuses, types []string) ([]dto.ProposalSummary, int64, error) { + var proposals []dto.ProposalSummary + var total int64 + + query := r.db.Model(&db.Proposal{}). + Select("proposals.id, proposals.title, proposals.types, proposals.voting_end_time, proposals.deposit_end_time, proposals.resolved_height, proposals.status, proposals.is_expedited, proposals.is_emergency, proposals.proposer_id as proposer") + + if proposer != "" { + query = query.Where("proposals.proposer_id = ?", proposer) + } + + if len(statuses) > 0 { + query = query.Where("proposals.status IN ?", statuses) + } + + if search != "" { + if id, err := strconv.Atoi(search); err == nil { + query = query.Where("proposals.id = ?", id) + } else { + query = query.Where("proposals.title ILIKE ?", "%"+search+"%") + } + } + + if len(types) > 0 { + query = query.Where("proposals.type IN ?", types) + } + + if pagination.CountTotal { + countQuery := query + var err error + total, err = db.CountWithTimeout(countQuery, r.countQueryTimeout) + if err != nil { + logger.Get().Error().Err(err).Msgf("Failed to query proposal count") + return nil, 0, err + } + } + + if err := query.Order(clause.OrderByColumn{ + Column: clause.Column{ + Name: "proposals.id", + }, + Desc: pagination.Reverse, + }). + Limit(int(pagination.Limit)). + Offset(int(pagination.Offset)). + Find(&proposals).Error; err != nil { + logger.Get().Error().Err(err).Msgf("Failed to query proposals") + return nil, 0, err + } + + return proposals, total, nil +} + +func (r *ProposalRepository) GetAllProposalTypes() (*dto.ProposalsTypesResponse, error) { + var proposals []struct { + Types json.RawMessage `gorm:"column:types"` + } + + if err := r.db.Model(&db.Proposal{}). + Select("types"). + Find(&proposals).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to query all proposal types") + return nil, err + } + + typesSet := make(map[string]bool) + for _, proposal := range proposals { + var types []string + if err := json.Unmarshal(proposal.Types, &types); err == nil { + for _, t := range types { + typesSet[t] = true + } + } + + } + + types := make(dto.ProposalsTypesResponse, 0, len(typesSet)) + for t := range typesSet { + types = append(types, t) + } + + sort.Slice(types, func(i, j int) bool { + return compareProposalTypes(types[i], types[j]) < 0 + }) + + return &types, nil +} + +func compareProposalTypes(a, b string) int { + if strings.HasPrefix(a, "/") && !strings.HasPrefix(b, "/") { + return 1 + } + if !strings.HasPrefix(a, "/") && strings.HasPrefix(b, "/") { + return -1 + } + return strings.Compare(a, b) +} + +func (r *ProposalRepository) GetProposalInfo(id int) (*dto.ProposalInfo, error) { + var proposal dto.ProposalInfoModel + + if err := r.db.Model(&db.Proposal{}). + Select("proposals.*, proposals.proposer_id as proposer_address, proposals.resolved_voting_power as resolved_total_voting_power, c_tx.hash as created_tx_hash, c_block.height as created_height, c_block.timestamp as created_timestamp, r_block.height as resolved_height, r_block.timestamp as resolved_timestamp"). + Joins("LEFT JOIN transactions c_tx ON proposals.created_tx = c_tx.id"). + Joins("LEFT JOIN blocks c_block ON c_tx.block_height = c_block.height"). + Joins("LEFT JOIN blocks r_block ON proposals.resolved_height = r_block.height"). + Where("proposals.id = ?", id). + First(&proposal).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, errors.New("proposal not found") + } + logger.Get().Error().Err(err).Msgf("Failed to query proposal info for %d", id) + return nil, err + } + + var types, messages, metadata json.RawMessage + if err := json.Unmarshal([]byte(proposal.Types), &types); err != nil { + types = nil + } + if err := json.Unmarshal([]byte(proposal.Messages), &messages); err != nil { + messages = nil + } + if err := json.Unmarshal([]byte(proposal.Metadata), &metadata); err != nil { + metadata = nil + } + + var content dto.ProposalContent + if proposal.Content != nil { + if err := json.Unmarshal([]byte(*proposal.Content), &content); err != nil { + content = dto.ProposalContent{} + } + } else { + content = dto.ProposalContent{} + } + + var totalDeposit dto.Coins + if err := json.Unmarshal([]byte(proposal.TotalDeposit), &totalDeposit); err != nil { + totalDeposit = nil + } + + var deposits []dto.ProposalDepositModel + if err := r.db.Model(&db.ProposalDeposit{}). + Select("proposal_deposits.amount, proposal_deposits.depositor, transactions.hash as tx_hash, blocks.timestamp"). + Joins("LEFT JOIN transactions ON proposal_deposits.transaction_id = transactions.id"). + Joins("LEFT JOIN blocks ON transactions.block_height = blocks.height"). + Where("proposal_deposits.proposal_id = ?", id). + Order(clause.OrderByColumn{ + Column: clause.Column{ + Name: "blocks.height", + }, + Desc: true, + }).Find(&deposits).Error; err != nil { + logger.Get().Error().Err(err).Msgf("Failed to query proposal deposits for %d", id) + return nil, err + } + + proposalDeposits := make([]dto.ProposalDeposit, len(deposits)) + for i, d := range deposits { + var amount dto.Coins + if err := json.Unmarshal(d.Amount, &amount); err != nil { + logger.Get().Error().Err(err).Msgf("Failed to query proposal deposits for %d", id) + } + proposalDeposits[i] = dto.ProposalDeposit{ + Amount: amount, + Depositor: d.Depositor, + TxHash: fmt.Sprintf("%x", d.TxHash), + Timestamp: d.Timestamp, + } + } + + return &dto.ProposalInfo{ + Id: proposal.Id, + Proposer: proposal.Proposer, + Types: types, + Title: proposal.Title, + Description: proposal.Description, + Status: proposal.Status, + FailedReason: proposal.FailedReason, + SubmitTime: proposal.SubmitTime, + DepositEndTime: proposal.DepositEndTime, + VotingTime: proposal.VotingTime, + VotingEndTime: proposal.VotingEndTime, + Content: content, + Messages: messages, + IsExpedited: proposal.IsExpedited, + IsEmergency: proposal.IsEmergency, + TotalDeposit: totalDeposit, + Version: proposal.Version, + CreatedTxHash: fmt.Sprintf("%x", proposal.CreatedTxHash), + CreatedHeight: proposal.CreatedHeight, + CreatedTimestamp: proposal.CreatedTimestamp, + ResolvedHeight: proposal.ResolvedHeight, + ResolvedTimestamp: proposal.ResolvedTimestamp, + Metadata: proposal.Metadata, + ProposalDeposits: proposalDeposits, + Yes: proposal.Yes, + Abstain: proposal.Abstain, + No: proposal.No, + NoWithVeto: proposal.NoWithVeto, + ResolvedTotalVotingPower: proposal.ResolvedTotalVotingPower, + }, nil +} + +func (r *ProposalRepository) GetProposalVotes(proposalId int, limit, offset int64, search, answer string) ([]dto.ProposalVote, int64, error) { + var votes []dto.ProposalVoteModel + + query := r.db.Model(&db.ProposalVote{}). + Select("proposal_votes.proposal_id, proposal_votes.yes, proposal_votes.no, proposal_votes.no_with_veto, proposal_votes.abstain, proposal_votes.is_vote_weighted, proposal_votes.voter, transactions.hash as tx_hash, blocks.timestamp, validators.operator_address as validator_address, validators.moniker as validator_moniker, validators.identity as validator_identity"). + Joins("LEFT JOIN transactions ON proposal_votes.transaction_id = transactions.id"). + Joins("LEFT JOIN blocks ON transactions.block_height = blocks.height"). + Joins("LEFT JOIN validators ON proposal_votes.validator_address = validators.operator_address"). + Where("proposal_votes.proposal_id = ?", proposalId) + + if search != "" { + query = query.Where("proposal_votes.voter = ?", search) + } + + switch answer { + case "yes": + query = query.Where("proposal_votes.yes = ?", 1) + case "no": + query = query.Where("proposal_votes.no = ?", 1) + case "no_with_veto": + query = query.Where("proposal_votes.no_with_veto = ?", 1) + case "abstain": + query = query.Where("proposal_votes.abstain = ?", 1) + case "weighted": + query = query.Where("proposal_votes.is_vote_weighted = ?", true) + } + + var total int64 + countQuery := query + if err := countQuery.Count(&total).Error; err != nil { + logger.Get().Error().Err(err).Msgf("Failed to query proposal votes count for %d", proposalId) + return nil, 0, err + } + + if err := query.Order(clause.OrderBy{ + Columns: []clause.OrderByColumn{ + { + Column: clause.Column{ + Name: "transactions.block_height", + }, + Desc: true, + }, + { + Column: clause.Column{ + Name: "transactions.block_index", + }, + Desc: true, + }, + }, + }). + Limit(int(limit)). + Offset(int(offset)). + Find(&votes).Error; err != nil { + logger.Get().Error().Err(err).Msgf("Failed to query proposal votes for %d", proposalId) + return nil, 0, err + } + + result := make([]dto.ProposalVote, len(votes)) + for idx, vote := range votes { + var validator *dto.ProposalValidatorVote + if vote.ValidatorAddr != nil && vote.ValidatorMoniker != nil && vote.ValidatorIdentity != nil { + validator = &dto.ProposalValidatorVote{ + Moniker: *vote.ValidatorMoniker, + Identity: *vote.ValidatorIdentity, + ValidatorAddress: *vote.ValidatorAddr, + } + } + + txHash := fmt.Sprintf("%x", vote.TxHash) + result[idx] = dto.ProposalVote{ + ProposalId: vote.ProposalID, + Yes: vote.Yes, + No: vote.No, + NoWithVeto: vote.NoWithVeto, + Abstain: vote.Abstain, + IsVoteWeighted: vote.IsVoteWeighted, + Voter: vote.Voter, + TxHash: &txHash, + Timestamp: &vote.Timestamp, + Validator: validator, + } + } + + return result, total, nil +} + +func (r *ProposalRepository) GetProposalValidatorVotes(proposalId int) ([]dto.ProposalVote, error) { + var validators []dto.ProposalVoteValidatorInfoModel + + if err := r.db.Model(&db.Validator{}). + Select("operator_address, moniker, identity"). + Order(clause.OrderByColumn{ + Column: clause.Column{Name: "voting_power DESC NULLS LAST", Raw: true}, + }). + Find(&validators).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to query validators") + return nil, err + } + + var votes []dto.ProposalValidatorVoteModel + + if err := r.db.Model(&db.ProposalVote{}). + Select("validators.operator_address as validator_address, "+ + "proposal_votes.yes, proposal_votes.no, "+ + "proposal_votes.no_with_veto, proposal_votes.abstain, "+ + "proposal_votes.is_vote_weighted, proposal_votes.voter, "+ + "transactions.hash as tx_hash, blocks.timestamp"). + Joins("JOIN validators ON proposal_votes.validator_address = validators.operator_address"). + Joins("JOIN transactions ON proposal_votes.transaction_id = transactions.id"). + Joins("JOIN blocks ON transactions.block_height = blocks.height"). + Where("proposal_votes.proposal_id = ? AND proposal_votes.is_validator = ?", proposalId, true). + Order(clause.OrderBy{ + Columns: []clause.OrderByColumn{ + { + Column: clause.Column{ + Name: "transactions.block_height", + }, + Desc: true, + }, + { + Column: clause.Column{ + Name: "transactions.block_index", + }, + Desc: true, + }, + }, + }). + Find(&votes).Error; err != nil { + logger.Get().Error().Err(err).Msgf("Failed to query validator votes for proposal id: %d", proposalId) + return nil, err + } + + votesByValidator := make(map[string]dto.ProposalVote) + for _, vote := range votes { + votesByValidator[vote.ValidatorAddress] = dto.ProposalVote{ + Yes: vote.Yes, + No: vote.No, + NoWithVeto: vote.NoWithVeto, + Abstain: vote.Abstain, + IsVoteWeighted: vote.IsVoteWeighted, + Voter: vote.Voter, + TxHash: vote.TxHash, + Timestamp: vote.Timestamp, + } + } + + result := make([]dto.ProposalVote, 0, len(validators)) + for _, validator := range validators { + vote, hasVoted := votesByValidator[validator.OperatorAddress] + + validatorVote := dto.ProposalVote{ + ProposalId: proposalId, + Validator: &dto.ProposalValidatorVote{ + Moniker: validator.Moniker, + Identity: validator.Identity, + ValidatorAddress: validator.OperatorAddress, + }, + } + + if hasVoted { + txHash := fmt.Sprintf("%x", *vote.TxHash) + validatorVote.Yes = vote.Yes + validatorVote.No = vote.No + validatorVote.NoWithVeto = vote.NoWithVeto + validatorVote.Abstain = vote.Abstain + validatorVote.IsVoteWeighted = vote.IsVoteWeighted + validatorVote.Voter = vote.Voter + validatorVote.TxHash = &txHash + validatorVote.Timestamp = vote.Timestamp + } else { + validatorVote.Yes = 0 + validatorVote.No = 0 + validatorVote.NoWithVeto = 0 + validatorVote.Abstain = 0 + validatorVote.IsVoteWeighted = false + validatorVote.Voter = "" + validatorVote.TxHash = nil + validatorVote.Timestamp = nil + } + + result = append(result, validatorVote) + } + + return result, nil +} + +func (r *ProposalRepository) GetProposalAnswerCounts(id int) (*dto.ProposalAnswerCountsResponse, error) { + var totalValidators int64 + if err := r.db.Model(&db.Validator{}).Count(&totalValidators).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to query total validators") + return nil, err + } + + var votes []dto.ProposalAnswerCountsModel + if err := r.db.Model(&db.ProposalVote{}). + Select("yes, no, no_with_veto, abstain, is_vote_weighted, is_validator"). + Where("proposal_id = ?", id). + Find(&votes).Error; err != nil { + logger.Get().Error().Err(err).Msgf("Failed to query proposal votes for id: %d", id) + return nil, err + } + + response := &dto.ProposalAnswerCountsResponse{ + All: dto.ProposalAnswerCounts{}, + Validator: dto.ProposalValidatorAnswerCounts{ + TotalValidators: int(totalValidators), + }, + } + + for _, vote := range votes { + if vote.Yes == 1 { + response.All.Yes++ + response.All.Total++ + if vote.IsValidator { + response.Validator.Yes++ + response.Validator.Total++ + } + continue + } + if vote.No == 1 { + response.All.No++ + response.All.Total++ + if vote.IsValidator { + response.Validator.No++ + response.Validator.Total++ + } + continue + } + if vote.NoWithVeto == 1 { + response.All.NoWithVeto++ + response.All.Total++ + if vote.IsValidator { + response.Validator.NoWithVeto++ + response.Validator.Total++ + } + continue + } + if vote.Abstain == 1 { + response.All.Abstain++ + response.All.Total++ + if vote.IsValidator { + response.Validator.Abstain++ + response.Validator.Total++ + } + continue + } + if vote.IsVoteWeighted { + response.All.Weighted++ + response.All.Total++ + if vote.IsValidator { + response.Validator.Weighted++ + response.Validator.Total++ + } + continue + } + } + + response.Validator.DidNotVote = response.Validator.TotalValidators - response.Validator.Total + + return response, nil +} diff --git a/api/repositories/repository.go b/api/repositories/repository.go new file mode 100644 index 00000000..3d1598d2 --- /dev/null +++ b/api/repositories/repository.go @@ -0,0 +1,122 @@ +package repositories + +import ( + "context" + "time" + + "gocloud.dev/blob" + "gorm.io/gorm" + + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/pkg/db" +) + +type Repositories struct { + BlockRepository *BlockRepository + ModuleRepository *ModuleRepository + NftRepository *NftRepository + ProposalRepository *ProposalRepository + TxRepository *TxRepository + ValidatorRepository *ValidatorRepository + AccountRepository *AccountRepository +} + +func SetupRepositories(dbClient *gorm.DB, buckets []*blob.Bucket, countQueryTimeout time.Duration) *Repositories { + return &Repositories{ + BlockRepository: NewBlockRepository(dbClient, countQueryTimeout), + ModuleRepository: NewModuleRepository(dbClient, countQueryTimeout), + NftRepository: NewNftRepository(dbClient, countQueryTimeout), + ProposalRepository: NewProposalRepository(dbClient, countQueryTimeout), + TxRepository: NewTxRepository(dbClient, buckets, countQueryTimeout), + ValidatorRepository: NewValidatorRepository(dbClient, countQueryTimeout), + AccountRepository: NewAccountRepository(dbClient, countQueryTimeout), + } +} + +// ModuleRepository defines the interface for module data access operations +type ModuleRepositoryI interface { + GetModules(pagination dto.PaginationQuery) ([]dto.ModuleResponse, int64, error) + GetModuleById(vmAddress string, name string) (*dto.ModuleResponse, error) + GetModuleHistories(pagination dto.PaginationQuery, vmAddress string, name string) ([]dto.ModuleHistoryResponse, int64, error) + GetModulePublishInfo(vmAddress string, name string) ([]dto.ModulePublishInfoModel, error) + GetModuleProposals(pagination dto.PaginationQuery, vmAddress string, name string) ([]dto.ModuleProposalModel, int64, error) + GetModuleTransactions(pagination dto.PaginationQuery, vmAddress string, name string) ([]dto.ModuleTxResponse, int64, error) + GetModuleStats(vmAddress string, name string) (*dto.ModuleStatsResponse, error) +} + +// NftRepositoryI defines the interface for Nft data access operations +type NftRepositoryI interface { + // GetCollections retrieves Nft collections with pagination and search + GetCollections(pagination dto.PaginationQuery, search string) ([]db.Collection, int64, error) + GetCollectionsByAccountAddress(accountAddress string) ([]dto.CollectionByAccountAddressModel, error) + GetCollectionsByCollectionAddress(collectionAddress string) (*db.Collection, error) + GetCollectionActivities(pagination dto.PaginationQuery, collectionAddress string, search string) ([]dto.CollectionActivityModel, int64, error) + GetCollectionCreator(collectionAddress string) (*dto.CollectionCreatorModel, error) + GetCollectionMutateEvents(pagination dto.PaginationQuery, collectionAddress string) ([]dto.MutateEventModel, int64, error) + GetNftByNftAddress(collectionAddress string, nftAddress string) (*dto.NftByAddressModel, error) + GetNftsByAccountAddress(pagination dto.PaginationQuery, accountAddress string, collectionAddress string, search string) ([]dto.NftByAddressModel, int64, error) + GetNftsByCollectionAddress(pagination dto.PaginationQuery, collectionAddress string, search string) ([]dto.NftByAddressModel, int64, error) + GetNftMintInfo(nftAddress string) (*dto.NftMintInfoModel, error) + GetNftMutateEvents(pagination dto.PaginationQuery, nftAddress string) ([]dto.MutateEventModel, int64, error) + GetNftTxs(pagination dto.PaginationQuery, nftAddress string) ([]dto.NftTxModel, int64, error) +} + +// ProposalRepositoryI defines the interface for proposal data access operations +type ProposalRepositoryI interface { + GetProposals(pagination *dto.PaginationQuery) ([]db.Proposal, error) + GetProposalVotesByValidator(operatorAddr string) ([]db.ProposalVote, error) + SearchProposals(pagination dto.PaginationQuery, proposer, search string, statuses, types []string) ([]dto.ProposalSummary, int64, error) + GetAllProposalTypes() (*dto.ProposalsTypesResponse, error) + GetProposalInfo(id int) (*dto.ProposalInfo, error) + GetProposalVotes(id int, limit, offset int64, search, answer string) ([]dto.ProposalVote, int64, error) + GetProposalValidatorVotes(id int) ([]dto.ProposalVote, error) + GetProposalAnswerCounts(id int) (*dto.ProposalAnswerCountsResponse, error) +} + +// TxRepositoryI defines the interface for transaction data access operations +type TxRepositoryI interface { + GetTxByHash(ctx context.Context, hash string) (*dto.TxByHashResponse, error) + GetTxCount() (*int64, error) + GetTxs(pagination *dto.PaginationQuery) ([]dto.TxModel, int64, error) +} + +type BlockRepositoryI interface { + GetBlockHeightLatest() (*int64, error) + GetBlockHeightInformativeLatest() (*int64, error) + GetBlockTimestamp(latestBlockHeight int64) ([]time.Time, error) + GetBlocks(pagination dto.PaginationQuery) ([]dto.BlockModel, int64, error) + GetBlockInfo(height int64) (*dto.BlockInfoModel, error) + GetBlockTxs(pagination dto.PaginationQuery, height int64) ([]dto.BlockTxModel, int64, error) + GetLatestBlock() (*db.Block, error) +} + +type AccountRepositoryI interface { + GetAccountByAccountAddress(accountAddress string) (*db.Account, error) + GetAccountProposals(pagination dto.PaginationQuery, accountAddress string) ([]db.Proposal, int64, error) + GetAccountTxs( + pagination dto.PaginationQuery, + accountAddress string, + search string, + isSend bool, + isIbc bool, + isOpinit bool, + isMovePublish bool, + isMoveUpgrade bool, + isMoveExecute bool, + isMoveScript bool, + isSigner *bool, + ) ([]dto.AccountTxModel, int64, error) +} + +type ValidatorRepositoryI interface { + GetValidators(pagination dto.PaginationQuery, status dto.ValidatorStatusFilter, sortBy, search string) ([]dto.ValidatorWithVoteCountModel, int64, error) + GetValidatorsByPower(pagination *dto.PaginationQuery, onlyActive bool) ([]db.Validator, error) + GetValidatorRow(operatorAddr string) (*db.Validator, error) + GetValidatorBlockVoteByBlockLimit(minHeight, maxHeight int64) ([]dto.ValidatorBlockVoteModel, error) + GetValidatorCommitSignatures(operatorAddr string, minHeight, maxHeight int64) ([]dto.ValidatorBlockVoteModel, error) + GetValidatorSlashEvents(operatorAddr string, minTimestamp time.Time) ([]dto.ValidatorUptimeEventModel, error) + GetValidatorUptimeInfo(operatorAddr string) (*dto.ValidatorWithVoteCountModel, error) + GetValidatorBondedTokenChanges(pagination dto.PaginationQuery, operatorAddr string) ([]db.ValidatorBondedTokenChange, int64, error) + GetValidatorProposedBlocks(pagination dto.PaginationQuery, operatorAddr string) ([]dto.ValidatorProposedBlockModel, int64, error) + GetValidatorHistoricalPowers(operatorAddr string) ([]dto.ValidatorHistoricalPowerModel, int64, error) +} diff --git a/api/repositories/tx.go b/api/repositories/tx.go new file mode 100644 index 00000000..a8eb3286 --- /dev/null +++ b/api/repositories/tx.go @@ -0,0 +1,174 @@ +package repositories + +import ( + "context" + "encoding/json" + "io" + "strconv" + "strings" + "time" + + "github.com/rs/zerolog/log" + "gocloud.dev/blob" + "gorm.io/gorm" + "gorm.io/gorm/clause" + + "github.com/initia-labs/core-indexer/api/apperror" + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/logger" +) + +var _ TxRepositoryI = &TxRepository{} + +// TxRepository implements TxRepositoryI +type TxRepository struct { + db *gorm.DB + buckets []*blob.Bucket + countQueryTimeout time.Duration +} + +// NewTxRepository creates a new SQL-based Tx repository +func NewTxRepository(db *gorm.DB, buckets []*blob.Bucket, countQueryTimeout time.Duration) *TxRepository { + return &TxRepository{ + db: db, + buckets: buckets, + countQueryTimeout: countQueryTimeout, + } +} + +// GetTxByHash retrieves a transaction by hash +func (r *TxRepository) GetTxByHash(ctx context.Context, hash string) (*dto.TxByHashResponse, error) { + upperHash := strings.ToUpper(hash) + + var largestName string + var largestNum int64 + var foundBucket *blob.Bucket + + for i, bucket := range r.buckets { + bucketName := "bucket_" + strconv.Itoa(i) + log.Debug().Str("bucket", bucketName).Str("hash", upperHash).Msg("Searching in bucket") + + iter := bucket.List(&blob.ListOptions{ + Prefix: upperHash + "/", + }) + + for { + obj, err := iter.Next(ctx) + if err != nil { + if err == io.EOF { + break + } + + if strings.Contains(err.Error(), "invalid_grant") { + log.Warn().Str("bucket", bucketName).Str("hash", upperHash).Msg("Authentication failure") + continue + } + + log.Warn().Err(err).Str("bucket", bucketName).Str("hash", upperHash).Msg("Error listing objects") + continue + } + + parts := strings.Split(obj.Key, "/") + if len(parts) != 2 { + continue + } + + if num, err := strconv.ParseInt(parts[1], 10, 64); err == nil { + if num > largestNum { + largestNum = num + largestName = obj.Key + foundBucket = bucket + log.Debug().Str("bucket", bucketName).Str("hash", upperHash).Int64("block_height", num).Msg("Found newer transaction") + } + } + } + } + + if largestName == "" { + return nil, apperror.NewNoValidTxFiles(upperHash) + } + + log.Info().Str("hash", upperHash).Str("block_height", strings.Split(largestName, "/")[1]).Msg("Found latest transaction across all buckets") + + tx, err := foundBucket.NewReader(ctx, largestName, nil) + if err != nil { + return nil, err + } + defer tx.Close() + + // Read all data into memory to support multiple unmarshal attempts + data, err := io.ReadAll(tx) + if err != nil { + return nil, err + } + + // Attempt to unmarshal into the full response structure + txResponse := &dto.TxByHashResponse{} + if err := json.Unmarshal(data, txResponse); err != nil { + return nil, err + } + + // Handle alternative format where TxResponse contains both tx and tx_response data + // TODO: revisit this after migrate gcs + if txResponse.TxResponse.Height == "" { + flatResponse := &dto.TxResponse{} + if err := json.Unmarshal(data, flatResponse); err != nil { + return nil, err + } + txResponse.Tx = flatResponse.Tx + txResponse.TxResponse = *flatResponse + } + + txResponse.CacheSizeBytes = int64(len(data)) + + return txResponse, nil +} + +// GetTxCount retrieves the total number of transactions +func (r *TxRepository) GetTxCount() (*int64, error) { + var record db.Tracking + + if err := r.db.Model(&db.Tracking{}). + Select("tx_count"). + First(&record).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to query tracking data for transaction count") + return nil, err + } + + return &record.TxCount, nil +} + +// GetTxs retrieves a list of transactions with pagination +func (r *TxRepository) GetTxs(pagination *dto.PaginationQuery) ([]dto.TxModel, int64, error) { + record := make([]dto.TxModel, 0) + total := int64(0) + + if err := r.db. + Model(&db.Transaction{}). + Select("transactions.sender, transactions.hash, transactions.success, transactions.messages, transactions.is_send, transactions.is_ibc, transactions.is_opinit, blocks.height, blocks.timestamp"). + Joins("LEFT JOIN blocks ON transactions.block_height = blocks.height"). + Clauses(clause.OrderBy{ + Columns: []clause.OrderByColumn{ + {Column: clause.Column{Name: "transactions.block_height"}, Desc: pagination.Reverse}, + {Column: clause.Column{Name: "transactions.block_index"}, Desc: pagination.Reverse}, + }, + }). + Limit(pagination.Limit). + Offset(pagination.Offset). + Find(&record).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to query transactions") + return nil, 0, err + } + + if pagination.CountTotal { + var err error + total, err = db.CountWithTimeout(r.db.Model(&db.Transaction{}), r.countQueryTimeout) + if err != nil { + logger.Get().Error().Err(err).Msg("Failed to get transaction count") + return nil, 0, err + } + } + + return record, total, nil +} diff --git a/api/repositories/validator.go b/api/repositories/validator.go new file mode 100644 index 00000000..c7ca78c6 --- /dev/null +++ b/api/repositories/validator.go @@ -0,0 +1,384 @@ +package repositories + +import ( + "fmt" + "time" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/logger" +) + +var _ ValidatorRepositoryI = &ValidatorRepository{} + +// ValidatorRepository implements ValidatorRepositoryI +type ValidatorRepository struct { + db *gorm.DB + countQueryTimeout time.Duration +} + +func NewValidatorRepository(db *gorm.DB, countQueryTimeout time.Duration) *ValidatorRepository { + return &ValidatorRepository{ + db: db, + countQueryTimeout: countQueryTimeout, + } +} + +func (r *ValidatorRepository) GetValidators(pagination dto.PaginationQuery, status dto.ValidatorStatusFilter, sortBy, search string) ([]dto.ValidatorWithVoteCountModel, int64, error) { + record := make([]dto.ValidatorWithVoteCountModel, 0) + total := int64(0) + + query := r.db.Model(&db.Validator{}). + Select("validators.*, validator_vote_counts.last_10000 AS last_10000"). + Joins("LEFT JOIN validator_vote_counts ON validators.operator_address = validator_vote_counts.validator_address") + + switch status { + case dto.ValidatorStatusFilterActive: + query = query.Where("is_active = ?", true) + case dto.ValidatorStatusFilterInactive: + query = query.Where("is_active = ?", false) + case dto.ValidatorStatusFilterAll: + // no filter + } + + if search != "" { + query = query.Where("moniker ILIKE ? OR operator_address = ?", "%"+search+"%", search) + } + + orders := make([]clause.OrderByColumn, 0) + + if sortBy == "uptime" && status == dto.ValidatorStatusFilterActive { + if pagination.Reverse { + orders = append(orders, clause.OrderByColumn{ + Column: clause.Column{Name: "validator_vote_counts.last_10000 DESC NULLS LAST", Raw: true}, + }) + } else { + orders = append(orders, clause.OrderByColumn{ + Column: clause.Column{Name: "validator_vote_counts.last_10000 ASC NULLS FIRST", Raw: true}, + }) + } + + orders = append(orders, clause.OrderByColumn{ + Column: clause.Column{Name: "voting_power"}, + Desc: true, + }) + orders = append(orders, clause.OrderByColumn{ + Column: clause.Column{Name: "moniker"}, + Desc: false, + }) + } else if sortBy == "commission" { + orders = append( + orders, + clause.OrderByColumn{ + Column: clause.Column{Name: "commission_rate"}, + Desc: pagination.Reverse, + }, + clause.OrderByColumn{ + Column: clause.Column{Name: "voting_power"}, + Desc: true, + }, + clause.OrderByColumn{ + Column: clause.Column{Name: "moniker"}, + Desc: false, + }, + ) + } else if sortBy == "moniker" { + orders = append( + orders, + clause.OrderByColumn{ + Column: clause.Column{Name: "moniker"}, + Desc: pagination.Reverse, + }, + clause.OrderByColumn{ + Column: clause.Column{Name: "voting_power"}, + Desc: true, + }, + ) + } else { + orders = append( + orders, + clause.OrderByColumn{ + Column: clause.Column{Name: "voting_power"}, + Desc: pagination.Reverse, + }, + clause.OrderByColumn{ + Column: clause.Column{Name: "moniker"}, + Desc: false, + }, + ) + } + + query = query.Clauses(clause.OrderBy{ + Columns: orders, + }) + + // Fetch paginated results + if err := query. + Limit(pagination.Limit). + Offset(pagination.Offset). + Find(&record).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to query validators") + return nil, 0, err + } + + if pagination.CountTotal { + countQuery := r.db.Model(&db.Validator{}) + switch status { + case dto.ValidatorStatusFilterActive: + countQuery = countQuery.Where("is_active = ?", true) + case dto.ValidatorStatusFilterInactive: + countQuery = countQuery.Where("is_active = ?", false) + case dto.ValidatorStatusFilterAll: + // no filter + } + if search != "" { + countQuery = countQuery.Where("moniker ILIKE ? OR operator_address = ?", "%"+search+"%", search) + } + + var err error + total, err = db.CountWithTimeout(countQuery, r.countQueryTimeout) + if err != nil { + logger.Get().Error().Err(err).Msg("Failed to count validators") + return nil, 0, err + } + } + + return record, total, nil +} + +func (r *ValidatorRepository) GetValidatorsByPower(pagination *dto.PaginationQuery, onlyActive bool) ([]db.Validator, error) { + record := make([]db.Validator, 0) + + query := r.db.Model(&db.Validator{}) + if onlyActive { + query = query.Where("is_active = true") + } + if pagination != nil { + query = query. + Limit(pagination.Limit). + Offset(pagination.Offset) + } + + if err := query. + Order(clause.OrderBy{ + Columns: []clause.OrderByColumn{ + { + Column: clause.Column{Name: "voting_power"}, + Desc: true, + }, + { + Column: clause.Column{Name: "moniker"}, + Desc: false, + }, + }, + }). + Find(&record).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to query validators by power") + return nil, err + } + + return record, nil +} + +func (r *ValidatorRepository) GetValidatorRow(operatorAddr string) (*db.Validator, error) { + var record db.Validator + + if err := r.db.Model(&db.Validator{}). + Where("operator_address = ?", operatorAddr). + First(&record).Error; err != nil { + logger.Get().Error().Err(err).Msgf("Failed to find validator of operator address: %s", operatorAddr) + return nil, err + } + + return &record, nil +} + +func (r *ValidatorRepository) GetValidatorBlockVoteByBlockLimit(minHeight, maxHeight int64) ([]dto.ValidatorBlockVoteModel, error) { + var record []dto.ValidatorBlockVoteModel + + if err := r.db.Model(&db.ValidatorCommitSignature{}). + Select("block_height as height, vote"). + Where("block_height <= ? AND block_height >= ? AND vote = ?", maxHeight, minHeight, "PROPOSE"). + Order(clause.OrderByColumn{ + Column: clause.Column{ + Name: "block_height", + }, + Desc: true, + }).Find(&record).Error; err != nil { + logger.Get().Error().Err(err).Msg("Failed to query validator proposed blocks") + return nil, err + } + + return record, nil +} + +func (r *ValidatorRepository) GetValidatorCommitSignatures(operatorAddr string, minHeight, maxHeight int64) ([]dto.ValidatorBlockVoteModel, error) { + var record []dto.ValidatorBlockVoteModel + + if err := r.db.Model(&db.ValidatorCommitSignature{}). + Select("block_height as height, vote"). + Where("validator_address = ? AND block_height <= ? AND block_height >= ?", operatorAddr, maxHeight, minHeight). + Order(clause.OrderByColumn{ + Column: clause.Column{ + Name: "block_height", + }, + Desc: true, + }).Find(&record).Error; err != nil { + logger.Get().Error().Err(err).Msgf("Failed to query validator commit signature for %s", operatorAddr) + return nil, err + } + + return record, nil +} + +func (r *ValidatorRepository) GetValidatorSlashEvents(operatorAddr string, minTimestamp time.Time) ([]dto.ValidatorUptimeEventModel, error) { + var record []dto.ValidatorUptimeEventModel + + if err := r.db.Model(&db.ValidatorSlashEvent{}). + Select("blocks.height as height, blocks.timestamp as timestamp, validator_slash_events.type as type"). + Joins("JOIN blocks ON validator_slash_events.block_height = blocks.height"). + Where("validator_slash_events.validator_address = ? AND blocks.timestamp >= ?", + operatorAddr, minTimestamp). + Order(clause.OrderByColumn{ + Column: clause.Column{ + Name: "block_height", + }, + Desc: true, + }). + Find(&record).Error; err != nil { + logger.Get().Error().Err(err).Msgf("Failed to query validator slash events for %s", operatorAddr) + return nil, err + } + + return record, nil +} + +func (r *ValidatorRepository) GetValidatorUptimeInfo(operatorAddr string) (*dto.ValidatorWithVoteCountModel, error) { + var record dto.ValidatorWithVoteCountModel + + if err := r.db.Model(&db.Validator{}). + Select("validators.*, validator_vote_counts.last_10000 as last_10000"). + Joins("LEFT JOIN validator_vote_counts ON validators.operator_address = validator_vote_counts.validator_address"). + Where("validators.operator_address = ?", operatorAddr). + First(&record).Error; err != nil { + logger.Get().Error().Err(err).Msgf("Failed to query validator uptime for %s", operatorAddr) + return nil, err + } + + return &record, nil +} + +func (r *ValidatorRepository) GetValidatorBondedTokenChanges(pagination dto.PaginationQuery, operatorAddr string) ([]db.ValidatorBondedTokenChange, int64, error) { + var record []db.ValidatorBondedTokenChange + var total int64 + + if err := r.db.Model(&db.ValidatorBondedTokenChange{}). + Preload("Transaction"). + Preload("Block"). + Where("validator_address = ?", operatorAddr). + Order(clause.OrderByColumn{ + Column: clause.Column{ + Name: "block_height", + }, + Desc: pagination.Reverse, + }). + Limit(pagination.Limit). + Offset(pagination.Offset). + Find(&record).Error; err != nil { + logger.Get().Error().Err(err).Msgf("Failed to query validator bonded token changes for %s", operatorAddr) + return nil, 0, err + } + + if pagination.CountTotal { + var err error + total, err = db.CountWithTimeout(r.db.Model(&db.ValidatorBondedTokenChange{}).Where("validator_address = ?", operatorAddr), r.countQueryTimeout) + if err != nil { + logger.Get().Error().Err(err).Msgf("Failed to count validator bonded token changes for %s", operatorAddr) + return nil, 0, err + } + } + + return record, total, nil +} + +func (r *ValidatorRepository) GetValidatorProposedBlocks(pagination dto.PaginationQuery, operatorAddr string) ([]dto.ValidatorProposedBlockModel, int64, error) { + var record []struct { + Hash []byte `gorm:"column:hash"` + Height int32 `gorm:"column:height"` + Timestamp time.Time `gorm:"column:timestamp"` + TransactionCount int64 `gorm:"column:transaction_count"` + ValidatorMoniker string `gorm:"column:moniker"` + ValidatorIdentity string `gorm:"column:identity"` + ValidatorAddress string `gorm:"column:operator_address"` + } + var total int64 + + since := time.Now().AddDate(0, 0, -30) + if err := r.db.Model(&db.Block{}). + Select("blocks.hash, blocks.height, blocks.timestamp, COUNT(transactions.id) as transaction_count, validators.moniker, validators.identity, validators.operator_address"). + Joins("LEFT JOIN transactions ON transactions.block_height = blocks.height"). + Joins("JOIN validators ON blocks.proposer = validators.operator_address"). + Where("blocks.proposer = ? AND blocks.timestamp >= ?", operatorAddr, since). + Group("blocks.height, blocks.hash, blocks.timestamp, validators.moniker, validators.identity, validators.operator_address"). + Order(clause.OrderByColumn{ + Column: clause.Column{ + Name: "blocks.height", + }, + Desc: pagination.Reverse, + }). + Limit(pagination.Limit). + Offset(pagination.Offset). + Find(&record).Error; err != nil { + logger.Get().Error().Err(err).Msgf("Failed to query proposed blocks for %s", operatorAddr) + return nil, 0, err + } + + if pagination.CountTotal { + var err error + total, err = db.CountWithTimeout(r.db.Model(&db.Block{}).Where("proposer = ? AND timestamp >= ?", operatorAddr, since), r.countQueryTimeout) + if err != nil { + logger.Get().Error().Err(err).Msgf("Failed to count proposed blocks for %s", operatorAddr) + return nil, 0, err + } + } + + result := make([]dto.ValidatorProposedBlockModel, len(record)) + for idx, block := range record { + result[idx] = dto.ValidatorProposedBlockModel{ + Hash: fmt.Sprintf("%x", block.Hash), + Height: int(block.Height), + Timestamp: block.Timestamp, + TransactionCount: int(block.TransactionCount), + Validator: dto.BlockProposer{ + Identity: block.ValidatorIdentity, + Moniker: block.ValidatorMoniker, + OperatorAddress: block.ValidatorAddress, + }, + } + } + + return result, total, nil +} + +func (r *ValidatorRepository) GetValidatorHistoricalPowers(operatorAddr string) ([]dto.ValidatorHistoricalPowerModel, int64, error) { + var record []dto.ValidatorHistoricalPowerModel + + since := time.Now().AddDate(0, 0, -90) + if err := r.db.Model(db.ValidatorHistoricalPower{}). + Select("hour_rounded_timestamp, timestamp, voting_power"). + Where("validator_address = ? AND timestamp >= ?", operatorAddr, since). + Order(clause.OrderByColumn{ + Column: clause.Column{ + Name: "timestamp", + }, + Desc: false, + }).Find(&record).Error; err != nil { + logger.Get().Error().Err(err).Msgf("Failed to query historical powers for %s", operatorAddr) + return nil, 0, err + } + + return record, int64(len(record)), nil +} diff --git a/api/routes/account.go b/api/routes/account.go new file mode 100644 index 00000000..8987c96d --- /dev/null +++ b/api/routes/account.go @@ -0,0 +1,25 @@ +package routes + +import ( + "github.com/gofiber/fiber/v2" + + "github.com/initia-labs/core-indexer/api/handlers" + "github.com/initia-labs/core-indexer/api/repositories" + "github.com/initia-labs/core-indexer/api/services" +) + +func SetupAccountRoutes(app *fiber.App, accountRepo repositories.AccountRepositoryI) { + // Initialize services + accountService := services.NewAccountService(accountRepo) + + // Initialize handlers + accountHandler := handlers.NewAccountHandler(accountService) + + // Account routes + v1 := app.Group("/indexer/account/v1") + { + v1.Get("/:accountAddress", accountHandler.GetAccountByAccountAddress) + v1.Get("/:accountAddress/proposals", accountHandler.GetAccountProposals) + v1.Get("/:accountAddress/txs", accountHandler.GetAccountTxs) + } +} diff --git a/api/routes/block.go b/api/routes/block.go new file mode 100644 index 00000000..e0b2359a --- /dev/null +++ b/api/routes/block.go @@ -0,0 +1,25 @@ +package routes + +import ( + "github.com/gofiber/fiber/v2" + + "github.com/initia-labs/core-indexer/api/handlers" + "github.com/initia-labs/core-indexer/api/repositories" + "github.com/initia-labs/core-indexer/api/services" +) + +func SetupBlockRoutes(app *fiber.App, blockRepo repositories.BlockRepositoryI) { + blockService := services.NewBlockService(blockRepo) + + blockHandler := handlers.NewBlockHandler(blockService) + + v1 := app.Group("/indexer/block/v1") + { + v1.Get("/blocks", blockHandler.GetBlocks) + v1.Get("/latest_block_height", blockHandler.GetBlockHeightLatest) + v1.Get("/latest_informative_block_height", blockHandler.GetBlockHeightInformativeLatest) + v1.Get("/avg_block_time", blockHandler.GetBlockTimeAverage) + v1.Get("/blocks/:height/info", blockHandler.GetBlockInfo) + v1.Get("/blocks/:height/txs", blockHandler.GetBlockTxs) + } +} diff --git a/api/routes/module.go b/api/routes/module.go new file mode 100644 index 00000000..2e6282f3 --- /dev/null +++ b/api/routes/module.go @@ -0,0 +1,30 @@ +package routes + +import ( + "github.com/gofiber/fiber/v2" + + "github.com/initia-labs/core-indexer/api/handlers" + "github.com/initia-labs/core-indexer/api/repositories" + "github.com/initia-labs/core-indexer/api/services" +) + +func SetupModuleRoutes(app *fiber.App, moduleRepo repositories.ModuleRepositoryI) { + moduleService := services.NewModuleService(moduleRepo) + moduleHandler := handlers.NewModuleHandler(moduleService) + + // Module routes + v1 := app.Group("/indexer/module/v1") + { + // Modules + modules := v1.Group("/modules") + { + modules.Get("/", moduleHandler.GetModules) + modules.Get("/:vmAddress/:name", moduleHandler.GetModuleById) + modules.Get("/:vmAddress/:name/histories", moduleHandler.GetModuleHistories) + modules.Get("/:vmAddress/:name/publish_info", moduleHandler.GetModulePublishInfo) + modules.Get("/:vmAddress/:name/proposals", moduleHandler.GetModuleProposals) + modules.Get("/:vmAddress/:name/transactions", moduleHandler.GetModuleTransactions) + modules.Get("/:vmAddress/:name/stats", moduleHandler.GetModuleStats) + } + } +} diff --git a/api/routes/nft.go b/api/routes/nft.go new file mode 100644 index 00000000..d8f569c8 --- /dev/null +++ b/api/routes/nft.go @@ -0,0 +1,47 @@ +package routes + +import ( + "github.com/gofiber/fiber/v2" + + "github.com/initia-labs/core-indexer/api/handlers" + "github.com/initia-labs/core-indexer/api/repositories" + "github.com/initia-labs/core-indexer/api/services" +) + +// SetupNftRoutes sets up the Nft routes +func SetupNftRoutes(app *fiber.App, nftRepo repositories.NftRepositoryI) { + // Initialize services + nftService := services.NewNftService(nftRepo) + + // Initialize handlers + nftHandler := handlers.NewNftHandler(nftService) + + // Nft routes + v1 := app.Group("/indexer/nft/v1") + { + // Collections + collections := v1.Group("/collections") + { + collections.Get("/", nftHandler.GetCollections) + collections.Get("/by_account/:accountAddress", nftHandler.GetCollectionsByAccountAddress) + collections.Get("/:collectionAddress", nftHandler.GetCollectionsByCollectionAddress) + collections.Get("/:collectionAddress/activities", nftHandler.GetCollectionActivities) + collections.Get("/:collectionAddress/creator", nftHandler.GetCollectionCreator) + collections.Get("/:collectionAddress/mutate_events", nftHandler.GetCollectionMutateEvents) + } + + tokens := v1.Group("/tokens") + { + tokens.Get("/by_collection/:collectionAddress/:nftAddress", nftHandler.GetNftByNftAddress) + tokens.Get("/by_collection/:collectionAddress", nftHandler.GetNftsByCollectionAddress) + tokens.Get("/by_account/:accountAddress", nftHandler.GetNftsByAccountAddress) + } + + token := v1.Group("/token") + { + token.Get("/:nftAddress/mint_info", nftHandler.GetNftMintInfo) + token.Get("/:nftAddress/mutate_events", nftHandler.GetNftMutateEvents) + token.Get("/:nftAddress/txs", nftHandler.GetNftTxs) + } + } +} diff --git a/api/routes/proposal.go b/api/routes/proposal.go new file mode 100644 index 00000000..417bba07 --- /dev/null +++ b/api/routes/proposal.go @@ -0,0 +1,26 @@ +package routes + +import ( + "github.com/gofiber/fiber/v2" + + "github.com/initia-labs/core-indexer/api/handlers" + "github.com/initia-labs/core-indexer/api/repositories" + "github.com/initia-labs/core-indexer/api/services" +) + +func SetupProposalRoutes(app *fiber.App, repo repositories.ProposalRepositoryI) { + proposalService := services.NewProposalService(repo) + proposalHandler := handlers.NewProposalHandler(proposalService) + + v1 := app.Group("/indexer/proposal/v1") + + proposals := v1.Group("/proposals") + proposals.Get("/", proposalHandler.GetProposals) + proposals.Get("/types", proposalHandler.GetProposalsTypes) + + proposal := proposals.Group("/:proposalId") + proposal.Get("/info", proposalHandler.GetProposalInfo) + proposal.Get("/votes", proposalHandler.GetProposalVotes) + proposal.Get("/validator_votes", proposalHandler.GetProposalValidatorVotes) + proposal.Get("/answer_counts", proposalHandler.GetProposalAnswerCounts) +} diff --git a/api/routes/routes.go b/api/routes/routes.go new file mode 100644 index 00000000..edfdfebe --- /dev/null +++ b/api/routes/routes.go @@ -0,0 +1,23 @@ +package routes + +import ( + "github.com/gofiber/fiber/v2" + "gocloud.dev/blob" + "gorm.io/gorm" + + "github.com/initia-labs/core-indexer/api/config" + "github.com/initia-labs/core-indexer/api/repositories" +) + +// SetupRoutes configures all the routes for the API +func SetupRoutes(app *fiber.App, dbClient *gorm.DB, buckets []*blob.Bucket, config *config.Config) { + repos := repositories.SetupRepositories(dbClient, buckets, config.Repository.CountQueryTimeout) + + SetupBlockRoutes(app, repos.BlockRepository) + SetupModuleRoutes(app, repos.ModuleRepository) + SetupNftRoutes(app, repos.NftRepository) + SetupProposalRoutes(app, repos.ProposalRepository) + SetupTxRoutes(app, repos.TxRepository, repos.AccountRepository, config) + SetupValidatorRoutes(app, repos.ValidatorRepository, repos.BlockRepository, repos.ProposalRepository) + SetupAccountRoutes(app, repos.AccountRepository) +} diff --git a/api/routes/runtime_metrics.go b/api/routes/runtime_metrics.go new file mode 100644 index 00000000..1fef4323 --- /dev/null +++ b/api/routes/runtime_metrics.go @@ -0,0 +1,67 @@ +package routes + +import ( + "runtime" + + "github.com/gofiber/fiber/v2" + "gorm.io/gorm" +) + +// SetupRuntimeMetricsRoute exposes a small runtime snapshot for operational debugging. +func SetupRuntimeMetricsRoute(app *fiber.App, dbClient *gorm.DB) { + app.Get("/indexer/debug/runtime", func(c *fiber.Ctx) error { + var mem runtime.MemStats + runtime.ReadMemStats(&mem) + + response := fiber.Map{ + "go": fiber.Map{ + "goroutines": runtime.NumGoroutine(), + "memory": fiber.Map{ + "alloc_bytes": mem.Alloc, + "total_alloc_bytes": mem.TotalAlloc, + "sys_bytes": mem.Sys, + "heap_alloc_bytes": mem.HeapAlloc, + "heap_sys_bytes": mem.HeapSys, + "heap_idle_bytes": mem.HeapIdle, + "heap_in_use_bytes": mem.HeapInuse, + "heap_released_bytes": mem.HeapReleased, + "heap_objects": mem.HeapObjects, + "next_gc_bytes": mem.NextGC, + }, + "gc": fiber.Map{ + "count": mem.NumGC, + "pause_total_ns": mem.PauseTotalNs, + "last_gc_unix_nano": mem.LastGC, + "gc_cpu_fraction": mem.GCCPUFraction, + "forced_gc_count": mem.NumForcedGC, + "gc_sys_bytes": mem.GCSys, + "stack_in_use_bytes": mem.StackInuse, + "stack_sys_bytes": mem.StackSys, + "mspan_in_use_bytes": mem.MSpanInuse, + "mspan_sys_bytes": mem.MSpanSys, + "mcache_in_use_bytes": mem.MCacheInuse, + "mcache_sys_bytes": mem.MCacheSys, + "buck_hash_sys_bytes": mem.BuckHashSys, + "other_runtime_sys_bytes": mem.OtherSys, + }, + }, + } + + if sqlDB, err := dbClient.DB(); err == nil { + stats := sqlDB.Stats() + response["database"] = fiber.Map{ + "max_open_connections": stats.MaxOpenConnections, + "open_connections": stats.OpenConnections, + "in_use": stats.InUse, + "idle": stats.Idle, + "wait_count": stats.WaitCount, + "wait_duration_ns": stats.WaitDuration.Nanoseconds(), + "max_idle_closed": stats.MaxIdleClosed, + "max_idle_time_closed": stats.MaxIdleTimeClosed, + "max_lifetime_closed": stats.MaxLifetimeClosed, + } + } + + return c.JSON(response) + }) +} diff --git a/api/routes/tx.go b/api/routes/tx.go new file mode 100644 index 00000000..82d2f8b0 --- /dev/null +++ b/api/routes/tx.go @@ -0,0 +1,29 @@ +package routes + +import ( + "github.com/gofiber/fiber/v2" + + "github.com/initia-labs/core-indexer/api/config" + "github.com/initia-labs/core-indexer/api/handlers" + "github.com/initia-labs/core-indexer/api/repositories" + "github.com/initia-labs/core-indexer/api/services" +) + +// SetupTxRoutes sets up the Tx routes +func SetupTxRoutes(app *fiber.App, txRepo repositories.TxRepositoryI, accountRepo repositories.AccountRepositoryI, cfg *config.Config) { + // Initialize services + txService := services.NewTxService(txRepo, accountRepo, cfg) + + // Initialize handlers + txHandler := handlers.NewTxHandler(txService) + + // Tx routes + v1 := app.Group("/indexer/tx/v1") + + txs := v1.Group("/txs") + + txs.Get("/", txHandler.GetTxs) + txs.Get("/count", txHandler.GetTxCount) + txs.Get("/:tx_hash", txHandler.GetTxByHash) + txs.Get("/by_account/:accountAddress", txHandler.GetTxsByAccountAddress) +} diff --git a/api/routes/validator.go b/api/routes/validator.go new file mode 100644 index 00000000..8ae513e3 --- /dev/null +++ b/api/routes/validator.go @@ -0,0 +1,31 @@ +package routes + +import ( + "github.com/gofiber/fiber/v2" + + "github.com/initia-labs/core-indexer/api/handlers" + "github.com/initia-labs/core-indexer/api/repositories" + "github.com/initia-labs/core-indexer/api/services" +) + +func SetupValidatorRoutes(app *fiber.App, validatorRepo repositories.ValidatorRepositoryI, blockRepo repositories.BlockRepositoryI, proposalRepo repositories.ProposalRepositoryI) { + validatorService := services.NewValidatorService(validatorRepo, blockRepo, proposalRepo) + validatorHandler := handlers.NewValidatorHandler(validatorService) + + v1 := app.Group("/indexer/validator/v1") + + // Add /all endpoint for simplified validator list + v1.Get("/all", validatorHandler.GetAllValidators) + + validators := v1.Group("/validators") + validators.Get("/", validatorHandler.GetValidators) + + validator := validators.Group("/:operatorAddr") + validator.Get("/info", validatorHandler.GetValidatorInfo) + validator.Get("/uptime", validatorHandler.GetValidatorUptime) + validator.Get("/delegation_related_txs", validatorHandler.GetValidatorDelegationRelatedTxs) + validator.Get("/proposed_blocks", validatorHandler.GetValidatorProposedBlocks) + validator.Get("/historical_powers", validatorHandler.GetValidatorHistoricalPowers) + validator.Get("/voted_proposals", validatorHandler.GetValidatorVotedProposals) + validator.Get("/answer_counts", validatorHandler.GetValidatorAnswerCounts) +} diff --git a/api/services/account.go b/api/services/account.go new file mode 100644 index 00000000..3536d345 --- /dev/null +++ b/api/services/account.go @@ -0,0 +1,113 @@ +package services + +import ( + "fmt" + + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/api/repositories" + "github.com/initia-labs/core-indexer/pkg/db" +) + +type AccountService interface { + GetAccountByAccountAddress(accountAddress string) (*db.Account, error) + GetAccountProposals(pagination dto.PaginationQuery, accountAddress string) (*dto.AccountProposalsResponse, error) + GetAccountTxs(pagination dto.PaginationQuery, accountAddress string, search string, isSend bool, isIbc bool, isOpinit bool, isMovePublish bool, isMoveUpgrade bool, isMoveExecute bool, isMoveScript bool, isSigner *bool) (*dto.AccountTxsResponse, error) +} + +type accountService struct { + repo repositories.AccountRepositoryI +} + +func NewAccountService(repo repositories.AccountRepositoryI) AccountService { + return &accountService{ + repo: repo, + } +} + +func (s *accountService) GetAccountByAccountAddress(accountAddress string) (*db.Account, error) { + account, err := s.repo.GetAccountByAccountAddress(accountAddress) + if err != nil { + return nil, err + } + + return account, nil +} + +func (s *accountService) GetAccountProposals(pagination dto.PaginationQuery, accountAddress string) (*dto.AccountProposalsResponse, error) { + proposals, total, err := s.repo.GetAccountProposals(pagination, accountAddress) + if err != nil { + return nil, err + } + + response := &dto.AccountProposalsResponse{ + Proposals: make([]dto.AccountProposal, len(proposals)), + Pagination: dto.NewPaginationResponse(pagination.Offset, pagination.Limit, total), + } + + for idx, proposal := range proposals { + var resolvedHeight *int64 + if proposal.ResolvedHeight != nil { + temp := int64(*proposal.ResolvedHeight) + resolvedHeight = &temp + } + response.Proposals[idx] = dto.AccountProposal{ + DepositEndTime: proposal.DepositEndTime, + ID: int64(proposal.ID), + IsEmergency: proposal.IsEmergency, + IsExpedited: proposal.IsExpedited, + Proposer: proposal.ProposerID, + ResolvedHeight: resolvedHeight, + Status: proposal.Status, + Title: proposal.Title, + Type: proposal.Type, + VotingEndTime: proposal.VotingEndTime, + } + } + + return response, nil +} + +func (s *accountService) GetAccountTxs( + pagination dto.PaginationQuery, + accountAddress string, + search string, + isSend bool, + isIbc bool, + isOpinit bool, + isMovePublish bool, + isMoveUpgrade bool, + isMoveExecute bool, + isMoveScript bool, + isSigner *bool, +) (*dto.AccountTxsResponse, error) { + txs, total, err := s.repo.GetAccountTxs( + pagination, accountAddress, search, isSend, isIbc, isOpinit, isMovePublish, isMoveUpgrade, isMoveExecute, isMoveScript, isSigner) + if err != nil { + return nil, err + } + + response := &dto.AccountTxsResponse{ + AccountTxs: make([]dto.AccountTx, len(txs)), + Pagination: dto.NewPaginationResponse(pagination.Offset, pagination.Limit, total), + } + + for idx, tx := range txs { + response.AccountTxs[idx] = dto.AccountTx{ + Created: tx.Timestamp, + Hash: fmt.Sprintf("%x", tx.Hash), + Height: tx.Height, + IsIbc: tx.IsIbc, + IsSend: tx.IsSend, + IsSigner: tx.IsSigner, + Messages: tx.Messages, + Sender: tx.Sender, + Success: tx.Success, + IsMoveExecute: tx.IsMoveExecute, + IsMovePublish: tx.IsMovePublish, + IsMoveScript: tx.IsMoveScript, + IsOpinit: tx.IsOpinit, + } + } + + return response, nil +} diff --git a/api/services/block.go b/api/services/block.go new file mode 100644 index 00000000..15db9982 --- /dev/null +++ b/api/services/block.go @@ -0,0 +1,160 @@ +package services + +import ( + "fmt" + + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/api/repositories" + "github.com/initia-labs/core-indexer/api/utils" +) + +type BlockService interface { + GetBlockHeightLatest() (*dto.BlockHeightLatestResponse, error) + GetBlockHeightInformativeLatest() (*dto.BlockHeightInformativeLatestResponse, error) + GetBlockTimeAverage() (*dto.BlockTimeAverageResponse, error) + GetBlocks(pagination dto.PaginationQuery) (*dto.BlocksResponse, error) + GetBlockInfo(height int64) (*dto.BlockInfoResponse, error) + GetBlockTxs(pagination dto.PaginationQuery, height int64) (*dto.BlockTxsResponse, error) +} + +type blockService struct { + repo repositories.BlockRepositoryI +} + +func NewBlockService(repo repositories.BlockRepositoryI) BlockService { + return &blockService{ + repo: repo, + } +} + +func (s *blockService) GetBlockHeightLatest() (*dto.BlockHeightLatestResponse, error) { + height, err := s.repo.GetBlockHeightLatest() + if err != nil { + return nil, err + } + + return &dto.BlockHeightLatestResponse{ + Height: *height, + }, nil +} + +func (s *blockService) GetBlockHeightInformativeLatest() (*dto.BlockHeightInformativeLatestResponse, error) { + height, err := s.repo.GetBlockHeightInformativeLatest() + if err != nil { + return nil, err + } + + return &dto.BlockHeightInformativeLatestResponse{ + Height: *height, + }, nil +} + +func (s *blockService) GetBlockTimeAverage() (*dto.BlockTimeAverageResponse, error) { + latestHeight, err := s.repo.GetBlockHeightLatest() + if err != nil { + return nil, err + } + + if latestHeight == nil { + return nil, nil + } + + timestamps, err := s.repo.GetBlockTimestamp(*latestHeight) + if err != nil { + return nil, err + } + + if len(timestamps) < 2 { + return nil, nil + } + + timeDiffs := make([]float64, 0, len(timestamps)-1) + for idx := 0; idx < len(timestamps)-1; idx++ { + diff := timestamps[idx].Sub(timestamps[idx+1]).Seconds() + if diff < 0 { + diff = -diff + } + timeDiffs = append(timeDiffs, diff) + } + + medianVal := &dto.BlockTimeAverageResponse{ + AverageBlockTime: utils.Median(timeDiffs), + } + + return medianVal, nil +} + +func (s *blockService) GetBlocks(pagination dto.PaginationQuery) (*dto.BlocksResponse, error) { + foundBlocks, total, err := s.repo.GetBlocks(pagination) + if err != nil { + return nil, err + } + + blocks := make([]dto.Block, len(foundBlocks)) + + for idx, block := range foundBlocks { + blocks[idx] = dto.Block{ + Hash: fmt.Sprintf("%x", block.Hash), + Height: block.Height, + Timestamp: block.Timestamp, + TxCount: block.TxCount, + Proposer: dto.BlockProposer{ + Identity: block.Identity, + Moniker: block.Moniker, + OperatorAddress: block.OperatorAddress, + }, + } + } + + return &dto.BlocksResponse{ + Blocks: blocks, + Pagination: dto.NewPaginationResponse(pagination.Offset, pagination.Limit, total), + }, nil +} + +func (s *blockService) GetBlockInfo(height int64) (*dto.BlockInfoResponse, error) { + block, err := s.repo.GetBlockInfo(height) + if err != nil { + return nil, err + } + + return &dto.BlockInfoResponse{ + GasLimit: block.GasLimit, + GasUsed: block.GasUsed, + Hash: fmt.Sprintf("%x", block.Hash), + Height: block.Height, + Timestamp: block.Timestamp, + Proposer: dto.BlockProposer{ + Identity: block.Identity, + Moniker: block.Moniker, + OperatorAddress: block.OperatorAddress, + }, + }, nil +} + +func (s *blockService) GetBlockTxs(pagination dto.PaginationQuery, height int64) (*dto.BlockTxsResponse, error) { + txs, total, err := s.repo.GetBlockTxs(pagination, height) + if err != nil { + return nil, err + } + + blockTxs := make([]dto.BlockTxModel, len(txs)) + for idx, tx := range txs { + blockTxs[idx] = dto.BlockTxModel{ + Height: tx.Height, + Timestamp: tx.Timestamp, + Address: tx.Address, + Hash: fmt.Sprintf("%x", tx.Hash), + Success: tx.Success, + Messages: tx.Messages, + IsSend: tx.IsSend, + IsIbc: tx.IsIbc, + IsOpinit: tx.IsOpinit, + } + } + + return &dto.BlockTxsResponse{ + BlockTxs: blockTxs, + Pagination: dto.NewPaginationResponse(pagination.Offset, pagination.Limit, total), + }, nil +} diff --git a/api/services/gcs.go b/api/services/gcs.go new file mode 100644 index 00000000..0f728ab4 --- /dev/null +++ b/api/services/gcs.go @@ -0,0 +1,235 @@ +package services + +import ( + "container/list" + "context" + "sync" + "time" + + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/api/repositories" + "golang.org/x/sync/errgroup" +) + +const ( + MaxWorkers = 10 + MaxRetries = 3 + RetryDelay = time.Second + MaxRetryDelay = 10 * time.Second + CacheBytes = 64 * 1024 * 1024 +) + +type txCacheEntry struct { + hash string + tx *dto.TxByHashResponse + size int64 +} + +type txResponseCache struct { + mu sync.Mutex + maxBytes int64 + used int64 + items map[string]*list.Element + order *list.List +} + +func newTxResponseCache(maxBytes int64) *txResponseCache { + if maxBytes <= 0 { + return nil + } + + return &txResponseCache{ + maxBytes: maxBytes, + items: make(map[string]*list.Element), + order: list.New(), + } +} + +func (c *txResponseCache) Get(hash string) (*dto.TxByHashResponse, bool) { + if c == nil { + return nil, false + } + + c.mu.Lock() + defer c.mu.Unlock() + + element, exists := c.items[hash] + if !exists { + return nil, false + } + + c.order.MoveToFront(element) + entry := element.Value.(*txCacheEntry) + return entry.tx, true +} + +func (c *txResponseCache) Add(hash string, tx *dto.TxByHashResponse) { + if c == nil || tx == nil { + return + } + + size := tx.CacheSizeBytes + if size <= 0 || size > c.maxBytes { + c.Remove(hash) + return + } + + c.mu.Lock() + defer c.mu.Unlock() + + if element, exists := c.items[hash]; exists { + entry := element.Value.(*txCacheEntry) + c.used += size - entry.size + entry.tx = tx + entry.size = size + c.order.MoveToFront(element) + } else { + entry := &txCacheEntry{hash: hash, tx: tx, size: size} + c.items[hash] = c.order.PushFront(entry) + c.used += size + } + + for c.used > c.maxBytes { + c.removeOldest() + } +} + +func (c *txResponseCache) Remove(hash string) { + if c == nil { + return + } + + c.mu.Lock() + defer c.mu.Unlock() + + if element, exists := c.items[hash]; exists { + c.removeElement(element) + } +} + +func (c *txResponseCache) removeOldest() { + element := c.order.Back() + if element != nil { + c.removeElement(element) + } +} + +func (c *txResponseCache) removeElement(element *list.Element) { + entry := element.Value.(*txCacheEntry) + delete(c.items, entry.hash) + c.used -= entry.size + c.order.Remove(element) +} + +type GCSManager struct { + MaxWorkers int + MaxRetries int + RetryDelay time.Duration + MaxRetryDelay time.Duration + repo repositories.TxRepositoryI + cache *txResponseCache +} + +func NewGCSManager(repo repositories.TxRepositoryI) GCSManager { + return NewGCSManagerWithConfig(repo, CacheBytes, MaxWorkers) +} + +func NewGCSManagerWithConfig(repo repositories.TxRepositoryI, cacheBytes int64, maxWorkers int) GCSManager { + if maxWorkers < 1 { + maxWorkers = 1 + } + + return GCSManager{ + repo: repo, + MaxWorkers: maxWorkers, + MaxRetries: MaxRetries, + RetryDelay: RetryDelay, + MaxRetryDelay: MaxRetryDelay, + cache: newTxResponseCache(cacheBytes), + } +} + +// retryWithBackoff executes a function with exponential backoff retry logic +func (g *GCSManager) retryWithBackoff(ctx context.Context, fn func() error) error { + var lastErr error + delay := g.RetryDelay + + for attempt := 0; attempt <= g.MaxRetries; attempt++ { + if attempt > 0 { + select { + case <-ctx.Done(): + return ctx.Err() + case <-time.After(delay): + } + } + + err := fn() + if err == nil { + return nil + } + + lastErr = err + if attempt < g.MaxRetries { + delay = min(time.Duration(float64(delay)*1.5), g.MaxRetryDelay) + } + } + + return lastErr +} + +func (g *GCSManager) QueryTxs(ctx context.Context, hashes []string) ([]*dto.TxByHashResponse, error) { + if len(hashes) == 0 { + return []*dto.TxByHashResponse{}, nil + } + + txs := make([]*dto.TxByHashResponse, len(hashes)) + + // Check cache first and collect uncached hashes + uncachedHashes := make([]int, 0) + for idx, h := range hashes { + if cached, exists := g.cache.Get(h); exists { + txs[idx] = cached + } else { + uncachedHashes = append(uncachedHashes, idx) + } + } + + if len(uncachedHashes) == 0 { + return txs, nil + } + + workerCount := min(g.MaxWorkers, len(uncachedHashes)) + group, ctx := errgroup.WithContext(ctx) + group.SetLimit(workerCount) + + for _, index := range uncachedHashes { + group.Go(func() error { + hash := hashes[index] + + var tx *dto.TxByHashResponse + var err error + + err = g.retryWithBackoff(ctx, func() error { + tx, err = g.repo.GetTxByHash(ctx, hash) + return err + }) + if err != nil { + return err + } + + // Cache successful results + if tx != nil { + g.cache.Add(hash, tx) + } + + txs[index] = tx + return nil + }) + } + + if err := group.Wait(); err != nil { + return nil, err + } + + return txs, nil +} diff --git a/api/services/module.go b/api/services/module.go new file mode 100644 index 00000000..3e61733d --- /dev/null +++ b/api/services/module.go @@ -0,0 +1,161 @@ +package services + +import ( + "fmt" + "strings" + + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/api/repositories" + "gorm.io/gorm" +) + +type ModuleService interface { + GetModules(pagination dto.PaginationQuery) (*dto.ModulesResponse, error) + GetModuleById(vmAddress string, name string) (*dto.ModuleResponse, error) + GetModuleHistories(pagination dto.PaginationQuery, vmAddress string, name string) (*dto.ModuleHistoriesResponse, error) + GetModulePublishInfo(vmAddress string, name string) (*dto.ModulePublishInfoResponse, error) + GetModuleProposals(pagination dto.PaginationQuery, vmAddress string, name string) (*dto.ModuleProposalsResponse, error) + GetModuleTransactions(pagination dto.PaginationQuery, vmAddress string, name string) (*dto.ModuleTxsResponse, error) + GetModuleStats(vmAddress string, name string) (*dto.ModuleStatsResponse, error) +} + +type moduleService struct { + repo repositories.ModuleRepositoryI +} + +func NewModuleService(repo repositories.ModuleRepositoryI) ModuleService { + return &moduleService{ + repo: repo, + } +} + +// GetModules retrieves modules with pagination +func (s *moduleService) GetModules(pagination dto.PaginationQuery) (*dto.ModulesResponse, error) { + modules, total, err := s.repo.GetModules(pagination) + if err != nil { + return nil, err + } + + response := &dto.ModulesResponse{ + Modules: modules, + Pagination: dto.NewPaginationResponse(pagination.Offset, pagination.Limit, total), + } + + return response, nil +} + +// GetModuleById retrieves a module by id +func (s *moduleService) GetModuleById(vmAddress string, name string) (*dto.ModuleResponse, error) { + module, err := s.repo.GetModuleById(vmAddress, name) + if err != nil { + return nil, err + } + + return module, nil +} + +// GetModuleHistories retrieves module histories with pagination +func (s *moduleService) GetModuleHistories(pagination dto.PaginationQuery, vmAddress string, name string) (*dto.ModuleHistoriesResponse, error) { + moduleHistories, total, err := s.repo.GetModuleHistories(pagination, vmAddress, name) + if err != nil { + return nil, err + } + + for i := range moduleHistories { + moduleHistories[i].UpgradePolicy = strings.ToUpper(moduleHistories[i].UpgradePolicy) + if i < len(moduleHistories)-1 { + previousPolicy := strings.ToUpper(moduleHistories[i+1].UpgradePolicy) + moduleHistories[i].PreviousPolicy = &previousPolicy + } + } + + response := &dto.ModuleHistoriesResponse{ + ModuleHistories: moduleHistories, + Pagination: dto.NewPaginationResponse(pagination.Offset, pagination.Limit, total), + } + + return response, nil +} + +// GetModulePublishInfo retrieves a module publish info +func (s *moduleService) GetModulePublishInfo(vmAddress string, name string) (*dto.ModulePublishInfoResponse, error) { + modulePublishInfoResponse := &dto.ModulePublishInfoResponse{} + modulePublishInfo, err := s.repo.GetModulePublishInfo(vmAddress, name) + if err != nil { + return nil, err + } + + if len(modulePublishInfo) == 0 { + return nil, gorm.ErrRecordNotFound + } + + recentPublish := modulePublishInfo[0] + + if recentPublish.TransactionHash != nil { + txHash := fmt.Sprintf("%x", *recentPublish.TransactionHash) + modulePublishInfoResponse.RecentPublishTransaction = &txHash + } + + modulePublishInfoResponse.IsRepublished = len(modulePublishInfo) > 1 + modulePublishInfoResponse.RecentPublishBlockHeight = recentPublish.Height + modulePublishInfoResponse.RecentPublishBlockTimestamp = recentPublish.Timestamp + modulePublishInfoResponse.RecentPublishProposal = recentPublish.Proposal + + return modulePublishInfoResponse, nil +} + +// GetModuleProposals retrieves a module proposal +func (s *moduleService) GetModuleProposals(pagination dto.PaginationQuery, vmAddress string, name string) (*dto.ModuleProposalsResponse, error) { + proposals, total, err := s.repo.GetModuleProposals(pagination, vmAddress, name) + if err != nil { + return nil, err + } + + return &dto.ModuleProposalsResponse{ + Proposals: proposals, + Pagination: dto.NewPaginationResponse(pagination.Offset, pagination.Limit, total), + }, nil +} + +// GetModuleTransactions retrieves a module transaction +func (s *moduleService) GetModuleTransactions(pagination dto.PaginationQuery, vmAddress string, name string) (*dto.ModuleTxsResponse, error) { + txs, total, err := s.repo.GetModuleTransactions(pagination, vmAddress, name) + if err != nil { + return nil, err + } + + moduleTxs := make([]dto.ModuleTxResponse, len(txs)) + for i, tx := range txs { + moduleTxs[i] = dto.ModuleTxResponse{ + Height: tx.Height, + Timestamp: tx.Timestamp, + Sender: tx.Sender, + TxHash: fmt.Sprintf("%x", tx.TxHash), + Success: tx.Success, + Messages: tx.Messages, + IsSend: tx.IsSend, + IsIBC: tx.IsIBC, + IsMoveExecute: tx.IsMoveExecute, + IsMoveExecuteEvent: tx.IsMoveExecuteEvent, + IsMovePublish: tx.IsMovePublish, + IsMoveScript: tx.IsMoveScript, + IsMoveUpgrade: tx.IsMoveUpgrade, + IsOpinit: tx.IsOpinit, + } + } + + return &dto.ModuleTxsResponse{ + ModuleTxs: moduleTxs, + Pagination: dto.NewPaginationResponse(pagination.Offset, pagination.Limit, total), + }, nil +} + +// GetModuleStats retrieves a module stats by module id +func (s *moduleService) GetModuleStats(vmAddress string, name string) (*dto.ModuleStatsResponse, error) { + stats, err := s.repo.GetModuleStats(vmAddress, name) + if err != nil { + return nil, err + } + + return stats, nil +} diff --git a/api/services/nft.go b/api/services/nft.go new file mode 100644 index 00000000..4809a79c --- /dev/null +++ b/api/services/nft.go @@ -0,0 +1,312 @@ +package services + +import ( + "fmt" + + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/api/repositories" +) + +// NftService defines the interface for Nft-related operations +type NftService interface { + GetCollections(pagination dto.PaginationQuery, search string) (*dto.NftCollectionsResponse, error) + GetCollectionsByAccountAddress(accountAddress string) (*dto.NftCollectionsResponse, error) + GetCollectionsByCollectionAddress(collectionAddress string) (*dto.NftCollectionResponse, error) + GetCollectionActivities(pagination dto.PaginationQuery, collectionAddress string, search string) (*dto.CollectionActivitiesResponse, error) + GetCollectionCreator(collectionAddress string) (*dto.CollectionCreatorResponse, error) + GetCollectionMutateEvents(pagination dto.PaginationQuery, collectionAddress string) (*dto.CollectionMutateEventsResponse, error) + GetNftByNftAddress(collectionAddress string, nftAddress string) (*dto.NftByAddressResponse, error) + GetNftsByAccountAddress(pagination dto.PaginationQuery, accountAddress string, collectionAddress string, search string) (*dto.NftsByAddressResponse, error) + GetNftsByCollectionAddress(pagination dto.PaginationQuery, collectionAddress string, search string) (*dto.NftsByAddressResponse, error) + GetNftMintInfo(nftAddress string) (*dto.NftMintInfoResponse, error) + GetNftMutateEvents(pagination dto.PaginationQuery, nftAddress string) (*dto.NftMutateEventsResponse, error) + GetNftTxs(pagination dto.PaginationQuery, nftAddress string) (*dto.NftTxsResponse, error) +} + +// nftService implements the NftService interface +type nftService struct { + repo repositories.NftRepositoryI +} + +// NewNftService creates a new instance of NftService +func NewNftService(repo repositories.NftRepositoryI) NftService { + return &nftService{ + repo: repo, + } +} + +// GetCollections retrieves Nft collections with pagination and search +func (s *nftService) GetCollections(pagination dto.PaginationQuery, search string) (*dto.NftCollectionsResponse, error) { + foundCollections, total, err := s.repo.GetCollections(pagination, search) + if err != nil { + return nil, err + } + + collections := make([]dto.NftCollectionResponse, len(foundCollections)) + + for idx, collection := range foundCollections { + collections[idx] = dto.NftCollectionResponse{ + ObjectAddr: collection.ID, + Collection: dto.NftCollectionCollection{ + Creator: collection.Creator, + Description: collection.Description, + Name: collection.Name, + URI: collection.URI, + Nft: nil, + }, + } + } + + response := &dto.NftCollectionsResponse{ + Collections: collections, + Pagination: dto.NewPaginationResponse(pagination.Offset, pagination.Limit, total), + } + + return response, nil +} + +func (s *nftService) GetCollectionsByAccountAddress(accountAddress string) (*dto.NftCollectionsResponse, error) { + foundCollections, err := s.repo.GetCollectionsByAccountAddress(accountAddress) + if err != nil { + return nil, err + } + + collections := make([]dto.NftCollectionResponse, len(foundCollections)) + + for idx, collection := range foundCollections { + collections[idx] = dto.NftCollectionResponse{ + ObjectAddr: collection.ID, + Collection: dto.NftCollectionCollection{ + Creator: collection.Creator, + Description: collection.Description, + Name: collection.Name, + URI: collection.URI, + Nft: &dto.NftCollectionCollectionNft{ + Length: collection.Count, + }, + }, + } + } + + response := &dto.NftCollectionsResponse{ + Collections: collections, + Pagination: dto.PaginationResponse{ + NextKey: nil, + Total: fmt.Sprintf("%d", len(foundCollections)), + }, + } + + return response, nil +} + +func (s *nftService) GetCollectionsByCollectionAddress(collectionAddress string) (*dto.NftCollectionResponse, error) { + collection, err := s.repo.GetCollectionsByCollectionAddress(collectionAddress) + if err != nil { + return nil, err + } + + return &dto.NftCollectionResponse{ + ObjectAddr: collection.ID, + Collection: dto.NftCollectionCollection{ + Creator: collection.Creator, + Description: collection.Description, + Name: collection.Name, + URI: collection.URI, + Nft: nil, + }, + }, nil +} + +func (s *nftService) GetCollectionActivities(pagination dto.PaginationQuery, collectionAddress string, search string) (*dto.CollectionActivitiesResponse, error) { + activities, total, err := s.repo.GetCollectionActivities(pagination, collectionAddress, search) + if err != nil { + return nil, err + } + + collectionActivities := make([]dto.CollectionActivityModel, len(activities)) + for idx, activity := range activities { + collectionActivities[idx] = dto.CollectionActivityModel{ + Hash: fmt.Sprintf("%x", activity.Hash), + Timestamp: activity.Timestamp, + IsNftBurn: activity.IsNftBurn, + IsNftMint: activity.IsNftMint, + IsNftTransfer: activity.IsNftTransfer, + NftID: activity.NftID, + TokenID: activity.TokenID, + IsCollectionCreate: activity.IsCollectionCreate, + } + } + + return &dto.CollectionActivitiesResponse{ + CollectionActivities: collectionActivities, + Pagination: dto.NewPaginationResponse(pagination.Offset, pagination.Limit, total), + }, nil +} + +func (s *nftService) GetCollectionCreator(collectionAddress string) (*dto.CollectionCreatorResponse, error) { + creator, err := s.repo.GetCollectionCreator(collectionAddress) + if err != nil { + return nil, err + } + + creator.Hash = fmt.Sprintf("%x", creator.Hash) + + return &dto.CollectionCreatorResponse{ + Creator: *creator, + }, nil +} + +func (s *nftService) GetCollectionMutateEvents(pagination dto.PaginationQuery, collectionAddress string) (*dto.CollectionMutateEventsResponse, error) { + mutateEvents, total, err := s.repo.GetCollectionMutateEvents(pagination, collectionAddress) + if err != nil { + return nil, err + } + + return &dto.CollectionMutateEventsResponse{ + CollectionMutateEvents: mutateEvents, + Pagination: dto.NewPaginationResponse(pagination.Offset, pagination.Limit, total), + }, nil + +} + +func (s *nftService) GetNftByNftAddress(collectionAddress string, nftAddress string) (*dto.NftByAddressResponse, error) { + nft, err := s.repo.GetNftByNftAddress(collectionAddress, nftAddress) + + if err != nil { + return nil, err + } + + return &dto.NftByAddressResponse{ + ObjectAddr: nft.ID, + CollectionAddr: nft.Collection, + CollectionName: nft.CollectionName, + OwnerAddr: nft.Owner, + Nft: dto.NftByAddressNft{ + Collection: dto.NftByAddressNftCollection{ + Inner: nft.Collection, + }, + Description: nft.Description, + TokenID: nft.TokenID, + URI: nft.URI, + IsBurned: nft.IsBurned, + }, + }, nil +} + +func (s *nftService) GetNftsByAccountAddress(pagination dto.PaginationQuery, accountAddress string, collectionAddress string, search string) (*dto.NftsByAddressResponse, error) { + nfts, total, err := s.repo.GetNftsByAccountAddress(pagination, accountAddress, collectionAddress, search) + + if err != nil { + return nil, err + } + + response := &dto.NftsByAddressResponse{ + Tokens: make([]dto.NftByAddressResponse, len(nfts)), + Pagination: dto.NewPaginationResponse(pagination.Offset, pagination.Limit, total), + } + + for idx, nft := range nfts { + response.Tokens[idx] = dto.NftByAddressResponse{ + ObjectAddr: nft.ID, + CollectionAddr: nft.Collection, + CollectionName: nft.CollectionName, + OwnerAddr: nft.Owner, + Nft: dto.NftByAddressNft{ + Collection: dto.NftByAddressNftCollection{ + Inner: nft.Collection, + }, + Description: nft.Description, + TokenID: nft.TokenID, + URI: nft.URI, + IsBurned: nft.IsBurned, + }, + } + } + + return response, nil +} + +func (s *nftService) GetNftsByCollectionAddress(pagination dto.PaginationQuery, collectionAddress string, search string) (*dto.NftsByAddressResponse, error) { + nfts, total, err := s.repo.GetNftsByCollectionAddress(pagination, collectionAddress, search) + + if err != nil { + return nil, err + } + + response := &dto.NftsByAddressResponse{ + Tokens: make([]dto.NftByAddressResponse, len(nfts)), + Pagination: dto.NewPaginationResponse(pagination.Offset, pagination.Limit, total), + } + + for idx, nft := range nfts { + response.Tokens[idx] = dto.NftByAddressResponse{ + ObjectAddr: nft.ID, + CollectionAddr: nft.Collection, + CollectionName: nft.CollectionName, + OwnerAddr: nft.Owner, + Nft: dto.NftByAddressNft{ + Collection: dto.NftByAddressNftCollection{ + Inner: nft.Collection, + }, + Description: nft.Description, + TokenID: nft.TokenID, + URI: nft.URI, + IsBurned: nft.IsBurned, + }, + } + } + + return response, nil +} + +func (s *nftService) GetNftMintInfo(nftAddress string) (*dto.NftMintInfoResponse, error) { + mintInfo, err := s.repo.GetNftMintInfo(nftAddress) + if err != nil { + return nil, err + } + + return &dto.NftMintInfoResponse{ + Height: mintInfo.Height, + Minter: mintInfo.Address, + TxHash: fmt.Sprintf("%x", mintInfo.Hash), + Timestamp: mintInfo.Timestamp, + }, nil +} + +func (s *nftService) GetNftMutateEvents(pagination dto.PaginationQuery, nftAddress string) (*dto.NftMutateEventsResponse, error) { + mutateEvents, total, err := s.repo.GetNftMutateEvents(pagination, nftAddress) + if err != nil { + return nil, err + } + + response := &dto.NftMutateEventsResponse{ + NftMutateEvents: mutateEvents, + Pagination: dto.NewPaginationResponse(pagination.Offset, pagination.Limit, total), + } + + return response, nil +} + +func (s *nftService) GetNftTxs(pagination dto.PaginationQuery, nftAddress string) (*dto.NftTxsResponse, error) { + txs, total, err := s.repo.GetNftTxs(pagination, nftAddress) + if err != nil { + return nil, err + } + + response := &dto.NftTxsResponse{ + NftTxs: make([]dto.NftTx, len(txs)), + Pagination: dto.NewPaginationResponse(pagination.Offset, pagination.Limit, total), + } + + for idx, tx := range txs { + response.NftTxs[idx] = dto.NftTx{ + IsNftBurn: tx.IsNftBurn, + IsNftMint: tx.IsNftMint, + IsNftTransfer: tx.IsNftTransfer, + Timestamp: tx.Timestamp, + TxHash: fmt.Sprintf("%x", tx.Hash), + } + } + + return response, nil +} diff --git a/api/services/proposal.go b/api/services/proposal.go new file mode 100644 index 00000000..88ba5d00 --- /dev/null +++ b/api/services/proposal.go @@ -0,0 +1,187 @@ +package services + +import ( + "strings" + + "github.com/initia-labs/core-indexer/api/apperror" + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/api/repositories" +) + +type ProposalService interface { + GetProposals(pagination dto.PaginationQuery, proposer, statuses, types, search string) (*dto.ProposalsResponse, error) + GetProposalsTypes() (*dto.ProposalsTypesResponse, error) + GetProposalInfo(proposalId int) (*dto.ProposalInfoResponse, error) + GetProposalVotes(pagination dto.PaginationQuery, proposalId int, search, answer string) (*dto.ProposalVotesResponse, error) + GetProposalValidatorVotes(pagination dto.PaginationQuery, proposalId int, search, answer string) (*dto.ProposalValidatorVotesResponse, error) + GetProposalAnswerCounts(proposalId int) (*dto.ProposalAnswerCountsResponse, error) +} + +type proposalService struct { + repo repositories.ProposalRepositoryI +} + +func NewProposalService(repo repositories.ProposalRepositoryI) ProposalService { + return &proposalService{ + repo: repo, + } +} + +func (s *proposalService) GetProposals(pagination dto.PaginationQuery, proposer, statuses, types, search string) (*dto.ProposalsResponse, error) { + allowedStatuses := map[string]struct{}{ + "DepositPeriod": {}, + "VotingPeriod": {}, + "Passed": {}, + "Rejected": {}, + "Failed": {}, + "Inactive": {}, + "Cancelled": {}, + } + + statusesSlice := []string{} + seenStatuses := map[string]struct{}{} + + if statuses != "" { + for _, status := range strings.Split(statuses, ",") { + v := strings.TrimSpace(status) + if v == "" { + continue + } + + if _, ok := allowedStatuses[v]; !ok { + return nil, apperror.NewBadRequest() + } + + if _, exists := seenStatuses[v]; exists { + return nil, apperror.NewDuplicateStatus() + } + + seenStatuses[v] = struct{}{} + statusesSlice = append(statusesSlice, v) + } + } + + var typesSlice []string + if types != "" { + for _, ty := range strings.Split(types, ",") { + if v := strings.TrimSpace(ty); v != "" { + typesSlice = append(typesSlice, v) + } + } + } + + proposals, total, err := s.repo.SearchProposals( + pagination, + proposer, + search, + statusesSlice, + typesSlice, + ) + + if err != nil { + return nil, err + } + + return &dto.ProposalsResponse{ + Proposals: proposals, + Pagination: dto.NewPaginationResponse(pagination.Offset, pagination.Limit, total), + }, nil +} + +func (s *proposalService) GetProposalsTypes() (*dto.ProposalsTypesResponse, error) { + return s.repo.GetAllProposalTypes() +} + +func (s *proposalService) GetProposalInfo(proposalId int) (*dto.ProposalInfoResponse, error) { + proposal, err := s.repo.GetProposalInfo(proposalId) + if err != nil { + return nil, err + } + + return &dto.ProposalInfoResponse{ + Info: *proposal, + }, nil +} + +func (s *proposalService) GetProposalVotes(pagination dto.PaginationQuery, proposalId int, search, answer string) (*dto.ProposalVotesResponse, error) { + votes, total, err := s.repo.GetProposalVotes( + proposalId, + int64(pagination.Limit), + int64(pagination.Offset), + search, + answer, + ) + if err != nil { + return nil, err + } + + return &dto.ProposalVotesResponse{ + Votes: votes, + Pagination: dto.NewPaginationResponse(pagination.Offset, pagination.Limit, total), + }, nil +} + +func (s *proposalService) GetProposalValidatorVotes(pagination dto.PaginationQuery, proposalId int, search, answer string) (*dto.ProposalValidatorVotesResponse, error) { + validatorVotes, err := s.repo.GetProposalValidatorVotes(proposalId) + if err != nil { + return nil, err + } + + filteredVotes := make([]dto.ProposalVote, 0) + for _, vote := range validatorVotes { + if search != "" { + moniker := strings.ToLower(vote.Validator.Moniker) + validatorAddress := strings.ToLower(vote.Validator.ValidatorAddress) + searchLower := strings.ToLower(search) + + if !strings.Contains(moniker, searchLower) && !strings.Contains(validatorAddress, searchLower) { + continue + } + } + + if answer != "" && !matchValidatorVote(vote, answer) { + continue + } + + filteredVotes = append(filteredVotes, vote) + } + + total := len(filteredVotes) + start := int(pagination.Offset) + end := int(pagination.Offset + pagination.Limit) + + if start >= total { + start = total + } + if end > total { + end = total + } + + return &dto.ProposalValidatorVotesResponse{ + Votes: filteredVotes[start:end], + Pagination: dto.NewPaginationResponse(pagination.Offset, pagination.Limit, int64(total)), + }, nil +} + +func matchValidatorVote(vote dto.ProposalVote, answer string) bool { + switch answer { + case "yes": + return vote.Yes == 1 + case "no": + return vote.No == 1 + case "no_with_veto": + return vote.NoWithVeto == 1 + case "abstain": + return vote.Abstain == 1 + case "weighted": + return vote.IsVoteWeighted + case "did_not_vote": + return vote.Yes == 0 && vote.No == 0 && vote.NoWithVeto == 0 && vote.Abstain == 0 && !vote.IsVoteWeighted + default: + return true + } +} + +func (s *proposalService) GetProposalAnswerCounts(proposalId int) (*dto.ProposalAnswerCountsResponse, error) { + return s.repo.GetProposalAnswerCounts(proposalId) +} diff --git a/api/services/tests/account_test.go b/api/services/tests/account_test.go new file mode 100644 index 00000000..dc58d5ca --- /dev/null +++ b/api/services/tests/account_test.go @@ -0,0 +1,886 @@ +package services_test + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/api/repositories/mocks" + "github.com/initia-labs/core-indexer/api/services" + "github.com/initia-labs/core-indexer/pkg/db" +) + +const ( + AccountAddress = "init1m8p6rakcfl4z5ruwa0578cqgn8c86mkc6ety2z" +) + +func TestAccountService_GetAccountByAccountAddress(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockAccountRepository() + + // Test data + expectedAccount := &db.Account{ + Address: AccountAddress, + Type: "validator", + Name: "Test Validator", + VMAddressID: "vm_address_123", + } + + // Set up mock expectations + mockRepo.On("GetAccountByAccountAddress", AccountAddress).Return(expectedAccount, nil) + + // Create service with mock repository + service := services.NewAccountService(mockRepo) + + // Call the method + result, err := service.GetAccountByAccountAddress(AccountAddress) + + // Assertions + assert.NoError(t, err) + assert.Equal(t, expectedAccount, result) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestAccountService_GetAccountByAccountAddress_Error(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockAccountRepository() + + // Set up mock expectations for error case + mockRepo.On("GetAccountByAccountAddress", AccountAddress).Return(nil, assert.AnError) + + // Create service with mock repository + service := services.NewAccountService(mockRepo) + + // Call the method + result, err := service.GetAccountByAccountAddress(AccountAddress) + + // Assertions + assert.Error(t, err) + assert.Nil(t, result) + assert.Equal(t, assert.AnError, err) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestAccountService_GetAccountProposals(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockAccountRepository() + + // Test data + pagination := dto.PaginationQuery{ + Limit: 10, + Offset: 0, + CountTotal: true, + } + + expectedProposals := []db.Proposal{ + { + ID: 1, + Title: "Test Proposal", + Status: "PROPOSAL_STATUS_VOTING_PERIOD", + Type: "Text", + ProposerID: AccountAddress, + }, + } + + // Set up mock expectations + mockRepo.On("GetAccountProposals", pagination, AccountAddress).Return(expectedProposals, int64(1), nil) + + // Create service with mock repository + service := services.NewAccountService(mockRepo) + + // Call the method + result, err := service.GetAccountProposals(pagination, AccountAddress) + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Len(t, result.Proposals, 1) + assert.Equal(t, "1", result.Pagination.Total) + assert.Equal(t, "Test Proposal", result.Proposals[0].Title) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestAccountService_GetAccountTxs(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockAccountRepository() + + // Test data + pagination := dto.PaginationQuery{ + Limit: 10, + Offset: 0, + CountTotal: true, + } + + expectedTxs := []dto.AccountTxModel{ + { + Height: 1000, + Timestamp: "2024-01-01T10:00:00Z", + Sender: AccountAddress, + Hash: "tx_hash_1", + Success: true, + IsSigner: true, + IsSend: true, + IsIbc: false, + IsMovePublish: false, + IsMoveUpgrade: false, + IsMoveExecute: false, + IsMoveScript: false, + IsOpinit: false, + }, + { + Height: 1001, + Timestamp: "2024-01-01T11:00:00Z", + Sender: AccountAddress, + Hash: "tx_hash_2", + Success: false, + IsSigner: false, + IsSend: false, + IsIbc: true, + IsMovePublish: false, + IsMoveUpgrade: false, + IsMoveExecute: false, + IsMoveScript: false, + IsOpinit: false, + }, + { + Height: 1002, + Timestamp: "2024-01-01T12:00:00Z", + Sender: AccountAddress, + Hash: "tx_hash_3", + Success: true, + IsSigner: true, + IsSend: false, + IsIbc: false, + IsMovePublish: true, + IsMoveUpgrade: false, + IsMoveExecute: false, + IsMoveScript: false, + IsOpinit: false, + }, + { + Height: 1003, + Timestamp: "2024-01-01T13:00:00Z", + Sender: AccountAddress, + Hash: "tx_hash_4", + Success: true, + IsSigner: false, + IsSend: false, + IsIbc: false, + IsMovePublish: false, + IsMoveUpgrade: false, + IsMoveExecute: true, + IsMoveScript: false, + IsOpinit: false, + }, + { + Height: 1004, + Timestamp: "2024-01-01T14:00:00Z", + Sender: AccountAddress, + Hash: "tx_hash_5", + Success: true, + IsSigner: true, + IsSend: false, + IsIbc: false, + IsMovePublish: false, + IsMoveUpgrade: false, + IsMoveExecute: false, + IsMoveScript: true, + IsOpinit: false, + }, + } + + // Set up mock expectations + mockRepo.On("GetAccountTxs", pagination, AccountAddress, "", false, false, false, false, false, false, false, (*bool)(nil)).Return(expectedTxs, int64(5), nil) + + // Create service with mock repository + service := services.NewAccountService(mockRepo) + + // Call the method + result, err := service.GetAccountTxs( + pagination, + AccountAddress, + "", + false, + false, + false, + false, + false, + false, + false, + nil, + ) + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Len(t, result.AccountTxs, 5) + assert.Equal(t, "5", result.Pagination.Total) + + // Test individual transaction properties + assert.Equal(t, "74785f686173685f31", result.AccountTxs[0].Hash) // hex encoded "tx_hash_1" + assert.Equal(t, int64(1000), result.AccountTxs[0].Height) + assert.True(t, result.AccountTxs[0].IsSigner) + assert.True(t, result.AccountTxs[0].IsSend) + + assert.Equal(t, "74785f686173685f32", result.AccountTxs[1].Hash) // hex encoded "tx_hash_2" + assert.Equal(t, int64(1001), result.AccountTxs[1].Height) + assert.False(t, result.AccountTxs[1].IsSigner) + assert.True(t, result.AccountTxs[1].IsIbc) + + assert.Equal(t, "74785f686173685f33", result.AccountTxs[2].Hash) // hex encoded "tx_hash_3" + assert.True(t, result.AccountTxs[2].IsMovePublish) + + assert.Equal(t, "74785f686173685f34", result.AccountTxs[3].Hash) // hex encoded "tx_hash_4" + assert.True(t, result.AccountTxs[3].IsMoveExecute) + + assert.Equal(t, "74785f686173685f35", result.AccountTxs[4].Hash) // hex encoded "tx_hash_5" + assert.True(t, result.AccountTxs[4].IsMoveScript) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestAccountService_GetAccountProposals_Pagination(t *testing.T) { + testCases := []struct { + name string + pagination dto.PaginationQuery + expectedTotal int64 + expectedLength int + expectedFirstTitle string + expectedLastTitle string + }{ + { + name: "Default pagination", + pagination: dto.PaginationQuery{ + Limit: 10, + Offset: 0, + CountTotal: true, + }, + expectedTotal: 11, + expectedLength: 10, + expectedFirstTitle: "Test Proposal 1", + expectedLastTitle: "Test Proposal 10", + }, + { + name: "Custom limit and offset", + pagination: dto.PaginationQuery{ + Limit: 5, + Offset: 5, + CountTotal: true, + }, + expectedTotal: 11, + expectedLength: 5, + expectedFirstTitle: "Test Proposal 6", + expectedLastTitle: "Test Proposal 10", + }, + { + name: "Large limit", + pagination: dto.PaginationQuery{ + Limit: 100, + Offset: 0, + CountTotal: true, + }, + expectedTotal: 11, + expectedLength: 11, + expectedFirstTitle: "Test Proposal 1", + expectedLastTitle: "Test Proposal 11", + }, + { + name: "Zero offset", + pagination: dto.PaginationQuery{ + Limit: 10, + Offset: 0, + CountTotal: true, + }, + expectedTotal: 11, + expectedLength: 10, + expectedFirstTitle: "Test Proposal 1", + expectedLastTitle: "Test Proposal 10", + }, + { + name: "Cases without count total", + pagination: dto.PaginationQuery{ + Limit: 10, + Offset: 0, + }, + expectedTotal: 11, // Changed from "11" to 11 + expectedLength: 10, + expectedFirstTitle: "Test Proposal 1", + expectedLastTitle: "Test Proposal 10", + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // Create mock repository for each test case + mockRepo := mocks.NewMockAccountRepository() + + // Create the full dataset + allProposals := []db.Proposal{ + { + ID: 1, + Title: "Test Proposal 1", + Status: "PROPOSAL_STATUS_VOTING_PERIOD", + Type: "Text", + ProposerID: AccountAddress, + }, + { + ID: 2, + Title: "Test Proposal 2", + Status: "PROPOSAL_STATUS_VOTING_PERIOD", + Type: "Text", + ProposerID: AccountAddress, + }, + { + ID: 3, + Title: "Test Proposal 3", + Status: "PROPOSAL_STATUS_VOTING_PERIOD", + Type: "Text", + ProposerID: AccountAddress, + }, + { + ID: 4, + Title: "Test Proposal 4", + Status: "PROPOSAL_STATUS_VOTING_PERIOD", + Type: "Text", + ProposerID: AccountAddress, + }, + { + ID: 5, + Title: "Test Proposal 5", + Status: "PROPOSAL_STATUS_VOTING_PERIOD", + Type: "Text", + ProposerID: AccountAddress, + }, + { + ID: 6, + Title: "Test Proposal 6", + Status: "PROPOSAL_STATUS_VOTING_PERIOD", + Type: "Text", + ProposerID: AccountAddress, + }, + { + ID: 7, + Title: "Test Proposal 7", + Status: "PROPOSAL_STATUS_VOTING_PERIOD", + Type: "Text", + ProposerID: AccountAddress, + }, + { + ID: 8, + Title: "Test Proposal 8", + Status: "PROPOSAL_STATUS_VOTING_PERIOD", + Type: "Text", + ProposerID: AccountAddress, + }, + { + ID: 9, + Title: "Test Proposal 9", + Status: "PROPOSAL_STATUS_VOTING_PERIOD", + Type: "Text", + ProposerID: AccountAddress, + }, + { + ID: 10, + Title: "Test Proposal 10", + Status: "PROPOSAL_STATUS_VOTING_PERIOD", + Type: "Text", + ProposerID: AccountAddress, + }, + { + ID: 11, + Title: "Test Proposal 11", + Status: "PROPOSAL_STATUS_VOTING_PERIOD", + Type: "Text", + ProposerID: AccountAddress, + }, + } + + // Calculate the expected subset based on pagination + start := tc.pagination.Offset + end := start + tc.pagination.Limit + if end > len(allProposals) { + end = len(allProposals) + } + expectedProposals := allProposals[start:end] + + // Set up mock expectations for this specific test case + mockRepo.On("GetAccountProposals", tc.pagination, AccountAddress).Return(expectedProposals, tc.expectedTotal, nil) + + // Create service with mock repository + service := services.NewAccountService(mockRepo) + + // Call the method + result, err := service.GetAccountProposals(tc.pagination, AccountAddress) + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Equal(t, fmt.Sprintf("%d", tc.expectedTotal), result.Pagination.Total) + assert.Len(t, result.Proposals, tc.expectedLength) + + if tc.expectedLength > 0 { + assert.Equal(t, tc.expectedFirstTitle, result.Proposals[0].Title) + assert.Equal(t, tc.expectedLastTitle, result.Proposals[tc.expectedLength-1].Title) + } + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) + }) + } +} + +func TestAccountService_GetAccountTxs_Pagination(t *testing.T) { + testCases := []struct { + name string + pagination dto.PaginationQuery + expectedTotal int64 // Changed from string to int64 + expectedLength int + expectedFirstHash string + expectedLastHash string + }{ + { + name: "Default pagination", + pagination: dto.PaginationQuery{ + Limit: 10, + Offset: 0, + CountTotal: true, + }, + expectedTotal: 11, + expectedLength: 10, + expectedFirstHash: "74785f686173685f31", // hex for "tx_hash_1" + expectedLastHash: "74785f686173685f3130", // hex for "tx_hash_10" + }, + { + name: "Small limit (3 items)", + pagination: dto.PaginationQuery{ + Limit: 3, + Offset: 0, + CountTotal: true, + }, + expectedTotal: 11, + expectedLength: 3, + expectedFirstHash: "74785f686173685f31", // hex for "tx_hash_1" + expectedLastHash: "74785f686173685f33", // hex for "tx_hash_3" + }, + { + name: "Offset pagination", + pagination: dto.PaginationQuery{ + Limit: 6, + Offset: 5, + CountTotal: true, + }, + expectedTotal: 11, + expectedLength: 6, + expectedFirstHash: "74785f686173685f36", // hex for "tx_hash_6" + expectedLastHash: "74785f686173685f3131", // hex for "tx_hash_11" + }, + { + name: "Large limit", + pagination: dto.PaginationQuery{ + Limit: 100, + Offset: 0, + CountTotal: true, + }, + expectedTotal: 11, + expectedLength: 11, + expectedFirstHash: "74785f686173685f31", // hex for "tx_hash_1" + expectedLastHash: "74785f686173685f3131", // hex for "tx_hash_11" + }, + { + name: "Cases without count total", + pagination: dto.PaginationQuery{ + Limit: 10, + Offset: 0, + }, + expectedTotal: 11, + expectedLength: 10, + expectedFirstHash: "74785f686173685f31", // hex for "tx_hash_1" + expectedLastHash: "74785f686173685f3130", // hex for "tx_hash_10" + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // Create mock repository for each test case + mockRepo := mocks.NewMockAccountRepository() + + // Create the full dataset + allTxs := []dto.AccountTxModel{ + { + Height: 1000, + Timestamp: "2024-01-01T10:00:00Z", + Sender: AccountAddress, + Hash: "tx_hash_1", + Success: true, + IsSigner: true, + IsSend: true, + IsIbc: false, + IsMovePublish: false, + IsMoveUpgrade: false, + IsMoveExecute: false, + IsMoveScript: false, + IsOpinit: false, + }, + { + Height: 1001, + Timestamp: "2024-01-01T11:00:00Z", + Sender: AccountAddress, + Hash: "tx_hash_2", + Success: false, + IsSigner: false, + IsSend: false, + IsIbc: true, + IsMovePublish: false, + IsMoveUpgrade: false, + IsMoveExecute: false, + IsMoveScript: false, + IsOpinit: false, + }, + { + Height: 1002, + Timestamp: "2024-01-01T12:00:00Z", + Sender: AccountAddress, + Hash: "tx_hash_3", + Success: true, + IsSigner: true, + IsSend: false, + IsIbc: false, + IsMovePublish: true, + IsMoveUpgrade: false, + IsMoveExecute: false, + IsMoveScript: false, + IsOpinit: false, + }, + { + Height: 1003, + Timestamp: "2024-01-01T13:00:00Z", + Sender: AccountAddress, + Hash: "tx_hash_4", + Success: true, + IsSigner: false, + IsSend: false, + IsIbc: false, + IsMovePublish: false, + IsMoveUpgrade: false, + IsMoveExecute: true, + IsMoveScript: false, + IsOpinit: false, + }, + { + Height: 1004, + Timestamp: "2024-01-01T14:00:00Z", + Sender: AccountAddress, + Hash: "tx_hash_5", + Success: true, + IsSigner: true, + IsSend: false, + IsIbc: false, + IsMovePublish: false, + IsMoveUpgrade: false, + IsMoveExecute: false, + IsMoveScript: true, + IsOpinit: false, + }, + { + Height: 1005, + Timestamp: "2024-01-01T15:00:00Z", + Sender: AccountAddress, + Hash: "tx_hash_6", + Success: true, + IsSigner: false, + IsSend: true, + IsIbc: true, + IsMovePublish: false, + IsMoveUpgrade: false, + IsMoveExecute: false, + IsMoveScript: false, + IsOpinit: false, + }, + { + Height: 1006, + Timestamp: "2024-01-01T16:00:00Z", + Sender: AccountAddress, + Hash: "tx_hash_7", + Success: false, + IsSigner: true, + IsSend: false, + IsIbc: false, + IsMovePublish: false, + IsMoveUpgrade: true, + IsMoveExecute: false, + IsMoveScript: false, + IsOpinit: false, + }, + { + Height: 1007, + Timestamp: "2024-01-01T17:00:00Z", + Sender: AccountAddress, + Hash: "tx_hash_8", + Success: true, + IsSigner: false, + IsSend: true, + IsIbc: true, + IsMovePublish: false, + IsMoveUpgrade: false, + IsMoveExecute: false, + IsMoveScript: false, + IsOpinit: false, + }, + { + Height: 1008, + Timestamp: "2024-01-01T18:00:00Z", + Sender: AccountAddress, + Hash: "tx_hash_9", + Success: true, + IsSigner: true, + IsSend: false, + IsIbc: false, + IsMovePublish: false, + IsMoveUpgrade: false, + IsMoveExecute: false, + IsMoveScript: false, + IsOpinit: false, + }, + { + Height: 1009, + Timestamp: "2024-01-01T19:00:00Z", + Sender: AccountAddress, + Hash: "tx_hash_10", + Success: true, + IsSigner: false, + IsSend: false, + IsIbc: false, + IsMovePublish: false, + IsMoveUpgrade: false, + IsMoveExecute: false, + IsMoveScript: false, + IsOpinit: false, + }, + { + Height: 1010, + Timestamp: "2024-01-01T20:00:00Z", + Sender: AccountAddress, + Hash: "tx_hash_11", + Success: true, + IsSigner: true, + IsSend: false, + IsIbc: false, + IsMovePublish: false, + IsMoveUpgrade: false, + IsMoveExecute: false, + IsMoveScript: false, + IsOpinit: false, + }, + } + + // Calculate the expected subset based on pagination + start := tc.pagination.Offset + end := start + tc.pagination.Limit + if end > len(allTxs) { + end = len(allTxs) + } + expectedTxs := allTxs[start:end] + + // Set up mock expectations for this specific test case + mockRepo.On("GetAccountTxs", tc.pagination, AccountAddress, "", false, false, false, false, false, false, false, (*bool)(nil)).Return(expectedTxs, tc.expectedTotal, nil) + + // Create service with mock repository + service := services.NewAccountService(mockRepo) + + // Call the method + result, err := service.GetAccountTxs( + tc.pagination, + AccountAddress, + "", + false, + false, + false, + false, + false, + false, + false, + nil, + ) + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Equal(t, fmt.Sprintf("%d", tc.expectedTotal), result.Pagination.Total) + assert.Len(t, result.AccountTxs, tc.expectedLength) + + if tc.expectedLength > 0 { + assert.Equal(t, tc.expectedFirstHash, result.AccountTxs[0].Hash) + assert.Equal(t, tc.expectedLastHash, result.AccountTxs[tc.expectedLength-1].Hash) + } + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) + }) + } +} + +func TestAccountService_GetAccountProposals_PaginationEdgeCases(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockAccountRepository() + + t.Run("Empty result set", func(t *testing.T) { + pagination := dto.PaginationQuery{ + Limit: 10, + Offset: 0, + CountTotal: true, + } + + // Set up mock expectations for empty result + mockRepo.On("GetAccountProposals", pagination, AccountAddress).Return([]db.Proposal{}, int64(0), nil) + + // Create service with mock repository + service := services.NewAccountService(mockRepo) + + // Call the method + result, err := service.GetAccountProposals(pagination, AccountAddress) + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Equal(t, "0", result.Pagination.Total) + assert.Len(t, result.Proposals, 0) + assert.NotNil(t, result.Proposals) // Should be empty slice, not nil + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) + }) + + t.Run("Offset beyond total count", func(t *testing.T) { + pagination := dto.PaginationQuery{ + Limit: 10, + Offset: 100, // Beyond total count + CountTotal: true, + } + + // Set up mock expectations for offset beyond total + mockRepo.On("GetAccountProposals", pagination, AccountAddress).Return([]db.Proposal{}, int64(25), nil) + + // Create service with mock repository + service := services.NewAccountService(mockRepo) + + // Call the method + result, err := service.GetAccountProposals(pagination, AccountAddress) + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Equal(t, fmt.Sprintf("%d", int64(25)), result.Pagination.Total) + assert.Len(t, result.Proposals, 0) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) + }) +} + +func TestAccountService_GetAccountTxs_PaginationEdgeCases(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockAccountRepository() + + t.Run("Empty result set", func(t *testing.T) { + pagination := dto.PaginationQuery{ + Limit: 10, + Offset: 0, + CountTotal: true, + } + + // Set up mock expectations for empty result + mockRepo.On("GetAccountTxs", pagination, AccountAddress, "", false, false, false, false, false, false, false, (*bool)(nil)).Return([]dto.AccountTxModel{}, int64(0), nil) + + // Create service with mock repository + service := services.NewAccountService(mockRepo) + + // Call the method + result, err := service.GetAccountTxs( + pagination, + AccountAddress, + "", + false, + false, + false, + false, + false, + false, + false, + nil, + ) + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Equal(t, "0", result.Pagination.Total) + assert.Len(t, result.AccountTxs, 0) + assert.NotNil(t, result.AccountTxs) // Should be empty slice, not nil + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) + }) + + t.Run("Limit 1 pagination", func(t *testing.T) { + pagination := dto.PaginationQuery{ + Limit: 1, + Offset: 0, + CountTotal: true, + } + + expectedTx := dto.AccountTxModel{ + Height: 1000, + Timestamp: "2024-01-01T10:00:00Z", + Sender: AccountAddress, + Hash: "tx_hash_1", + Success: true, + IsSigner: true, + IsSend: true, + IsIbc: false, + IsMovePublish: false, + IsMoveUpgrade: false, + IsMoveExecute: false, + IsMoveScript: false, + IsOpinit: false, + } + + // Set up mock expectations for single result + mockRepo.On("GetAccountTxs", pagination, AccountAddress, "", false, false, false, false, false, false, false, (*bool)(nil)).Return([]dto.AccountTxModel{expectedTx}, int64(100), nil) + + // Create service with mock repository + service := services.NewAccountService(mockRepo) + + // Call the method + result, err := service.GetAccountTxs( + pagination, + AccountAddress, + "", + false, + false, + false, + false, + false, + false, + false, + nil, + ) + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Equal(t, "100", result.Pagination.Total) + assert.Len(t, result.AccountTxs, 1) + assert.Equal(t, "74785f686173685f31", result.AccountTxs[0].Hash) // hex encoded "tx_hash_1" + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) + }) +} diff --git a/api/services/tests/block_test.go b/api/services/tests/block_test.go new file mode 100644 index 00000000..13d8be86 --- /dev/null +++ b/api/services/tests/block_test.go @@ -0,0 +1,628 @@ +package services_test + +import ( + "fmt" + "testing" + "time" + + "github.com/stretchr/testify/assert" + + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/api/repositories/mocks" + "github.com/initia-labs/core-indexer/api/services" +) + +func TestBlockService_GetBlockHeightLatest(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockBlockRepository() + + // Test data + expectedHeight := int64(1000) + + // Set up mock expectations + mockRepo.On("GetBlockHeightLatest").Return(&expectedHeight, nil) + + // Create service with mock repository + service := services.NewBlockService(mockRepo) + + // Call the method + result, err := service.GetBlockHeightLatest() + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Equal(t, expectedHeight, result.Height) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestBlockService_GetBlockHeightLatest_Error(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockBlockRepository() + + // Test data + var nilHeight *int64 = nil + + // Set up mock expectations for error case + mockRepo.On("GetBlockHeightLatest").Return(nilHeight, assert.AnError) + + // Create service with mock repository + service := services.NewBlockService(mockRepo) + + // Call the method + result, err := service.GetBlockHeightLatest() + + // Assertions + assert.Error(t, err) + assert.Nil(t, result) + assert.Equal(t, assert.AnError, err) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestBlockService_GetBlockHeightInformativeLatest(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockBlockRepository() + + // Test data + expectedHeight := int64(950) + + // Set up mock expectations + mockRepo.On("GetBlockHeightInformativeLatest").Return(&expectedHeight, nil) + + // Create service with mock repository + service := services.NewBlockService(mockRepo) + + // Call the method + result, err := service.GetBlockHeightInformativeLatest() + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Equal(t, expectedHeight, result.Height) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestBlockService_GetBlockTimeAverage(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockBlockRepository() + + // Test data + latestHeight := int64(1000) + timestamps := []time.Time{ + time.Date(2024, 1, 1, 10, 0, 0, 0, time.UTC), + time.Date(2024, 1, 1, 9, 59, 30, 0, time.UTC), + time.Date(2024, 1, 1, 9, 59, 0, 0, time.UTC), + } + + // Set up mock expectations + mockRepo.On("GetBlockHeightLatest").Return(&latestHeight, nil) + mockRepo.On("GetBlockTimestamp", latestHeight).Return(timestamps, nil) + + // Create service with mock repository + service := services.NewBlockService(mockRepo) + + // Call the method + result, err := service.GetBlockTimeAverage() + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Equal(t, 30.0, result.AverageBlockTime) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestBlockService_GetBlocks(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockBlockRepository() + + // Test data + pagination := dto.PaginationQuery{ + Limit: 10, + Offset: 0, + CountTotal: true, + } + + expectedBlocks := []dto.BlockModel{ + { + Hash: "block_hash_123", + Height: 1000, + Timestamp: "2024-01-01T10:00:00Z", + OperatorAddress: "initvaloper1test", + Moniker: "Test Validator", + Identity: "test-identity", + TxCount: 5, + }, + } + + // Set up mock expectations + mockRepo.On("GetBlocks", pagination).Return(expectedBlocks, int64(1), nil) + + // Create service with mock repository + service := services.NewBlockService(mockRepo) + + // Call the method + result, err := service.GetBlocks(pagination) + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Len(t, result.Blocks, 1) + assert.Equal(t, fmt.Sprintf("%d", int64(1)), result.Pagination.Total) + assert.Equal(t, "626c6f636b5f686173685f313233", result.Blocks[0].Hash) // hex encoded + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestBlockService_GetBlockInfo(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockBlockRepository() + + // Test data + height := int64(1000) + expectedBlockInfo := &dto.BlockInfoModel{ + Hash: "block_hash_123", + Height: height, + Timestamp: "2024-01-01T10:00:00Z", + OperatorAddress: "initvaloper1test", + Moniker: "Test Validator", + Identity: "test-identity", + GasUsed: 1000000, + GasLimit: 2000000, + } + + // Set up mock expectations + mockRepo.On("GetBlockInfo", height).Return(expectedBlockInfo, nil) + + // Create service with mock repository + service := services.NewBlockService(mockRepo) + + // Call the method + result, err := service.GetBlockInfo(height) + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Equal(t, "626c6f636b5f686173685f313233", result.Hash) // hex encoded + assert.Equal(t, height, result.Height) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestBlockService_GetBlockTxs(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockBlockRepository() + + // Test data + pagination := dto.PaginationQuery{ + Limit: 10, + Offset: 0, + CountTotal: true, + } + height := int64(1000) + + expectedTxs := []dto.BlockTxModel{ + { + Height: height, + Timestamp: "2024-01-01T10:00:00Z", + Address: "init1test1", + Hash: "tx_hash_1", + Success: true, + Messages: []byte(`[{"type": "send"}]`), + IsSend: true, + IsIbc: false, + IsOpinit: false, + }, + { + Height: height, + Timestamp: "2024-01-01T10:00:05Z", + Address: "init1test2", + Hash: "tx_hash_2", + Success: true, + Messages: []byte(`[{"type": "ibc_transfer"}]`), + IsSend: false, + IsIbc: true, + IsOpinit: false, + }, + { + Height: height, + Timestamp: "2024-01-01T10:00:10Z", + Address: "init1test3", + Hash: "tx_hash_3", + Success: false, + Messages: []byte(`[{"type": "opinit"}]`), + IsSend: false, + IsIbc: false, + IsOpinit: true, + }, + { + Height: height, + Timestamp: "2024-01-01T10:00:15Z", + Address: "init1test4", + Hash: "tx_hash_4", + Success: true, + Messages: []byte(`[{"type": "move"}]`), + IsSend: false, + IsIbc: false, + IsOpinit: false, + }, + } + + // Set up mock expectations + mockRepo.On("GetBlockTxs", pagination, height).Return(expectedTxs, int64(4), nil) + + // Create service with mock repository + service := services.NewBlockService(mockRepo) + + // Call the method + result, err := service.GetBlockTxs(pagination, height) + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Len(t, result.BlockTxs, 4) + assert.Equal(t, fmt.Sprintf("%d", int64(4)), result.Pagination.Total) + + // Check first transaction (send type) + assert.Equal(t, "74785f686173685f31", result.BlockTxs[0].Hash) // hex encoded + assert.Equal(t, "init1test1", result.BlockTxs[0].Address) + assert.True(t, result.BlockTxs[0].Success) + assert.True(t, result.BlockTxs[0].IsSend) + assert.False(t, result.BlockTxs[0].IsIbc) + assert.False(t, result.BlockTxs[0].IsOpinit) + + // Check second transaction (IBC type) + assert.Equal(t, "74785f686173685f32", result.BlockTxs[1].Hash) // hex encoded + assert.Equal(t, "init1test2", result.BlockTxs[1].Address) + assert.True(t, result.BlockTxs[1].Success) + assert.False(t, result.BlockTxs[1].IsSend) + assert.True(t, result.BlockTxs[1].IsIbc) + assert.False(t, result.BlockTxs[1].IsOpinit) + + // Check third transaction (Opinit type, failed) + assert.Equal(t, "74785f686173685f33", result.BlockTxs[2].Hash) // hex encoded + assert.Equal(t, "init1test3", result.BlockTxs[2].Address) + assert.False(t, result.BlockTxs[2].Success) + assert.False(t, result.BlockTxs[2].IsSend) + assert.False(t, result.BlockTxs[2].IsIbc) + assert.True(t, result.BlockTxs[2].IsOpinit) + + // Check fourth transaction (Move type) + assert.Equal(t, "74785f686173685f34", result.BlockTxs[3].Hash) // hex encoded + assert.Equal(t, "init1test4", result.BlockTxs[3].Address) + assert.True(t, result.BlockTxs[3].Success) + assert.False(t, result.BlockTxs[3].IsSend) + assert.False(t, result.BlockTxs[3].IsIbc) + assert.False(t, result.BlockTxs[3].IsOpinit) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestBlockService_GetBlocks_WithPagination(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockBlockRepository() + + // Test data for different pagination scenarios + testCases := []struct { + name string + pagination dto.PaginationQuery + expectedBlocks []dto.BlockModel + expectedTotal int64 + expectedCount int + }{ + { + name: "First page with limit 5", + pagination: dto.PaginationQuery{ + Limit: 5, + Offset: 0, + CountTotal: true, + }, + expectedBlocks: []dto.BlockModel{ + { + Hash: "block_hash_1", + Height: 1000, + Timestamp: "2024-01-01T10:00:00Z", + OperatorAddress: "initvaloper1test1", + Moniker: "Test Validator 1", + Identity: "test-identity-1", + TxCount: 5, + }, + { + Hash: "block_hash_2", + Height: 999, + Timestamp: "2024-01-01T09:59:30Z", + OperatorAddress: "initvaloper1test2", + Moniker: "Test Validator 2", + Identity: "test-identity-2", + TxCount: 3, + }, + }, + expectedTotal: 50, + expectedCount: 2, + }, + { + name: "Second page with offset", + pagination: dto.PaginationQuery{ + Limit: 3, + Offset: 5, + CountTotal: true, + }, + expectedBlocks: []dto.BlockModel{ + { + Hash: "block_hash_6", + Height: 995, + Timestamp: "2024-01-01T09:57:00Z", + OperatorAddress: "initvaloper1test6", + Moniker: "Test Validator 6", + Identity: "test-identity-6", + TxCount: 2, + }, + }, + expectedTotal: 50, + expectedCount: 1, + }, + { + name: "Empty result with high offset", + pagination: dto.PaginationQuery{ + Limit: 10, + Offset: 100, + CountTotal: true, + }, + expectedBlocks: []dto.BlockModel{}, + expectedTotal: 50, + expectedCount: 0, + }, + { + name: "Large limit", + pagination: dto.PaginationQuery{ + Limit: 1000, + Offset: 0, + CountTotal: true, + }, + expectedBlocks: []dto.BlockModel{ + { + Hash: "block_hash_1", + Height: 1000, + Timestamp: "2024-01-01T10:00:00Z", + OperatorAddress: "initvaloper1test1", + Moniker: "Test Validator 1", + Identity: "test-identity-1", + TxCount: 5, + }, + }, + expectedTotal: 50, + expectedCount: 1, + }, + { + name: "Without count total", + pagination: dto.PaginationQuery{ + Limit: 5, + Offset: 0, + CountTotal: false, + }, + expectedBlocks: []dto.BlockModel{ + { + Hash: "block_hash_1", + Height: 1000, + Timestamp: "2024-01-01T10:00:00Z", + OperatorAddress: "initvaloper1test1", + Moniker: "Test Validator 1", + Identity: "test-identity-1", + TxCount: 5, + }, + }, + expectedTotal: 0, // When CountTotal is false, total should be 0 + expectedCount: 1, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // Set up mock expectations for this test case + mockRepo.On("GetBlocks", tc.pagination).Return(tc.expectedBlocks, tc.expectedTotal, nil) + + // Create service with mock repository + service := services.NewBlockService(mockRepo) + + // Call the method + result, err := service.GetBlocks(tc.pagination) + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Len(t, result.Blocks, tc.expectedCount) + assert.Equal(t, fmt.Sprintf("%d", tc.expectedTotal), result.Pagination.Total) + + // Verify the blocks are properly formatted + if len(result.Blocks) > 0 { + assert.Equal(t, fmt.Sprintf("%x", tc.expectedBlocks[0].Hash), result.Blocks[0].Hash) + assert.Equal(t, tc.expectedBlocks[0].Height, result.Blocks[0].Height) + assert.Equal(t, tc.expectedBlocks[0].Timestamp, result.Blocks[0].Timestamp) + assert.Equal(t, tc.expectedBlocks[0].TxCount, result.Blocks[0].TxCount) + assert.Equal(t, tc.expectedBlocks[0].OperatorAddress, result.Blocks[0].Proposer.OperatorAddress) + assert.Equal(t, tc.expectedBlocks[0].Moniker, result.Blocks[0].Proposer.Moniker) + assert.Equal(t, tc.expectedBlocks[0].Identity, result.Blocks[0].Proposer.Identity) + } + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) + }) + } +} + +func TestBlockService_GetBlockTxs_WithPagination(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockBlockRepository() + + // Test data for different pagination scenarios + testCases := []struct { + name string + pagination dto.PaginationQuery + height int64 + expectedTxs []dto.BlockTxModel + expectedTotal int64 + expectedCount int + }{ + { + name: "First page of transactions", + pagination: dto.PaginationQuery{ + Limit: 3, + Offset: 0, + CountTotal: true, + }, + height: 1000, + expectedTxs: []dto.BlockTxModel{ + { + Height: 1000, + Timestamp: "2024-01-01T10:00:00Z", + Address: "init1test1", + Hash: "tx_hash_1", + Success: true, + Messages: []byte(`[{"type": "send"}]`), + IsSend: true, + IsIbc: false, + IsOpinit: false, + }, + { + Height: 1000, + Timestamp: "2024-01-01T10:00:05Z", + Address: "init1test2", + Hash: "tx_hash_2", + Success: true, + Messages: []byte(`[{"type": "ibc_transfer"}]`), + IsSend: false, + IsIbc: true, + IsOpinit: false, + }, + { + Height: 1000, + Timestamp: "2024-01-01T10:00:10Z", + Address: "init1test3", + Hash: "tx_hash_3", + Success: false, + Messages: []byte(`[{"type": "opinit"}]`), + IsSend: false, + IsIbc: false, + IsOpinit: true, + }, + }, + expectedTotal: 15, + expectedCount: 3, + }, + { + name: "Second page of transactions", + pagination: dto.PaginationQuery{ + Limit: 2, + Offset: 3, + CountTotal: true, + }, + height: 1000, + expectedTxs: []dto.BlockTxModel{ + { + Height: 1000, + Timestamp: "2024-01-01T10:00:15Z", + Address: "init1test4", + Hash: "tx_hash_4", + Success: true, + Messages: []byte(`[{"type": "move"}]`), + IsSend: false, + IsIbc: false, + IsOpinit: false, + }, + { + Height: 1000, + Timestamp: "2024-01-01T10:00:20Z", + Address: "init1test5", + Hash: "tx_hash_5", + Success: true, + Messages: []byte(`[{"type": "send"}]`), + IsSend: true, + IsIbc: false, + IsOpinit: false, + }, + }, + expectedTotal: 15, + expectedCount: 2, + }, + { + name: "Empty result with high offset", + pagination: dto.PaginationQuery{ + Limit: 10, + Offset: 20, + CountTotal: true, + }, + height: 1000, + expectedTxs: []dto.BlockTxModel{}, + expectedTotal: 15, + expectedCount: 0, + }, + { + name: "Without count total", + pagination: dto.PaginationQuery{ + Limit: 5, + Offset: 0, + CountTotal: false, + }, + height: 1000, + expectedTxs: []dto.BlockTxModel{ + { + Height: 1000, + Timestamp: "2024-01-01T10:00:00Z", + Address: "init1test1", + Hash: "tx_hash_1", + Success: true, + Messages: []byte(`[{"type": "send"}]`), + IsSend: true, + IsIbc: false, + IsOpinit: false, + }, + }, + expectedTotal: 0, // When CountTotal is false, total should be 0 + expectedCount: 1, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // Set up mock expectations for this test case + mockRepo.On("GetBlockTxs", tc.pagination, tc.height).Return(tc.expectedTxs, tc.expectedTotal, nil) + + // Create service with mock repository + service := services.NewBlockService(mockRepo) + + // Call the method + result, err := service.GetBlockTxs(tc.pagination, tc.height) + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Len(t, result.BlockTxs, tc.expectedCount) + assert.Equal(t, fmt.Sprintf("%d", tc.expectedTotal), result.Pagination.Total) + + // Verify the transactions are properly formatted + if len(result.BlockTxs) > 0 { + assert.Equal(t, fmt.Sprintf("%x", tc.expectedTxs[0].Hash), result.BlockTxs[0].Hash) + assert.Equal(t, tc.expectedTxs[0].Height, result.BlockTxs[0].Height) + assert.Equal(t, tc.expectedTxs[0].Timestamp, result.BlockTxs[0].Timestamp) + assert.Equal(t, tc.expectedTxs[0].Address, result.BlockTxs[0].Address) + assert.Equal(t, tc.expectedTxs[0].Success, result.BlockTxs[0].Success) + assert.Equal(t, tc.expectedTxs[0].Messages, result.BlockTxs[0].Messages) + assert.Equal(t, tc.expectedTxs[0].IsSend, result.BlockTxs[0].IsSend) + assert.Equal(t, tc.expectedTxs[0].IsIbc, result.BlockTxs[0].IsIbc) + assert.Equal(t, tc.expectedTxs[0].IsOpinit, result.BlockTxs[0].IsOpinit) + } + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) + }) + } +} diff --git a/api/services/tests/module_test.go b/api/services/tests/module_test.go new file mode 100644 index 00000000..430eeab4 --- /dev/null +++ b/api/services/tests/module_test.go @@ -0,0 +1,644 @@ +package services_test + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/assert" + "gorm.io/gorm" + + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/api/repositories/mocks" + "github.com/initia-labs/core-indexer/api/services" +) + +func TestModuleService_GetModules(t *testing.T) { + tests := []struct { + name string + pagination dto.PaginationQuery + mockModules []dto.ModuleResponse + mockTotal int64 + mockError error + expectedResult *dto.ModulesResponse + expectedError error + }{ + { + name: "successful get modules", + pagination: dto.PaginationQuery{ + Limit: 10, + Offset: 0, + CountTotal: true, + }, + mockModules: []dto.ModuleResponse{ + { + ModuleName: "test_module", + Digest: "abc123", + IsVerify: true, + Address: "0x123", + Height: 100, + LatestUpdated: "2023-01-01T00:00:00Z", + IsRepublished: false, + }, + }, + mockTotal: 1, + mockError: nil, + expectedResult: &dto.ModulesResponse{ + Modules: []dto.ModuleResponse{ + { + ModuleName: "test_module", + Digest: "abc123", + IsVerify: true, + Address: "0x123", + Height: 100, + LatestUpdated: "2023-01-01T00:00:00Z", + IsRepublished: false, + }, + }, + Pagination: dto.NewPaginationResponse(0, 10, 1), + }, + expectedError: nil, + }, + { + name: "repository error", + pagination: dto.PaginationQuery{ + Limit: 10, + Offset: 0, + }, + mockModules: nil, + mockTotal: 0, + mockError: errors.New("database error"), + expectedResult: nil, + expectedError: errors.New("database error"), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mockRepo := mocks.NewMockModuleRepository() + service := services.NewModuleService(mockRepo) + + mockRepo.On("GetModules", tt.pagination).Return(tt.mockModules, tt.mockTotal, tt.mockError) + + result, err := service.GetModules(tt.pagination) + + if tt.expectedError != nil { + assert.Error(t, err) + assert.Equal(t, tt.expectedError.Error(), err.Error()) + } else { + assert.NoError(t, err) + assert.Equal(t, tt.expectedResult, result) + } + + mockRepo.AssertExpectations(t) + }) + } +} + +func TestModuleService_GetModuleById(t *testing.T) { + tests := []struct { + name string + vmAddress string + moduleName string + mockModule *dto.ModuleResponse + mockError error + expectedResult *dto.ModuleResponse + expectedError error + }{ + { + name: "successful get module by id", + vmAddress: "0x123", + moduleName: "test_module", + mockModule: &dto.ModuleResponse{ + ModuleName: "test_module", + Digest: "abc123", + IsVerify: true, + Address: "0x123", + Height: 100, + LatestUpdated: "2023-01-01T00:00:00Z", + IsRepublished: false, + }, + mockError: nil, + expectedResult: &dto.ModuleResponse{ + ModuleName: "test_module", + Digest: "abc123", + IsVerify: true, + Address: "0x123", + Height: 100, + LatestUpdated: "2023-01-01T00:00:00Z", + IsRepublished: false, + }, + expectedError: nil, + }, + { + name: "module not found", + vmAddress: "0x123", + moduleName: "nonexistent_module", + mockModule: nil, + mockError: errors.New("module 0x123::nonexistent_module not found"), + expectedResult: nil, + expectedError: errors.New("module 0x123::nonexistent_module not found"), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mockRepo := mocks.NewMockModuleRepository() + service := services.NewModuleService(mockRepo) + + mockRepo.On("GetModuleById", tt.vmAddress, tt.moduleName).Return(tt.mockModule, tt.mockError) + + result, err := service.GetModuleById(tt.vmAddress, tt.moduleName) + + if tt.expectedError != nil { + assert.Error(t, err) + assert.Equal(t, tt.expectedError.Error(), err.Error()) + } else { + assert.NoError(t, err) + assert.Equal(t, tt.expectedResult, result) + } + + mockRepo.AssertExpectations(t) + }) + } +} + +func TestModuleService_GetModuleHistories(t *testing.T) { + tests := []struct { + name string + pagination dto.PaginationQuery + vmAddress string + moduleName string + mockHistories []dto.ModuleHistoryResponse + mockTotal int64 + mockError error + expectedResult *dto.ModuleHistoriesResponse + expectedError error + }{ + { + name: "successful get module histories with multiple entries", + pagination: dto.PaginationQuery{ + Limit: 10, + Offset: 0, + CountTotal: true, + }, + vmAddress: "0x123", + moduleName: "test_module", + mockHistories: []dto.ModuleHistoryResponse{ + { + Height: 100, + Remark: []byte(`{"key": "value"}`), + UpgradePolicy: "immutable", + Timestamp: "2023-01-01T00:00:00Z", + }, + { + Height: 99, + Remark: []byte(`{"key": "old_value"}`), + UpgradePolicy: "compatible", + Timestamp: "2023-01-01T00:00:00Z", + }, + }, + mockTotal: 2, + mockError: nil, + expectedResult: &dto.ModuleHistoriesResponse{ + ModuleHistories: []dto.ModuleHistoryResponse{ + { + Height: 100, + Remark: []byte(`{"key": "value"}`), + UpgradePolicy: "IMMUTABLE", + Timestamp: "2023-01-01T00:00:00Z", + PreviousPolicy: func() *string { + s := "COMPATIBLE" + return &s + }(), + }, + { + Height: 99, + Remark: []byte(`{"key": "old_value"}`), + UpgradePolicy: "COMPATIBLE", + Timestamp: "2023-01-01T00:00:00Z", + PreviousPolicy: nil, + }, + }, + Pagination: dto.NewPaginationResponse(0, 10, 2), + }, + expectedError: nil, + }, + { + name: "repository error", + pagination: dto.PaginationQuery{ + Limit: 10, + Offset: 0, + }, + vmAddress: "0x123", + moduleName: "test_module", + mockHistories: nil, + mockTotal: 0, + mockError: errors.New("database error"), + expectedResult: nil, + expectedError: errors.New("database error"), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mockRepo := mocks.NewMockModuleRepository() + service := services.NewModuleService(mockRepo) + + mockRepo.On("GetModuleHistories", tt.pagination, tt.vmAddress, tt.moduleName).Return(tt.mockHistories, tt.mockTotal, tt.mockError) + + result, err := service.GetModuleHistories(tt.pagination, tt.vmAddress, tt.moduleName) + + if tt.expectedError != nil { + assert.Error(t, err) + assert.Equal(t, tt.expectedError.Error(), err.Error()) + } else { + assert.NoError(t, err) + assert.Equal(t, tt.expectedResult, result) + } + + mockRepo.AssertExpectations(t) + }) + } +} + +func TestModuleService_GetModulePublishInfo(t *testing.T) { + tests := []struct { + name string + vmAddress string + moduleName string + mockPublishInfo []dto.ModulePublishInfoModel + mockError error + expectedResult *dto.ModulePublishInfoResponse + expectedError error + }{ + { + name: "successful get module publish info with transaction hash", + vmAddress: "0x123", + moduleName: "test_module", + mockPublishInfo: []dto.ModulePublishInfoModel{ + { + Height: 100, + Proposal: nil, + Timestamp: "2023-01-01T00:00:00Z", + TransactionHash: func() *string { + s := "0xabc123" + return &s + }(), + }, + }, + mockError: nil, + expectedResult: &dto.ModulePublishInfoResponse{ + RecentPublishTransaction: func() *string { + s := "3078616263313233" // hex representation of "0xabc123" + return &s + }(), + IsRepublished: false, + RecentPublishBlockHeight: 100, + RecentPublishBlockTimestamp: "2023-01-01T00:00:00Z", + RecentPublishProposal: nil, + }, + expectedError: nil, + }, + { + name: "successful get module publish info with republished module", + vmAddress: "0x123", + moduleName: "test_module", + mockPublishInfo: []dto.ModulePublishInfoModel{ + { + Height: 100, + Proposal: nil, + Timestamp: "2023-01-01T00:00:00Z", + TransactionHash: nil, + }, + { + Height: 99, + Proposal: nil, + Timestamp: "2023-01-01T00:00:00Z", + TransactionHash: nil, + }, + }, + mockError: nil, + expectedResult: &dto.ModulePublishInfoResponse{ + RecentPublishTransaction: nil, + IsRepublished: true, + RecentPublishBlockHeight: 100, + RecentPublishBlockTimestamp: "2023-01-01T00:00:00Z", + RecentPublishProposal: nil, + }, + expectedError: nil, + }, + { + name: "no publish info found", + vmAddress: "0x123", + moduleName: "test_module", + mockPublishInfo: []dto.ModulePublishInfoModel{}, + mockError: nil, + expectedResult: nil, + expectedError: gorm.ErrRecordNotFound, + }, + { + name: "repository error", + vmAddress: "0x123", + moduleName: "test_module", + mockPublishInfo: nil, + mockError: errors.New("database error"), + expectedResult: nil, + expectedError: errors.New("database error"), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mockRepo := mocks.NewMockModuleRepository() + service := services.NewModuleService(mockRepo) + + mockRepo.On("GetModulePublishInfo", tt.vmAddress, tt.moduleName).Return(tt.mockPublishInfo, tt.mockError) + + result, err := service.GetModulePublishInfo(tt.vmAddress, tt.moduleName) + + if tt.expectedError != nil { + assert.Error(t, err) + if errors.Is(err, gorm.ErrRecordNotFound) { + assert.ErrorIs(t, err, gorm.ErrRecordNotFound) + } else { + assert.Equal(t, tt.expectedError.Error(), err.Error()) + } + } else { + assert.NoError(t, err) + assert.Equal(t, tt.expectedResult, result) + } + + mockRepo.AssertExpectations(t) + }) + } +} + +func TestModuleService_GetModuleProposals(t *testing.T) { + tests := []struct { + name string + pagination dto.PaginationQuery + vmAddress string + moduleName string + mockProposals []dto.ModuleProposalModel + mockTotal int64 + mockError error + expectedResult *dto.ModuleProposalsResponse + expectedError error + }{ + { + name: "successful get module proposals", + pagination: dto.PaginationQuery{ + Limit: 10, + Offset: 0, + CountTotal: true, + }, + vmAddress: "0x123", + moduleName: "test_module", + mockProposals: []dto.ModuleProposalModel{ + { + ID: 1, + Title: "Test Proposal", + Status: "PROPOSAL_STATUS_PASSED", + VotingEndTime: "2023-01-01T00:00:00Z", + DepositEndTime: "2023-01-01T00:00:00Z", + Types: []byte(`["gov"]`), + IsExpedited: false, + IsEmergency: false, + ResolvedHeight: 100, + Proposer: "0x456", + }, + }, + mockTotal: 1, + mockError: nil, + expectedResult: &dto.ModuleProposalsResponse{ + Proposals: []dto.ModuleProposalModel{ + { + ID: 1, + Title: "Test Proposal", + Status: "PROPOSAL_STATUS_PASSED", + VotingEndTime: "2023-01-01T00:00:00Z", + DepositEndTime: "2023-01-01T00:00:00Z", + Types: []byte(`["gov"]`), + IsExpedited: false, + IsEmergency: false, + ResolvedHeight: 100, + Proposer: "0x456", + }, + }, + Pagination: dto.NewPaginationResponse(0, 10, 1), + }, + expectedError: nil, + }, + { + name: "repository error", + pagination: dto.PaginationQuery{ + Limit: 10, + Offset: 0, + }, + vmAddress: "0x123", + moduleName: "test_module", + mockProposals: nil, + mockTotal: 0, + mockError: errors.New("database error"), + expectedResult: nil, + expectedError: errors.New("database error"), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mockRepo := mocks.NewMockModuleRepository() + service := services.NewModuleService(mockRepo) + + mockRepo.On("GetModuleProposals", tt.pagination, tt.vmAddress, tt.moduleName).Return(tt.mockProposals, tt.mockTotal, tt.mockError) + + result, err := service.GetModuleProposals(tt.pagination, tt.vmAddress, tt.moduleName) + + if tt.expectedError != nil { + assert.Error(t, err) + assert.Equal(t, tt.expectedError.Error(), err.Error()) + } else { + assert.NoError(t, err) + assert.Equal(t, tt.expectedResult, result) + } + + mockRepo.AssertExpectations(t) + }) + } +} + +func TestModuleService_GetModuleTransactions(t *testing.T) { + tests := []struct { + name string + pagination dto.PaginationQuery + vmAddress string + moduleName string + mockTxs []dto.ModuleTxResponse + mockTotal int64 + mockError error + expectedResult *dto.ModuleTxsResponse + expectedError error + }{ + { + name: "successful get module transactions", + pagination: dto.PaginationQuery{ + Limit: 10, + Offset: 0, + CountTotal: true, + }, + vmAddress: "0x123", + moduleName: "test_module", + mockTxs: []dto.ModuleTxResponse{ + { + Height: 100, + Timestamp: "2023-01-01T00:00:00Z", + Sender: "0x456", + TxHash: "0xabc123", + Success: true, + Messages: []byte(`[{"type": "move_execute"}]`), + IsSend: false, + IsIBC: false, + IsMoveExecute: true, + IsMoveExecuteEvent: false, + IsMovePublish: false, + IsMoveScript: false, + IsMoveUpgrade: false, + IsOpinit: false, + }, + }, + mockTotal: 1, + mockError: nil, + expectedResult: &dto.ModuleTxsResponse{ + ModuleTxs: []dto.ModuleTxResponse{ + { + Height: 100, + Timestamp: "2023-01-01T00:00:00Z", + Sender: "0x456", + TxHash: "3078616263313233", // Fixed: hex encoding of "0xabc123" + Success: true, + Messages: []byte(`[{"type": "move_execute"}]`), + IsSend: false, + IsIBC: false, + IsMoveExecute: true, + IsMoveExecuteEvent: false, + IsMovePublish: false, + IsMoveScript: false, + IsMoveUpgrade: false, + IsOpinit: false, + }, + }, + Pagination: dto.NewPaginationResponse(0, 10, 1), + }, + expectedError: nil, + }, + { + name: "repository error", + pagination: dto.PaginationQuery{ + Limit: 10, + Offset: 0, + }, + vmAddress: "0x123", + moduleName: "test_module", + mockTxs: nil, + mockTotal: 0, + mockError: errors.New("database error"), + expectedResult: nil, + expectedError: errors.New("database error"), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mockRepo := mocks.NewMockModuleRepository() + service := services.NewModuleService(mockRepo) + + mockRepo.On("GetModuleTransactions", tt.pagination, tt.vmAddress, tt.moduleName).Return(tt.mockTxs, tt.mockTotal, tt.mockError) + + result, err := service.GetModuleTransactions(tt.pagination, tt.vmAddress, tt.moduleName) + + if tt.expectedError != nil { + assert.Error(t, err) + assert.Equal(t, tt.expectedError.Error(), err.Error()) + } else { + assert.NoError(t, err) + assert.Equal(t, tt.expectedResult, result) + } + + mockRepo.AssertExpectations(t) + }) + } +} + +func TestModuleService_GetModuleStats(t *testing.T) { + tests := []struct { + name string + vmAddress string + moduleName string + mockStats *dto.ModuleStatsResponse + mockError error + expectedResult *dto.ModuleStatsResponse + expectedError error + }{ + { + name: "successful get module stats", + vmAddress: "0x123", + moduleName: "test_module", + mockStats: &dto.ModuleStatsResponse{ + TotalHistories: 5, + TotalProposals: func() *int64 { + var count int64 = 2 + return &count + }(), + TotalTxs: 10, + }, + mockError: nil, + expectedResult: &dto.ModuleStatsResponse{ + TotalHistories: 5, + TotalProposals: func() *int64 { + var count int64 = 2 + return &count + }(), + TotalTxs: 10, + }, + expectedError: nil, + }, + { + name: "repository error", + vmAddress: "0x123", + moduleName: "test_module", + mockStats: nil, + mockError: errors.New("database error"), + expectedResult: nil, + expectedError: errors.New("database error"), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mockRepo := mocks.NewMockModuleRepository() + service := services.NewModuleService(mockRepo) + + mockRepo.On("GetModuleStats", tt.vmAddress, tt.moduleName).Return(tt.mockStats, tt.mockError) + + result, err := service.GetModuleStats(tt.vmAddress, tt.moduleName) + + if tt.expectedError != nil { + assert.Error(t, err) + assert.Equal(t, tt.expectedError.Error(), err.Error()) + } else { + assert.NoError(t, err) + assert.Equal(t, tt.expectedResult, result) + } + + mockRepo.AssertExpectations(t) + }) + } +} + +func TestModuleService_NewModuleService(t *testing.T) { + mockRepo := mocks.NewMockModuleRepository() + service := services.NewModuleService(mockRepo) + + assert.NotNil(t, service) + assert.Implements(t, (*services.ModuleService)(nil), service) +} diff --git a/api/services/tests/nft_test.go b/api/services/tests/nft_test.go new file mode 100644 index 00000000..037ea470 --- /dev/null +++ b/api/services/tests/nft_test.go @@ -0,0 +1,992 @@ +package services_test + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/api/repositories/mocks" + "github.com/initia-labs/core-indexer/api/services" + "github.com/initia-labs/core-indexer/pkg/db" +) + +const ( + CollectionAddress = "0x1234567890abcdef1234567890abcdef12345678" + NftAddress = "0xabcdef1234567890abcdef1234567890abcdef12" +) + +func TestNftService_GetCollections(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockNftRepository() + + // Test data + pagination := dto.PaginationQuery{ + Limit: 10, + Offset: 0, + CountTotal: true, + } + search := "test" + + expectedCollections := []db.Collection{ + { + ID: CollectionAddress, + Name: "Test Collection 1", + URI: "https://example.com/collection1", + Description: "Test collection description 1", + Creator: AccountAddress, + }, + { + ID: "0x2345678901bcdef2345678901bcdef23456789", + Name: "Test Collection 2", + URI: "https://example.com/collection2", + Description: "Test collection description 2", + Creator: "init1testaccount2", + }, + } + + // Set up mock expectations + mockRepo.On("GetCollections", pagination, search).Return(expectedCollections, int64(2), nil) + + // Create service with mock repository + service := services.NewNftService(mockRepo) + + // Call the method + result, err := service.GetCollections(pagination, search) + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Len(t, result.Collections, 2) + assert.Equal(t, fmt.Sprintf("%d", int64(2)), result.Pagination.Total) + + // Test first collection + assert.Equal(t, CollectionAddress, result.Collections[0].ObjectAddr) + assert.Equal(t, "Test Collection 1", result.Collections[0].Collection.Name) + assert.Equal(t, "https://example.com/collection1", result.Collections[0].Collection.URI) + assert.Equal(t, "Test collection description 1", result.Collections[0].Collection.Description) + assert.Equal(t, AccountAddress, result.Collections[0].Collection.Creator) + assert.Nil(t, result.Collections[0].Collection.Nft) + + // Test second collection + assert.Equal(t, "0x2345678901bcdef2345678901bcdef23456789", result.Collections[1].ObjectAddr) + assert.Equal(t, "Test Collection 2", result.Collections[1].Collection.Name) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestNftService_GetCollections_Error(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockNftRepository() + + pagination := dto.PaginationQuery{ + Limit: 10, + Offset: 0, + CountTotal: true, + } + search := "test" + + // Set up mock expectations for error case + mockRepo.On("GetCollections", pagination, search).Return(nil, int64(0), assert.AnError) + + // Create service with mock repository + service := services.NewNftService(mockRepo) + + // Call the method + result, err := service.GetCollections(pagination, search) + + // Assertions + assert.Error(t, err) + assert.Nil(t, result) + assert.Equal(t, assert.AnError, err) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestNftService_GetCollectionsByAccountAddress(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockNftRepository() + + expectedCollections := []dto.CollectionByAccountAddressModel{ + { + ID: CollectionAddress, + Name: "Test Collection 1", + URI: "https://example.com/collection1", + Description: "Test collection description 1", + Creator: AccountAddress, + Count: 5, + }, + { + ID: "0x2345678901bcdef2345678901bcdef23456789", + Name: "Test Collection 2", + URI: "https://example.com/collection2", + Description: "Test collection description 2", + Creator: AccountAddress, + Count: 3, + }, + } + + // Set up mock expectations + mockRepo.On("GetCollectionsByAccountAddress", AccountAddress).Return(expectedCollections, nil) + + // Create service with mock repository + service := services.NewNftService(mockRepo) + + // Call the method + result, err := service.GetCollectionsByAccountAddress(AccountAddress) + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Len(t, result.Collections, 2) + assert.Equal(t, fmt.Sprintf("%d", int64(2)), result.Pagination.Total) + + // Test first collection + assert.Equal(t, CollectionAddress, result.Collections[0].ObjectAddr) + assert.Equal(t, "Test Collection 1", result.Collections[0].Collection.Name) + assert.Equal(t, AccountAddress, result.Collections[0].Collection.Creator) + assert.NotNil(t, result.Collections[0].Collection.Nft) + assert.Equal(t, int64(5), result.Collections[0].Collection.Nft.Length) + + // Test second collection + assert.Equal(t, "0x2345678901bcdef2345678901bcdef23456789", result.Collections[1].ObjectAddr) + assert.Equal(t, int64(3), result.Collections[1].Collection.Nft.Length) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestNftService_GetCollectionsByAccountAddress_Error(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockNftRepository() + + // Set up mock expectations for error case + mockRepo.On("GetCollectionsByAccountAddress", AccountAddress).Return(nil, assert.AnError) + + // Create service with mock repository + service := services.NewNftService(mockRepo) + + // Call the method + result, err := service.GetCollectionsByAccountAddress(AccountAddress) + + // Assertions + assert.Error(t, err) + assert.Nil(t, result) + assert.Equal(t, assert.AnError, err) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestNftService_GetCollectionsByCollectionAddress(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockNftRepository() + + expectedCollection := &db.Collection{ + ID: CollectionAddress, + Name: "Test Collection", + URI: "https://example.com/collection", + Description: "Test collection description", + Creator: AccountAddress, + } + + // Set up mock expectations + mockRepo.On("GetCollectionsByCollectionAddress", CollectionAddress).Return(expectedCollection, nil) + + // Create service with mock repository + service := services.NewNftService(mockRepo) + + // Call the method + result, err := service.GetCollectionsByCollectionAddress(CollectionAddress) + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Equal(t, CollectionAddress, result.ObjectAddr) + assert.Equal(t, "Test Collection", result.Collection.Name) + assert.Equal(t, "https://example.com/collection", result.Collection.URI) + assert.Equal(t, "Test collection description", result.Collection.Description) + assert.Equal(t, AccountAddress, result.Collection.Creator) + assert.Nil(t, result.Collection.Nft) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestNftService_GetCollectionsByCollectionAddress_Error(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockNftRepository() + + // Set up mock expectations for error case + mockRepo.On("GetCollectionsByCollectionAddress", CollectionAddress).Return(nil, assert.AnError) + + // Create service with mock repository + service := services.NewNftService(mockRepo) + + // Call the method + result, err := service.GetCollectionsByCollectionAddress(CollectionAddress) + + // Assertions + assert.Error(t, err) + assert.Nil(t, result) + assert.Equal(t, assert.AnError, err) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestNftService_GetCollectionActivities(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockNftRepository() + + pagination := dto.PaginationQuery{ + Limit: 10, + Offset: 0, + CountTotal: true, + } + search := "test" + + expectedActivities := []dto.CollectionActivityModel{ + { + Hash: "0x1234567890abcdef", + Timestamp: "2024-01-01T10:00:00Z", + IsNftBurn: false, + IsNftMint: true, + IsNftTransfer: false, + NftID: NftAddress, + TokenID: "token1", + IsCollectionCreate: false, + }, + { + Hash: "0xabcdef1234567890", + Timestamp: "2024-01-01T11:00:00Z", + IsNftBurn: false, + IsNftMint: false, + IsNftTransfer: true, + NftID: NftAddress, + TokenID: "token1", + IsCollectionCreate: false, + }, + } + + // Set up mock expectations + mockRepo.On("GetCollectionActivities", pagination, CollectionAddress, search).Return(expectedActivities, int64(2), nil) + + // Create service with mock repository + service := services.NewNftService(mockRepo) + + // Call the method + result, err := service.GetCollectionActivities(pagination, CollectionAddress, search) + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Len(t, result.CollectionActivities, 2) + assert.Equal(t, fmt.Sprintf("%d", int64(2)), result.Pagination.Total) + + // Test first activity + assert.Equal(t, "307831323334353637383930616263646566", result.CollectionActivities[0].Hash) + assert.Equal(t, "2024-01-01T10:00:00Z", result.CollectionActivities[0].Timestamp) + assert.False(t, result.CollectionActivities[0].IsNftBurn) + assert.True(t, result.CollectionActivities[0].IsNftMint) + assert.False(t, result.CollectionActivities[0].IsNftTransfer) + assert.Equal(t, NftAddress, result.CollectionActivities[0].NftID) + assert.Equal(t, "token1", result.CollectionActivities[0].TokenID) + assert.False(t, result.CollectionActivities[0].IsCollectionCreate) + + // Test second activity + assert.Equal(t, "307861626364656631323334353637383930", result.CollectionActivities[1].Hash) + assert.True(t, result.CollectionActivities[1].IsNftTransfer) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestNftService_GetCollectionCreator(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockNftRepository() + + expectedCreator := &dto.CollectionCreatorModel{ + Height: 1000, + Timestamp: "2024-01-01T10:00:00Z", + Creator: AccountAddress, + Hash: "0x1234567890abcdef", + } + + // Set up mock expectations + mockRepo.On("GetCollectionCreator", CollectionAddress).Return(expectedCreator, nil) + + // Create service with mock repository + service := services.NewNftService(mockRepo) + + // Call the method + result, err := service.GetCollectionCreator(CollectionAddress) + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Equal(t, int64(1000), result.Creator.Height) + assert.Equal(t, "2024-01-01T10:00:00Z", result.Creator.Timestamp) + assert.Equal(t, AccountAddress, result.Creator.Creator) + assert.Equal(t, "307831323334353637383930616263646566", result.Creator.Hash) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestNftService_GetCollectionMutateEvents(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockNftRepository() + + pagination := dto.PaginationQuery{ + Limit: 10, + Offset: 0, + CountTotal: true, + } + + expectedEvents := []dto.MutateEventModel{ + { + MutatedFieldName: "name", + NewValue: "New Collection Name", + OldValue: "Old Collection Name", + Remark: []byte(`{"reason": "update"}`), + Timestamp: "2024-01-01T10:00:00Z", + }, + { + MutatedFieldName: "description", + NewValue: "New description", + OldValue: "Old description", + Remark: []byte(`{"reason": "improvement"}`), + Timestamp: "2024-01-01T11:00:00Z", + }, + } + + // Set up mock expectations + mockRepo.On("GetCollectionMutateEvents", pagination, CollectionAddress).Return(expectedEvents, int64(2), nil) + + // Create service with mock repository + service := services.NewNftService(mockRepo) + + // Call the method + result, err := service.GetCollectionMutateEvents(pagination, CollectionAddress) + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Len(t, result.CollectionMutateEvents, 2) + assert.Equal(t, fmt.Sprintf("%d", int64(2)), result.Pagination.Total) + + // Test first event + assert.Equal(t, "name", result.CollectionMutateEvents[0].MutatedFieldName) + assert.Equal(t, "New Collection Name", result.CollectionMutateEvents[0].NewValue) + assert.Equal(t, "Old Collection Name", result.CollectionMutateEvents[0].OldValue) + assert.Equal(t, "2024-01-01T10:00:00Z", result.CollectionMutateEvents[0].Timestamp) + + // Test second event + assert.Equal(t, "description", result.CollectionMutateEvents[1].MutatedFieldName) + assert.Equal(t, "New description", result.CollectionMutateEvents[1].NewValue) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestNftService_GetNftByNftAddress(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockNftRepository() + + expectedNft := &dto.NftByAddressModel{ + TokenID: "token1", + URI: "https://example.com/nft1", + Description: "Test NFT description", + IsBurned: false, + Owner: AccountAddress, + ID: NftAddress, + Collection: CollectionAddress, + CollectionName: "Test Collection", + } + + // Set up mock expectations + mockRepo.On("GetNftByNftAddress", CollectionAddress, NftAddress).Return(expectedNft, nil) + + // Create service with mock repository + service := services.NewNftService(mockRepo) + + // Call the method + result, err := service.GetNftByNftAddress(CollectionAddress, NftAddress) + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Equal(t, NftAddress, result.ObjectAddr) + assert.Equal(t, CollectionAddress, result.CollectionAddr) + assert.Equal(t, "Test Collection", result.CollectionName) + assert.Equal(t, AccountAddress, result.OwnerAddr) + assert.Equal(t, CollectionAddress, result.Nft.Collection.Inner) + assert.Equal(t, "token1", result.Nft.TokenID) + assert.Equal(t, "https://example.com/nft1", result.Nft.URI) + assert.Equal(t, "Test NFT description", result.Nft.Description) + assert.False(t, result.Nft.IsBurned) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestNftService_GetNftByNftAddress_Error(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockNftRepository() + + // Set up mock expectations for error case + mockRepo.On("GetNftByNftAddress", CollectionAddress, NftAddress).Return(nil, assert.AnError) + + // Create service with mock repository + service := services.NewNftService(mockRepo) + + // Call the method + result, err := service.GetNftByNftAddress(CollectionAddress, NftAddress) + + // Assertions + assert.Error(t, err) + assert.Nil(t, result) + assert.Equal(t, assert.AnError, err) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestNftService_GetNftsByAccountAddress(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockNftRepository() + + pagination := dto.PaginationQuery{ + Limit: 10, + Offset: 0, + CountTotal: true, + } + collectionAddress := CollectionAddress + search := "test" + + expectedNfts := []dto.NftByAddressModel{ + { + TokenID: "token1", + URI: "https://example.com/nft1", + Description: "Test NFT 1 description", + IsBurned: false, + Owner: AccountAddress, + ID: NftAddress, + Collection: CollectionAddress, + CollectionName: "Test Collection", + }, + { + TokenID: "token2", + URI: "https://example.com/nft2", + Description: "Test NFT 2 description", + IsBurned: false, + Owner: AccountAddress, + ID: "0xabcdef1234567890abcdef1234567890abcdef13", + Collection: CollectionAddress, + CollectionName: "Test Collection", + }, + } + + // Set up mock expectations + mockRepo.On("GetNftsByAccountAddress", pagination, AccountAddress, collectionAddress, search).Return(expectedNfts, int64(2), nil) + + // Create service with mock repository + service := services.NewNftService(mockRepo) + + // Call the method + result, err := service.GetNftsByAccountAddress(pagination, AccountAddress, collectionAddress, search) + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Len(t, result.Tokens, 2) + assert.Equal(t, fmt.Sprintf("%d", int64(2)), result.Pagination.Total) + + // Test first NFT + assert.Equal(t, NftAddress, result.Tokens[0].ObjectAddr) + assert.Equal(t, CollectionAddress, result.Tokens[0].CollectionAddr) + assert.Equal(t, "Test Collection", result.Tokens[0].CollectionName) + assert.Equal(t, AccountAddress, result.Tokens[0].OwnerAddr) + assert.Equal(t, "token1", result.Tokens[0].Nft.TokenID) + assert.Equal(t, "https://example.com/nft1", result.Tokens[0].Nft.URI) + assert.Equal(t, "Test NFT 1 description", result.Tokens[0].Nft.Description) + assert.False(t, result.Tokens[0].Nft.IsBurned) + + // Test second NFT + assert.Equal(t, "0xabcdef1234567890abcdef1234567890abcdef13", result.Tokens[1].ObjectAddr) + assert.Equal(t, "token2", result.Tokens[1].Nft.TokenID) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestNftService_GetNftsByCollectionAddress(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockNftRepository() + + pagination := dto.PaginationQuery{ + Limit: 10, + Offset: 0, + CountTotal: true, + } + search := "test" + + expectedNfts := []dto.NftByAddressModel{ + { + TokenID: "token1", + URI: "https://example.com/nft1", + Description: "Test NFT 1 description", + IsBurned: false, + Owner: AccountAddress, + ID: NftAddress, + Collection: CollectionAddress, + CollectionName: "Test Collection", + }, + { + TokenID: "token2", + URI: "https://example.com/nft2", + Description: "Test NFT 2 description", + IsBurned: false, + Owner: "init1testaccount2", + ID: "0xabcdef1234567890abcdef1234567890abcdef13", + Collection: CollectionAddress, + CollectionName: "Test Collection", + }, + } + + // Set up mock expectations + mockRepo.On("GetNftsByCollectionAddress", pagination, CollectionAddress, search).Return(expectedNfts, int64(2), nil) + + // Create service with mock repository + service := services.NewNftService(mockRepo) + + // Call the method + result, err := service.GetNftsByCollectionAddress(pagination, CollectionAddress, search) + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Len(t, result.Tokens, 2) + assert.Equal(t, fmt.Sprintf("%d", int64(2)), result.Pagination.Total) + + // Test first NFT + assert.Equal(t, NftAddress, result.Tokens[0].ObjectAddr) + assert.Equal(t, CollectionAddress, result.Tokens[0].CollectionAddr) + assert.Equal(t, "Test Collection", result.Tokens[0].CollectionName) + assert.Equal(t, AccountAddress, result.Tokens[0].OwnerAddr) + assert.Equal(t, "token1", result.Tokens[0].Nft.TokenID) + + // Test second NFT + assert.Equal(t, "0xabcdef1234567890abcdef1234567890abcdef13", result.Tokens[1].ObjectAddr) + assert.Equal(t, "init1testaccount2", result.Tokens[1].OwnerAddr) + assert.Equal(t, "token2", result.Tokens[1].Nft.TokenID) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestNftService_GetNftMintInfo(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockNftRepository() + + expectedMintInfo := &dto.NftMintInfoModel{ + Address: AccountAddress, + Hash: "0x1234567890abcdef", + Height: 1000, + Timestamp: "2024-01-01T10:00:00Z", + } + + // Set up mock expectations + mockRepo.On("GetNftMintInfo", NftAddress).Return(expectedMintInfo, nil) + + // Create service with mock repository + service := services.NewNftService(mockRepo) + + // Call the method + result, err := service.GetNftMintInfo(NftAddress) + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Equal(t, int64(1000), result.Height) + assert.Equal(t, AccountAddress, result.Minter) + assert.Equal(t, "307831323334353637383930616263646566", result.TxHash) + assert.Equal(t, "2024-01-01T10:00:00Z", result.Timestamp) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestNftService_GetNftMintInfo_Error(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockNftRepository() + + // Set up mock expectations for error case + mockRepo.On("GetNftMintInfo", NftAddress).Return(nil, assert.AnError) + + // Create service with mock repository + service := services.NewNftService(mockRepo) + + // Call the method + result, err := service.GetNftMintInfo(NftAddress) + + // Assertions + assert.Error(t, err) + assert.Nil(t, result) + assert.Equal(t, assert.AnError, err) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestNftService_GetNftMutateEvents(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockNftRepository() + + pagination := dto.PaginationQuery{ + Limit: 10, + Offset: 0, + CountTotal: true, + } + + expectedEvents := []dto.MutateEventModel{ + { + MutatedFieldName: "uri", + NewValue: "https://example.com/new-nft1", + OldValue: "https://example.com/old-nft1", + Remark: []byte(`{"reason": "update"}`), + Timestamp: "2024-01-01T10:00:00Z", + }, + { + MutatedFieldName: "description", + NewValue: "New NFT description", + OldValue: "Old NFT description", + Remark: []byte(`{"reason": "improvement"}`), + Timestamp: "2024-01-01T11:00:00Z", + }, + } + + // Set up mock expectations + mockRepo.On("GetNftMutateEvents", pagination, NftAddress).Return(expectedEvents, int64(2), nil) + + // Create service with mock repository + service := services.NewNftService(mockRepo) + + // Call the method + result, err := service.GetNftMutateEvents(pagination, NftAddress) + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Len(t, result.NftMutateEvents, 2) + assert.Equal(t, fmt.Sprintf("%d", int64(2)), result.Pagination.Total) + + // Test first event + assert.Equal(t, "uri", result.NftMutateEvents[0].MutatedFieldName) + assert.Equal(t, "https://example.com/new-nft1", result.NftMutateEvents[0].NewValue) + assert.Equal(t, "https://example.com/old-nft1", result.NftMutateEvents[0].OldValue) + assert.Equal(t, "2024-01-01T10:00:00Z", result.NftMutateEvents[0].Timestamp) + + // Test second event + assert.Equal(t, "description", result.NftMutateEvents[1].MutatedFieldName) + assert.Equal(t, "New NFT description", result.NftMutateEvents[1].NewValue) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestNftService_GetNftTxs(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockNftRepository() + + pagination := dto.PaginationQuery{ + Limit: 10, + Offset: 0, + CountTotal: true, + } + + expectedTxs := []dto.NftTxModel{ + { + IsNftBurn: false, + IsNftMint: true, + IsNftTransfer: false, + Hash: "0x1234567890abcdef", + Height: 1000, + Timestamp: "2024-01-01T10:00:00Z", + }, + { + IsNftBurn: false, + IsNftMint: false, + IsNftTransfer: true, + Hash: "0xabcdef1234567890", + Height: 1001, + Timestamp: "2024-01-01T11:00:00Z", + }, + { + IsNftBurn: true, + IsNftMint: false, + IsNftTransfer: false, + Hash: "0x9876543210fedcba", + Height: 1002, + Timestamp: "2024-01-01T12:00:00Z", + }, + } + + // Set up mock expectations + mockRepo.On("GetNftTxs", pagination, NftAddress).Return(expectedTxs, int64(3), nil) + + // Create service with mock repository + service := services.NewNftService(mockRepo) + + // Call the method + result, err := service.GetNftTxs(pagination, NftAddress) + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Len(t, result.NftTxs, 3) + assert.Equal(t, fmt.Sprintf("%d", int64(3)), result.Pagination.Total) + + // Test first transaction (mint) + assert.False(t, result.NftTxs[0].IsNftBurn) + assert.True(t, result.NftTxs[0].IsNftMint) + assert.False(t, result.NftTxs[0].IsNftTransfer) + assert.Equal(t, "307831323334353637383930616263646566", result.NftTxs[0].TxHash) + assert.Equal(t, "2024-01-01T10:00:00Z", result.NftTxs[0].Timestamp) + + // Test second transaction (transfer) + assert.False(t, result.NftTxs[1].IsNftBurn) + assert.False(t, result.NftTxs[1].IsNftMint) + assert.True(t, result.NftTxs[1].IsNftTransfer) + assert.Equal(t, "307861626364656631323334353637383930", result.NftTxs[1].TxHash) + + // Test third transaction (burn) + assert.True(t, result.NftTxs[2].IsNftBurn) + assert.False(t, result.NftTxs[2].IsNftMint) + assert.False(t, result.NftTxs[2].IsNftTransfer) + assert.Equal(t, "307839383736353433323130666564636261", result.NftTxs[2].TxHash) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) +} + +func TestNftService_PaginationScenarios(t *testing.T) { + testCases := []struct { + name string + pagination dto.PaginationQuery + expectedTotal int64 + expectedLength int + expectedFirstName string + expectedLastName string + }{ + { + name: "Default pagination", + pagination: dto.PaginationQuery{ + Limit: 10, + Offset: 0, + CountTotal: true, + }, + expectedTotal: 15, + expectedLength: 10, + expectedFirstName: "Collection 1", + expectedLastName: "Collection 10", + }, + { + name: "Small limit", + pagination: dto.PaginationQuery{ + Limit: 3, + Offset: 0, + CountTotal: true, + }, + expectedTotal: 15, + expectedLength: 3, + expectedFirstName: "Collection 1", + expectedLastName: "Collection 3", + }, + { + name: "With offset", + pagination: dto.PaginationQuery{ + Limit: 5, + Offset: 5, + CountTotal: true, + }, + expectedTotal: 15, + expectedLength: 5, + expectedFirstName: "Collection 6", + expectedLastName: "Collection 10", + }, + { + name: "Without count total", + pagination: dto.PaginationQuery{ + Limit: 10, + Offset: 0, + }, + expectedTotal: 15, + expectedLength: 10, + expectedFirstName: "Collection 1", + expectedLastName: "Collection 10", + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // Create mock repository for each test case + mockRepo := mocks.NewMockNftRepository() + + // Create test data + allCollections := make([]db.Collection, 15) + for i := 0; i < 15; i++ { + allCollections[i] = db.Collection{ + ID: fmt.Sprintf("0x%040d", i+1), + Name: fmt.Sprintf("Collection %d", i+1), + URI: fmt.Sprintf("https://example.com/collection%d", i+1), + Description: fmt.Sprintf("Description for collection %d", i+1), + Creator: AccountAddress, + } + } + + // Calculate expected subset + start := tc.pagination.Offset + end := start + tc.pagination.Limit + if end > len(allCollections) { + end = len(allCollections) + } + expectedCollections := allCollections[start:end] + + // Set up mock expectations + mockRepo.On("GetCollections", tc.pagination, "").Return(expectedCollections, tc.expectedTotal, nil) + + // Create service with mock repository + service := services.NewNftService(mockRepo) + + // Call the method + result, err := service.GetCollections(tc.pagination, "") + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Equal(t, fmt.Sprintf("%d", tc.expectedTotal), result.Pagination.Total) + assert.Len(t, result.Collections, tc.expectedLength) + + if tc.expectedLength > 0 { + assert.Equal(t, tc.expectedFirstName, result.Collections[0].Collection.Name) + assert.Equal(t, tc.expectedLastName, result.Collections[tc.expectedLength-1].Collection.Name) + } + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) + }) + } +} + +func TestNftService_EmptyResults(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockNftRepository() + + t.Run("Empty collections", func(t *testing.T) { + pagination := dto.PaginationQuery{ + Limit: 10, + Offset: 0, + CountTotal: true, + } + + // Set up mock expectations for empty result + mockRepo.On("GetCollections", pagination, "").Return([]db.Collection{}, int64(0), nil) + + // Create service with mock repository + service := services.NewNftService(mockRepo) + + // Call the method + result, err := service.GetCollections(pagination, "") + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Equal(t, fmt.Sprintf("%d", int64(0)), result.Pagination.Total) + assert.Len(t, result.Collections, 0) + assert.NotNil(t, result.Collections) // Should be empty slice, not nil + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) + }) + + t.Run("Empty NFTs by account", func(t *testing.T) { + pagination := dto.PaginationQuery{ + Limit: 10, + Offset: 0, + CountTotal: true, + } + + // Set up mock expectations for empty result + mockRepo.On("GetNftsByAccountAddress", pagination, AccountAddress, "", "").Return([]dto.NftByAddressModel{}, int64(0), nil) + + // Create service with mock repository + service := services.NewNftService(mockRepo) + + // Call the method + result, err := service.GetNftsByAccountAddress(pagination, AccountAddress, "", "") + + // Assertions + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Equal(t, fmt.Sprintf("%d", int64(0)), result.Pagination.Total) + assert.Len(t, result.Tokens, 0) + assert.NotNil(t, result.Tokens) // Should be empty slice, not nil + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) + }) +} + +func TestNftService_ErrorHandling(t *testing.T) { + // Create mock repository + mockRepo := mocks.NewMockNftRepository() + + t.Run("GetCollections error", func(t *testing.T) { + pagination := dto.PaginationQuery{ + Limit: 10, + Offset: 0, + CountTotal: true, + } + + // Set up mock expectations for error + mockRepo.On("GetCollections", pagination, "").Return(nil, int64(0), assert.AnError) + + // Create service with mock repository + service := services.NewNftService(mockRepo) + + // Call the method + result, err := service.GetCollections(pagination, "") + + // Assertions + assert.Error(t, err) + assert.Nil(t, result) + assert.Equal(t, assert.AnError, err) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) + }) + + t.Run("GetNftByNftAddress error", func(t *testing.T) { + // Set up mock expectations for error + mockRepo.On("GetNftByNftAddress", CollectionAddress, NftAddress).Return(nil, assert.AnError) + + // Create service with mock repository + service := services.NewNftService(mockRepo) + + // Call the method + result, err := service.GetNftByNftAddress(CollectionAddress, NftAddress) + + // Assertions + assert.Error(t, err) + assert.Nil(t, result) + assert.Equal(t, assert.AnError, err) + + // Verify mock was called as expected + mockRepo.AssertExpectations(t) + }) +} diff --git a/api/services/tests/proposal_test.go b/api/services/tests/proposal_test.go new file mode 100644 index 00000000..068d33e8 --- /dev/null +++ b/api/services/tests/proposal_test.go @@ -0,0 +1,505 @@ +package services_test + +// import ( +// "context" +// "fmt" +// "testing" +// "time" + +// "github.com/stretchr/testify/assert" + +// "github.com/initia-labs/core-indexer/api/dto" +// "github.com/initia-labs/core-indexer/api/repositories/mocks" +// "github.com/initia-labs/core-indexer/api/services" +// ) + +// const ( +// TestProposalID = 1 +// TestProposer = "init1m8p6rakcfl4z5ruwa0578cqgn8c86mkc6ety2z" +// ) + +// // func TestProposalService_GetProposals(t *testing.T) { +// // // Create mock repository +// // mockRepo := mocks.NewMockProposalRepository() + +// // // Test data +// // pagination := dto.PaginationQuery{ +// // Limit: 10, +// // Offset: 0, +// // CountTotal: true, +// // } + +// // expectedProposals := []dto.ProposalSummary{ +// // { +// // Id: 1, +// // Title: "Test Proposal 1", +// // Status: "VotingPeriod", +// // Proposer: TestProposer, +// // DepositEndTime: time.Now().Add(24 * time.Hour), +// // VotingEndTime: &[]time.Time{time.Now().Add(48 * time.Hour)}[0], +// // ResolvedHeight: 1000, +// // IsEmergency: false, +// // IsExpedited: false, +// // }, +// // { +// // Id: 2, +// // Title: "Test Proposal 2", +// // Status: "Passed", +// // Proposer: TestProposer, +// // DepositEndTime: time.Now().Add(-24 * time.Hour), +// // VotingEndTime: &[]time.Time{time.Now().Add(-12 * time.Hour)}[0], +// // ResolvedHeight: 2000, +// // IsEmergency: true, +// // IsExpedited: true, +// // }, +// // } + +// // // Set up mock expectations +// // mockRepo.On("SearchProposals", context.Background(), pagination, "", "", []string{}, []string{}).Return(expectedProposals, int64(2), nil) + +// // // Create service with mock repository +// // service := services.NewProposalService(mockRepo) + +// // // Call the method +// // result, err := service.GetProposals(context.Background(), pagination, "", "", "", "") + +// // // Assertions +// // assert.NoError(t, err) +// // assert.NotNil(t, result) +// // assert.Len(t, result.Proposals, 2) +// // assert.Equal(t, fmt.Sprintf("%d", int64(2)), result.Pagination.Total) +// // assert.Equal(t, "Test Proposal 1", result.Proposals[0].Title) +// // assert.Equal(t, "Test Proposal 2", result.Proposals[1].Title) + +// // // Verify mock was called as expected +// // mockRepo.AssertExpectations(t) +// // } + +// func TestProposalService_GetProposals_DuplicateStatus(t *testing.T) { +// // Create mock repository +// mockRepo := mocks.NewMockProposalRepository() + +// // Test data +// pagination := dto.PaginationQuery{ +// Limit: 10, +// Offset: 0, +// CountTotal: true, +// } + +// // Create service with mock repository +// service := services.NewProposalService(mockRepo) + +// // Call the method with duplicate status +// result, err := service.GetProposals(context.Background(), pagination, "", "VotingPeriod,VotingPeriod", "", "") + +// // Assertions +// assert.Error(t, err) +// assert.Nil(t, result) + +// // Verify no mock calls were made +// mockRepo.AssertNotCalled(t, "SearchProposals") +// } + +// func TestProposalService_GetProposalsTypes(t *testing.T) { +// // Create mock repository +// mockRepo := mocks.NewMockProposalRepository() + +// // Test data +// expectedTypes := &dto.ProposalsTypesResponse{ +// "Text", +// "ParameterChange", +// "SoftwareUpgrade", +// } + +// // Set up mock expectations +// mockRepo.On("GetAllProposalTypes", context.Background()).Return(expectedTypes, nil) + +// // Create service with mock repository +// service := services.NewProposalService(mockRepo) + +// // Call the method +// result, err := service.GetProposalsTypes(context.Background()) + +// // Assertions +// assert.NoError(t, err) +// assert.NotNil(t, result) +// assert.Len(t, *result, 3) +// assert.Contains(t, *result, "Text") +// assert.Contains(t, *result, "ParameterChange") +// assert.Contains(t, *result, "SoftwareUpgrade") + +// // Verify mock was called as expected +// mockRepo.AssertExpectations(t) +// } + +// func TestProposalService_GetProposalInfo(t *testing.T) { +// // Create mock repository +// mockRepo := mocks.NewMockProposalRepository() + +// // Test data +// expectedProposal := &dto.ProposalInfo{ +// Id: TestProposalID, +// Title: "Test Proposal", +// Description: "This is a test proposal", +// Status: "VotingPeriod", +// Proposer: TestProposer, +// SubmitTime: time.Now(), +// DepositEndTime: time.Now().Add(24 * time.Hour), +// VotingEndTime: &[]time.Time{time.Now().Add(48 * time.Hour)}[0], +// CreatedHeight: 1000, +// CreatedTimestamp: time.Now(), +// CreatedTxHash: "abc123", +// IsEmergency: false, +// IsExpedited: false, +// Yes: "1000000", +// No: "500000", +// NoWithVeto: "100000", +// Abstain: "200000", +// TotalDeposit: dto.Coins{}, +// ProposalDeposits: []dto.ProposalDeposit{}, +// ResolvedTotalVotingPower: nil, +// } + +// // Set up mock expectations +// mockRepo.On("GetProposalInfo", context.Background(), TestProposalID).Return(expectedProposal, nil) + +// // Create service with mock repository +// service := services.NewProposalService(mockRepo) + +// // Call the method +// result, err := service.GetProposalInfo(context.Background(), TestProposalID) + +// // Assertions +// assert.NoError(t, err) +// assert.NotNil(t, result) +// assert.Equal(t, expectedProposal, &result.Info) +// assert.Equal(t, "Test Proposal", result.Info.Title) +// assert.Equal(t, TestProposer, result.Info.Proposer) + +// // Verify mock was called as expected +// mockRepo.AssertExpectations(t) +// } + +// func TestProposalService_GetProposalVotes(t *testing.T) { +// // Create mock repository +// mockRepo := mocks.NewMockProposalRepository() + +// // Test data +// pagination := dto.PaginationQuery{ +// Limit: 10, +// Offset: 0, +// CountTotal: true, +// } + +// expectedVotes := []dto.ProposalVote{ +// { +// ProposalId: TestProposalID, +// Voter: "init1voter1", +// Yes: 1, +// No: 0, +// NoWithVeto: 0, +// Abstain: 0, +// IsVoteWeighted: false, +// TxHash: &[]string{"tx_hash_1"}[0], +// Timestamp: &[]time.Time{time.Now()}[0], +// }, +// { +// ProposalId: TestProposalID, +// Voter: "init1voter2", +// Yes: 0, +// No: 1, +// NoWithVeto: 0, +// Abstain: 0, +// IsVoteWeighted: false, +// TxHash: &[]string{"tx_hash_2"}[0], +// Timestamp: &[]time.Time{time.Now()}[0], +// }, +// } + +// // Set up mock expectations +// mockRepo.On("GetProposalVotes", context.Background(), TestProposalID, int64(10), int64(0), "", "").Return(expectedVotes, int64(2), nil) + +// // Create service with mock repository +// service := services.NewProposalService(mockRepo) + +// // Call the method +// result, err := service.GetProposalVotes(context.Background(), pagination, TestProposalID, "", "") + +// // Assertions +// assert.NoError(t, err) +// assert.NotNil(t, result) +// assert.Len(t, result.Votes, 2) +// assert.Equal(t, fmt.Sprintf("%d", int64(2)), result.Pagination.Total) +// assert.Equal(t, "init1voter1", result.Votes[0].Voter) +// assert.Equal(t, "init1voter2", result.Votes[1].Voter) + +// // Verify mock was called as expected +// mockRepo.AssertExpectations(t) +// } + +// func TestProposalService_GetProposalValidatorVotes(t *testing.T) { +// // Create mock repository +// mockRepo := mocks.NewMockProposalRepository() + +// // Test data +// pagination := dto.PaginationQuery{ +// Limit: 10, +// Offset: 0, +// CountTotal: true, +// } + +// expectedVotes := []dto.ProposalVote{ +// { +// ProposalId: TestProposalID, +// Validator: &dto.ProposalValidatorVote{ +// Moniker: "Validator 1", +// Identity: "identity1", +// ValidatorAddress: "init1validator1", +// }, +// Yes: 1, +// No: 0, +// NoWithVeto: 0, +// Abstain: 0, +// IsVoteWeighted: false, +// Voter: "init1validator1", +// TxHash: &[]string{"tx_hash_1"}[0], +// Timestamp: &[]time.Time{time.Now()}[0], +// }, +// { +// ProposalId: TestProposalID, +// Validator: &dto.ProposalValidatorVote{ +// Moniker: "Validator 2", +// Identity: "identity2", +// ValidatorAddress: "init1validator2", +// }, +// Yes: 0, +// No: 1, +// NoWithVeto: 0, +// Abstain: 0, +// IsVoteWeighted: false, +// Voter: "init1validator2", +// TxHash: &[]string{"tx_hash_2"}[0], +// Timestamp: &[]time.Time{time.Now()}[0], +// }, +// } + +// // Set up mock expectations +// mockRepo.On("GetProposalValidatorVotes", context.Background(), TestProposalID).Return(expectedVotes, nil) + +// // Create service with mock repository +// service := services.NewProposalService(mockRepo) + +// // Call the method +// result, err := service.GetProposalValidatorVotes(context.Background(), pagination, TestProposalID, "", "") + +// // Assertions +// assert.NoError(t, err) +// assert.NotNil(t, result) +// assert.Len(t, result.Votes, 2) +// assert.Equal(t, fmt.Sprintf("%d", int64(2)), result.Pagination.Total) +// assert.Equal(t, "Validator 1", result.Votes[0].Validator.Moniker) +// assert.Equal(t, "Validator 2", result.Votes[1].Validator.Moniker) + +// // Verify mock was called as expected +// mockRepo.AssertExpectations(t) +// } + +// func TestProposalService_GetProposalValidatorVotes_WithSearch(t *testing.T) { +// // Create mock repository +// mockRepo := mocks.NewMockProposalRepository() + +// // Test data +// pagination := dto.PaginationQuery{ +// Limit: 10, +// Offset: 0, +// CountTotal: true, +// } + +// allVotes := []dto.ProposalVote{ +// { +// ProposalId: TestProposalID, +// Validator: &dto.ProposalValidatorVote{ +// Moniker: "Validator Alpha", +// Identity: "identity1", +// ValidatorAddress: "init1validator1", +// }, +// Yes: 1, +// No: 0, +// NoWithVeto: 0, +// Abstain: 0, +// IsVoteWeighted: false, +// Voter: "init1validator1", +// TxHash: &[]string{"tx_hash_1"}[0], +// Timestamp: &[]time.Time{time.Now()}[0], +// }, +// { +// ProposalId: TestProposalID, +// Validator: &dto.ProposalValidatorVote{ +// Moniker: "Validator Beta", +// Identity: "identity2", +// ValidatorAddress: "init1validator2", +// }, +// Yes: 0, +// No: 1, +// NoWithVeto: 0, +// Abstain: 0, +// IsVoteWeighted: false, +// Voter: "init1validator2", +// TxHash: &[]string{"tx_hash_2"}[0], +// Timestamp: &[]time.Time{time.Now()}[0], +// }, +// } + +// // Set up mock expectations +// mockRepo.On("GetProposalValidatorVotes", context.Background(), TestProposalID).Return(allVotes, nil) + +// // Create service with mock repository +// service := services.NewProposalService(mockRepo) + +// // Call the method with search filter +// result, err := service.GetProposalValidatorVotes(context.Background(), pagination, TestProposalID, "alpha", "") + +// // Assertions +// assert.NoError(t, err) +// assert.NotNil(t, result) +// assert.Len(t, result.Votes, 1) // Only "Validator Alpha" should match +// assert.Equal(t, "Validator Alpha", result.Votes[0].Validator.Moniker) + +// // Verify mock was called as expected +// mockRepo.AssertExpectations(t) +// } + +// func TestProposalService_GetProposalAnswerCounts(t *testing.T) { +// // Create mock repository +// mockRepo := mocks.NewMockProposalRepository() + +// // Test data +// expectedCounts := &dto.ProposalAnswerCountsResponse{ +// All: dto.ProposalAnswerCounts{ +// Yes: 10, +// No: 5, +// NoWithVeto: 2, +// Abstain: 3, +// Weighted: 1, +// Total: 21, +// }, +// Validator: dto.ProposalValidatorAnswerCounts{ +// ProposalAnswerCounts: dto.ProposalAnswerCounts{ +// Yes: 8, +// No: 3, +// NoWithVeto: 1, +// Abstain: 2, +// Weighted: 0, +// Total: 14, +// }, +// DidNotVote: 6, +// TotalValidators: 20, +// }, +// } + +// // Set up mock expectations +// mockRepo.On("GetProposalAnswerCounts", TestProposalID).Return(expectedCounts, nil) + +// // Create service with mock repository +// service := services.NewProposalService(mockRepo) + +// // Call the method +// result, err := service.GetProposalAnswerCounts(context.Background(), TestProposalID) + +// // Assertions +// assert.NoError(t, err) +// assert.NotNil(t, result) +// assert.Equal(t, int(10), result.All.Yes) +// assert.Equal(t, int(5), result.All.No) +// assert.Equal(t, int(21), result.All.Total) +// assert.Equal(t, int(8), result.Validator.Yes) +// assert.Equal(t, int(6), result.Validator.DidNotVote) +// assert.Equal(t, int(20), result.Validator.TotalValidators) + +// // Verify mock was called as expected +// mockRepo.AssertExpectations(t) +// } + +// func TestProposalService_GetProposalInfo_RepositoryError(t *testing.T) { +// // Create mock repository +// mockRepo := mocks.NewMockProposalRepository() + +// // Set up mock expectations for error +// mockRepo.On("GetProposalInfo", TestProposalID).Return(nil, assert.AnError) + +// // Create service with mock repository +// service := services.NewProposalService(mockRepo) + +// // Call the method +// result, err := service.GetProposalInfo(context.Background(), TestProposalID) + +// // Assertions +// assert.Error(t, err) +// assert.Nil(t, result) +// assert.Equal(t, assert.AnError, err) + +// // Verify mock was called as expected +// mockRepo.AssertExpectations(t) +// } + +// func TestProposalService_GetProposalValidatorVotes_Pagination(t *testing.T) { +// // Create mock repository +// mockRepo := mocks.NewMockProposalRepository() + +// // Test data with pagination +// pagination := dto.PaginationQuery{ +// Limit: 2, +// Offset: 1, +// CountTotal: true, +// } + +// allVotes := []dto.ProposalVote{ +// { +// ProposalId: TestProposalID, +// Validator: &dto.ProposalValidatorVote{ +// Moniker: "Validator 1", +// Identity: "identity1", +// ValidatorAddress: "init1validator1", +// }, +// Yes: 1, +// }, +// { +// ProposalId: TestProposalID, +// Validator: &dto.ProposalValidatorVote{ +// Moniker: "Validator 2", +// Identity: "identity2", +// ValidatorAddress: "init1validator2", +// }, +// No: 1, +// }, +// { +// ProposalId: TestProposalID, +// Validator: &dto.ProposalValidatorVote{ +// Moniker: "Validator 3", +// Identity: "identity3", +// ValidatorAddress: "init1validator3", +// }, +// Abstain: 1, +// }, +// } + +// // Set up mock expectations +// mockRepo.On("GetProposalValidatorVotes", context.Background(), TestProposalID).Return(allVotes, nil) + +// // Create service with mock repository +// service := services.NewProposalService(mockRepo) + +// // Call the method +// result, err := service.GetProposalValidatorVotes(context.Background(), pagination, TestProposalID, "", "") + +// // Assertions +// assert.NoError(t, err) +// assert.NotNil(t, result) +// assert.Len(t, result.Votes, 2) // Should return 2 items due to limit +// assert.Equal(t, fmt.Sprintf("%d", int64(3)), result.Pagination.Total) // Total should be 3 +// assert.Equal(t, "Validator 2", result.Votes[0].Validator.Moniker) // Should start from offset 1 +// assert.Equal(t, "Validator 3", result.Votes[1].Validator.Moniker) + +// // Verify mock was called as expected +// mockRepo.AssertExpectations(t) +// } diff --git a/api/services/tx.go b/api/services/tx.go new file mode 100644 index 00000000..29a2d1a0 --- /dev/null +++ b/api/services/tx.go @@ -0,0 +1,109 @@ +package services + +import ( + "context" + "fmt" + + "github.com/initia-labs/core-indexer/api/config" + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/api/repositories" +) + +type TxService interface { + GetTxByHash(ctx context.Context, hash string) (*dto.TxByHashResponse, error) + GetTxCount() (*dto.TxCountResponse, error) + GetTxs(pagination *dto.PaginationQuery) (*dto.TxsModelResponse, error) + GetTxsByAccountAddress(ctx context.Context, pagination dto.PaginationQuery, accountAddress string) (*dto.TxsResponse, error) +} + +type txService struct { + txRepo repositories.TxRepositoryI + accountRepo repositories.AccountRepositoryI + gcsManager GCSManager +} + +func NewTxService(txRepo repositories.TxRepositoryI, accountRepo repositories.AccountRepositoryI, cfg *config.Config) TxService { + return &txService{ + txRepo: txRepo, + accountRepo: accountRepo, + gcsManager: NewGCSManagerWithConfig(txRepo, cfg.Storage.TxResponseCacheBytes, cfg.Storage.TxMaxWorkers), + } +} + +// GetTxByHash retrieves a transaction by hash +func (s *txService) GetTxByHash(ctx context.Context, hash string) (*dto.TxByHashResponse, error) { + tx, err := s.txRepo.GetTxByHash(ctx, hash) + if err != nil { + return nil, err + } + return tx, nil +} + +// GetTxCount retrieves the total number of transactions +func (s *txService) GetTxCount() (*dto.TxCountResponse, error) { + txCount, err := s.txRepo.GetTxCount() + if err != nil { + return nil, err + } + + return &dto.TxCountResponse{ + Count: *txCount, + }, nil +} + +func (s *txService) GetTxs(pagination *dto.PaginationQuery) (*dto.TxsModelResponse, error) { + txs, total, err := s.txRepo.GetTxs(pagination) + if err != nil { + return nil, err + } + + response := &dto.TxsModelResponse{ + Txs: make([]dto.TxModel, len(txs)), + Pagination: dto.NewPaginationResponse(pagination.Offset, pagination.Limit, total), + } + + for idx, tx := range txs { + response.Txs[idx] = dto.TxModel{ + Sender: tx.Sender, + Hash: fmt.Sprintf("%x", tx.Hash), + Success: tx.Success, + Messages: tx.Messages, + IsSend: tx.IsSend, + IsIbc: tx.IsIbc, + IsOpinit: tx.IsOpinit, + Height: tx.Height, + Timestamp: tx.Timestamp, + } + } + + return response, nil +} + +func (s *txService) GetTxsByAccountAddress(ctx context.Context, pagination dto.PaginationQuery, accountAddress string) (*dto.TxsResponse, error) { + txs, total, err := s.accountRepo.GetAccountTxs(pagination, accountAddress, "", false, false, false, false, false, false, false, nil) + if err != nil { + return nil, err + } + + response := &dto.TxsResponse{ + Txs: make([]dto.TxResponse, len(txs)), + Pagination: dto.NewPaginationResponse(pagination.Offset, pagination.Limit, total), + } + + txHashes := make([]string, len(txs)) + for idx, tx := range txs { + txHashes[idx] = fmt.Sprintf("%x", tx.Hash) + } + + res, err := s.gcsManager.QueryTxs(ctx, txHashes) + if err != nil { + return nil, err + } + + response.Txs = make([]dto.TxResponse, len(res)) + for idx, tx := range res { + response.Txs[idx] = tx.TxResponse + } + + return response, nil +} diff --git a/api/services/validator.go b/api/services/validator.go new file mode 100644 index 00000000..5fba8d0a --- /dev/null +++ b/api/services/validator.go @@ -0,0 +1,546 @@ +package services + +import ( + "encoding/json" + "fmt" + "strconv" + "strings" + "sync" + + "github.com/initia-labs/core-indexer/api/dto" + "github.com/initia-labs/core-indexer/api/repositories" + "github.com/initia-labs/core-indexer/api/utils" + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/logger" +) + +type ValidatorService interface { + GetValidators(pagination dto.PaginationQuery, status dto.ValidatorStatusFilter, sortBy, search string) (*dto.ValidatorsResponse, error) + GetValidatorInfo(operatorAddr string) (*dto.ValidatorInfoResponse, error) + GetValidatorUptime(operatorAddr string, blocks int) (*dto.ValidatorUptimeResponse, error) + GetValidatorDelegationTxs(pagination dto.PaginationQuery, operatorAddr string) (*dto.ValidatorDelegationRelatedTxsResponse, error) + GetValidatorProposedBlocks(pagination dto.PaginationQuery, operatorAddr string) (*dto.ValidatorProposedBlocksResponse, error) + GetValidatorHistoricalPowers(operatorAddr string) (*dto.ValidatorHistoricalPowersResponse, error) + GetValidatorVotedProposals(pagination dto.PaginationQuery, operatorAddr, search, answer string) (*dto.ValidatorVotedProposalsResponse, error) + GetValidatorAnswerCounts(operatorAddr string) (*dto.ValidatorAnswerCountsResponse, error) +} + +type validatorService struct { + repo repositories.ValidatorRepositoryI + blockRepo repositories.BlockRepositoryI + proposalRepo repositories.ProposalRepositoryI +} + +func NewValidatorService(repo repositories.ValidatorRepositoryI, blockRepo repositories.BlockRepositoryI, proposalRepo repositories.ProposalRepositoryI) ValidatorService { + return &validatorService{ + repo: repo, + blockRepo: blockRepo, + proposalRepo: proposalRepo, + } +} + +func (s *validatorService) GetValidators(pagination dto.PaginationQuery, status dto.ValidatorStatusFilter, sortBy, search string) (*dto.ValidatorsResponse, error) { + validators, total, err := s.repo.GetValidators(pagination, status, sortBy, search) + if err != nil { + return nil, err + } + + validatorsByPower, err := s.repo.GetValidatorsByPower(&pagination, false) + if err != nil { + return nil, err + } + + minCommissionRate := 1.0 + var active, inactive []db.Validator + + for _, val := range validatorsByPower { + shouldInclude := false + switch status { + case dto.ValidatorStatusFilterAll: + shouldInclude = true + case dto.ValidatorStatusFilterActive: + shouldInclude = val.IsActive + case dto.ValidatorStatusFilterInactive: + shouldInclude = !val.IsActive + } + + if shouldInclude { + valRate, err := strconv.ParseFloat(val.CommissionRate, 64) + if err == nil && valRate < minCommissionRate { + minCommissionRate = valRate + } + } + + if val.IsActive { + active = append(active, val) + } else { + inactive = append(inactive, val) + } + } + + totalVotingPower, rankMap, percent33Rank, percent66Rank := getTotalVotingPowerAndRank(active) + + validatorInfoItems := make([]dto.ValidatorInfo, 0, len(validators)) + for _, val := range validators { + validatorInfo := flattenValidatorInfo(&val, rankMap) + if val.IsActive { + // Uptime as percentage (0-100) from signed blocks in last 10,000 + validatorInfo.Uptime = (val.Last10000 * 100) / 10000 + } else { + validatorInfo.Uptime = 0 + } + + // Add block statistics from pre-calculated validator_vote_counts table + validatorInfo.TotalBlocks = 10000 + validatorInfo.SignedBlocks = int64(val.Last10000) + + // Add image data from database (pre-fetched by cron job from Keybase, base64-encoded) + validatorInfo.Image = val.IdentityImage + + validatorInfoItems = append(validatorInfoItems, *validatorInfo) + } + + return &dto.ValidatorsResponse{ + ValidatorsInfo: validatorInfoItems, + Metadata: dto.ValidatorsMetadata{ + ActiveCount: len(active), + InactiveCount: len(inactive), + MinCommissionRate: strconv.FormatFloat(minCommissionRate, 'f', -1, 64), + Percent33Rank: percent33Rank, + Percent66Rank: percent66Rank, + TotalVotingPower: strconv.FormatInt(totalVotingPower, 10), + }, + Pagination: dto.NewPaginationResponse(pagination.Offset, pagination.Limit, total), + }, nil +} + +func flattenValidatorInfo(validator *dto.ValidatorWithVoteCountModel, rankMap map[string]int) *dto.ValidatorInfo { + validatorInfo := &dto.ValidatorInfo{ + AccountAddress: validator.AccountID, + CommissionRate: validator.CommissionRate, + ConsensusAddress: validator.ConsensusAddress, + Details: validator.Details, + Identity: validator.Identity, + IsActive: validator.IsActive, + IsJailed: validator.Jailed, + Moniker: strings.TrimSpace(validator.Moniker), + ValidatorAddress: validator.OperatorAddress, + VotingPower: strconv.FormatInt(validator.VotingPower, 10), + Website: validator.Website, + } + + if rank, exists := rankMap[validator.OperatorAddress]; exists { + validatorInfo.Rank = rank + } else { + validatorInfo.Rank = 0 + } + + return validatorInfo +} + +func getTotalVotingPowerAndRank(validators []db.Validator) (int64, map[string]int, int, int) { + totalVotingPower := int64(0) + cumulativeVotingPower := int64(0) + rankMap := make(map[string]int) + var percent33Rank, percent66Rank int + + for idx, val := range validators { + totalVotingPower += val.VotingPower + rankMap[val.OperatorAddress] = idx + 1 + } + + for idx, val := range validators { + cumulativeVotingPower += val.VotingPower + cumulativePercent := float64(cumulativeVotingPower) / float64(totalVotingPower) + + if cumulativePercent >= 0.33 && percent33Rank == 0 { + percent33Rank = idx + 1 + } + + if cumulativePercent > 0.66 { + percent66Rank = idx + 1 + break + } + } + + return totalVotingPower, rankMap, percent33Rank, percent66Rank +} + +func (s *validatorService) GetValidatorInfo(operatorAddr string) (*dto.ValidatorInfoResponse, error) { + validator, err := s.repo.GetValidatorRow(operatorAddr) + if err != nil { + return nil, err + } + + activeValidators, err := s.repo.GetValidatorsByPower(nil, true) + if err != nil { + return nil, err + } + + totalVotingPower, rankMap, _, _ := getTotalVotingPowerAndRank(activeValidators) + validatorInfo := flattenValidatorInfo(&dto.ValidatorWithVoteCountModel{Validator: *validator}, rankMap) + validatorInfo.Image = validator.IdentityImage + + return &dto.ValidatorInfoResponse{ + Info: *validatorInfo, + TotalVotingPower: strconv.FormatInt(totalVotingPower, 10), + }, nil +} + +func (s *validatorService) GetValidatorUptime(operatorAddr string, blocks int) (*dto.ValidatorUptimeResponse, error) { + latestBlock, err := s.blockRepo.GetLatestBlock() + if err != nil { + return nil, err + } + + latestHeight := int64(latestBlock.Height) + latestTimestamp := latestBlock.Timestamp + + total := int64(blocks) + if total > latestHeight { + total = latestHeight + } + + minHeight := max(1, latestHeight-total+1) + eventTimestampMin := latestTimestamp.AddDate(0, -3, 0) + + var proposedBlocks, validatorSignatures []dto.ValidatorBlockVoteModel + var slashEvents []dto.ValidatorUptimeEventModel + var validatorInfo *dto.ValidatorWithVoteCountModel + var proposedBlocksErr, signaturesErr, eventsErr, validatorInfoErr error + + var wg sync.WaitGroup + wg.Add(4) + + go func() { + defer wg.Done() + proposedBlocks, proposedBlocksErr = s.repo.GetValidatorBlockVoteByBlockLimit(minHeight, latestHeight) + }() + + go func() { + defer wg.Done() + validatorSignatures, signaturesErr = s.repo.GetValidatorCommitSignatures(operatorAddr, minHeight, latestHeight) + }() + + go func() { + defer wg.Done() + slashEvents, eventsErr = s.repo.GetValidatorSlashEvents(operatorAddr, eventTimestampMin) + }() + + go func() { + defer wg.Done() + validatorInfo, validatorInfoErr = s.repo.GetValidatorUptimeInfo(operatorAddr) + }() + + wg.Wait() + + if proposedBlocksErr != nil { + return nil, proposedBlocksErr + } + if signaturesErr != nil { + return nil, signaturesErr + } + if eventsErr != nil { + return nil, eventsErr + } + if validatorInfoErr != nil { + return nil, validatorInfoErr + } + + proposedBlocksMapping := make(map[int64]string) + for _, block := range proposedBlocks { + proposedBlocksMapping[block.Height] = block.Vote + } + + commitSignaturesMapping := make(map[int64]string) + for _, sig := range validatorSignatures { + commitSignaturesMapping[sig.Height] = sig.Vote + } + + validatorUptime := 0 + if validatorInfo != nil && validatorInfo.IsActive { + validatorUptime = int(validatorInfo.Last10000) + } + + recent100Blocks := make([]dto.ValidatorBlockVoteModel, 0, total) + for i := latestHeight; i > latestHeight-total; i-- { + vote := "VOTE" + if val, exists := commitSignaturesMapping[i]; exists { + vote = val + } else if _, exists := proposedBlocksMapping[i+1]; exists && !utils.ContainsKey(commitSignaturesMapping, i) || validatorUptime == 0 { + vote = "ABSTAIN" + } + recent100Blocks = append(recent100Blocks, dto.ValidatorBlockVoteModel{Height: i, Vote: vote}) + } + + uptime := dto.ValidatorUptimeSummary{ + SignedBlocks: 0, + ProposedBlocks: 0, + MissedBlocks: 0, + Total: int(total), + } + + for _, block := range recent100Blocks { + switch block.Vote { + case "VOTE": + uptime.SignedBlocks++ + case "PROPOSE": + uptime.ProposedBlocks++ + default: + uptime.MissedBlocks++ + } + } + + maxBlocks := len(recent100Blocks) + if maxBlocks > 100 { + maxBlocks = 100 + } + + return &dto.ValidatorUptimeResponse{ + Events: slashEvents, + Recent100Blocks: recent100Blocks[:maxBlocks], + Uptime: uptime, + }, nil +} + +func (s *validatorService) GetValidatorDelegationTxs(pagination dto.PaginationQuery, operatorAddr string) (*dto.ValidatorDelegationRelatedTxsResponse, error) { + tokenChanges, total, err := s.repo.GetValidatorBondedTokenChanges(pagination, operatorAddr) + if err != nil { + return nil, err + } + + items := make([]dto.ValidatorDelegationRelatedTx, 0, len(tokenChanges)) + for _, tx := range tokenChanges { + var messages []map[string]interface{} + if err := json.Unmarshal(tx.Transaction.Messages, &messages); err != nil { + logger.Get().Error().Err(err).Msg("Failed to unmarshal transaction messages") + continue + } + + msgTypes := make([]dto.MessageType, 0, len(messages)) + for _, msg := range messages { + // NOTE: the original storing of message type and details + if typeStr, ok := msg["type"].(string); ok { + msgTypes = append(msgTypes, dto.MessageType{ + Type: typeStr, + }) + } + + // NOTE: the new flatten message type + if typeStr, ok := msg["@type"].(string); ok { + msgTypes = append(msgTypes, dto.MessageType{ + Type: typeStr, + }) + } + } + + var tokens []map[string]interface{} + if err := json.Unmarshal(tx.Tokens, &tokens); err != nil { + logger.Get().Error().Err(err).Msg("Failed to unmarshal token changes") + continue + } + + tokenCoins := make(dto.Coins, 0, len(tokens)) + for _, token := range tokens { + amount, amountOk := token["amount"].(string) + denom, denomOk := token["denom"].(string) + if amountOk && denomOk { + tokenCoins = append(tokenCoins, dto.Coin{ + Amount: amount, + Denom: denom, + }) + } + } + + items = append(items, dto.ValidatorDelegationRelatedTx{ + Height: int(tx.BlockHeight), + Messages: msgTypes, + Sender: tx.Transaction.Sender, + Timestamp: tx.Block.Timestamp, + Tokens: tokenCoins, + TxHash: fmt.Sprintf("%x", tx.Transaction.Hash), + }) + } + + return &dto.ValidatorDelegationRelatedTxsResponse{ + ValidatorDelegationRelatedTxs: items, + Pagination: dto.NewPaginationResponse(pagination.Offset, pagination.Limit, total), + }, nil +} + +func (s *validatorService) GetValidatorProposedBlocks(pagination dto.PaginationQuery, operatorAddr string) (*dto.ValidatorProposedBlocksResponse, error) { + blocks, total, err := s.repo.GetValidatorProposedBlocks(pagination, operatorAddr) + if err != nil { + return nil, err + } + + return &dto.ValidatorProposedBlocksResponse{ + ValidatorProposedBlocks: blocks, + Pagination: dto.NewPaginationResponse(pagination.Offset, pagination.Limit, total), + }, nil +} + +func (s *validatorService) GetValidatorHistoricalPowers(operatorAddr string) (*dto.ValidatorHistoricalPowersResponse, error) { + powers, total, err := s.repo.GetValidatorHistoricalPowers(operatorAddr) + if err != nil { + return nil, err + } + + return &dto.ValidatorHistoricalPowersResponse{ + ValidatorHistoricalPowers: powers, + Pagination: dto.PaginationResponse{ + NextKey: nil, + Total: fmt.Sprintf("%d", total), + }, + }, nil +} + +func (s *validatorService) GetValidatorVotedProposals(pagination dto.PaginationQuery, operatorAddr, search, answer string) (*dto.ValidatorVotedProposalsResponse, error) { + allProposals, err := s.proposalRepo.GetProposals(&pagination) + if err != nil { + return nil, err + } + + validatorVotes, err := s.proposalRepo.GetProposalVotesByValidator(operatorAddr) + if err != nil { + return nil, err + } + + voteMap := make(map[int32]db.ProposalVote) + for _, vote := range validatorVotes { + voteMap[vote.ProposalID] = vote + } + + var filteredProposals []dto.ValidatorVotedProposal + for _, proposal := range allProposals { + proposalItem := dto.ValidatorVotedProposal{ + Abstain: 0, + IsEmergency: proposal.IsEmergency, + IsExpedited: proposal.IsExpedited, + IsVoteWeighted: false, + No: 0, + NoWithVeto: 0, + ProposalId: int(proposal.ID), + Status: proposal.Status, + Title: proposal.Title, + Yes: 0, + } + + if proposal.Types != nil { + var types []string + if err := json.Unmarshal(proposal.Types, &types); err == nil { + proposalItem.Types = types + } + } + + if vote, exists := voteMap[proposal.ID]; exists { + proposalItem.Yes = vote.Yes + proposalItem.No = vote.No + proposalItem.NoWithVeto = vote.NoWithVeto + proposalItem.Abstain = vote.Abstain + proposalItem.IsVoteWeighted = vote.IsVoteWeighted + proposalItem.Timestamp = &vote.Transaction.Block.Timestamp + proposalItem.TxHash = fmt.Sprintf("%x", vote.Transaction.Hash) + } + + if search != "" { + proposalIdStr := strconv.Itoa(proposalItem.ProposalId) + titleLower := strings.ToLower(proposalItem.Title) + searchLower := strings.ToLower(search) + + if !strings.Contains(proposalIdStr, searchLower) && !strings.Contains(titleLower, searchLower) { + continue + } + } + + if answer != "" && !matchAnswer(proposalItem, answer) { + continue + } + + filteredProposals = append(filteredProposals, proposalItem) + } + + var total int64 = 0 + if pagination.CountTotal { + total = int64(len(filteredProposals)) + } + + startIdx := pagination.Offset + endIdx := pagination.Offset + pagination.Limit + + if startIdx > len(filteredProposals) { + startIdx = len(filteredProposals) + } + if endIdx > len(filteredProposals) { + endIdx = len(filteredProposals) + } + + return &dto.ValidatorVotedProposalsResponse{ + ValidatorVotedProposals: filteredProposals[startIdx:endIdx], + Pagination: dto.NewPaginationResponse(pagination.Offset, pagination.Limit, total), + }, nil +} + +func matchAnswer(proposal dto.ValidatorVotedProposal, answer string) bool { + switch answer { + case "yes": + return proposal.Yes > 0 + case "no": + return proposal.No > 0 + case "abstain": + return proposal.Abstain > 0 + case "no_with_veto": + return proposal.NoWithVeto > 0 + case "did_not_vote": + return proposal.TxHash == "" + case "weighted": + return proposal.IsVoteWeighted + default: + return true + } +} + +func (s *validatorService) GetValidatorAnswerCounts(operatorAddr string) (*dto.ValidatorAnswerCountsResponse, error) { + allProposals, err := s.proposalRepo.GetProposals(nil) + if err != nil { + return nil, err + } + + validatorVotes, err := s.proposalRepo.GetProposalVotesByValidator(operatorAddr) + if err != nil { + return nil, err + } + + allProposalsCount := len(allProposals) + votedProposalsCount := len(validatorVotes) + answerCounts := &dto.ValidatorAnswerCountsResponse{ + Abstain: 0, + All: allProposalsCount, + DidNotVote: allProposalsCount - votedProposalsCount, + No: 0, + NoWithVeto: 0, + Weighted: 0, + Yes: 0, + } + + for _, vote := range validatorVotes { + if vote.IsVoteWeighted { + answerCounts.Weighted++ + continue + } + if vote.Yes > 0 { + answerCounts.Yes++ + } + if vote.No > 0 { + answerCounts.No++ + } + if vote.NoWithVeto > 0 { + answerCounts.NoWithVeto++ + } + if vote.Abstain > 0 { + answerCounts.Abstain++ + } + } + + return answerCounts, nil +} diff --git a/api/utils/hex.go b/api/utils/hex.go new file mode 100644 index 00000000..f6b412d7 --- /dev/null +++ b/api/utils/hex.go @@ -0,0 +1,23 @@ +package utils + +import ( + "encoding/hex" + "regexp" + "strings" +) + +func IsHex(s string) bool { + if strings.HasPrefix(s, "0x") || strings.HasPrefix(s, "0X") { + s = s[2:] + } + if len(s)%2 != 0 { + return false + } + _, err := hex.DecodeString(s) + return err == nil +} + +func IsTxHash(txhash string) bool { + hexRegex := regexp.MustCompile(`^[a-fA-F0-9]{64}$`) + return hexRegex.MatchString(txhash) +} diff --git a/api/utils/map.go b/api/utils/map.go new file mode 100644 index 00000000..4a80bbaa --- /dev/null +++ b/api/utils/map.go @@ -0,0 +1,6 @@ +package utils + +func ContainsKey(m map[int64]string, key int64) bool { + _, exists := m[key] + return exists +} diff --git a/api/utils/math.go b/api/utils/math.go new file mode 100644 index 00000000..649bffb2 --- /dev/null +++ b/api/utils/math.go @@ -0,0 +1,22 @@ +package utils + +import ( + "sort" +) + +func Median(nums []float64) float64 { + n := len(nums) + if n == 0 { + return 0 + } + + sorted := make([]float64, n) + copy(sorted, nums) + sort.Float64s(sorted) + + mid := n / 2 + if n%2 == 0 { + return (sorted[mid-1] + sorted[mid]) / 2 + } + return sorted[mid] +} diff --git a/charts/api/Chart.yaml b/charts/api/Chart.yaml new file mode 100644 index 00000000..88e1c9d1 --- /dev/null +++ b/charts/api/Chart.yaml @@ -0,0 +1,5 @@ +apiVersion: v2 +name: core-indexer-api +version: 0.1.0 +type: application +description: core-indexer-api chart diff --git a/charts/api/templates/deployment.yaml b/charts/api/templates/deployment.yaml new file mode 100644 index 00000000..b30a6480 --- /dev/null +++ b/charts/api/templates/deployment.yaml @@ -0,0 +1,92 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: "{{ .Release.Name }}-api" + namespace: {{ quote .Release.Namespace }} + labels: + app: "{{ .Release.Name }}-api" + app.kubernetes.io/name: "{{ .Release.Name }}-api" + app.kubernetes.io/instance: {{ quote .Release.Name }} + app.kubernetes.io/version: {{ quote (default "latest" .Chart.AppVersion) }} + app.kubernetes.io/managed-by: {{ quote .Release.Service }} + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 6 }} + {{- end }} +spec: + {{- if not .Values.autoscaling.enabled }} + replicas: {{ .Values.replicas }} + {{- end }} + {{- if .Values.strategy }} + strategy: + {{- toYaml .Values.strategy | nindent 4 }} + {{- end }} + revisionHistoryLimit: 10 + selector: + matchLabels: + app: "{{ .Release.Name }}-api" + template: + metadata: + labels: + app: "{{ .Release.Name }}-api" + spec: + {{- if .Values.serviceAccountName }} + serviceAccountName: {{ quote .Values.serviceAccountName }} + {{- end }} + {{- with .Values.imagePullSecret }} + imagePullSecrets: + - name: {{ quote . }} + {{- end }} + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: app + operator: In + values: + - "{{ .Release.Name }}-api" + topologyKey: "kubernetes.io/hostname" + containers: + - name: core-indexer-api + image: {{ quote .Values.image }} + {{- with .Values.imagePullPolicy }} + imagePullPolicy: {{ quote . }} + {{- end }} + {{- if .Values.env }} + env: + {{- range $key, $value := .Values.env }} + - name: {{ quote $key }} + value: {{ quote $value }} + {{- end }} + {{- end }} + {{- if .Values.envFrom }} + envFrom: + {{- toYaml .Values.envFrom | nindent 12 }} + {{- end }} + resources: + {{- toYaml .Values.resources | nindent 12 }} + securityContext: + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1000 + runAsGroup: 1000 + ports: + - containerPort: 8080 + livenessProbe: + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 2 + httpGet: + path: /health + port: 8080 + readinessProbe: + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 5 + httpGet: + path: /health + port: 8080 diff --git a/charts/api/templates/hpa.yaml b/charts/api/templates/hpa.yaml new file mode 100644 index 00000000..38a17d7a --- /dev/null +++ b/charts/api/templates/hpa.yaml @@ -0,0 +1,31 @@ +{{- if .Values.autoscaling.enabled }} +--- +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: "{{ .Release.Name }}-api" + labels: + app: "{{ .Release.Name }}-api" +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: "{{ .Release.Name }}-api" + minReplicas: {{ .Values.autoscaling.minReplicas }} + maxReplicas: {{ .Values.autoscaling.maxReplicas }} + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} + {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + target: + type: Utilization + averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} diff --git a/charts/api/templates/pod-disruption-budget.yaml b/charts/api/templates/pod-disruption-budget.yaml new file mode 100644 index 00000000..7eabdaf0 --- /dev/null +++ b/charts/api/templates/pod-disruption-budget.yaml @@ -0,0 +1,13 @@ +{{- if or (gt (int .Values.replicas) 1) .Values.autoscaling.enabled }} +--- +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: "{{ .Release.Name }}-api" +spec: + minAvailable: 1 + unhealthyPodEvictionPolicy: AlwaysAllow + selector: + matchLabels: + app: "{{ .Release.Name }}-api" +{{- end }} diff --git a/charts/api/templates/service.yaml b/charts/api/templates/service.yaml new file mode 100644 index 00000000..d377c9c3 --- /dev/null +++ b/charts/api/templates/service.yaml @@ -0,0 +1,17 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: "{{ .Release.Name }}-api" + namespace: {{ quote .Release.Namespace }} + labels: + app: "{{ .Release.Name }}-api" +spec: + type: ClusterIP + ports: + - port: 80 + targetPort: 8080 + protocol: TCP + name: http + selector: + app: "{{ .Release.Name }}-api" diff --git a/charts/api/values.yaml b/charts/api/values.yaml new file mode 100644 index 00000000..f10142d2 --- /dev/null +++ b/charts/api/values.yaml @@ -0,0 +1,45 @@ +image: ghcr.io/initia-labs/core-indexer-api:main +imagePullPolicy: null +imagePullSecret: null +replicas: 2 + +strategy: + type: RollingUpdate + rollingUpdate: + maxUnavailable: 1 + maxSurge: 1 + +# List of environment variables +env: + {} + # For example: + # EXAMPLE_ENV: example + +# List of ConfigMap/Secret references for environment variables +envFrom: + [] + # For example: + # - configMapRef: + # name: my-config + # - secretRef: + # name: my-secret + +resources: + requests: + cpu: 500m + memory: 1Gi + limits: + cpu: 500m + memory: 1Gi + +autoscaling: + enabled: false + minReplicas: 2 + maxReplicas: 5 + targetCPUUtilizationPercentage: 80 + targetMemoryUtilizationPercentage: 80 + +annotations: + {} + +serviceAccountName: null diff --git a/charts/event-indexer/Chart.yaml b/charts/event-indexer/Chart.yaml new file mode 100644 index 00000000..b1b02490 --- /dev/null +++ b/charts/event-indexer/Chart.yaml @@ -0,0 +1,5 @@ +apiVersion: v2 +name: event-indexer +version: 0.1.0 +type: application +description: Event indexer for Scan diff --git a/charts/event-indexer/templates/deployment.yaml b/charts/event-indexer/templates/deployment.yaml new file mode 100644 index 00000000..fa7d251d --- /dev/null +++ b/charts/event-indexer/templates/deployment.yaml @@ -0,0 +1,65 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ quote .Release.Name }} + namespace: {{ quote .Release.Namespace }} + labels: + app: {{ quote .Release.Name }} + app.kubernetes.io/name: {{ quote .Release.Name }} + app.kubernetes.io/instance: {{ quote .Release.Name }} + app.kubernetes.io/version: {{ quote (default "latest" .Chart.AppVersion) }} + app.kubernetes.io/managed-by: {{ quote .Release.Service }} + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 6 }} + {{- end }} +spec: + replicas: {{ .Values.replicas }} + strategy: + type: Recreate + selector: + matchLabels: + app: {{ quote .Release.Name }} + template: + metadata: + labels: + app: {{ quote .Release.Name }} + spec: + {{- if .Values.serviceAccountName }} + serviceAccountName: {{ quote .Values.serviceAccountName }} + {{- end }} + {{- with .Values.imagePullSecret }} + imagePullSecrets: + - name: {{ quote . }} + {{- end }} + containers: + - name: event-indexer + image: {{ quote .Values.image }} + command: + - /event-indexer + - run + {{- with .Values.imagePullPolicy }} + imagePullPolicy: {{ quote . }} + {{- end }} + env: + # Auto-generate unique ID per pod for workers + - name: ID + valueFrom: + fieldRef: + fieldPath: metadata.name + {{- range $key, $value := .Values.env }} + - name: {{ quote $key }} + value: {{ quote $value }} + {{- end }} + {{- if .Values.envFrom }} + envFrom: + {{- toYaml .Values.envFrom | nindent 12 }} + {{- end }} + resources: + {{- toYaml .Values.resources | nindent 12 }} + securityContext: + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1000 + runAsGroup: 1000 diff --git a/charts/event-indexer/values.yaml b/charts/event-indexer/values.yaml new file mode 100644 index 00000000..a6129af6 --- /dev/null +++ b/charts/event-indexer/values.yaml @@ -0,0 +1,28 @@ +image: ghcr.io/initia-labs/event-indexer:main +imagePullPolicy: null +imagePullSecret: null +replicas: 1 + +# List of environment variables +env: {} + +# List of ConfigMap/Secret references for environment variables +envFrom: [] + # For example: + # - configMapRef: + # name: my-config + # - secretRef: + # name: my-secret + +resources: + requests: + cpu: 500m + memory: 1Gi + + limits: + cpu: 500m + memory: 1Gi + +annotations: {} + +serviceAccountName: null diff --git a/charts/generic-indexer/Chart.yaml b/charts/generic-indexer/Chart.yaml new file mode 100644 index 00000000..07f75d89 --- /dev/null +++ b/charts/generic-indexer/Chart.yaml @@ -0,0 +1,5 @@ +apiVersion: v2 +name: generic-indexer +version: 0.1.0 +type: application +description: Generic indexer for Scan diff --git a/charts/generic-indexer/templates/deployment-cron.yaml b/charts/generic-indexer/templates/deployment-cron.yaml new file mode 100644 index 00000000..168b3b38 --- /dev/null +++ b/charts/generic-indexer/templates/deployment-cron.yaml @@ -0,0 +1,67 @@ +{{- if .Values.cron.enabled }} +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: "{{ .Release.Name }}-cron" + namespace: {{ quote .Release.Namespace }} + labels: + app: "{{ .Release.Name }}-cron" + app.kubernetes.io/name: "{{ .Release.Name }}-cron" + app.kubernetes.io/instance: {{ quote .Release.Name }} + app.kubernetes.io/version: {{ quote (default "latest" .Chart.AppVersion) }} + app.kubernetes.io/managed-by: {{ quote .Release.Service }} + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 6 }} + {{- end }} +spec: + replicas: {{ .Values.cron.replicas }} + strategy: + type: Recreate + selector: + matchLabels: + app: "{{ .Release.Name }}-cron" + template: + metadata: + labels: + app: "{{ .Release.Name }}-cron" + spec: + {{- if .Values.serviceAccountName }} + serviceAccountName: {{ quote .Values.serviceAccountName }} + {{- end }} + {{- with .Values.imagePullSecret }} + imagePullSecrets: + - name: {{ quote . }} + {{- end }} + containers: + - name: generic-indexer-cron + image: {{ quote .Values.image }} + command: + - /generic-indexer + - cron + {{- with .Values.imagePullPolicy }} + imagePullPolicy: {{ quote . }} + {{- end }} + env: + # Auto-generate unique ID per pod for workers + - name: ID + valueFrom: + fieldRef: + fieldPath: metadata.name + {{- range $key, $value := .Values.cron.env }} + - name: {{ quote $key }} + value: {{ quote $value }} + {{- end }} + {{- if .Values.cron.envFrom }} + envFrom: + {{- toYaml .Values.cron.envFrom | nindent 12 }} + {{- end }} + resources: + {{- toYaml .Values.cron.resources | nindent 12 }} + securityContext: + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1000 + runAsGroup: 1000 +{{- end }} diff --git a/charts/generic-indexer/templates/deployment.yaml b/charts/generic-indexer/templates/deployment.yaml new file mode 100644 index 00000000..3d85b225 --- /dev/null +++ b/charts/generic-indexer/templates/deployment.yaml @@ -0,0 +1,67 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ quote .Release.Name }} + namespace: {{ quote .Release.Namespace }} + labels: + app: {{ quote .Release.Name }} + app.kubernetes.io/name: {{ quote .Release.Name }} + app.kubernetes.io/instance: {{ quote .Release.Name }} + app.kubernetes.io/version: {{ quote (default "latest" .Chart.AppVersion) }} + app.kubernetes.io/managed-by: {{ quote .Release.Service }} + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 6 }} + {{- end }} +spec: + replicas: {{ .Values.replicas }} + {{- with .Values.strategy }} + strategy: + {{- toYaml . | nindent 4 }} + {{- end }} + selector: + matchLabels: + app: {{ quote .Release.Name }} + template: + metadata: + labels: + app: {{ quote .Release.Name }} + spec: + {{- if .Values.serviceAccountName }} + serviceAccountName: {{ quote .Values.serviceAccountName }} + {{- end }} + {{- with .Values.imagePullSecret }} + imagePullSecrets: + - name: {{ quote . }} + {{- end }} + containers: + - name: generic-indexer + image: {{ quote .Values.image }} + command: + - /generic-indexer + - run + {{- with .Values.imagePullPolicy }} + imagePullPolicy: {{ quote . }} + {{- end }} + env: + # Auto-generate unique ID per pod for workers + - name: ID + valueFrom: + fieldRef: + fieldPath: metadata.name + {{- range $key, $value := .Values.env }} + - name: {{ quote $key }} + value: {{ quote $value }} + {{- end }} + {{- if .Values.envFrom }} + envFrom: + {{- toYaml .Values.envFrom | nindent 12 }} + {{- end }} + resources: + {{- toYaml .Values.resources | nindent 12 }} + securityContext: + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1000 + runAsGroup: 1000 diff --git a/charts/generic-indexer/templates/hpa.yaml b/charts/generic-indexer/templates/hpa.yaml new file mode 100644 index 00000000..c5cc1e2d --- /dev/null +++ b/charts/generic-indexer/templates/hpa.yaml @@ -0,0 +1,31 @@ +{{- if .Values.autoscaling.enabled }} +--- +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: {{ .Release.Name }} + labels: + app: {{ .Release.Name }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ .Release.Name }} + minReplicas: {{ .Values.autoscaling.minReplicas }} + maxReplicas: {{ .Values.autoscaling.maxReplicas }} + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} + {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + target: + type: Utilization + averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} diff --git a/charts/generic-indexer/templates/poddisruptionbudget.yaml b/charts/generic-indexer/templates/poddisruptionbudget.yaml new file mode 100644 index 00000000..72f37432 --- /dev/null +++ b/charts/generic-indexer/templates/poddisruptionbudget.yaml @@ -0,0 +1,13 @@ +{{- if or (gt (int .Values.replicas) 1) .Values.autoscaling.enabled }} +--- +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: {{ quote .Release.Name }} +spec: + minAvailable: 1 + unhealthyPodEvictionPolicy: AlwaysAllow + selector: + matchLabels: + app: {{ quote .Release.Name }} +{{- end }} diff --git a/charts/generic-indexer/values.yaml b/charts/generic-indexer/values.yaml new file mode 100644 index 00000000..63eac229 --- /dev/null +++ b/charts/generic-indexer/values.yaml @@ -0,0 +1,59 @@ +image: ghcr.io/initia-labs/generic-indexer:main +imagePullPolicy: null +imagePullSecret: null +replicas: 3 # HA configuration + +# List of environment variables +env: {} + # For example: + # EXAMPLE_ENV: example + +# List of ConfigMap/Secret references for environment variables +envFrom: [] + # For example: + # - configMapRef: + # name: my-config + # - secretRef: + # name: my-secret + +resources: + requests: + cpu: 500m + memory: 1Gi + + limits: + cpu: 500m + memory: 1Gi + +strategy: + type: RollingUpdate + rollingUpdate: + maxUnavailable: 3 + maxSurge: 6 + +autoscaling: + enabled: false + minReplicas: 2 + maxReplicas: 5 + targetCPUUtilizationPercentage: 80 + targetMemoryUtilizationPercentage: 80 + +annotations: {} + +serviceAccountName: null + +# Cron deployment configuration +cron: + enabled: false + replicas: 1 + env: {} + + envFrom: [] + + resources: + requests: + cpu: 500m + memory: 1Gi + limits: + cpu: 500m + memory: 1Gi diff --git a/charts/informative-indexer/Chart.yaml b/charts/informative-indexer/Chart.yaml new file mode 100644 index 00000000..292a4e87 --- /dev/null +++ b/charts/informative-indexer/Chart.yaml @@ -0,0 +1,5 @@ +apiVersion: v2 +name: informative-indexer +version: 0.1.0 +type: application +description: Informative indexer for Scan diff --git a/charts/informative-indexer/templates/deployment.yaml b/charts/informative-indexer/templates/deployment.yaml new file mode 100644 index 00000000..35b872c9 --- /dev/null +++ b/charts/informative-indexer/templates/deployment.yaml @@ -0,0 +1,65 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ quote .Release.Name }} + namespace: {{ quote .Release.Namespace }} + labels: + app: {{ quote .Release.Name }} + app.kubernetes.io/name: {{ quote .Release.Name }} + app.kubernetes.io/instance: {{ quote .Release.Name }} + app.kubernetes.io/version: {{ quote (default "latest" .Chart.AppVersion) }} + app.kubernetes.io/managed-by: {{ quote .Release.Service }} + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 6 }} + {{- end }} +spec: + replicas: {{ .Values.replicas }} + strategy: + type: Recreate + selector: + matchLabels: + app: {{ quote .Release.Name }} + template: + metadata: + labels: + app: {{ quote .Release.Name }} + spec: + {{- if .Values.serviceAccountName }} + serviceAccountName: {{ quote .Values.serviceAccountName }} + {{- end }} + {{- with .Values.imagePullSecret }} + imagePullSecrets: + - name: {{ quote . }} + {{- end }} + containers: + - name: informative-indexer + image: {{ quote .Values.image }} + command: + - /informative-indexer + - run + {{- with .Values.imagePullPolicy }} + imagePullPolicy: {{ quote . }} + {{- end }} + env: + # Auto-generate unique ID per pod for workers + - name: ID + valueFrom: + fieldRef: + fieldPath: metadata.name + {{- range $key, $value := .Values.env }} + - name: {{ quote $key }} + value: {{ quote $value }} + {{- end }} + {{- if .Values.envFrom }} + envFrom: + {{- toYaml .Values.envFrom | nindent 12 }} + {{- end }} + resources: + {{- toYaml .Values.resources | nindent 12 }} + securityContext: + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1000 + runAsGroup: 1000 diff --git a/charts/informative-indexer/values.yaml b/charts/informative-indexer/values.yaml new file mode 100644 index 00000000..91801765 --- /dev/null +++ b/charts/informative-indexer/values.yaml @@ -0,0 +1,28 @@ +image: ghcr.io/initia-labs/informative-indexer:main +imagePullPolicy: null +imagePullSecret: null +replicas: 1 + +# List of environment variables +env: {} + +# List of ConfigMap/Secret references for environment variables +envFrom: [] + # For example: + # - configMapRef: + # name: my-config + # - secretRef: + # name: my-secret + +resources: + requests: + cpu: 500m + memory: 1Gi + + limits: + cpu: 500m + memory: 1Gi + +annotations: {} + +serviceAccountName: null diff --git a/charts/pruner/Chart.yaml b/charts/pruner/Chart.yaml new file mode 100644 index 00000000..d8db0e9d --- /dev/null +++ b/charts/pruner/Chart.yaml @@ -0,0 +1,5 @@ +apiVersion: v2 +name: pruner +version: 0.1.0 +type: application +description: Pruner for Scan diff --git a/charts/pruner/templates/deployment.yaml b/charts/pruner/templates/deployment.yaml new file mode 100644 index 00000000..7a776456 --- /dev/null +++ b/charts/pruner/templates/deployment.yaml @@ -0,0 +1,65 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ quote .Release.Name }} + namespace: {{ quote .Release.Namespace }} + labels: + app: {{ quote .Release.Name }} + app.kubernetes.io/name: {{ quote .Release.Name }} + app.kubernetes.io/instance: {{ quote .Release.Name }} + app.kubernetes.io/version: {{ quote (default "latest" .Chart.AppVersion) }} + app.kubernetes.io/managed-by: {{ quote .Release.Service }} + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 6 }} + {{- end }} +spec: + replicas: {{ .Values.replicas }} + strategy: + type: Recreate + selector: + matchLabels: + app: {{ quote .Release.Name }} + template: + metadata: + labels: + app: {{ quote .Release.Name }} + spec: + {{- if .Values.serviceAccountName }} + serviceAccountName: {{ quote .Values.serviceAccountName }} + {{- end }} + {{- with .Values.imagePullSecret }} + imagePullSecrets: + - name: {{ quote . }} + {{- end }} + containers: + - name: pruner + image: {{ quote .Values.image }} + command: + - /pruner + - run + {{- with .Values.imagePullPolicy }} + imagePullPolicy: {{ quote . }} + {{- end }} + env: + # Auto-generate unique ID per pod for workers + - name: ID + valueFrom: + fieldRef: + fieldPath: metadata.name + {{- range $key, $value := .Values.env }} + - name: {{ quote $key }} + value: {{ quote $value }} + {{- end }} + {{- if .Values.envFrom }} + envFrom: + {{- toYaml .Values.envFrom | nindent 12 }} + {{- end }} + resources: + {{- toYaml .Values.resources | nindent 12 }} + securityContext: + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1000 + runAsGroup: 1000 diff --git a/charts/pruner/values.yaml b/charts/pruner/values.yaml new file mode 100644 index 00000000..f86d52fe --- /dev/null +++ b/charts/pruner/values.yaml @@ -0,0 +1,28 @@ +image: ghcr.io/initia-labs/pruner:main +imagePullPolicy: null +imagePullSecret: null +replicas: 1 + +# List of environment variables +env: {} + +# List of ConfigMap/Secret references for environment variables +envFrom: [] + # For example: + # - configMapRef: + # name: my-config + # - secretRef: + # name: my-secret + +resources: + requests: + cpu: 500m + memory: 1Gi + + limits: + cpu: 500m + memory: 1Gi + +annotations: {} + +serviceAccountName: null diff --git a/charts/sweeper/Chart.yaml b/charts/sweeper/Chart.yaml new file mode 100644 index 00000000..9379880a --- /dev/null +++ b/charts/sweeper/Chart.yaml @@ -0,0 +1,5 @@ +apiVersion: v2 +name: sweeper +version: 0.1.0 +type: application +description: Sweeper for Scan diff --git a/charts/sweeper/templates/deployment.yaml b/charts/sweeper/templates/deployment.yaml new file mode 100644 index 00000000..efeb070f --- /dev/null +++ b/charts/sweeper/templates/deployment.yaml @@ -0,0 +1,62 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ quote .Release.Name }} + namespace: {{ quote .Release.Namespace }} + labels: + app: {{ quote .Release.Name }} + app.kubernetes.io/name: {{ quote .Release.Name }} + app.kubernetes.io/instance: {{ quote .Release.Name }} + app.kubernetes.io/version: {{ quote (default "latest" .Chart.AppVersion) }} + app.kubernetes.io/managed-by: {{ quote .Release.Service }} + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 6 }} + {{- end }} +spec: + replicas: {{ .Values.replicas }} + strategy: + type: Recreate + selector: + matchLabels: + app: {{ quote .Release.Name }} + template: + metadata: + labels: + app: {{ quote .Release.Name }} + spec: + {{- if .Values.serviceAccountName }} + serviceAccountName: {{ quote .Values.serviceAccountName }} + {{- end }} + {{- with .Values.imagePullSecret }} + imagePullSecrets: + - name: {{ quote . }} + {{- end }} + containers: + - name: sweeper + image: {{ quote .Values.image }} + command: + - /sweeper + - sweep + {{- with .Values.imagePullPolicy }} + imagePullPolicy: {{ quote . }} + {{- end }} + {{- if .Values.env }} + env: + {{- range $key, $value := .Values.env }} + - name: {{ quote $key }} + value: {{ quote $value }} + {{- end }} + {{- end }} + {{- if .Values.envFrom }} + envFrom: + {{- toYaml .Values.envFrom | nindent 12 }} + {{- end }} + resources: + {{- toYaml .Values.resources | nindent 12 }} + securityContext: + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1000 + runAsGroup: 1000 diff --git a/charts/sweeper/values.yaml b/charts/sweeper/values.yaml new file mode 100644 index 00000000..49157455 --- /dev/null +++ b/charts/sweeper/values.yaml @@ -0,0 +1,28 @@ +image: ghcr.io/initia-labs/sweeper:main +imagePullPolicy: null +imagePullSecret: null +replicas: 1 + +# List of environment variables +env: {} + +# List of ConfigMap/Secret references for environment variables +envFrom: [] + # For example: + # - configMapRef: + # name: my-config + # - secretRef: + # name: my-secret + +resources: + requests: + cpu: 500m + memory: 1Gi + + limits: + cpu: 500m + memory: 1Gi + +annotations: {} + +serviceAccountName: null diff --git a/charts/uploader/Chart.yaml b/charts/uploader/Chart.yaml new file mode 100644 index 00000000..1a58b2e5 --- /dev/null +++ b/charts/uploader/Chart.yaml @@ -0,0 +1,5 @@ +apiVersion: v2 +name: uploader +version: 0.1.0 +type: application +description: Uploader for Scan diff --git a/charts/uploader/templates/deployment.yaml b/charts/uploader/templates/deployment.yaml new file mode 100644 index 00000000..1a938b79 --- /dev/null +++ b/charts/uploader/templates/deployment.yaml @@ -0,0 +1,65 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ quote .Release.Name }} + namespace: {{ quote .Release.Namespace }} + labels: + app: {{ quote .Release.Name }} + app.kubernetes.io/name: {{ quote .Release.Name }} + app.kubernetes.io/instance: {{ quote .Release.Name }} + app.kubernetes.io/version: {{ quote (default "latest" .Chart.AppVersion) }} + app.kubernetes.io/managed-by: {{ quote .Release.Service }} + {{- with .Values.annotations }} + annotations: + {{- toYaml . | nindent 6 }} + {{- end }} +spec: + replicas: {{ .Values.replicas }} + strategy: + type: Recreate + selector: + matchLabels: + app: {{ quote .Release.Name }} + template: + metadata: + labels: + app: {{ quote .Release.Name }} + spec: + {{- if .Values.serviceAccountName }} + serviceAccountName: {{ quote .Values.serviceAccountName }} + {{- end }} + {{- with .Values.imagePullSecret }} + imagePullSecrets: + - name: {{ quote . }} + {{- end }} + containers: + - name: uploader + image: {{ quote .Values.image }} + command: + - /tx-response-uploader + - run + {{- with .Values.imagePullPolicy }} + imagePullPolicy: {{ quote . }} + {{- end }} + env: + # Auto-generate unique ID per pod for workers + - name: ID + valueFrom: + fieldRef: + fieldPath: metadata.name + {{- range $key, $value := .Values.env }} + - name: {{ quote $key }} + value: {{ quote $value }} + {{- end }} + {{- if .Values.envFrom }} + envFrom: + {{- toYaml .Values.envFrom | nindent 12 }} + {{- end }} + resources: + {{- toYaml .Values.resources | nindent 12 }} + securityContext: + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1000 + runAsGroup: 1000 diff --git a/charts/uploader/values.yaml b/charts/uploader/values.yaml new file mode 100644 index 00000000..7cebd8dc --- /dev/null +++ b/charts/uploader/values.yaml @@ -0,0 +1,28 @@ +image: ghcr.io/initia-labs/uploader:main +imagePullPolicy: null +imagePullSecret: null +replicas: 1 + +# List of environment variables +env: {} + +# List of ConfigMap/Secret references for environment variables +envFrom: [] + # For example: + # - configMapRef: + # name: my-config + # - secretRef: + # name: my-secret + +resources: + requests: + cpu: 500m + memory: 1Gi + + limits: + cpu: 500m + memory: 1Gi + +annotations: {} + +serviceAccountName: null diff --git a/db/migrations/20240307080048_dump_existing_tables.down.sql b/db/migrations/20240307080048_dump_existing_tables.down.sql new file mode 100644 index 00000000..e69de29b diff --git a/db/migrations/20240307080048_dump_existing_tables.up.sql b/db/migrations/20240307080048_dump_existing_tables.up.sql new file mode 100644 index 00000000..ffff59d9 --- /dev/null +++ b/db/migrations/20240307080048_dump_existing_tables.up.sql @@ -0,0 +1,1630 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 15.5 +-- Dumped by pg_dump version 15.6 (Homebrew) + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +-- +-- Name: accounttype; Type: TYPE; Schema: public; Owner: postgres +-- + +CREATE TYPE public.accounttype AS ENUM ( + 'BaseAccount', + 'InterchainAccount', + 'ModuleAccount', + 'ContinuousVestingAccount', + 'DelayedVestingAccount', + 'ClawbackVestingAccount', + 'ContractAccount' + ); + + +ALTER TYPE public.accounttype OWNER TO postgres; + +-- +-- Name: proposalstatus; Type: TYPE; Schema: public; Owner: postgres +-- + +CREATE TYPE public.proposalstatus AS ENUM ( + 'Nil', + 'DepositPeriod', + 'VotingPeriod', + 'Passed', + 'Rejected', + 'Failed', + 'Inactive', + 'Cancelled' + ); + + +ALTER TYPE public.proposalstatus OWNER TO postgres; + +-- +-- Name: upgradepolicy; Type: TYPE; Schema: public; Owner: postgres +-- + +CREATE TYPE public.upgradepolicy AS ENUM ( + 'Arbitrary', + 'Compatible', + 'Immutable' + ); + + +ALTER TYPE public.upgradepolicy OWNER TO postgres; + +SET default_tablespace = ''; + +SET default_table_access_method = heap; + +-- +-- Name: proposals; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.proposals ( + id integer NOT NULL, + proposer_id integer, + type character varying NOT NULL, + title character varying NOT NULL, + description character varying NOT NULL, + proposal_route character varying NOT NULL, + status public.proposalstatus NOT NULL, + submit_time timestamp without time zone NOT NULL, + deposit_end_time timestamp without time zone NOT NULL, + voting_time timestamp without time zone, + voting_end_time timestamp without time zone, + content json, + total_deposit json NOT NULL, + yes bigint NOT NULL, + no bigint NOT NULL, + abstain bigint NOT NULL, + no_with_veto bigint NOT NULL, + is_expedited boolean NOT NULL, + version character varying NOT NULL, + resolved_height integer, + types json NOT NULL, + messages json NOT NULL, + created_tx integer, + created_height integer, + metadata character varying NOT NULL +); + + +ALTER TABLE public.proposals OWNER TO postgres; + +-- +-- Name: search_proposals(character varying[]); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public.search_proposals(types_param character varying[] DEFAULT NULL::character varying[]) RETURNS SETOF public.proposals + LANGUAGE sql STABLE +AS $$ +SELECT * +FROM proposals +WHERE types_param IS NULL OR types_param::text[] <@ ARRAY(SELECT json_array_elements_text(types)); +$$; + + +ALTER FUNCTION public.search_proposals(types_param character varying[]) OWNER TO postgres; + +-- +-- Name: account_transactions; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.account_transactions ( + transaction_id integer NOT NULL, + account_id integer NOT NULL, + is_signer boolean NOT NULL, + block_height integer NOT NULL +); + + +ALTER TABLE public.account_transactions OWNER TO postgres; + +-- +-- Name: accounts; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.accounts ( + id integer NOT NULL, + address character varying NOT NULL, + vm_address_id integer NOT NULL, + type public.accounttype, + name character varying +); + + +ALTER TABLE public.accounts OWNER TO postgres; + +-- +-- Name: blocks; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.blocks ( + height integer NOT NULL, + "timestamp" timestamp without time zone NOT NULL, + proposer character varying, + hash bytea NOT NULL +); + + +ALTER TABLE public.blocks OWNER TO postgres; + +-- +-- Name: blocks_height_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.blocks_height_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.blocks_height_seq OWNER TO postgres; + +-- +-- Name: blocks_height_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres +-- + +ALTER SEQUENCE public.blocks_height_seq OWNED BY public.blocks.height; + + +-- +-- Name: collection_mutation_events; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.collection_mutation_events ( + collection_id integer NOT NULL, + mutated_field_name character varying NOT NULL, + old_value character varying NOT NULL, + new_value character varying NOT NULL, + block_height integer NOT NULL, + remark json NOT NULL +); + + +ALTER TABLE public.collection_mutation_events OWNER TO postgres; + +-- +-- Name: collection_proposals; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.collection_proposals ( + collection_id integer NOT NULL, + nft_id integer, + proposal_id integer NOT NULL +); + + +ALTER TABLE public.collection_proposals OWNER TO postgres; + +-- +-- Name: collection_transactions; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.collection_transactions ( + collection_id integer NOT NULL, + nft_id integer, + tx_id integer NOT NULL, + is_nft_transfer boolean NOT NULL, + is_nft_mint boolean NOT NULL, + is_nft_burn boolean NOT NULL, + is_collection_create boolean NOT NULL, + block_height integer NOT NULL +); + + +ALTER TABLE public.collection_transactions OWNER TO postgres; + +-- +-- Name: collections; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.collections ( + id integer NOT NULL, + block_height integer NOT NULL, + collection integer NOT NULL, + uri character varying NOT NULL, + description character varying NOT NULL, + creator integer NOT NULL, + name character varying NOT NULL +); + + +ALTER TABLE public.collections OWNER TO postgres; + +-- +-- Name: lcd_tx_results; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.lcd_tx_results ( + block_height integer NOT NULL, + transaction_id integer NOT NULL, + result json NOT NULL +); + + +ALTER TABLE public.lcd_tx_results OWNER TO postgres; + +-- +-- Name: module_histories; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.module_histories ( + module_id integer NOT NULL, + upgrade_policy public.upgradepolicy NOT NULL, + block_height integer NOT NULL, + remark json NOT NULL +); + + +ALTER TABLE public.module_histories OWNER TO postgres; + +-- +-- Name: module_proposals; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.module_proposals ( + module_id integer NOT NULL, + proposal_id integer NOT NULL +); + + +ALTER TABLE public.module_proposals OWNER TO postgres; + +-- +-- Name: module_transactions; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.module_transactions ( + tx_id integer NOT NULL, + module_id integer NOT NULL, + is_entry boolean NOT NULL, + block_height integer NOT NULL +); + + +ALTER TABLE public.module_transactions OWNER TO postgres; + +-- +-- Name: modules; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.modules ( + id integer NOT NULL, + publisher_id integer NOT NULL, + name character varying NOT NULL, + upgrade_policy public.upgradepolicy NOT NULL, + publish_tx_id integer, + module_entry_executed integer NOT NULL, + is_verify boolean NOT NULL +); + + +ALTER TABLE public.modules OWNER TO postgres; + +-- +-- Name: nft_histories; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.nft_histories ( + nft_id integer NOT NULL, + "from" integer NOT NULL, + "to" integer NOT NULL, + block_height integer NOT NULL, + remark json NOT NULL +); + + +ALTER TABLE public.nft_histories OWNER TO postgres; + +-- +-- Name: nft_mutation_events; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.nft_mutation_events ( + nft_id integer NOT NULL, + mutated_field_name character varying NOT NULL, + old_value character varying NOT NULL, + new_value character varying NOT NULL, + block_height integer NOT NULL, + remark json NOT NULL +); + + +ALTER TABLE public.nft_mutation_events OWNER TO postgres; + +-- +-- Name: nft_proposals; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.nft_proposals ( + nft_id integer NOT NULL, + proposal_id integer NOT NULL +); + + +ALTER TABLE public.nft_proposals OWNER TO postgres; + +-- +-- Name: nft_transactions; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.nft_transactions ( + nft_id integer NOT NULL, + tx_id integer NOT NULL, + is_nft_transfer boolean NOT NULL, + is_nft_mint boolean NOT NULL, + is_nft_burn boolean NOT NULL, + block_height integer NOT NULL +); + + +ALTER TABLE public.nft_transactions OWNER TO postgres; + +-- +-- Name: nfts; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.nfts ( + id integer NOT NULL, + collection integer NOT NULL, + owner integer NOT NULL, + nft integer NOT NULL, + uri character varying NOT NULL, + description character varying NOT NULL, + is_burned boolean NOT NULL, + token_id character varying NOT NULL, + remark json NOT NULL +); + + +ALTER TABLE public.nfts OWNER TO postgres; + +-- +-- Name: opinit_transactions; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.opinit_transactions ( + tx_id integer NOT NULL, + bridge_id integer NOT NULL, + block_height integer NOT NULL +); + + +ALTER TABLE public.opinit_transactions OWNER TO postgres; + +-- +-- Name: proposal_deposits; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.proposal_deposits ( + proposal_id integer NOT NULL, + transaction_id integer, + depositor integer NOT NULL, + amount json NOT NULL +); + + +ALTER TABLE public.proposal_deposits OWNER TO postgres; + +-- +-- Name: proposal_votes; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.proposal_votes ( + proposal_id integer NOT NULL, + transaction_id integer, + voter integer NOT NULL, + is_vote_weighted boolean NOT NULL, + is_validator boolean NOT NULL, + validator_address character varying, + yes numeric NOT NULL, + no numeric NOT NULL, + abstain numeric NOT NULL, + no_with_veto numeric NOT NULL +); + + +ALTER TABLE public.proposal_votes OWNER TO postgres; + +-- +-- Name: proposal_votes_legacy; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.proposal_votes_legacy ( + proposal_id integer NOT NULL, + transaction_id integer, + voter integer NOT NULL, + is_vote_weighted boolean NOT NULL, + is_validator boolean NOT NULL, + validator_address character varying, + yes numeric NOT NULL, + no numeric NOT NULL, + abstain numeric NOT NULL, + no_with_veto numeric NOT NULL +); + + +ALTER TABLE public.proposal_votes_legacy OWNER TO postgres; + +-- +-- Name: proposals_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.proposals_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.proposals_id_seq OWNER TO postgres; + +-- +-- Name: proposals_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres +-- + +ALTER SEQUENCE public.proposals_id_seq OWNED BY public.proposals.id; + + +-- +-- Name: seq_account_id; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.seq_account_id + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.seq_account_id OWNER TO postgres; + +-- +-- Name: seq_collection_id; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.seq_collection_id + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.seq_collection_id OWNER TO postgres; + +-- +-- Name: seq_module_id; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.seq_module_id + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.seq_module_id OWNER TO postgres; + +-- +-- Name: seq_nft_id; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.seq_nft_id + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.seq_nft_id OWNER TO postgres; + +-- +-- Name: seq_transaction_id; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.seq_transaction_id + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.seq_transaction_id OWNER TO postgres; + +-- +-- Name: seq_validator_id; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.seq_validator_id + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.seq_validator_id OWNER TO postgres; + +-- +-- Name: seq_vm_address_id; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.seq_vm_address_id + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.seq_vm_address_id OWNER TO postgres; + +-- +-- Name: tracking; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.tracking ( + chain_id character varying NOT NULL, + topic character varying NOT NULL, + kafka_offset integer NOT NULL, + replay_topic character varying NOT NULL, + replay_offset integer NOT NULL +); + + +ALTER TABLE public.tracking OWNER TO postgres; + +-- +-- Name: transactions; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.transactions ( + id integer NOT NULL, + hash bytea NOT NULL, + block_height integer NOT NULL, + gas_used integer NOT NULL, + gas_limit integer NOT NULL, + gas_fee character varying NOT NULL, + err_msg character varying, + success boolean NOT NULL, + sender integer NOT NULL, + memo character varying NOT NULL, + messages json NOT NULL, + is_ibc boolean NOT NULL, + is_send boolean NOT NULL, + is_move_publish boolean NOT NULL, + is_move_execute_event boolean NOT NULL, + is_move_execute boolean NOT NULL, + is_move_upgrade boolean NOT NULL, + is_move_script boolean NOT NULL, + is_nft_transfer boolean NOT NULL, + is_nft_mint boolean NOT NULL, + is_nft_burn boolean NOT NULL, + is_collection_create boolean NOT NULL, + is_opinit boolean NOT NULL, + is_instantiate boolean NOT NULL, + is_migrate boolean NOT NULL, + is_update_admin boolean NOT NULL, + is_clear_admin boolean NOT NULL, + is_store_code boolean NOT NULL +); + + +ALTER TABLE public.transactions OWNER TO postgres; + +-- +-- Name: validators; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.validators ( + id integer NOT NULL, + account_id integer NOT NULL, + operator_address character varying NOT NULL, + consensus_address character varying NOT NULL, + voting_powers json NOT NULL, + voting_power bigint NOT NULL, + moniker character varying NOT NULL, + identity character varying NOT NULL, + website character varying NOT NULL, + details character varying NOT NULL, + commission_rate character varying NOT NULL, + commission_max_rate character varying NOT NULL, + commission_max_change character varying NOT NULL, + jailed boolean NOT NULL +); + + +ALTER TABLE public.validators OWNER TO postgres; + +-- +-- Name: vm_addresses; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.vm_addresses ( + id integer NOT NULL, + vm_address character varying NOT NULL +); + + +ALTER TABLE public.vm_addresses OWNER TO postgres; + +-- +-- Name: blocks height; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.blocks ALTER COLUMN height SET DEFAULT nextval('public.blocks_height_seq'::regclass); + + +-- +-- Name: proposals id; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.proposals ALTER COLUMN id SET DEFAULT nextval('public.proposals_id_seq'::regclass); + + +-- +-- Name: account_transactions account_transactions_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.account_transactions + ADD CONSTRAINT account_transactions_pkey PRIMARY KEY (transaction_id, account_id); + + +-- +-- Name: accounts accounts_id_key; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.accounts + ADD CONSTRAINT accounts_id_key UNIQUE (id); + + +-- +-- Name: accounts accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.accounts + ADD CONSTRAINT accounts_pkey PRIMARY KEY (address); + + +-- +-- Name: blocks blocks_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.blocks + ADD CONSTRAINT blocks_pkey PRIMARY KEY (height); + + +-- +-- Name: collections collections_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.collections + ADD CONSTRAINT collections_pkey PRIMARY KEY (id); + + +-- +-- Name: modules modules_id_key; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.modules + ADD CONSTRAINT modules_id_key UNIQUE (id); + + +-- +-- Name: modules modules_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.modules + ADD CONSTRAINT modules_pkey PRIMARY KEY (publisher_id, name); + + +-- +-- Name: nfts nfts_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.nfts + ADD CONSTRAINT nfts_pkey PRIMARY KEY (id); + + +-- +-- Name: proposals proposals_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.proposals + ADD CONSTRAINT proposals_pkey PRIMARY KEY (id); + + +-- +-- Name: tracking tracking_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.tracking + ADD CONSTRAINT tracking_pkey PRIMARY KEY (chain_id); + + +-- +-- Name: transactions transactions_id_key; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.transactions + ADD CONSTRAINT transactions_id_key UNIQUE (id); + + +-- +-- Name: transactions transactions_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.transactions + ADD CONSTRAINT transactions_pkey PRIMARY KEY (hash, block_height); + + +-- +-- Name: validators validators_account_id_key; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.validators + ADD CONSTRAINT validators_account_id_key UNIQUE (account_id); + + +-- +-- Name: validators validators_id_key; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.validators + ADD CONSTRAINT validators_id_key UNIQUE (id); + + +-- +-- Name: validators validators_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.validators + ADD CONSTRAINT validators_pkey PRIMARY KEY (operator_address); + + +-- +-- Name: vm_addresses vm_addresses_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.vm_addresses + ADD CONSTRAINT vm_addresses_pkey PRIMARY KEY (id); + + +-- +-- Name: vm_addresses vm_addresses_vm_address_key; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.vm_addresses + ADD CONSTRAINT vm_addresses_vm_address_key UNIQUE (vm_address); + + +-- +-- Name: ix_blocks_timestamp; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX ix_blocks_timestamp ON public.blocks USING btree ("timestamp"); + + +-- +-- Name: ix_collection_mutation_events_block_height; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX ix_collection_mutation_events_block_height ON public.collection_mutation_events USING btree (block_height); + + +-- +-- Name: ix_collection_transactions_block_height; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX ix_collection_transactions_block_height ON public.collection_transactions USING btree (block_height); + + +-- +-- Name: ix_collections_block_height; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX ix_collections_block_height ON public.collections USING btree (block_height); + + +-- +-- Name: ix_lcd_tx_results_block_height; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX ix_lcd_tx_results_block_height ON public.lcd_tx_results USING btree (block_height); + + +-- +-- Name: ix_lcd_tx_results_transaction_id; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX ix_lcd_tx_results_transaction_id ON public.lcd_tx_results USING btree (transaction_id); + + +-- +-- Name: ix_module_histories_block_height; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX ix_module_histories_block_height ON public.module_histories USING btree (block_height); + + +-- +-- Name: ix_module_histories_module_id; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX ix_module_histories_module_id ON public.module_histories USING btree (module_id); + + +-- +-- Name: ix_module_transactions_block_height; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX ix_module_transactions_block_height ON public.module_transactions USING btree (block_height); + + +-- +-- Name: ix_nft_histories_block_height; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX ix_nft_histories_block_height ON public.nft_histories USING btree (block_height); + + +-- +-- Name: ix_nft_mutation_events_block_height; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX ix_nft_mutation_events_block_height ON public.nft_mutation_events USING btree (block_height); + + +-- +-- Name: ix_nft_transactions_block_height; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX ix_nft_transactions_block_height ON public.nft_transactions USING btree (block_height); + + +-- +-- Name: ix_opinit_transactions_block_height; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX ix_opinit_transactions_block_height ON public.opinit_transactions USING btree (block_height); + + +-- +-- Name: ix_proposal_votes_transaction_id_desc; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX ix_proposal_votes_transaction_id_desc ON public.proposal_votes USING btree (proposal_id, transaction_id DESC); + + +-- +-- Name: ix_proposals_resolved_height; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX ix_proposals_resolved_height ON public.proposals USING btree (resolved_height); + + +-- +-- Name: ix_transactions_block_height; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX ix_transactions_block_height ON public.transactions USING btree (block_height); + + +-- +-- Name: account_transactions account_transactions_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.account_transactions + ADD CONSTRAINT account_transactions_account_id_fkey FOREIGN KEY (account_id) REFERENCES public.accounts(id); + + +-- +-- Name: account_transactions account_transactions_block_height_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.account_transactions + ADD CONSTRAINT account_transactions_block_height_fkey FOREIGN KEY (block_height) REFERENCES public.blocks(height); + + +-- +-- Name: account_transactions account_transactions_transaction_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.account_transactions + ADD CONSTRAINT account_transactions_transaction_id_fkey FOREIGN KEY (transaction_id) REFERENCES public.transactions(id); + + +-- +-- Name: accounts accounts_vm_address_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.accounts + ADD CONSTRAINT accounts_vm_address_id_fkey FOREIGN KEY (vm_address_id) REFERENCES public.vm_addresses(id); + + +-- +-- Name: blocks blocks_proposer_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.blocks + ADD CONSTRAINT blocks_proposer_fkey FOREIGN KEY (proposer) REFERENCES public.validators(operator_address); + + +-- +-- Name: collection_mutation_events collection_mutation_events_block_height_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.collection_mutation_events + ADD CONSTRAINT collection_mutation_events_block_height_fkey FOREIGN KEY (block_height) REFERENCES public.blocks(height); + + +-- +-- Name: collection_mutation_events collection_mutation_events_collection_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.collection_mutation_events + ADD CONSTRAINT collection_mutation_events_collection_id_fkey FOREIGN KEY (collection_id) REFERENCES public.collections(id); + + +-- +-- Name: collection_proposals collection_proposals_collection_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.collection_proposals + ADD CONSTRAINT collection_proposals_collection_id_fkey FOREIGN KEY (collection_id) REFERENCES public.collections(id); + + +-- +-- Name: collection_proposals collection_proposals_nft_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.collection_proposals + ADD CONSTRAINT collection_proposals_nft_id_fkey FOREIGN KEY (nft_id) REFERENCES public.nfts(id); + + +-- +-- Name: collection_proposals collection_proposals_proposal_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.collection_proposals + ADD CONSTRAINT collection_proposals_proposal_id_fkey FOREIGN KEY (proposal_id) REFERENCES public.proposals(id); + + +-- +-- Name: collection_transactions collection_transactions_block_height_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.collection_transactions + ADD CONSTRAINT collection_transactions_block_height_fkey FOREIGN KEY (block_height) REFERENCES public.blocks(height); + + +-- +-- Name: collection_transactions collection_transactions_collection_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.collection_transactions + ADD CONSTRAINT collection_transactions_collection_id_fkey FOREIGN KEY (collection_id) REFERENCES public.collections(id); + + +-- +-- Name: collection_transactions collection_transactions_nft_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.collection_transactions + ADD CONSTRAINT collection_transactions_nft_id_fkey FOREIGN KEY (nft_id) REFERENCES public.nfts(id); + + +-- +-- Name: collection_transactions collection_transactions_tx_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.collection_transactions + ADD CONSTRAINT collection_transactions_tx_id_fkey FOREIGN KEY (tx_id) REFERENCES public.transactions(id); + + +-- +-- Name: collections collections_block_height_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.collections + ADD CONSTRAINT collections_block_height_fkey FOREIGN KEY (block_height) REFERENCES public.blocks(height); + + +-- +-- Name: collections collections_collection_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.collections + ADD CONSTRAINT collections_collection_fkey FOREIGN KEY (collection) REFERENCES public.vm_addresses(id); + + +-- +-- Name: collections collections_creator_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.collections + ADD CONSTRAINT collections_creator_fkey FOREIGN KEY (creator) REFERENCES public.vm_addresses(id); + + +-- +-- Name: lcd_tx_results lcd_tx_results_block_height_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.lcd_tx_results + ADD CONSTRAINT lcd_tx_results_block_height_fkey FOREIGN KEY (block_height) REFERENCES public.blocks(height); + + +-- +-- Name: lcd_tx_results lcd_tx_results_transaction_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.lcd_tx_results + ADD CONSTRAINT lcd_tx_results_transaction_id_fkey FOREIGN KEY (transaction_id) REFERENCES public.transactions(id); + + +-- +-- Name: module_histories module_histories_block_height_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.module_histories + ADD CONSTRAINT module_histories_block_height_fkey FOREIGN KEY (block_height) REFERENCES public.blocks(height); + + +-- +-- Name: module_histories module_histories_module_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.module_histories + ADD CONSTRAINT module_histories_module_id_fkey FOREIGN KEY (module_id) REFERENCES public.modules(id); + + +-- +-- Name: module_proposals module_proposals_module_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.module_proposals + ADD CONSTRAINT module_proposals_module_id_fkey FOREIGN KEY (module_id) REFERENCES public.modules(id); + + +-- +-- Name: module_proposals module_proposals_proposal_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.module_proposals + ADD CONSTRAINT module_proposals_proposal_id_fkey FOREIGN KEY (proposal_id) REFERENCES public.proposals(id); + + +-- +-- Name: module_transactions module_transactions_block_height_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.module_transactions + ADD CONSTRAINT module_transactions_block_height_fkey FOREIGN KEY (block_height) REFERENCES public.blocks(height); + + +-- +-- Name: module_transactions module_transactions_module_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.module_transactions + ADD CONSTRAINT module_transactions_module_id_fkey FOREIGN KEY (module_id) REFERENCES public.modules(id); + + +-- +-- Name: module_transactions module_transactions_tx_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.module_transactions + ADD CONSTRAINT module_transactions_tx_id_fkey FOREIGN KEY (tx_id) REFERENCES public.transactions(id); + + +-- +-- Name: modules modules_publish_tx_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.modules + ADD CONSTRAINT modules_publish_tx_id_fkey FOREIGN KEY (publish_tx_id) REFERENCES public.transactions(id); + + +-- +-- Name: modules modules_publisher_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.modules + ADD CONSTRAINT modules_publisher_id_fkey FOREIGN KEY (publisher_id) REFERENCES public.vm_addresses(id); + + +-- +-- Name: nft_histories nft_histories_block_height_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.nft_histories + ADD CONSTRAINT nft_histories_block_height_fkey FOREIGN KEY (block_height) REFERENCES public.blocks(height); + + +-- +-- Name: nft_histories nft_histories_from_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.nft_histories + ADD CONSTRAINT nft_histories_from_fkey FOREIGN KEY ("from") REFERENCES public.vm_addresses(id); + + +-- +-- Name: nft_histories nft_histories_nft_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.nft_histories + ADD CONSTRAINT nft_histories_nft_id_fkey FOREIGN KEY (nft_id) REFERENCES public.nfts(id); + + +-- +-- Name: nft_histories nft_histories_to_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.nft_histories + ADD CONSTRAINT nft_histories_to_fkey FOREIGN KEY ("to") REFERENCES public.vm_addresses(id); + + +-- +-- Name: nft_mutation_events nft_mutation_events_block_height_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.nft_mutation_events + ADD CONSTRAINT nft_mutation_events_block_height_fkey FOREIGN KEY (block_height) REFERENCES public.blocks(height); + + +-- +-- Name: nft_mutation_events nft_mutation_events_nft_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.nft_mutation_events + ADD CONSTRAINT nft_mutation_events_nft_id_fkey FOREIGN KEY (nft_id) REFERENCES public.nfts(id); + + +-- +-- Name: nft_proposals nft_proposals_nft_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.nft_proposals + ADD CONSTRAINT nft_proposals_nft_id_fkey FOREIGN KEY (nft_id) REFERENCES public.nfts(id); + + +-- +-- Name: nft_proposals nft_proposals_proposal_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.nft_proposals + ADD CONSTRAINT nft_proposals_proposal_id_fkey FOREIGN KEY (proposal_id) REFERENCES public.proposals(id); + + +-- +-- Name: nft_transactions nft_transactions_block_height_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.nft_transactions + ADD CONSTRAINT nft_transactions_block_height_fkey FOREIGN KEY (block_height) REFERENCES public.blocks(height); + + +-- +-- Name: nft_transactions nft_transactions_nft_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.nft_transactions + ADD CONSTRAINT nft_transactions_nft_id_fkey FOREIGN KEY (nft_id) REFERENCES public.nfts(id); + + +-- +-- Name: nft_transactions nft_transactions_tx_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.nft_transactions + ADD CONSTRAINT nft_transactions_tx_id_fkey FOREIGN KEY (tx_id) REFERENCES public.transactions(id); + + +-- +-- Name: nfts nfts_collection_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.nfts + ADD CONSTRAINT nfts_collection_fkey FOREIGN KEY (collection) REFERENCES public.collections(id); + + +-- +-- Name: nfts nfts_nft_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.nfts + ADD CONSTRAINT nfts_nft_fkey FOREIGN KEY (nft) REFERENCES public.vm_addresses(id); + + +-- +-- Name: nfts nfts_owner_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.nfts + ADD CONSTRAINT nfts_owner_fkey FOREIGN KEY (owner) REFERENCES public.vm_addresses(id); + + +-- +-- Name: opinit_transactions opinit_transactions_block_height_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.opinit_transactions + ADD CONSTRAINT opinit_transactions_block_height_fkey FOREIGN KEY (block_height) REFERENCES public.blocks(height); + + +-- +-- Name: opinit_transactions opinit_transactions_tx_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.opinit_transactions + ADD CONSTRAINT opinit_transactions_tx_id_fkey FOREIGN KEY (tx_id) REFERENCES public.transactions(id); + + +-- +-- Name: proposal_deposits proposal_deposits_depositor_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.proposal_deposits + ADD CONSTRAINT proposal_deposits_depositor_fkey FOREIGN KEY (depositor) REFERENCES public.accounts(id); + + +-- +-- Name: proposal_deposits proposal_deposits_proposal_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.proposal_deposits + ADD CONSTRAINT proposal_deposits_proposal_id_fkey FOREIGN KEY (proposal_id) REFERENCES public.proposals(id); + + +-- +-- Name: proposal_deposits proposal_deposits_transaction_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.proposal_deposits + ADD CONSTRAINT proposal_deposits_transaction_id_fkey FOREIGN KEY (transaction_id) REFERENCES public.transactions(id); + + +-- +-- Name: proposal_votes_legacy proposal_votes_proposal_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.proposal_votes_legacy + ADD CONSTRAINT proposal_votes_proposal_id_fkey FOREIGN KEY (proposal_id) REFERENCES public.proposals(id); + + +-- +-- Name: proposal_votes proposal_votes_proposal_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.proposal_votes + ADD CONSTRAINT proposal_votes_proposal_id_fkey FOREIGN KEY (proposal_id) REFERENCES public.proposals(id); + + +-- +-- Name: proposal_votes_legacy proposal_votes_transaction_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.proposal_votes_legacy + ADD CONSTRAINT proposal_votes_transaction_id_fkey FOREIGN KEY (transaction_id) REFERENCES public.transactions(id); + + +-- +-- Name: proposal_votes proposal_votes_transaction_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.proposal_votes + ADD CONSTRAINT proposal_votes_transaction_id_fkey FOREIGN KEY (transaction_id) REFERENCES public.transactions(id); + + +-- +-- Name: proposal_votes_legacy proposal_votes_validator_address_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.proposal_votes_legacy + ADD CONSTRAINT proposal_votes_validator_address_fkey FOREIGN KEY (validator_address) REFERENCES public.validators(operator_address); + + +-- +-- Name: proposal_votes proposal_votes_validator_address_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.proposal_votes + ADD CONSTRAINT proposal_votes_validator_address_fkey FOREIGN KEY (validator_address) REFERENCES public.validators(operator_address); + + +-- +-- Name: proposal_votes_legacy proposal_votes_voter_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.proposal_votes_legacy + ADD CONSTRAINT proposal_votes_voter_fkey FOREIGN KEY (voter) REFERENCES public.accounts(id); + + +-- +-- Name: proposal_votes proposal_votes_voter_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.proposal_votes + ADD CONSTRAINT proposal_votes_voter_fkey FOREIGN KEY (voter) REFERENCES public.accounts(id); + + +-- +-- Name: proposals proposals_created_height_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.proposals + ADD CONSTRAINT proposals_created_height_fkey FOREIGN KEY (created_height) REFERENCES public.blocks(height); + + +-- +-- Name: proposals proposals_created_tx_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.proposals + ADD CONSTRAINT proposals_created_tx_fkey FOREIGN KEY (created_tx) REFERENCES public.transactions(id); + + +-- +-- Name: proposals proposals_proposer_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.proposals + ADD CONSTRAINT proposals_proposer_id_fkey FOREIGN KEY (proposer_id) REFERENCES public.accounts(id); + + +-- +-- Name: proposals proposals_resolved_height_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.proposals + ADD CONSTRAINT proposals_resolved_height_fkey FOREIGN KEY (resolved_height) REFERENCES public.blocks(height); + + +-- +-- Name: transactions transactions_block_height_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.transactions + ADD CONSTRAINT transactions_block_height_fkey FOREIGN KEY (block_height) REFERENCES public.blocks(height); + + +-- +-- Name: transactions transactions_sender_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.transactions + ADD CONSTRAINT transactions_sender_fkey FOREIGN KEY (sender) REFERENCES public.accounts(id); + + +-- +-- Name: validators validators_account_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.validators + ADD CONSTRAINT validators_account_id_fkey FOREIGN KEY (account_id) REFERENCES public.accounts(id); + + +-- +-- Name: TABLE proposals; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.proposals TO readonly; + + +-- +-- Name: FUNCTION search_proposals(types_param character varying[]); Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON FUNCTION public.search_proposals(types_param character varying[]) TO readonly; + + +-- +-- Name: TABLE account_transactions; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.account_transactions TO readonly; + + +-- +-- Name: TABLE accounts; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.accounts TO readonly; + + +-- +-- Name: TABLE blocks; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.blocks TO readonly; + + +-- +-- Name: TABLE collection_mutation_events; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.collection_mutation_events TO readonly; + + +-- +-- Name: TABLE collection_proposals; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.collection_proposals TO readonly; + + +-- +-- Name: TABLE collection_transactions; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.collection_transactions TO readonly; + + +-- +-- Name: TABLE collections; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.collections TO readonly; + + +-- +-- Name: TABLE lcd_tx_results; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.lcd_tx_results TO readonly; + + +-- +-- Name: TABLE module_histories; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.module_histories TO readonly; + + +-- +-- Name: TABLE module_proposals; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.module_proposals TO readonly; + + +-- +-- Name: TABLE module_transactions; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.module_transactions TO readonly; + + +-- +-- Name: TABLE modules; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.modules TO readonly; + + +-- +-- Name: TABLE nft_histories; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.nft_histories TO readonly; + + +-- +-- Name: TABLE nft_mutation_events; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.nft_mutation_events TO readonly; + + +-- +-- Name: TABLE nft_proposals; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.nft_proposals TO readonly; + + +-- +-- Name: TABLE nft_transactions; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.nft_transactions TO readonly; + + +-- +-- Name: TABLE nfts; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.nfts TO readonly; + + +-- +-- Name: TABLE opinit_transactions; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.opinit_transactions TO readonly; + + +-- +-- Name: TABLE proposal_deposits; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.proposal_deposits TO readonly; + + +-- +-- Name: TABLE proposal_votes; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.proposal_votes TO readonly; + + +-- +-- Name: TABLE proposal_votes_legacy; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.proposal_votes_legacy TO readonly; + + +-- +-- Name: TABLE tracking; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.tracking TO readonly; + + +-- +-- Name: TABLE transactions; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.transactions TO readonly; + + +-- +-- Name: TABLE validators; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.validators TO readonly; + + +-- +-- Name: TABLE vm_addresses; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT ON TABLE public.vm_addresses TO readonly; + + +-- +-- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: public; Owner: postgres +-- + +ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT SELECT ON TABLES TO readonly; + + +-- +-- PostgreSQL database dump complete +-- diff --git a/db/migrations/20240318095014_validator_tables_update_for_generic_indexer.down.sql b/db/migrations/20240318095014_validator_tables_update_for_generic_indexer.down.sql new file mode 100644 index 00000000..bb794bfb --- /dev/null +++ b/db/migrations/20240318095014_validator_tables_update_for_generic_indexer.down.sql @@ -0,0 +1,15 @@ +ALTER TABLE public.validators DROP COLUMN is_active; +ALTER TABLE public.validators DROP COLUMN consensus_pubkey; + +ALTER TABLE public.validators ADD COLUMN id integer; + +DROP TABLE IF EXISTS public.validator_commit_signatures; +DROP TYPE IF EXISTS public.commit_signature_type; + +DROP TABLE IF EXISTS public.validator_vote_counts; + +DROP TABLE IF EXISTS public.validator_historical_powers; + +DROP TABLE IF EXISTS public.validator_bonded_token_changes; + +DROP TABLE IF EXISTS public.validator_slash_events; diff --git a/db/migrations/20240318095014_validator_tables_update_for_generic_indexer.up.sql b/db/migrations/20240318095014_validator_tables_update_for_generic_indexer.up.sql new file mode 100644 index 00000000..b2d7dfde --- /dev/null +++ b/db/migrations/20240318095014_validator_tables_update_for_generic_indexer.up.sql @@ -0,0 +1,48 @@ +ALTER TABLE public.validators ADD COLUMN is_active boolean; +ALTER TABLE public.validators ADD COLUMN consensus_pubkey varchar; + +ALTER TABLE public.validators DROP COLUMN id; + +CREATE TYPE public.commit_signature_type AS ENUM ( + 'PROPOSE', + 'VOTE', + 'ABSENT' +); +CREATE TABLE IF NOT EXISTS public.validator_commit_signatures ( + validator_address varchar REFERENCES public.validators (operator_address) , + block_height bigint NOT NULL, + vote public.commit_signature_type NOT NULL, + PRIMARY KEY(validator_address, block_height) +); +GRANT SELECT ON public.validator_commit_signatures TO readonly; + +CREATE TABLE IF NOT EXISTS public.validator_vote_counts ( + validator_address varchar REFERENCES public.validators (operator_address) PRIMARY KEY, + last_100 integer NOT NULL +); +GRANT SELECT ON public.validator_vote_counts TO readonly; + +CREATE TABLE IF NOT EXISTS public.validator_historical_powers ( + validator_address varchar REFERENCES public.validators (operator_address), + tokens json NOT NULL, + voting_power bigint NOT NULL, + hour_rounded_timestamp timestamp NOT NULL, + timestamp timestamp NOT NULL, + CONSTRAINT unique_validator_historicail_power UNIQUE (validator_address, hour_rounded_timestamp) +); +GRANT SELECT ON public.validator_historical_powers TO readonly; + +CREATE TABLE IF NOT EXISTS public.validator_bonded_token_changes ( + validator_address varchar NOT NULL REFERENCES public.validators (operator_address), + transaction_id bigint NOT NULL REFERENCES public.transactions (id), + block_height bigint NOT NULL REFERENCES public.blocks (height), + tokens json NOT NULL +); +GRANT SELECT ON public.validator_bonded_token_changes TO readonly; + +CREATE TABLE IF NOT EXISTS public.validator_slash_events ( + validator_address varchar NOT NULL REFERENCES public.validators (operator_address), + block_height bigint NOT NULL REFERENCES public.blocks (height), + is_jailed boolean NOT NULL +); +GRANT SELECT ON public.validator_slash_events TO readonly; diff --git a/db/migrations/20240319085423_add_latest_informative_height_in_tracking.down.sql b/db/migrations/20240319085423_add_latest_informative_height_in_tracking.down.sql new file mode 100644 index 00000000..e5eee427 --- /dev/null +++ b/db/migrations/20240319085423_add_latest_informative_height_in_tracking.down.sql @@ -0,0 +1 @@ +ALTER TABLE public.tracking DROP COLUMN latest_informative_block_height; diff --git a/db/migrations/20240319085423_add_latest_informative_height_in_tracking.up.sql b/db/migrations/20240319085423_add_latest_informative_height_in_tracking.up.sql new file mode 100644 index 00000000..327ca11b --- /dev/null +++ b/db/migrations/20240319085423_add_latest_informative_height_in_tracking.up.sql @@ -0,0 +1 @@ +ALTER TABLE public.tracking ADD COLUMN latest_informative_block_height integer; diff --git a/db/migrations/20240326061541_update_validator_slash_events_enum.down.sql b/db/migrations/20240326061541_update_validator_slash_events_enum.down.sql new file mode 100644 index 00000000..5aff327c --- /dev/null +++ b/db/migrations/20240326061541_update_validator_slash_events_enum.down.sql @@ -0,0 +1,4 @@ +ALTER TABLE public.validator_slash_events ADD COLUMN is_jailed boolean; + +ALTER TABLE public.validator_slash_events DROP COLUMN type; +DROP TYPE slashtype; diff --git a/db/migrations/20240326061541_update_validator_slash_events_enum.up.sql b/db/migrations/20240326061541_update_validator_slash_events_enum.up.sql new file mode 100644 index 00000000..94009460 --- /dev/null +++ b/db/migrations/20240326061541_update_validator_slash_events_enum.up.sql @@ -0,0 +1,6 @@ +CREATE TYPE public.slashtype AS ENUM ('Jailed', 'Slashed', 'Unjailed'); +ALTER TYPE public.slashtype OWNER TO postgres; + +ALTER TABLE public.validator_slash_events ADD COLUMN type public.slashtype; + +ALTER TABLE public.validator_slash_events DROP COLUMN is_jailed; diff --git a/db/migrations/20240327104039_add_failed_reason_in_proposals.down.sql b/db/migrations/20240327104039_add_failed_reason_in_proposals.down.sql new file mode 100644 index 00000000..97d390dc --- /dev/null +++ b/db/migrations/20240327104039_add_failed_reason_in_proposals.down.sql @@ -0,0 +1 @@ +ALTER TABLE public.proposals DROP COLUMN failed_reason; diff --git a/db/migrations/20240327104039_add_failed_reason_in_proposals.up.sql b/db/migrations/20240327104039_add_failed_reason_in_proposals.up.sql new file mode 100644 index 00000000..13d3cbd8 --- /dev/null +++ b/db/migrations/20240327104039_add_failed_reason_in_proposals.up.sql @@ -0,0 +1,2 @@ +ALTER TABLE public.proposals ADD COLUMN failed_reason varchar default ''; +ALTER TABLE public.proposals ALTER COLUMN failed_reason set not null; diff --git a/db/migrations/20240410105818_add_resolved_voting_power.down.sql b/db/migrations/20240410105818_add_resolved_voting_power.down.sql new file mode 100644 index 00000000..2492abe9 --- /dev/null +++ b/db/migrations/20240410105818_add_resolved_voting_power.down.sql @@ -0,0 +1 @@ +ALTER TABLE public.proposals DROP COLUMN resolved_voting_power; diff --git a/db/migrations/20240410105818_add_resolved_voting_power.up.sql b/db/migrations/20240410105818_add_resolved_voting_power.up.sql new file mode 100644 index 00000000..a9fa513e --- /dev/null +++ b/db/migrations/20240410105818_add_resolved_voting_power.up.sql @@ -0,0 +1 @@ +ALTER TABLE public.proposals ADD COLUMN resolved_voting_power BIGINT; diff --git a/db/migrations/20240424083951_update_module_and_nft_histories.down.sql b/db/migrations/20240424083951_update_module_and_nft_histories.down.sql new file mode 100644 index 00000000..7378648a --- /dev/null +++ b/db/migrations/20240424083951_update_module_and_nft_histories.down.sql @@ -0,0 +1,14 @@ +ALTER TABLE public.module_histories DROP COLUMN tx_id; +ALTER TABLE public.module_histories DROP COLUMN proposal_id; + +ALTER TABLE public.nfts DROP COLUMN tx_id; +ALTER TABLE public.nfts DROP COLUMN proposal_id; + +ALTER TABLE public.nft_histories DROP COLUMN tx_id; +ALTER TABLE public.nft_histories DROP COLUMN proposal_id; + +ALTER TABLE public.nft_mutation_events DROP COLUMN tx_id; +ALTER TABLE public.nft_mutation_events DROP COLUMN proposal_id; + +ALTER TABLE public.collection_mutation_events DROP COLUMN tx_id; +ALTER TABLE public.collection_mutation_events DROP COLUMN proposal_id; diff --git a/db/migrations/20240424083951_update_module_and_nft_histories.up.sql b/db/migrations/20240424083951_update_module_and_nft_histories.up.sql new file mode 100644 index 00000000..26878807 --- /dev/null +++ b/db/migrations/20240424083951_update_module_and_nft_histories.up.sql @@ -0,0 +1,26 @@ +ALTER TABLE public.module_histories ADD COLUMN proposal_id INTEGER NULL ; +ALTER TABLE public.module_histories ADD CONSTRAINT module_histories_proposal_id_fkey FOREIGN KEY (proposal_id) REFERENCES public.proposals(id); +ALTER TABLE public.module_histories ADD COLUMN tx_id INTEGER NULL ; +ALTER TABLE public.module_histories ADD CONSTRAINT module_histories_tx_id_fkey FOREIGN KEY (tx_id) REFERENCES public.transactions(id); + +ALTER TABLE public.nfts ADD COLUMN proposal_id INTEGER NULL ; +ALTER TABLE public.nfts ADD CONSTRAINT nfts_proposal_id_fkey FOREIGN KEY (proposal_id) REFERENCES public.proposals(id); +ALTER TABLE public.nfts ADD COLUMN tx_id INTEGER NULL ; +ALTER TABLE public.nfts ADD CONSTRAINT nfts_tx_id_fkey FOREIGN KEY (tx_id) REFERENCES public.transactions(id); + +ALTER TABLE public.nft_histories ADD COLUMN proposal_id INTEGER NULL ; +ALTER TABLE public.nft_histories ADD CONSTRAINT nft_histories_proposal_id_fkey FOREIGN KEY (proposal_id) REFERENCES public.proposals(id); +ALTER TABLE public.nft_histories ADD COLUMN tx_id INTEGER NULL ; +ALTER TABLE public.nft_histories ADD CONSTRAINT nft_histories_tx_id_fkey FOREIGN KEY (tx_id) REFERENCES public.transactions(id); + + +ALTER TABLE public.nft_mutation_events ADD COLUMN proposal_id INTEGER NULL ; +ALTER TABLE public.nft_mutation_events ADD CONSTRAINT nft_mutation_events_proposal_id_fkey FOREIGN KEY (proposal_id) REFERENCES public.proposals(id); +ALTER TABLE public.nft_mutation_events ADD COLUMN tx_id INTEGER NULL ; +ALTER TABLE public.nft_mutation_events ADD CONSTRAINT nft_mutation_events_tx_id_fkey FOREIGN KEY (tx_id) REFERENCES public.transactions(id); + + +ALTER TABLE public.collection_mutation_events ADD COLUMN proposal_id INTEGER NULL ; +ALTER TABLE public.collection_mutation_events ADD CONSTRAINT collection_mutation_events_proposal_id_fkey FOREIGN KEY (proposal_id) REFERENCES public.proposals(id); +ALTER TABLE public.collection_mutation_events ADD COLUMN tx_id INTEGER NULL ; +ALTER TABLE public.collection_mutation_events ADD CONSTRAINT collection_mutation_events_tx_id_fkey FOREIGN KEY (tx_id) REFERENCES public.transactions(id); diff --git a/db/migrations/20240521105847_transaction_id_to_string.down.sql b/db/migrations/20240521105847_transaction_id_to_string.down.sql new file mode 100644 index 00000000..e69de29b diff --git a/db/migrations/20240521105847_transaction_id_to_string.up.sql b/db/migrations/20240521105847_transaction_id_to_string.up.sql new file mode 100644 index 00000000..067a977d --- /dev/null +++ b/db/migrations/20240521105847_transaction_id_to_string.up.sql @@ -0,0 +1,112 @@ +-- 1 +alter table public.transactions add column new_id varchar; +update public.transactions set new_id = UPPER(ENCODE(hash, 'hex')) || '/' || block_height; +alter table public.transactions drop constraint transactions_pkey; +alter table public.transactions add primary key (new_id); + +-- 2 +alter table public.proposals add column new_tx_id varchar; +update public.proposals set new_tx_id = transactions.new_id from public.transactions where proposals.created_tx = transactions.id; +alter table public.proposals drop column created_tx; +alter table public.proposals rename column new_tx_id to created_tx; +alter table public.proposals add constraint proposals_created_tx_fkey foreign key (created_tx) references public.transactions (new_id); + +alter table public.account_transactions add column new_tx_id varchar; +update public.account_transactions set new_tx_id = transactions.new_id from public.transactions where account_transactions.transaction_id = transactions.id; +alter table public.account_transactions drop column transaction_id; +alter table public.account_transactions rename column new_tx_id to transaction_id; +alter table public.account_transactions add constraint account_transactions_transaction_id_fkey foreign key (transaction_id) references public.transactions (new_id); + +alter table public.lcd_tx_results add column new_tx_id varchar; +update public.lcd_tx_results set new_tx_id = transactions.new_id from public.transactions where lcd_tx_results.transaction_id = transactions.id; +alter table public.lcd_tx_results drop column transaction_id; +alter table public.lcd_tx_results rename column new_tx_id to transaction_id; +alter table public.lcd_tx_results add constraint lcd_tx_results_transaction_id_fkey foreign key (transaction_id) references public.transactions (new_id); + +alter table public.proposal_deposits add column new_tx_id varchar; +update public.proposal_deposits set new_tx_id = transactions.new_id from public.transactions where proposal_deposits.transaction_id = transactions.id; +alter table public.proposal_deposits drop column transaction_id; +alter table public.proposal_deposits rename column new_tx_id to transaction_id; +alter table public.proposal_deposits add constraint proposal_deposits_transaction_id_fkey foreign key (transaction_id) references public.transactions (new_id); + +alter table public.proposal_votes add column new_tx_id varchar; +update public.proposal_votes set new_tx_id = transactions.new_id from public.transactions where proposal_votes.transaction_id = transactions.id; +alter table public.proposal_votes drop column transaction_id; +alter table public.proposal_votes rename column new_tx_id to transaction_id; +alter table public.proposal_votes add constraint proposal_votes_transaction_id_fkey foreign key (transaction_id) references public.transactions (new_id); + +alter table public.proposal_votes_legacy add column new_tx_id varchar; +update public.proposal_votes_legacy set new_tx_id = transactions.new_id from public.transactions where proposal_votes_legacy.transaction_id = transactions.id; +alter table public.proposal_votes_legacy drop column transaction_id; +alter table public.proposal_votes_legacy rename column new_tx_id to transaction_id; +alter table public.proposal_votes_legacy add constraint proposal_votes_legacy_transaction_id_fkey foreign key (transaction_id) references public.transactions (new_id); + +alter table public.validator_bonded_token_changes add column new_tx_id varchar; +update public.validator_bonded_token_changes set new_tx_id = transactions.new_id from public.transactions where validator_bonded_token_changes.transaction_id = transactions.id; +alter table public.validator_bonded_token_changes drop column transaction_id; +alter table public.validator_bonded_token_changes rename column new_tx_id to transaction_id; +alter table public.validator_bonded_token_changes add constraint validator_bonded_token_changes_transaction_id_fkey foreign key (transaction_id) references public.transactions (new_id); + +alter table public.collection_transactions add column new_tx_id varchar; +update public.collection_transactions set new_tx_id = transactions.new_id from public.transactions where collection_transactions.tx_id = transactions.id; +alter table public.collection_transactions drop column tx_id; +alter table public.collection_transactions rename column new_tx_id to tx_id; +alter table public.collection_transactions add constraint collection_transactions_tx_id_fkey foreign key (tx_id) references public.transactions (new_id); + +alter table public.module_transactions add column new_tx_id varchar; +update public.module_transactions set new_tx_id = transactions.new_id from public.transactions where module_transactions.tx_id = transactions.id; +alter table public.module_transactions drop column tx_id; +alter table public.module_transactions rename column new_tx_id to tx_id; +alter table public.module_transactions add constraint module_transactions_tx_id_fkey foreign key (tx_id) references public.transactions (new_id); + +alter table public.nft_transactions add column new_tx_id varchar; +update public.nft_transactions set new_tx_id = transactions.new_id from public.transactions where nft_transactions.tx_id = transactions.id; +alter table public.nft_transactions drop column tx_id; +alter table public.nft_transactions rename column new_tx_id to tx_id; +alter table public.nft_transactions add constraint nft_transactions_tx_id_fkey foreign key (tx_id) references public.transactions (new_id); + +alter table public.opinit_transactions add column new_tx_id varchar; +update public.opinit_transactions set new_tx_id = transactions.new_id from public.transactions where opinit_transactions.tx_id = transactions.id; +alter table public.opinit_transactions drop column tx_id; +alter table public.opinit_transactions rename column new_tx_id to tx_id; +alter table public.opinit_transactions add constraint opinit_transactions_tx_id_fkey foreign key (tx_id) references public.transactions (new_id); + +alter table public.module_histories add column new_tx_id varchar; +update public.module_histories set new_tx_id = transactions.new_id from public.transactions where module_histories.tx_id = transactions.id; +alter table public.module_histories drop column tx_id; +alter table public.module_histories rename column new_tx_id to tx_id; +alter table public.module_histories add constraint module_histories_tx_id_fkey foreign key (tx_id) references public.transactions (new_id); + +alter table public.nfts add column new_tx_id varchar; +update public.nfts set new_tx_id = transactions.new_id from public.transactions where nfts.tx_id = transactions.id; +alter table public.nfts drop column tx_id; +alter table public.nfts rename column new_tx_id to tx_id; +alter table public.nfts add constraint nfts_tx_id_fkey foreign key (tx_id) references public.transactions (new_id); + +alter table public.nft_histories add column new_tx_id varchar; +update public.nft_histories set new_tx_id = transactions.new_id from public.transactions where nft_histories.tx_id = transactions.id; +alter table public.nft_histories drop column tx_id; +alter table public.nft_histories rename column new_tx_id to tx_id; +alter table public.nft_histories add constraint nft_histories_tx_id_fkey foreign key (tx_id) references public.transactions (new_id); + +alter table public.nft_mutation_events add column new_tx_id varchar; +update public.nft_mutation_events set new_tx_id = transactions.new_id from public.transactions where nft_mutation_events.tx_id = transactions.id; +alter table public.nft_mutation_events drop column tx_id; +alter table public.nft_mutation_events rename column new_tx_id to tx_id; +alter table public.nft_mutation_events add constraint nft_mutation_events_tx_id_fkey foreign key (tx_id) references public.transactions (new_id); + +alter table public.collection_mutation_events add column new_tx_id varchar; +update public.collection_mutation_events set new_tx_id = transactions.new_id from public.transactions where collection_mutation_events.tx_id = transactions.id; +alter table public.collection_mutation_events drop column tx_id; +alter table public.collection_mutation_events rename column new_tx_id to tx_id; +alter table public.collection_mutation_events add constraint collection_mutation_events_tx_id_fkey foreign key (tx_id) references public.transactions (new_id); + +alter table public.modules add column new_tx_id varchar; +update public.modules set new_tx_id = transactions.new_id from public.transactions where modules.publish_tx_id = transactions.id; +alter table public.modules drop column publish_tx_id; +alter table public.modules rename column new_tx_id to publish_tx_id; +alter table public.modules add constraint modules_publish_tx_id_fkey foreign key (publish_tx_id) references public.transactions (new_id); + +-- 3 +alter table public.transactions drop column id; +alter table public.transactions rename column new_id to id; diff --git a/db/migrations/20240521110034_vm_address_collection_module_nft_reference.down.sql b/db/migrations/20240521110034_vm_address_collection_module_nft_reference.down.sql new file mode 100644 index 00000000..e69de29b diff --git a/db/migrations/20240521110034_vm_address_collection_module_nft_reference.up.sql b/db/migrations/20240521110034_vm_address_collection_module_nft_reference.up.sql new file mode 100644 index 00000000..7253a78f --- /dev/null +++ b/db/migrations/20240521110034_vm_address_collection_module_nft_reference.up.sql @@ -0,0 +1,167 @@ +-- vm_address +alter table public.accounts add column new_vm_address_id varchar; +update public.accounts set new_vm_address_id = vm_addresses.vm_address from public.vm_addresses where accounts.vm_address_id = vm_addresses.id; +alter table public.accounts drop column vm_address_id; +alter table public.accounts rename column new_vm_address_id to vm_address_id; +alter table public.accounts add constraint accounts_vm_address_id_fkey foreign key (vm_address_id) references public.vm_addresses (vm_address); + +alter table public.collections add column new_vm_address_id varchar; +update public.collections set new_vm_address_id = vm_addresses.vm_address from public.vm_addresses where collections.collection = vm_addresses.id; +alter table public.collections drop column collection; +alter table public.collections rename column new_vm_address_id to collection; +alter table public.collections add constraint collections_collection_fkey foreign key (collection) references public.vm_addresses (vm_address); + +alter table public.collections add column new_vm_address_id varchar; +update public.collections set new_vm_address_id = vm_addresses.vm_address from public.vm_addresses where collections.creator = vm_addresses.id; +alter table public.collections drop column creator; +alter table public.collections rename column new_vm_address_id to creator; +alter table public.collections add constraint collections_creator_fkey foreign key (creator) references public.vm_addresses (vm_address); + +alter table public.modules add column new_vm_address_id varchar; +update public.modules set new_vm_address_id = vm_addresses.vm_address from public.vm_addresses where modules.publisher_id = vm_addresses.id; +alter table public.modules drop column publisher_id; +alter table public.modules rename column new_vm_address_id to publisher_id; +alter table public.modules add constraint modules_publisher_id_fkey foreign key (publisher_id) references public.vm_addresses (vm_address); + +alter table public.nft_histories add column new_vm_address_id varchar; +update public.nft_histories set new_vm_address_id = vm_addresses.vm_address from public.vm_addresses where nft_histories."from" = vm_addresses.id; +alter table public.nft_histories drop column "from"; +alter table public.nft_histories rename column new_vm_address_id to "from"; +alter table public.nft_histories add constraint nft_histories_from_fkey foreign key ("from") references public.vm_addresses (vm_address); + +alter table public.nft_histories add column new_vm_address_id varchar; +update public.nft_histories set new_vm_address_id = vm_addresses.vm_address from public.vm_addresses where nft_histories."to" = vm_addresses.id; +alter table public.nft_histories drop column "to"; +alter table public.nft_histories rename column new_vm_address_id to "to"; +alter table public.nft_histories add constraint nft_histories_to_fkey foreign key ("to") references public.vm_addresses (vm_address); + +alter table public.nfts add column new_vm_address_id varchar; +update public.nfts set new_vm_address_id = vm_addresses.vm_address from public.vm_addresses where nfts."owner" = vm_addresses.id; +alter table public.nfts drop column "owner"; +alter table public.nfts rename column new_vm_address_id to "owner"; +alter table public.nfts add constraint nfts_owner_fkey foreign key ("owner") references public.vm_addresses (vm_address); + +alter table public.nfts add column new_vm_address_id varchar; +update public.nfts set new_vm_address_id = vm_addresses.vm_address from public.vm_addresses where nfts.nft = vm_addresses.id; +alter table public.nfts drop column nft; +alter table public.nfts rename column new_vm_address_id to nft; +alter table public.nfts add constraint nfts_nft_fkey foreign key (nft) references public.vm_addresses (vm_address); + +alter table public.vm_addresses drop column id; +alter table public.vm_addresses add primary key (vm_address); + +-- collection +alter table public.collection_mutation_events drop constraint collection_mutation_events_collection_id_fkey; +alter table public.collection_proposals drop constraint collection_proposals_collection_id_fkey; +alter table public.collection_transactions drop constraint collection_transactions_collection_id_fkey; +alter table public.nfts drop constraint nfts_collection_fkey; + +alter table public.collections drop constraint collections_pkey; +alter table public.collections add primary key (collection); + +alter table public.collection_mutation_events add column new_collection_id varchar; +update public.collection_mutation_events set new_collection_id = collections.collection from public.collections where collection_mutation_events.collection_id = collections.id; +alter table public.collection_mutation_events drop column collection_id; +alter table public.collection_mutation_events rename column new_collection_id to collection_id; +alter table public.collection_mutation_events add constraint collection_mutation_events_collection_id_fkey foreign key (collection_id) references public.collections (collection); + +alter table public.collection_proposals add column new_collection_id varchar; +update public.collection_proposals set new_collection_id = collections.collection from public.collections where collection_proposals.collection_id = collections.id; +alter table public.collection_proposals drop column collection_id; +alter table public.collection_proposals rename column new_collection_id to collection_id; +alter table public.collection_proposals add constraint collection_proposals_collection_id_fkey foreign key (collection_id) references public.collections (collection); + +alter table public.collection_transactions add column new_collection_id varchar; +update public.collection_transactions set new_collection_id = collections.collection from public.collections where collection_transactions.collection_id = collections.id; +alter table public.collection_transactions drop column collection_id; +alter table public.collection_transactions rename column new_collection_id to collection_id; +alter table public.collection_transactions add constraint collection_transactions_collection_id_fkey foreign key (collection_id) references public.collections (collection); + +alter table public.nfts add column new_collection_id varchar; +update public.nfts set new_collection_id = collections.collection from public.collections where nfts.collection = collections.id; +alter table public.nfts drop column collection; +alter table public.nfts rename column new_collection_id to collection; +alter table public.nfts add constraint nfts_collection_fkey foreign key (collection) references public.collections (collection); + +alter table public.collections drop column id; +alter table public.collections rename column collection to id; + +-- module +alter table public.module_histories drop constraint module_histories_module_id_fkey; +alter table public.module_proposals drop constraint module_proposals_module_id_fkey; +alter table public.module_transactions drop constraint module_transactions_module_id_fkey; + +alter table public.modules add column new_id varchar; +update public.modules set new_id = publisher_id || '::' || name; +alter table public.modules add primary key (new_id); + +alter table public.module_histories add column new_module_id varchar; +update public.module_histories set new_module_id = modules.new_id from public.modules where module_histories.module_id = modules.id; +alter table public.module_histories drop column module_id; +alter table public.module_histories rename column new_module_id to module_id; +alter table public.module_histories add constraint module_histories_module_id_fkey foreign key (module_id) references public.modules (new_id); + +alter table public.module_proposals add column new_module_id varchar; +update public.module_proposals set new_module_id = modules.new_id from public.modules where module_proposals.module_id = modules.id; +alter table public.module_proposals drop column module_id; +alter table public.module_proposals rename column new_module_id to module_id; +alter table public.module_proposals add constraint module_proposals_module_id_fkey foreign key (module_id) references public.modules (new_id); + +alter table public.module_transactions add column new_module_id varchar; +update public.module_transactions set new_module_id = modules.new_id from public.modules where module_transactions.module_id = modules.id; +alter table public.module_transactions drop column module_id; +alter table public.module_transactions rename column new_module_id to module_id; +alter table public.module_transactions add constraint module_transactions_module_id_fkey foreign key (module_id) references public.modules (new_id); + +alter table public.modules drop column id; +alter table public.modules rename column new_id to id; + +-- nft +alter table public.collection_proposals drop constraint collection_proposals_nft_id_fkey; +alter table public.collection_transactions drop constraint collection_transactions_nft_id_fkey; +alter table public.nft_histories drop constraint nft_histories_nft_id_fkey; +alter table public.nft_mutation_events drop constraint nft_mutation_events_nft_id_fkey; +alter table public.nft_proposals drop constraint nft_proposals_nft_id_fkey; +alter table public.nft_transactions drop constraint nft_transactions_nft_id_fkey; + +alter table public.nfts drop constraint nfts_pkey; +alter table public.nfts add primary key (nft); + +alter table public.collection_proposals add column new_nft_id varchar; +update public.collection_proposals set new_nft_id = nfts.nft from public.nfts where collection_proposals.nft_id = nfts.id; +alter table public.collection_proposals drop column nft_id; +alter table public.collection_proposals rename column new_nft_id to nft_id; +alter table public.collection_proposals add constraint collection_proposals_nft_id_fkey foreign key (nft_id) references public.nfts (nft); + +alter table public.collection_transactions add column new_nft_id varchar; +update public.collection_transactions set new_nft_id = nfts.nft from public.nfts where collection_transactions.nft_id = nfts.id; +alter table public.collection_transactions drop column nft_id; +alter table public.collection_transactions rename column new_nft_id to nft_id; +alter table public.collection_transactions add constraint collection_transactions_nft_id_fkey foreign key (nft_id) references public.nfts (nft); + +alter table public.nft_histories add column new_nft_id varchar; +update public.nft_histories set new_nft_id = nfts.nft from public.nfts where nft_histories.nft_id = nfts.id; +alter table public.nft_histories drop column nft_id; +alter table public.nft_histories rename column new_nft_id to nft_id; +alter table public.nft_histories add constraint nft_histories_nft_id_fkey foreign key (nft_id) references public.nfts (nft); + +alter table public.nft_mutation_events add column new_nft_id varchar; +update public.nft_mutation_events set new_nft_id = nfts.nft from public.nfts where nft_mutation_events.nft_id = nfts.id; +alter table public.nft_mutation_events drop column nft_id; +alter table public.nft_mutation_events rename column new_nft_id to nft_id; +alter table public.nft_mutation_events add constraint nft_mutation_events_nft_id_fkey foreign key (nft_id) references public.nfts (nft); + +alter table public.nft_proposals add column new_nft_id varchar; +update public.nft_proposals set new_nft_id = nfts.nft from public.nfts where nft_proposals.nft_id = nfts.id; +alter table public.nft_proposals drop column nft_id; +alter table public.nft_proposals rename column new_nft_id to nft_id; +alter table public.nft_proposals add constraint nft_proposals_nft_id_fkey foreign key (nft_id) references public.nfts (nft); + +alter table public.nft_transactions add column new_nft_id varchar; +update public.nft_transactions set new_nft_id = nfts.nft from public.nfts where nft_transactions.nft_id = nfts.id; +alter table public.nft_transactions drop column nft_id; +alter table public.nft_transactions rename column new_nft_id to nft_id; +alter table public.nft_transactions add constraint nft_transactions_nft_id_fkey foreign key (nft_id) references public.nfts (nft); + +alter table public.nfts drop column id; +alter table public.nfts rename column nft to id; diff --git a/db/migrations/20240521110232_remove_account_id.down.sql b/db/migrations/20240521110232_remove_account_id.down.sql new file mode 100644 index 00000000..e69de29b diff --git a/db/migrations/20240521110232_remove_account_id.up.sql b/db/migrations/20240521110232_remove_account_id.up.sql new file mode 100644 index 00000000..4dd0493b --- /dev/null +++ b/db/migrations/20240521110232_remove_account_id.up.sql @@ -0,0 +1,43 @@ +alter table public.account_transactions add column new_account_id varchar; +update public.account_transactions set new_account_id = accounts.address from public.accounts where account_transactions.account_id = accounts.id; +alter table public.account_transactions drop column account_id; +alter table public.account_transactions rename column new_account_id to account_id; +alter table public.account_transactions add constraint account_transactions_account_id_fkey foreign key (account_id) references public.accounts (address); + +alter table public.validators add column new_account_id varchar; +update public.validators set new_account_id = accounts.address from public.accounts where validators.account_id = accounts.id; +alter table public.validators drop column account_id; +alter table public.validators rename column new_account_id to account_id; +alter table public.validators add constraint validators_account_id_fkey foreign key (account_id) references public.accounts (address); + +alter table public.proposal_deposits add column new_account_id varchar; +update public.proposal_deposits set new_account_id = accounts.address from public.accounts where proposal_deposits.depositor = accounts.id; +alter table public.proposal_deposits drop column depositor; +alter table public.proposal_deposits rename column new_account_id to depositor; +alter table public.proposal_deposits add constraint proposal_deposits_depositor_fkey foreign key (depositor) references public.accounts (address); + +alter table public.proposal_votes_legacy add column new_account_id varchar; +update public.proposal_votes_legacy set new_account_id = accounts.address from public.accounts where proposal_votes_legacy.voter = accounts.id; +alter table public.proposal_votes_legacy drop column voter; +alter table public.proposal_votes_legacy rename column new_account_id to voter; +alter table public.proposal_votes_legacy add constraint proposal_votes_legacy_voter_fkey foreign key (voter) references public.accounts (address); + +alter table public.proposal_votes add column new_account_id varchar; +update public.proposal_votes set new_account_id = accounts.address from public.accounts where proposal_votes.voter = accounts.id; +alter table public.proposal_votes drop column voter; +alter table public.proposal_votes rename column new_account_id to voter; +alter table public.proposal_votes add constraint proposal_votes_voter_fkey foreign key (voter) references public.accounts (address); + +alter table public.proposals add column new_account_id varchar; +update public.proposals set new_account_id = accounts.address from public.accounts where proposals.proposer_id = accounts.id; +alter table public.proposals drop column proposer_id; +alter table public.proposals rename column new_account_id to proposer_id; +alter table public.proposals add constraint proposals_proposer_id_fkey foreign key (proposer_id) references public.accounts (address); + +alter table public.transactions add column new_account_id varchar; +update public.transactions set new_account_id = accounts.address from public.accounts where transactions.sender = accounts.id; +alter table public.transactions drop column sender; +alter table public.transactions rename column new_account_id to sender; +alter table public.transactions add constraint transactions_sender_fkey foreign key (sender) references public.accounts (address); + +alter table public.accounts drop column id; diff --git a/db/migrations/20240521110340_add_account_transactions_pk_add_tx_count_on_tracking_add_account_transactions_index.down.sql b/db/migrations/20240521110340_add_account_transactions_pk_add_tx_count_on_tracking_add_account_transactions_index.down.sql new file mode 100644 index 00000000..e69de29b diff --git a/db/migrations/20240521110340_add_account_transactions_pk_add_tx_count_on_tracking_add_account_transactions_index.up.sql b/db/migrations/20240521110340_add_account_transactions_pk_add_tx_count_on_tracking_add_account_transactions_index.up.sql new file mode 100644 index 00000000..24245d30 --- /dev/null +++ b/db/migrations/20240521110340_add_account_transactions_pk_add_tx_count_on_tracking_add_account_transactions_index.up.sql @@ -0,0 +1,6 @@ +alter table public.account_transactions add primary key (transaction_id, account_id); +create index ix_module_histories_module_id on public.module_histories (module_id); + +alter table public.tracking add column tx_count bigint not null default 0; + +create index ix_account_transactions_account_id_block_height_desc on public.account_transactions(account_id, block_height desc); diff --git a/db/migrations/20240529040917_add_block_index_in_transactions.down.sql b/db/migrations/20240529040917_add_block_index_in_transactions.down.sql new file mode 100644 index 00000000..7f4ab3e3 --- /dev/null +++ b/db/migrations/20240529040917_add_block_index_in_transactions.down.sql @@ -0,0 +1,2 @@ +DROP INDEX ix_transactions_block_height_block_index; +ALTER TABLE transactions DROP COLUMN block_index; diff --git a/db/migrations/20240529040917_add_block_index_in_transactions.up.sql b/db/migrations/20240529040917_add_block_index_in_transactions.up.sql new file mode 100644 index 00000000..fb282493 --- /dev/null +++ b/db/migrations/20240529040917_add_block_index_in_transactions.up.sql @@ -0,0 +1,3 @@ +ALTER TABLE public.transactions ADD COLUMN block_index int NOT NULL DEFAULT 0; + +CREATE INDEX ix_transactions_block_height_block_index ON public.transactions(block_height desc, block_index desc); diff --git a/db/migrations/20240604053138_index_module_transactions.down.sql b/db/migrations/20240604053138_index_module_transactions.down.sql new file mode 100644 index 00000000..0efe22d0 --- /dev/null +++ b/db/migrations/20240604053138_index_module_transactions.down.sql @@ -0,0 +1 @@ +DROP INDEX IF EXISTS ix_module_transactions_module_id_block_height_desc; diff --git a/db/migrations/20240604053138_index_module_transactions.up.sql b/db/migrations/20240604053138_index_module_transactions.up.sql new file mode 100644 index 00000000..15113f07 --- /dev/null +++ b/db/migrations/20240604053138_index_module_transactions.up.sql @@ -0,0 +1 @@ +CREATE INDEX ix_module_transactions_module_id_block_height_desc ON public.module_transactions(module_id, block_height desc); diff --git a/db/migrations/20240621081201_create_nfts_owner_and_collection_index.down.sql b/db/migrations/20240621081201_create_nfts_owner_and_collection_index.down.sql new file mode 100644 index 00000000..75e8f026 --- /dev/null +++ b/db/migrations/20240621081201_create_nfts_owner_and_collection_index.down.sql @@ -0,0 +1,2 @@ +DROP INDEX IF EXISTS ix_nfts_owner; +DROP INDEX IF EXISTS ix_nfts_collection; diff --git a/db/migrations/20240621081201_create_nfts_owner_and_collection_index.up.sql b/db/migrations/20240621081201_create_nfts_owner_and_collection_index.up.sql new file mode 100644 index 00000000..3705fcc0 --- /dev/null +++ b/db/migrations/20240621081201_create_nfts_owner_and_collection_index.up.sql @@ -0,0 +1,2 @@ +CREATE INDEX ix_nfts_owner ON public.nfts("owner"); +CREATE INDEX ix_nfts_collection ON public.nfts("collection"); diff --git a/db/migrations/20240621082913_create_nfts_tx_id_index.down.sql b/db/migrations/20240621082913_create_nfts_tx_id_index.down.sql new file mode 100644 index 00000000..2356afbe --- /dev/null +++ b/db/migrations/20240621082913_create_nfts_tx_id_index.down.sql @@ -0,0 +1 @@ +DROP INDEX IF EXISTS ix_nfts_tx_id; diff --git a/db/migrations/20240621082913_create_nfts_tx_id_index.up.sql b/db/migrations/20240621082913_create_nfts_tx_id_index.up.sql new file mode 100644 index 00000000..669d5970 --- /dev/null +++ b/db/migrations/20240621082913_create_nfts_tx_id_index.up.sql @@ -0,0 +1 @@ +CREATE INDEX ix_nfts_tx_id ON public.nfts(tx_id); diff --git a/db/migrations/20240621083827_create_nft_transactions_nft_index.down.sql b/db/migrations/20240621083827_create_nft_transactions_nft_index.down.sql new file mode 100644 index 00000000..e64ea7de --- /dev/null +++ b/db/migrations/20240621083827_create_nft_transactions_nft_index.down.sql @@ -0,0 +1 @@ +DROP INDEX IF EXISTS ix_nft_transactions_nft_id_block_height_desc; diff --git a/db/migrations/20240621083827_create_nft_transactions_nft_index.up.sql b/db/migrations/20240621083827_create_nft_transactions_nft_index.up.sql new file mode 100644 index 00000000..26453e80 --- /dev/null +++ b/db/migrations/20240621083827_create_nft_transactions_nft_index.up.sql @@ -0,0 +1 @@ +CREATE INDEX ix_nft_transactions_nft_id_block_height_desc ON public.nft_transactions(nft_id, block_height desc); diff --git a/db/migrations/20240626114225_create_index_for_nfts_and_collections.down.sql b/db/migrations/20240626114225_create_index_for_nfts_and_collections.down.sql new file mode 100644 index 00000000..8b42e14e --- /dev/null +++ b/db/migrations/20240626114225_create_index_for_nfts_and_collections.down.sql @@ -0,0 +1,4 @@ +DROP INDEX IF EXISTS ix_collection_transactions_collection_id; +DROP INDEX IF EXISTS ix_collection_transactions_tx_id; +DROP INDEX IF EXISTS ix_collection_transactions_nft_id; +DROP INDEX IF EXISTS ix_collections_creator; diff --git a/db/migrations/20240626114225_create_index_for_nfts_and_collections.up.sql b/db/migrations/20240626114225_create_index_for_nfts_and_collections.up.sql new file mode 100644 index 00000000..95342230 --- /dev/null +++ b/db/migrations/20240626114225_create_index_for_nfts_and_collections.up.sql @@ -0,0 +1,4 @@ +CREATE INDEX ix_collection_transactions_collection_id ON public.collection_transactions(collection_id); +CREATE INDEX ix_collection_transactions_tx_id ON public.collection_transactions(tx_id); +CREATE INDEX ix_collection_transactions_nft_id ON public.collection_transactions(nft_id); +CREATE INDEX ix_collections_creator ON public.collections(creator); diff --git a/db/migrations/20240626175649_create_index_for_validator_bonded_token_changes.down.sql b/db/migrations/20240626175649_create_index_for_validator_bonded_token_changes.down.sql new file mode 100644 index 00000000..4955ced4 --- /dev/null +++ b/db/migrations/20240626175649_create_index_for_validator_bonded_token_changes.down.sql @@ -0,0 +1,2 @@ +DROP INDEX IF EXISTS ix_validator_bonded_token_changes_validator_address_block_height; +DROP INDEX IF EXISTS ix_validator_bonded_token_changes_transaction_id; diff --git a/db/migrations/20240626175649_create_index_for_validator_bonded_token_changes.up.sql b/db/migrations/20240626175649_create_index_for_validator_bonded_token_changes.up.sql new file mode 100644 index 00000000..7183dfcb --- /dev/null +++ b/db/migrations/20240626175649_create_index_for_validator_bonded_token_changes.up.sql @@ -0,0 +1,2 @@ +CREATE INDEX ix_validator_bonded_token_changes_validator_address_block_height ON public.validator_bonded_token_changes(validator_address, block_height desc); +CREATE INDEX ix_validator_bonded_token_changes_transaction_id ON public.validator_bonded_token_changes(transaction_id); diff --git a/db/migrations/20240628035349_create_composite_index_for_collection_transactions_and_remove_individual_ones.down.sql b/db/migrations/20240628035349_create_composite_index_for_collection_transactions_and_remove_individual_ones.down.sql new file mode 100644 index 00000000..e69de29b diff --git a/db/migrations/20240628035349_create_composite_index_for_collection_transactions_and_remove_individual_ones.up.sql b/db/migrations/20240628035349_create_composite_index_for_collection_transactions_and_remove_individual_ones.up.sql new file mode 100644 index 00000000..9d81b1a5 --- /dev/null +++ b/db/migrations/20240628035349_create_composite_index_for_collection_transactions_and_remove_individual_ones.up.sql @@ -0,0 +1,2 @@ +DROP INDEX IF EXISTS ix_collection_transactions_collection_id; +CREATE INDEX ix_collection_transactions_collection_id_block_height ON public.collection_transactions(collection_id, block_height); diff --git a/db/migrations/20240719090357_add_module_digest.down.sql b/db/migrations/20240719090357_add_module_digest.down.sql new file mode 100644 index 00000000..ab802425 --- /dev/null +++ b/db/migrations/20240719090357_add_module_digest.down.sql @@ -0,0 +1 @@ +ALTER TABLE public.modules DROP COLUMN digest; diff --git a/db/migrations/20240719090357_add_module_digest.up.sql b/db/migrations/20240719090357_add_module_digest.up.sql new file mode 100644 index 00000000..6df67914 --- /dev/null +++ b/db/migrations/20240719090357_add_module_digest.up.sql @@ -0,0 +1 @@ +ALTER TABLE public.modules ADD COLUMN digest VARCHAR DEFAULT NULL; diff --git a/db/migrations/20240730093922_add_module_proposals_pkey.down.sql b/db/migrations/20240730093922_add_module_proposals_pkey.down.sql new file mode 100644 index 00000000..f18f5020 --- /dev/null +++ b/db/migrations/20240730093922_add_module_proposals_pkey.down.sql @@ -0,0 +1,2 @@ +ALTER TABLE ONLY public.module_proposals + DROP CONSTRAINT module_proposals_pkey; diff --git a/db/migrations/20240730093922_add_module_proposals_pkey.up.sql b/db/migrations/20240730093922_add_module_proposals_pkey.up.sql new file mode 100644 index 00000000..de702d6a --- /dev/null +++ b/db/migrations/20240730093922_add_module_proposals_pkey.up.sql @@ -0,0 +1,2 @@ +ALTER TABLE ONLY public.module_proposals + ADD CONSTRAINT module_proposals_pkey PRIMARY KEY (proposal_id, module_id); diff --git a/db/migrations/20241206084247_add_transaction_events.down.sql b/db/migrations/20241206084247_add_transaction_events.down.sql new file mode 100644 index 00000000..dc345f12 --- /dev/null +++ b/db/migrations/20241206084247_add_transaction_events.down.sql @@ -0,0 +1,6 @@ +REVOKE SELECT ON public.transaction_events FROM readonly; +REVOKE SELECT ON public.finalize_block_events FROM readonly; + +DROP TABLE IF EXISTS public.transaction_events CASCADE; +DROP TABLE IF EXISTS public.finalize_block_events CASCADE; +DROP TYPE IF EXISTS public.finalize_block_events_mode CASCADE; diff --git a/db/migrations/20241206084247_add_transaction_events.up.sql b/db/migrations/20241206084247_add_transaction_events.up.sql new file mode 100644 index 00000000..f7e7cc11 --- /dev/null +++ b/db/migrations/20241206084247_add_transaction_events.up.sql @@ -0,0 +1,26 @@ +CREATE TABLE IF NOT EXISTS public.transaction_events ( + transaction_hash VARCHAR NOT NULL, + block_height BIGINT NOT NULL, + event_key VARCHAR NOT NULL, + event_value VARCHAR NOT NULL, + event_index INTEGER NOT NULL, + PRIMARY KEY (transaction_hash, block_height, event_index) +); + +GRANT SELECT ON public.transaction_events TO readonly; + +CREATE TYPE public.finalize_block_events_mode AS ENUM ( + 'BeginBlock', + 'EndBlock' + ); + +CREATE TABLE public.finalize_block_events ( + block_height BIGINT NOT NULL, + event_key VARCHAR NOT NULL, + event_value VARCHAR NOT NULL, + event_index INTEGER NOT NULL, + mode public.finalize_block_events_mode NOT NULL, + PRIMARY KEY (block_height, event_index) +); + +GRANT SELECT ON public.finalize_block_events TO readonly; diff --git a/db/migrations/20241223171937_index_transaction_events_block_height.down.sql b/db/migrations/20241223171937_index_transaction_events_block_height.down.sql new file mode 100644 index 00000000..9579ea2b --- /dev/null +++ b/db/migrations/20241223171937_index_transaction_events_block_height.down.sql @@ -0,0 +1 @@ +DROP INDEX IF EXISTS ix_transaction_events_block_height_desc; diff --git a/db/migrations/20241223171937_index_transaction_events_block_height.up.sql b/db/migrations/20241223171937_index_transaction_events_block_height.up.sql new file mode 100644 index 00000000..bc6ce615 --- /dev/null +++ b/db/migrations/20241223171937_index_transaction_events_block_height.up.sql @@ -0,0 +1 @@ +CREATE INDEX ix_transaction_events_block_height_desc ON public.transaction_events (block_height DESC); diff --git a/db/migrations/20250103072725_index_events_block_height.down.sql b/db/migrations/20250103072725_index_events_block_height.down.sql new file mode 100644 index 00000000..b97ccf07 --- /dev/null +++ b/db/migrations/20250103072725_index_events_block_height.down.sql @@ -0,0 +1,3 @@ +DROP INDEX IF EXISTS ix_transactions_events_event_key_block_height_desc; + +DROP INDEX IF EXISTS ix_finalize_block_events_event_key_block_height_desc; diff --git a/db/migrations/20250103072725_index_events_block_height.up.sql b/db/migrations/20250103072725_index_events_block_height.up.sql new file mode 100644 index 00000000..dc443d3c --- /dev/null +++ b/db/migrations/20250103072725_index_events_block_height.up.sql @@ -0,0 +1,4 @@ +CREATE INDEX ix_finalize_block_events_event_key_block_height_desc ON public.finalize_block_events (event_key, block_height DESC); + +CREATE INDEX ix_transactions_events_event_key_block_height_desc + ON public.transaction_events (event_key, block_height DESC); diff --git a/db/migrations/20250109041241_add_move_events.down.sql b/db/migrations/20250109041241_add_move_events.down.sql new file mode 100644 index 00000000..9f92e9ee --- /dev/null +++ b/db/migrations/20250109041241_add_move_events.down.sql @@ -0,0 +1,2 @@ +DROP INDEX IF EXISTS ix_move_events_type_tag_block_height_desc; +DROP TABLE IF EXISTS move_events; diff --git a/db/migrations/20250109041241_add_move_events.up.sql b/db/migrations/20250109041241_add_move_events.up.sql new file mode 100644 index 00000000..a9d4a2ad --- /dev/null +++ b/db/migrations/20250109041241_add_move_events.up.sql @@ -0,0 +1,13 @@ +CREATE TABLE IF NOT EXISTS public.move_events ( + type_tag VARCHAR NOT NULL, + data JSONB NOT NULL, + block_height BIGINT NOT NULL, + transaction_hash VARCHAR NOT NULL, + event_index INTEGER NOT NULL, + PRIMARY KEY (transaction_hash, block_height, event_index) +); + +GRANT SELECT ON public.move_events TO readonly; + +CREATE INDEX ix_move_events_type_tag_block_height_desc + ON public.move_events (type_tag, block_height DESC); diff --git a/db/migrations/20250421041717_emergency_proposals.down.sql b/db/migrations/20250421041717_emergency_proposals.down.sql new file mode 100644 index 00000000..f9419dbc --- /dev/null +++ b/db/migrations/20250421041717_emergency_proposals.down.sql @@ -0,0 +1,3 @@ +ALTER TABLE public.proposals DROP COLUMN IF EXISTS emergency_next_tally_time; +ALTER TABLE public.proposals DROP COLUMN IF EXISTS emergency_start_time; +ALTER TABLE public.proposals DROP COLUMN IF EXISTS is_emergency; diff --git a/db/migrations/20250421041717_emergency_proposals.up.sql b/db/migrations/20250421041717_emergency_proposals.up.sql new file mode 100644 index 00000000..1bb9bf2f --- /dev/null +++ b/db/migrations/20250421041717_emergency_proposals.up.sql @@ -0,0 +1,3 @@ +ALTER TABLE public.proposals ADD is_emergency BOOL DEFAULT FALSE NOT NULL; +ALTER TABLE public.proposals ADD emergency_start_time TIMESTAMP; +ALTER TABLE public.proposals ADD emergency_next_tally_time TIMESTAMP; diff --git a/db/migrations/20250530093541_atlas_integration.down.sql b/db/migrations/20250530093541_atlas_integration.down.sql new file mode 100644 index 00000000..e69de29b diff --git a/db/migrations/20250530093541_atlas_integration.up.sql b/db/migrations/20250530093541_atlas_integration.up.sql new file mode 100644 index 00000000..90641589 --- /dev/null +++ b/db/migrations/20250530093541_atlas_integration.up.sql @@ -0,0 +1,122 @@ +CREATE TABLE IF NOT EXISTS "public"."schema_migrations" ("version" bigserial NOT NULL, "dirty" boolean NOT NULL, PRIMARY KEY ("version")); + +ALTER TABLE "public"."accounts" RENAME CONSTRAINT "accounts_vm_address_id_fkey" TO "fk_accounts_vm_address"; + +ALTER TABLE "public"."account_transactions" RENAME CONSTRAINT "account_transactions_account_id_fkey" TO "fk_account_transactions_account"; +ALTER TABLE "public"."account_transactions" RENAME CONSTRAINT "account_transactions_block_height_fkey" TO "fk_account_transactions_block"; +ALTER TABLE "public"."account_transactions" RENAME CONSTRAINT "account_transactions_transaction_id_fkey" TO "fk_account_transactions_transaction"; + +-- should be bigint anyway +ALTER TABLE "public"."account_transactions" ALTER COLUMN "block_height" TYPE bigint; + +ALTER TABLE "public"."blocks" RENAME CONSTRAINT "blocks_proposer_fkey" TO "fk_blocks_proposer_validator"; + +ALTER TABLE "public"."collections" RENAME CONSTRAINT "collections_block_height_fkey" TO "fk_collections_block"; +ALTER TABLE "public"."collections" RENAME CONSTRAINT "collections_collection_fkey" TO "fk_collections_collection_addr"; +ALTER TABLE "public"."collections" RENAME CONSTRAINT "collections_creator_fkey" TO "fk_collections_creator_addr"; + +ALTER TABLE "public"."collection_mutation_events" RENAME CONSTRAINT "collection_mutation_events_block_height_fkey" TO "fk_collection_mutation_events_block"; +ALTER TABLE "public"."collection_mutation_events" RENAME CONSTRAINT "collection_mutation_events_collection_id_fkey" TO "fk_collection_mutation_events_collection"; +ALTER TABLE "public"."collection_mutation_events" RENAME CONSTRAINT "collection_mutation_events_proposal_id_fkey" TO "fk_collection_mutation_events_proposal"; +ALTER TABLE "public"."collection_mutation_events" RENAME CONSTRAINT "collection_mutation_events_tx_id_fkey" TO "fk_collection_mutation_events_transaction"; + +ALTER TABLE "public"."collection_proposals" RENAME CONSTRAINT "collection_proposals_collection_id_fkey" TO "fk_collection_proposals_collection"; +ALTER TABLE "public"."collection_proposals" RENAME CONSTRAINT "collection_proposals_nft_id_fkey" TO "fk_collection_proposals_nft"; +ALTER TABLE "public"."collection_proposals" RENAME CONSTRAINT "collection_proposals_proposal_id_fkey" TO "fk_collection_proposals_proposal"; + +ALTER TABLE "public"."collection_transactions" RENAME CONSTRAINT "collection_transactions_block_height_fkey" TO "fk_collection_transactions_block"; +ALTER TABLE "public"."collection_transactions" RENAME CONSTRAINT "collection_transactions_collection_id_fkey" TO "fk_collection_transactions_collection"; +ALTER TABLE "public"."collection_transactions" RENAME CONSTRAINT "collection_transactions_nft_id_fkey" TO "fk_collection_transactions_nft"; +ALTER TABLE "public"."collection_transactions" RENAME CONSTRAINT "collection_transactions_tx_id_fkey" TO "fk_collection_transactions_transaction"; + +ALTER TABLE "public"."lcd_tx_results" RENAME CONSTRAINT "lcd_tx_results_block_height_fkey" TO "fk_lcd_tx_results_block"; +ALTER TABLE "public"."lcd_tx_results" RENAME CONSTRAINT "lcd_tx_results_transaction_id_fkey" TO "fk_lcd_tx_results_transaction"; + +ALTER TABLE "public"."modules" RENAME CONSTRAINT "modules_publish_tx_id_fkey" TO "fk_modules_publish_tx"; +ALTER TABLE "public"."modules" RENAME CONSTRAINT "modules_publisher_id_fkey" TO "fk_modules_publisher"; + +ALTER TABLE "public"."module_histories" RENAME CONSTRAINT "module_histories_block_height_fkey" TO "fk_module_histories_block"; +ALTER TABLE "public"."module_histories" RENAME CONSTRAINT "module_histories_module_id_fkey" TO "fk_module_histories_module"; +ALTER TABLE "public"."module_histories" RENAME CONSTRAINT "module_histories_proposal_id_fkey" TO "fk_module_histories_proposal"; +ALTER TABLE "public"."module_histories" RENAME CONSTRAINT "module_histories_tx_id_fkey" TO "fk_module_histories_transaction"; + +ALTER TABLE "public"."module_proposals" RENAME CONSTRAINT "module_proposals_module_id_fkey" TO "fk_module_proposals_module"; +ALTER TABLE "public"."module_proposals" RENAME CONSTRAINT "module_proposals_proposal_id_fkey" TO "fk_module_proposals_proposal"; + +ALTER TABLE "public"."module_transactions" RENAME CONSTRAINT "module_transactions_block_height_fkey" TO "fk_module_transactions_block"; +ALTER TABLE "public"."module_transactions" RENAME CONSTRAINT "module_transactions_module_id_fkey" TO "fk_module_transactions_module"; +ALTER TABLE "public"."module_transactions" RENAME CONSTRAINT "module_transactions_tx_id_fkey" TO "fk_module_transactions_transaction"; + +ALTER TABLE "public"."nfts" RENAME CONSTRAINT "nfts_collection_fkey" TO "fk_nfts_collection_ref"; +ALTER TABLE "public"."nfts" RENAME CONSTRAINT "nfts_nft_fkey" TO "fk_nfts_nft_addr"; +ALTER TABLE "public"."nfts" RENAME CONSTRAINT "nfts_owner_fkey" TO "fk_nfts_owner_addr"; +ALTER TABLE "public"."nfts" RENAME CONSTRAINT "nfts_proposal_id_fkey" TO "fk_nfts_proposal"; +ALTER TABLE "public"."nfts" RENAME CONSTRAINT "nfts_tx_id_fkey" TO "fk_nfts_tx_ref"; + +ALTER TABLE "public"."nft_histories" RENAME CONSTRAINT "nft_histories_block_height_fkey" TO "fk_nft_histories_block"; +ALTER TABLE "public"."nft_histories" RENAME CONSTRAINT "nft_histories_from_fkey" TO "fk_nft_histories_from_addr"; +ALTER TABLE "public"."nft_histories" RENAME CONSTRAINT "nft_histories_nft_id_fkey" TO "fk_nft_histories_nft"; +ALTER TABLE "public"."nft_histories" RENAME CONSTRAINT "nft_histories_proposal_id_fkey" TO "fk_nft_histories_proposal"; +ALTER TABLE "public"."nft_histories" RENAME CONSTRAINT "nft_histories_to_fkey" TO "fk_nft_histories_to_addr"; +ALTER TABLE "public"."nft_histories" RENAME CONSTRAINT "nft_histories_tx_id_fkey" TO "fk_nft_histories_transaction"; + +ALTER TABLE "public"."nft_mutation_events" RENAME CONSTRAINT "nft_mutation_events_block_height_fkey" TO "fk_nft_mutation_events_block"; +ALTER TABLE "public"."nft_mutation_events" RENAME CONSTRAINT "nft_mutation_events_nft_id_fkey" TO "fk_nft_mutation_events_nft"; +ALTER TABLE "public"."nft_mutation_events" RENAME CONSTRAINT "nft_mutation_events_proposal_id_fkey" TO "fk_nft_mutation_events_proposal"; +ALTER TABLE "public"."nft_mutation_events" RENAME CONSTRAINT "nft_mutation_events_tx_id_fkey" TO "fk_nft_mutation_events_transaction"; + +ALTER TABLE "public"."nft_proposals" RENAME CONSTRAINT "nft_proposals_nft_id_fkey" TO "fk_nft_proposals_nft"; +ALTER TABLE "public"."nft_proposals" RENAME CONSTRAINT "nft_proposals_proposal_id_fkey" TO "fk_nft_proposals_proposal"; + +ALTER TABLE "public"."nft_transactions" RENAME CONSTRAINT "nft_transactions_block_height_fkey" TO "fk_nft_transactions_block"; +ALTER TABLE "public"."nft_transactions" RENAME CONSTRAINT "nft_transactions_nft_id_fkey" TO "fk_nft_transactions_nft"; +ALTER TABLE "public"."nft_transactions" RENAME CONSTRAINT "nft_transactions_tx_id_fkey" TO "fk_nft_transactions_transaction"; + +ALTER TABLE "public"."opinit_transactions" RENAME CONSTRAINT "opinit_transactions_block_height_fkey" TO "fk_opinit_transactions_block"; +ALTER TABLE "public"."opinit_transactions" RENAME CONSTRAINT "opinit_transactions_tx_id_fkey" TO "fk_opinit_transactions_transaction"; + +ALTER TABLE "public"."proposals" RENAME CONSTRAINT "proposals_created_height_fkey" TO "fk_proposals_created_block"; +ALTER TABLE "public"."proposals" RENAME CONSTRAINT "proposals_created_tx_fkey" TO "fk_proposals_created_tx_ref"; +ALTER TABLE "public"."proposals" RENAME CONSTRAINT "proposals_proposer_id_fkey" TO "fk_proposals_proposer"; +ALTER TABLE "public"."proposals" RENAME CONSTRAINT "proposals_resolved_height_fkey" TO "fk_proposals_resolved_block"; + +ALTER TABLE "public"."proposal_deposits" RENAME CONSTRAINT "proposal_deposits_depositor_fkey" TO "fk_proposal_deposits_depositor_account"; +ALTER TABLE "public"."proposal_deposits" RENAME CONSTRAINT "proposal_deposits_proposal_id_fkey" TO "fk_proposal_deposits_proposal"; +ALTER TABLE "public"."proposal_deposits" RENAME CONSTRAINT "proposal_deposits_transaction_id_fkey" TO "fk_proposal_deposits_transaction"; + +ALTER TABLE "public"."proposal_votes" RENAME CONSTRAINT "proposal_votes_proposal_id_fkey" TO "fk_proposal_votes_proposal"; +ALTER TABLE "public"."proposal_votes" RENAME CONSTRAINT "proposal_votes_transaction_id_fkey" TO "fk_proposal_votes_transaction"; +ALTER TABLE "public"."proposal_votes" RENAME CONSTRAINT "proposal_votes_validator_address_fkey" TO "fk_proposal_votes_validator"; +ALTER TABLE "public"."proposal_votes" RENAME CONSTRAINT "proposal_votes_voter_fkey" TO "fk_proposal_votes_voter_account"; + +ALTER TABLE "public"."proposal_votes_legacy" RENAME CONSTRAINT "proposal_votes_legacy_transaction_id_fkey" TO "fk_proposal_votes_legacy_transaction"; +ALTER TABLE "public"."proposal_votes_legacy" RENAME CONSTRAINT "proposal_votes_legacy_voter_fkey" TO "fk_proposal_votes_legacy_voter_account"; +ALTER TABLE "public"."proposal_votes_legacy" RENAME CONSTRAINT "proposal_votes_proposal_id_fkey" TO "fk_proposal_votes_legacy_proposal"; +ALTER TABLE "public"."proposal_votes_legacy" RENAME CONSTRAINT "proposal_votes_validator_address_fkey" TO "fk_proposal_votes_legacy_validator"; + +-- should be bigint anyway +ALTER TABLE "public"."transactions" ALTER COLUMN "block_height" TYPE bigint; + +ALTER TABLE "public"."transactions" RENAME CONSTRAINT "transactions_block_height_fkey" TO "fk_transactions_block"; +ALTER TABLE "public"."transactions" RENAME CONSTRAINT "transactions_sender_fkey" TO "fk_transactions_sender_account"; + +ALTER TABLE "public"."validators" RENAME CONSTRAINT "validators_account_id_fkey" TO "fk_validators_account"; + +ALTER TABLE "public"."validator_bonded_token_changes" RENAME CONSTRAINT "validator_bonded_token_changes_block_height_fkey" TO "fk_validator_bonded_token_changes_block"; +ALTER TABLE "public"."validator_bonded_token_changes" RENAME CONSTRAINT "validator_bonded_token_changes_transaction_id_fkey" TO "fk_validator_bonded_token_changes_transaction"; +ALTER TABLE "public"."validator_bonded_token_changes" RENAME CONSTRAINT "validator_bonded_token_changes_validator_address_fkey" TO "fk_validator_bonded_token_changes_validator"; + +ALTER TABLE "public"."validator_commit_signatures" RENAME CONSTRAINT "validator_commit_signatures_validator_address_fkey" TO "fk_validator_commit_signatures_validator"; + +ALTER TABLE "public"."validator_historical_powers" RENAME CONSTRAINT "validator_historical_powers_validator_address_fkey" TO "fk_validator_historical_powers_validator"; + +ALTER TABLE "public"."validator_slash_events" RENAME CONSTRAINT "validator_slash_events_block_height_fkey" TO "fk_validator_slash_events_block"; +ALTER TABLE "public"."validator_slash_events" RENAME CONSTRAINT "validator_slash_events_validator_address_fkey" TO "fk_validator_slash_events_validator"; + +ALTER TABLE "public"."validator_vote_counts" RENAME CONSTRAINT "validator_vote_counts_validator_address_fkey" TO "fk_validator_vote_counts_validator"; + +-- PRIMARY KEYS ORDER + +ALTER TABLE "public"."move_events" DROP CONSTRAINT "move_events_pkey", ADD PRIMARY KEY ("block_height", "transaction_hash", "event_index"); + +ALTER TABLE "public"."transaction_events" DROP CONSTRAINT "transaction_events_pkey", ADD PRIMARY KEY ("block_height", "transaction_hash", "event_index"); diff --git a/db/migrations/20250714112459_height_bigint.up.sql b/db/migrations/20250714112459_height_bigint.up.sql new file mode 100644 index 00000000..d8404ac4 --- /dev/null +++ b/db/migrations/20250714112459_height_bigint.up.sql @@ -0,0 +1,26 @@ +-- Modify "blocks" table +ALTER TABLE "public"."blocks" ALTER COLUMN "height" TYPE bigint; +-- Modify "collection_mutation_events" table +ALTER TABLE "public"."collection_mutation_events" ALTER COLUMN "block_height" TYPE bigint; +-- Modify "collection_transactions" table +ALTER TABLE "public"."collection_transactions" ALTER COLUMN "block_height" TYPE bigint; +-- Modify "collections" table +ALTER TABLE "public"."collections" ALTER COLUMN "block_height" TYPE bigint; +-- Modify "lcd_tx_results" table +ALTER TABLE "public"."lcd_tx_results" ALTER COLUMN "block_height" TYPE bigint; +-- Modify "module_histories" table +ALTER TABLE "public"."module_histories" ALTER COLUMN "block_height" TYPE bigint; +-- Modify "module_transactions" table +ALTER TABLE "public"."module_transactions" ALTER COLUMN "block_height" TYPE bigint; +-- Modify "nft_histories" table +ALTER TABLE "public"."nft_histories" ALTER COLUMN "block_height" TYPE bigint; +-- Modify "nft_mutation_events" table +ALTER TABLE "public"."nft_mutation_events" ALTER COLUMN "block_height" TYPE bigint; +-- Modify "nft_transactions" table +ALTER TABLE "public"."nft_transactions" ALTER COLUMN "block_height" TYPE bigint; +-- Modify "opinit_transactions" table +ALTER TABLE "public"."opinit_transactions" ALTER COLUMN "block_height" TYPE bigint; +-- Modify "proposals" table +ALTER TABLE "public"."proposals" ALTER COLUMN "resolved_height" TYPE bigint, ALTER COLUMN "created_height" TYPE bigint; +-- Modify "tracking" table +ALTER TABLE "public"."tracking" ALTER COLUMN "latest_informative_block_height" TYPE bigint; diff --git a/db/migrations/20251014065615_add-index.up.sql b/db/migrations/20251014065615_add-index.up.sql new file mode 100644 index 00000000..98068515 --- /dev/null +++ b/db/migrations/20251014065615_add-index.up.sql @@ -0,0 +1,8 @@ +-- Create index "ix_account_transactions_signer" to table: "account_transactions" +CREATE INDEX "ix_account_transactions_signer" ON "public"."account_transactions" ("account_id", "is_signer", "block_height" DESC); +-- Create index "ix_transactions_move_ops" to table: "transactions" +CREATE INDEX "ix_transactions_move_ops" ON "public"."transactions" ("is_move_publish", "is_move_upgrade", "is_move_execute", "is_move_script"); +-- Create index "ix_transactions_opinit" to table: "transactions" +CREATE INDEX "ix_transactions_opinit" ON "public"."transactions" ("is_opinit"); +-- Create index "ix_transactions_send_ibc" to table: "transactions" +CREATE INDEX "ix_transactions_send_ibc" ON "public"."transactions" ("is_send", "is_ibc"); diff --git a/db/migrations/20260217152000_add_validator_vote_counts_last_10000.down.sql b/db/migrations/20260217152000_add_validator_vote_counts_last_10000.down.sql new file mode 100644 index 00000000..98b1ba93 --- /dev/null +++ b/db/migrations/20260217152000_add_validator_vote_counts_last_10000.down.sql @@ -0,0 +1,2 @@ +-- Remove last_10000 column from validator_vote_counts table +ALTER TABLE validator_vote_counts DROP COLUMN last_10000; diff --git a/db/migrations/20260217152000_add_validator_vote_counts_last_10000.up.sql b/db/migrations/20260217152000_add_validator_vote_counts_last_10000.up.sql new file mode 100644 index 00000000..5e0341bd --- /dev/null +++ b/db/migrations/20260217152000_add_validator_vote_counts_last_10000.up.sql @@ -0,0 +1,3 @@ +-- Add last_10000 column to validator_vote_counts table to store pre-calculated vote counts for last 10,000 blocks +-- This avoids expensive on-demand counting queries in GetValidatorBlockStats +ALTER TABLE validator_vote_counts ADD COLUMN last_10000 integer NOT NULL DEFAULT 0; diff --git a/db/migrations/20260217153000_add_validators_image_url.down.sql b/db/migrations/20260217153000_add_validators_image_url.down.sql new file mode 100644 index 00000000..62dd7e4e --- /dev/null +++ b/db/migrations/20260217153000_add_validators_image_url.down.sql @@ -0,0 +1,2 @@ +-- Remove identity_image column from validators table +ALTER TABLE validators DROP COLUMN identity_image; diff --git a/db/migrations/20260217153000_add_validators_image_url.up.sql b/db/migrations/20260217153000_add_validators_image_url.up.sql new file mode 100644 index 00000000..64e2b026 --- /dev/null +++ b/db/migrations/20260217153000_add_validators_image_url.up.sql @@ -0,0 +1,3 @@ +-- Add identity_image column to validators table to store pre-fetched Keybase image data (base64-encoded) +-- This avoids on-demand API calls to Keybase during API requests +ALTER TABLE validators ADD COLUMN identity_image text NOT NULL DEFAULT ''; diff --git a/db/migrations/atlas.sum b/db/migrations/atlas.sum new file mode 100644 index 00000000..6deda8a3 --- /dev/null +++ b/db/migrations/atlas.sum @@ -0,0 +1,61 @@ +h1:u2HFSFKdp3rpbDxWMy+grpyV2I0I2fILZulkkJy3zLc= +20240307080048_dump_existing_tables.down.sql h1:QYXNuvzK7vRymEc9vf0J0OEqtnPsvGqB8+37H1U/gUg= +20240307080048_dump_existing_tables.up.sql h1:b6MAlzuv0Tly0AeLlvQvC872c6ufUYnzQ2sRz/snl/c= +20240318095014_validator_tables_update_for_generic_indexer.down.sql h1:K5z6x5h1I6rVVKtJF6pgMcINruScn/8mM9UoPOpG5as= +20240318095014_validator_tables_update_for_generic_indexer.up.sql h1:fUJkE1Bn98kX4usaePs0xAL2RKlEU/rXyuKRnLk16bc= +20240319085423_add_latest_informative_height_in_tracking.down.sql h1:ErpAwMs22FJe6rwP7ZZkjuvcD2ziFB3a29hCRd7cb9g= +20240319085423_add_latest_informative_height_in_tracking.up.sql h1:H8q9EjKf1lliAhhITUQmy1Hsb7ug1KG4KZ5aYAxfMeQ= +20240326061541_update_validator_slash_events_enum.down.sql h1:VjVybdpYO2ZF1PTjcv5rlQLALcVD8Sn3wQpejuwDE0A= +20240326061541_update_validator_slash_events_enum.up.sql h1:s31Dzk3zlKzg3QirBWD2wVE2Au/sm4nnFq7dFvGz+hE= +20240327104039_add_failed_reason_in_proposals.down.sql h1:E43g5dNLnpOz+acbAuXnt7R3TtXtlBMuCcDNZj6e7cM= +20240327104039_add_failed_reason_in_proposals.up.sql h1:aB+WhdKhJtbKmdblMDwvtdelKlhMOIzOOCpQzaAbV7c= +20240410105818_add_resolved_voting_power.down.sql h1:+PHgQWTAmsyzZEnwVoH7e6lMhN5796RKqvexAX8RYA8= +20240410105818_add_resolved_voting_power.up.sql h1:AzsQvWWD1mX+CUkxPNea5X+4PeLaxlZ4urXfYa6FqhQ= +20240424083951_update_module_and_nft_histories.down.sql h1:9mO1nRPl5ZmAv+TFsULZQm2HmOBD8pp48iotM9rvysY= +20240424083951_update_module_and_nft_histories.up.sql h1:oWioa9fXT/95HrfQXk9mCt2FS6cx/Czqxx0D9Ci3AvY= +20240521105847_transaction_id_to_string.down.sql h1:9CVcDBJcJymdqky2Pt0f0TB0SXRHXIAX7PMLpuq+JYk= +20240521105847_transaction_id_to_string.up.sql h1:fUGOgsagpvDB9zWVnr8ethCtbsQsYGLghfabHJmoZXw= +20240521110034_vm_address_collection_module_nft_reference.down.sql h1:d/t7LyaWQQRhHXjeDNXGOj9EbPTUhGAM9ceOjXMFPxo= +20240521110034_vm_address_collection_module_nft_reference.up.sql h1:33Nqd2rLn1URH8GcntPurd95cF98FL1LS++T5d1rSU8= +20240521110232_remove_account_id.down.sql h1:5khKjN6EwAYLTzyyI9gEGLpkNKEGB6sp7YNuNDk/i+4= +20240521110232_remove_account_id.up.sql h1:8plomPYB4FGtz14ACgedsfewKbOP+DYsTfwSh6PjuRc= +20240521110340_add_account_transactions_pk_add_tx_count_on_tracking_add_account_transactions_index.down.sql h1:rm2tv95kJ/QRG/TkeRrSqZGXxXJCBHIC6NcHsDSGvIo= +20240521110340_add_account_transactions_pk_add_tx_count_on_tracking_add_account_transactions_index.up.sql h1:Lpgg8FL992w2ZDBdiPVLCfLuSCNS1un9Z1PWbCp/hEM= +20240529040917_add_block_index_in_transactions.down.sql h1:CPwfQ0p/SHjyHoXWtm+RjO3BIb1giwgQGqw8cpjlUG0= +20240529040917_add_block_index_in_transactions.up.sql h1:Dy5uGuZ6uBOlFQJqiYgP5wRpuAhU00duVU9jqMGGbk0= +20240604053138_index_module_transactions.down.sql h1:1ZShCJXmYGIhTHG4uzDJFD0Qva7+06D4tvMT5ICYKG8= +20240604053138_index_module_transactions.up.sql h1:wyA/a+w4HfEmkNXzJdGThVyo4KN3b6pZ+UOdxuczh9A= +20240621081201_create_nfts_owner_and_collection_index.down.sql h1:BCETJVMj5eaWZ0VyhL+SJrLYSNhx9Oqtlmvfrl6fYi8= +20240621081201_create_nfts_owner_and_collection_index.up.sql h1:Nl/Fj22f3+XZrvxQxAqyHYCpEZSB2MGoWsz/te+kgHI= +20240621082913_create_nfts_tx_id_index.down.sql h1:NvUpkOELnmLerXl4Yo5rtJ35E4MJXB9a53cqQGis33Y= +20240621082913_create_nfts_tx_id_index.up.sql h1:l5QurGhfKqkxgq8So2YMIeWwC0xr/eNwj/MVizJuBD0= +20240621083827_create_nft_transactions_nft_index.down.sql h1:UqHlc5xjGHp/fwVEPKa4WqZiCAbfW0b8n0bXZFUre/4= +20240621083827_create_nft_transactions_nft_index.up.sql h1:omdkJNXa3kZIsNB3VkDLzn1QDXUoFuwmBdojYiyQm0k= +20240626114225_create_index_for_nfts_and_collections.down.sql h1:09Lw5BOe+FGETxtZZ7Aobx+2RzLBCoXmQ+Bba1i5VXI= +20240626114225_create_index_for_nfts_and_collections.up.sql h1:Ny58ckxW9AC2HmjVzLshems5+5IyAwDuPtpZiEQ93Tk= +20240626175649_create_index_for_validator_bonded_token_changes.down.sql h1:aNfVVDjDcRj0LBUdrtox8Cj754lssGA2bLwGxjGQyB0= +20240626175649_create_index_for_validator_bonded_token_changes.up.sql h1:kXf9jN5N446dwYzWHM+x+wL7+qMkZNeJZPLotssTZOU= +20240628035349_create_composite_index_for_collection_transactions_and_remove_individual_ones.down.sql h1:E2nfqY8C8o1fzA11IZWOnlluSD4sJbM6VwyIM1y6DaM= +20240628035349_create_composite_index_for_collection_transactions_and_remove_individual_ones.up.sql h1:cIRM5Yid7e6iL1Qz0Iz1qyl/Mz4Iie3jgtAACSb/OQM= +20240719090357_add_module_digest.down.sql h1:fYveMGfyUVwWDSRZtmMq2CEN+th6vYdfoH8UwYHN9LY= +20240719090357_add_module_digest.up.sql h1:vJHNv2VEPirTI30ktgeqCmVMxfwP0BMjkskeIHRia2M= +20240730093922_add_module_proposals_pkey.down.sql h1:6Cr29/EqGkQMxciDFtdzvlIZ9H9ROwqyJhCJGiLSw4U= +20240730093922_add_module_proposals_pkey.up.sql h1:qi9tBvFzB/szkXMwUABs/V7YobCZhffvqu+RxdGgofw= +20241206084247_add_transaction_events.down.sql h1:VlhVmE3J1wqBTNzFHA7xDl49sibfR54f/kA3EELXwRk= +20241206084247_add_transaction_events.up.sql h1:YAqJxBDvS9CLJ+jRWAIm7ID8u3N5x0biCAtqT8vQ5AA= +20241223171937_index_transaction_events_block_height.down.sql h1:CC4WVULbTpFIIuQO2TX9epAggJpn0/tsRDrqAQzhrXw= +20241223171937_index_transaction_events_block_height.up.sql h1:3a4y4mHNthmq98rrQAov75YglFMci7w9GwPU++wt0Mk= +20250103072725_index_events_block_height.down.sql h1:nL8zk62WXIKdurvLLOQEfcTtR5fgsMVTSn/4XoYmYzw= +20250103072725_index_events_block_height.up.sql h1:Gk4cjtI21GEjI3K2lVXIc9L5q4nqqiUHsr5hiPgUTnY= +20250109041241_add_move_events.down.sql h1:CJjZKMbHUqthFxCx1XtiUG6DwAJ4UpMOhdrs4sEpreM= +20250109041241_add_move_events.up.sql h1:f5Smece1SsN88lVTeYlmaxL1Bi59AbsB1DwPX2aCXVw= +20250421041717_emergency_proposals.down.sql h1:AtsBX77igCREjFqrpMM8PqWhIgsvffTiSSgOuXA16U4= +20250421041717_emergency_proposals.up.sql h1:JciHgl1Fur8bAlRTdERLmCPHFsZVsdzZ77HDYInJnrY= +20250530093541_atlas_integration.down.sql h1:vnAUAkLMiQpav8EaZRZyxEwOKVT/bClgy4n5is1IKNs= +20250530093541_atlas_integration.up.sql h1:YtTICrPXXjmZfA7b8ahIpXGw7eyqnarj+xmVMP0Xol8= +20250714112459_height_bigint.up.sql h1:cMJ7q4KwrPj9vT/vXRSzVPjl3mUPKgXgrNZrDABCWZ4= +20251014065615_add-index.up.sql h1:RLZz63VMbG99LfkkXxCtnURA2X2Z3ltuJ2qjWS1b/pk= +20260217152000_add_validator_vote_counts_last_10000.down.sql h1:TkbR/HLCOWLlGxyVdkaQyF2/l5YOLwtJPCilxRS3iE8= +20260217152000_add_validator_vote_counts_last_10000.up.sql h1:Fhj6QH/9t91f89CFmKG02ECDrNoqHXFQg3oHBNk6L7U= +20260217153000_add_validators_image_url.down.sql h1:nye4iGAcyE2wdt0Ge/SnRVN3FYbcSw8I9xo4T+Z0iwE= +20260217153000_add_validators_image_url.up.sql h1:JlcbY+cZgMkJRWP5GpRTujQrhsWtKdp5NmpTMxrcfPY= diff --git a/dockerfiles/Dockerfile.api b/dockerfiles/Dockerfile.api new file mode 100644 index 00000000..7584ef86 --- /dev/null +++ b/dockerfiles/Dockerfile.api @@ -0,0 +1,32 @@ +FROM golang:1.25 AS builder + +WORKDIR /api +COPY ../api /api +COPY ../pkg /pkg + +RUN go build -o /api . + +FROM ubuntu:22.04 + +ENV MOVEVM_VERSION=v1.2.0 + +RUN apt-get update && apt-get install -y ca-certificates wget + +WORKDIR /api + +COPY --from=builder /api /api + +RUN ARCH=$(dpkg --print-architecture) && \ + if [ "$ARCH" = "amd64" ]; then \ + MOVEVM_ARCH="x86_64"; \ + elif [ "$ARCH" = "arm64" ]; then \ + MOVEVM_ARCH="aarch64"; \ + else \ + echo "Unsupported architecture: $ARCH" && exit 1; \ + fi && \ + wget -O /lib/libmovevm.${MOVEVM_ARCH}.so \ + https://github.com/initia-labs/movevm/releases/download/${MOVEVM_VERSION}/libmovevm.${MOVEVM_ARCH}.so && \ + wget -O /lib/libcompiler.${MOVEVM_ARCH}.so \ + https://github.com/initia-labs/movevm/releases/download/${MOVEVM_VERSION}/libcompiler.${MOVEVM_ARCH}.so + +CMD ["/api/api"] diff --git a/dockerfiles/Dockerfile.event b/dockerfiles/Dockerfile.event new file mode 100644 index 00000000..3b81631e --- /dev/null +++ b/dockerfiles/Dockerfile.event @@ -0,0 +1,32 @@ +FROM golang:1.25 AS builder + +WORKDIR /build +COPY ../event-indexer /build/event-indexer +COPY ../pkg /build/pkg + +RUN cd event-indexer && go build -o /event-indexer-binary . + +FROM ubuntu:22.04 + +ENV MOVEVM_VERSION=v1.2.0 + +WORKDIR /app + +RUN apt-get update && apt-get install -y ca-certificates wget + +COPY --from=builder /event-indexer-binary /event-indexer + +RUN ARCH=$(dpkg --print-architecture) && \ + if [ "$ARCH" = "amd64" ]; then \ + MOVEVM_ARCH="x86_64"; \ + elif [ "$ARCH" = "arm64" ]; then \ + MOVEVM_ARCH="aarch64"; \ + else \ + echo "Unsupported architecture: $ARCH" && exit 1; \ + fi && \ + wget -O /lib/libmovevm.${MOVEVM_ARCH}.so \ + https://github.com/initia-labs/movevm/releases/download/${MOVEVM_VERSION}/libmovevm.${MOVEVM_ARCH}.so && \ + wget -O /lib/libcompiler.${MOVEVM_ARCH}.so \ + https://github.com/initia-labs/movevm/releases/download/${MOVEVM_VERSION}/libcompiler.${MOVEVM_ARCH}.so + +CMD ["/event-indexer"] diff --git a/dockerfiles/Dockerfile.generic b/dockerfiles/Dockerfile.generic new file mode 100644 index 00000000..8b3d51d6 --- /dev/null +++ b/dockerfiles/Dockerfile.generic @@ -0,0 +1,44 @@ +FROM golang:1.25 AS builder + +# bimg (image resizing) needs pkg-config, libvips, and C compiler at build time +RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential \ + ca-certificates \ + libvips-dev \ + pkg-config \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /build +COPY ../generic-indexer /build/generic-indexer +COPY ../pkg /build/pkg + +RUN cd generic-indexer && go build -o /generic-indexer-binary . + +FROM ubuntu:22.04 + +ENV MOVEVM_VERSION=v1.2.0 + +WORKDIR /app + +RUN apt-get update && apt-get install -y --no-install-recommends \ + ca-certificates \ + wget \ + libvips42 \ + && rm -rf /var/lib/apt/lists/* + +COPY --from=builder /generic-indexer-binary /generic-indexer + +RUN ARCH=$(dpkg --print-architecture) && \ + if [ "$ARCH" = "amd64" ]; then \ + MOVEVM_ARCH="x86_64"; \ + elif [ "$ARCH" = "arm64" ]; then \ + MOVEVM_ARCH="aarch64"; \ + else \ + echo "Unsupported architecture: $ARCH" && exit 1; \ + fi && \ + wget -O /lib/libmovevm.${MOVEVM_ARCH}.so \ + https://github.com/initia-labs/movevm/releases/download/${MOVEVM_VERSION}/libmovevm.${MOVEVM_ARCH}.so && \ + wget -O /lib/libcompiler.${MOVEVM_ARCH}.so \ + https://github.com/initia-labs/movevm/releases/download/${MOVEVM_VERSION}/libcompiler.${MOVEVM_ARCH}.so + +CMD ["/generic-indexer"] diff --git a/dockerfiles/Dockerfile.informative b/dockerfiles/Dockerfile.informative index 6cf55614..78835576 100644 --- a/dockerfiles/Dockerfile.informative +++ b/dockerfiles/Dockerfile.informative @@ -1,19 +1,20 @@ -FROM golang:1.23 AS builder +FROM golang:1.25 AS builder -WORKDIR /informative-indexer -COPY ../informative-indexer /informative-indexer +WORKDIR /build +COPY ../informative-indexer /build/informative-indexer +COPY ../pkg /build/pkg -RUN go build -o /informative-indexer.bin . +RUN cd informative-indexer && go build -o /informative-indexer-binary . FROM ubuntu:22.04 -ENV MOVEVM_VERSION=v0.7.0 +ENV MOVEVM_VERSION=v1.2.0 -RUN apt-get update && apt-get install -y ca-certificates wget +WORKDIR /app -WORKDIR /informative-indexer +RUN apt-get update && apt-get install -y ca-certificates wget -COPY --from=builder /informative-indexer.bin /informative-indexer.bin +COPY --from=builder /informative-indexer-binary /informative-indexer RUN ARCH=$(dpkg --print-architecture) && \ if [ "$ARCH" = "amd64" ]; then \ @@ -28,4 +29,4 @@ RUN ARCH=$(dpkg --print-architecture) && \ wget -O /lib/libcompiler.${MOVEVM_ARCH}.so \ https://github.com/initia-labs/movevm/releases/download/${MOVEVM_VERSION}/libcompiler.${MOVEVM_ARCH}.so -CMD ["/informative-indexer.bin"] +CMD ["/informative-indexer"] diff --git a/dockerfiles/Dockerfile.pruner b/dockerfiles/Dockerfile.pruner new file mode 100644 index 00000000..92cc95c5 --- /dev/null +++ b/dockerfiles/Dockerfile.pruner @@ -0,0 +1,32 @@ +FROM golang:1.25 AS builder + +WORKDIR /build +COPY ../pruner /build/pruner +COPY ../pkg /build/pkg + +RUN cd pruner && go build -o /pruner-binary . + +FROM ubuntu:22.04 + +ENV MOVEVM_VERSION=v0.7.0 + +WORKDIR /app + +RUN apt-get update && apt-get install -y ca-certificates wget + +COPY --from=builder /pruner-binary /pruner + +RUN ARCH=$(dpkg --print-architecture) && \ + if [ "$ARCH" = "amd64" ]; then \ + MOVEVM_ARCH="x86_64"; \ + elif [ "$ARCH" = "arm64" ]; then \ + MOVEVM_ARCH="aarch64"; \ + else \ + echo "Unsupported architecture: $ARCH" && exit 1; \ + fi && \ + wget -O /lib/libmovevm.${MOVEVM_ARCH}.so \ + https://github.com/initia-labs/movevm/releases/download/${MOVEVM_VERSION}/libmovevm.${MOVEVM_ARCH}.so && \ + wget -O /lib/libcompiler.${MOVEVM_ARCH}.so \ + https://github.com/initia-labs/movevm/releases/download/${MOVEVM_VERSION}/libcompiler.${MOVEVM_ARCH}.so + +CMD ["/pruner"] diff --git a/dockerfiles/Dockerfile.sweeper b/dockerfiles/Dockerfile.sweeper new file mode 100644 index 00000000..51ad9503 --- /dev/null +++ b/dockerfiles/Dockerfile.sweeper @@ -0,0 +1,33 @@ +FROM golang:1.25 AS builder + +WORKDIR /build +COPY ../sweeper /build/sweeper +COPY ../pkg /build/pkg + +RUN cd sweeper && go build -o /sweeper-binary . + +FROM ubuntu:22.04 + +ENV MOVEVM_VERSION=v1.2.0 + +WORKDIR /app + +RUN apt-get update && apt-get install -y ca-certificates wget + +COPY --from=builder /sweeper-binary /sweeper +COPY ../db /app/db + +RUN ARCH=$(dpkg --print-architecture) && \ + if [ "$ARCH" = "amd64" ]; then \ + MOVEVM_ARCH="x86_64"; \ + elif [ "$ARCH" = "arm64" ]; then \ + MOVEVM_ARCH="aarch64"; \ + else \ + echo "Unsupported architecture: $ARCH" && exit 1; \ + fi && \ + wget -O /lib/libmovevm.${MOVEVM_ARCH}.so \ + https://github.com/initia-labs/movevm/releases/download/${MOVEVM_VERSION}/libmovevm.${MOVEVM_ARCH}.so && \ + wget -O /lib/libcompiler.${MOVEVM_ARCH}.so \ + https://github.com/initia-labs/movevm/releases/download/${MOVEVM_VERSION}/libcompiler.${MOVEVM_ARCH}.so + +CMD ["/sweeper"] diff --git a/dockerfiles/Dockerfile.uploader b/dockerfiles/Dockerfile.uploader new file mode 100644 index 00000000..fd950c39 --- /dev/null +++ b/dockerfiles/Dockerfile.uploader @@ -0,0 +1,17 @@ +FROM golang:1.25 AS builder + +WORKDIR /build +COPY ../tx-response-uploader /build/tx-response-uploader +COPY ../pkg /build/pkg + +RUN cd tx-response-uploader && go build -o /tx-response-uploader-binary . + +FROM ubuntu:22.04 + +WORKDIR /app + +RUN apt-get update && apt-get install -y ca-certificates wget + +COPY --from=builder /tx-response-uploader-binary /tx-response-uploader + +CMD ["/tx-response-uploader"] diff --git a/dockerfiles/README.md b/dockerfiles/README.md deleted file mode 100644 index a10731f8..00000000 --- a/dockerfiles/README.md +++ /dev/null @@ -1,71 +0,0 @@ -## Docker compose for informative indexer - -### Prerequisite -1. Create a .env file -- Use the provided `.env.example` file as a reference. -- Example configuration: -```env -POSTGRES_USER="postgres" -POSTGRES_PASSWORD="postgres" -POSTGRES_DB="core_indexer" -CHAIN="initiation-2" -ENVIRONMENT="local" -``` - -2. Update the `block_height` value -- Modify `init/init.sql` to change the `starting block_height`. -- Default: `2797040` - -### Running the Service -To start the indexer using Docker Compose, run: -```shell -docker compose -f dockerfiles/docker-compose-informative.yml up --build -``` - -### Fake-GCS -We are using [fake-gcs-server](https://github.com/fsouza/fake-gcs-server) to enable the storage feature. -You can view your fake GCS information at: `http://localhost:9184/storage/v1/b/{bucket_name}` -```json -{ - "kind": "storage#bucket", - "id": "initiation-2-local-informative-indexer-large-block-results", - "defaultEventBasedHold": false, - "name": "initiation-2-local-informative-indexer-large-block-results", - "versioning": { - "enabled": false - }, - "timeCreated": "2025-01-23T06:11:01.205566Z", - "updated": "2025-01-23T06:11:01.205566Z", - "location": "US-CENTRAL1", - "storageClass": "STANDARD", - "projectNumber": "0", - "metageneration": "1", - "etag": "RVRhZw==", - "locationType": "region" -} -``` - -### Hasura for GraphQL -We use Hasura for GraphQL. Run the following to update the metadata. -```shell -curl -X POST -H 'Content-Type: application/json' \ - --data '{ - "type": "bulk", - "source": "default", - "resource_version": 1, - "args": [ - { - "type": "postgres_track_tables", - "args": { - "allow_warnings": true, - "tables": [ - {"table": {"name": "finalize_block_events", "schema": "public"}, "source": "default"}, - {"table": {"name": "move_events", "schema": "public"}, "source": "default"}, - {"table": {"name": "transaction_events", "schema": "public"}, "source": "default"} - ] - } - } - ] - }' \ - http://localhost:8080/v1/metadata -``` diff --git a/event-indexer/.env.example b/event-indexer/.env.example new file mode 100644 index 00000000..b30cddc0 --- /dev/null +++ b/event-indexer/.env.example @@ -0,0 +1,14 @@ +# For local development only + +## Kafka credentials +export KAFKA_API_KEY="" +export KAFKA_API_SECRET="" +export KAFKA_BOOTSTRAP_SERVER="" + +## RPC for indexer +export RPC_ENDPOINTS="" +export RPC_TIMEOUT_IN_SECONDS="" +export REBALANCE_INTERVAL="" + +## Database connection +export DB_CONNECTION_STRING="" diff --git a/informative-indexer/cmd/flusher/cmd.go b/event-indexer/cmd/indexer/cmd.go similarity index 57% rename from informative-indexer/cmd/flusher/cmd.go rename to event-indexer/cmd/indexer/cmd.go index 698904d4..cd30aa20 100644 --- a/informative-indexer/cmd/flusher/cmd.go +++ b/event-indexer/cmd/indexer/cmd.go @@ -1,4 +1,4 @@ -package flusher_cmd +package indexer_cmd import ( "os" @@ -6,11 +6,13 @@ import ( "github.com/spf13/cobra" - "github.com/initia-labs/core-indexer/informative-indexer/flusher" + "github.com/initia-labs/core-indexer/event-indexer/indexer" ) const ( FlagID = "id" + FlagRPCEndpoints = "rpc-endpoints" + FlagRPCTimeoutInSeconds = "rpc-timeout-in-seconds" FlagKafkaBootstrapServer = "bootstrap-server" FlagDBConnectionString = "db" FlagChain = "chain" @@ -27,13 +29,15 @@ const ( FlagSentryTracesSampleRate = "sentry-traces-sample-rate" ) -// FlushCmd consumes messages from Kafka and flushes data into the database. -func FlushCmd() *cobra.Command { - flushCmd := &cobra.Command{ - Use: "flush", - Short: "Consumes messages from Kafka and flushes them into the database.", +// RunCmd consumes messages from Kafka and indexes them into the database. +func RunCmd() *cobra.Command { + RunCmd := &cobra.Command{ + Use: "run", + Short: "Consumes messages from Kafka and indexes them into the database.", Args: cobra.ExactArgs(0), RunE: func(cmd *cobra.Command, args []string) error { + rpcEndpoints, _ := cmd.Flags().GetString(FlagRPCEndpoints) + rpcTimeoutInSeconds, _ := cmd.Flags().GetInt64(FlagRPCTimeoutInSeconds) kafkaBootstrapServer, _ := cmd.Flags().GetString(FlagKafkaBootstrapServer) chain, _ := cmd.Flags().GetString(FlagChain) dbConnectionString, _ := cmd.Flags().GetString(FlagDBConnectionString) @@ -53,7 +57,9 @@ func FlushCmd() *cobra.Command { sentryProfilesSampleRate, _ := cmd.Flags().GetFloat64(FlagSentryProfilesSampleRate) sentryTracesSampleRate, _ := cmd.Flags().GetFloat64(FlagSentryTracesSampleRate) - f, err := flusher.NewFlusher(&flusher.Config{ + f, err := indexer.New(&indexer.Config{ + RPCEndpoints: rpcEndpoints, + RPCTimeoutInSeconds: rpcTimeoutInSeconds, ID: workerID, Chain: chain, DBConnectionString: dbConnectionString, @@ -70,17 +76,21 @@ func FlushCmd() *cobra.Command { SentryProfilesSampleRate: sentryProfilesSampleRate, SentryTracesSampleRate: sentryTracesSampleRate, }) - if err != nil { return err } - f.Flush() + f.Run() return nil }, } + rpcTimeOutInSeconds, err := strconv.ParseInt(os.Getenv("RPC_TIMEOUT_IN_SECONDS"), 10, 64) + if err != nil { + rpcTimeOutInSeconds = 30 + } + threshold, err := strconv.ParseInt(os.Getenv("CLAIM_CHECK_THRESHOLD_IN_MB"), 10, 64) if err != nil { threshold = 1 @@ -96,21 +106,23 @@ func FlushCmd() *cobra.Command { sentryTracesSampleRate = 0.01 } - flushCmd.Flags().String(FlagKafkaBootstrapServer, os.Getenv("BOOTSTRAP_SERVER"), ": to Kafka bootstrap server") - flushCmd.Flags().String(KafkaBlockResultsTopic, os.Getenv("BLOCK_RESULTS_TOPIC"), "Kafka topic to consume block_results message") - flushCmd.Flags().String(FlagKafkaBlockResultsConsumerGroup, os.Getenv("BLOCK_RESULTS_CONSUMER_GROUP"), "Kafka consumer group for block_results topic") - flushCmd.Flags().String(FlagKafkaAPIKey, os.Getenv("KAFKA_API_KEY"), "Kafka API key") - flushCmd.Flags().String(FlagKafkaAPISecret, os.Getenv("KAFKA_API_SECRET"), "Kafka API secret") - flushCmd.Flags().String(FlagDBConnectionString, os.Getenv("DB_CONNECTION_STRING"), "Database connection string") - flushCmd.Flags().String(FlagChain, os.Getenv("CHAIN"), "Chain ID to sweep") - flushCmd.Flags().String(FlagBlockResultsClaimCheckBucket, os.Getenv("BLOCK_RESULTS_CLAIM_CHECK_BUCKET"), "Block results claim check bucket") - flushCmd.Flags().Uint64(FlagClaimCheckThresholdInMB, uint64(threshold), "Claim check threshold in MB") - flushCmd.Flags().String(FlagID, os.Getenv("ID"), "Worker ID") - flushCmd.Flags().String(FlagEnvironment, os.Getenv("ENVIRONMENT"), "Environment") - flushCmd.Flags().String(FlagSentryDSN, os.Getenv("SENTRY_DSN"), "Sentry DSN") - flushCmd.Flags().String(FlagCommitSHA, os.Getenv("COMMIT_SHA"), "Commit SHA") - flushCmd.Flags().Float64(FlagSentryProfilesSampleRate, sentryProfilesSampleRate, "Sentry profiles sample rate") - flushCmd.Flags().Float64(FlagSentryTracesSampleRate, sentryTracesSampleRate, "Sentry traces sample rate") - - return flushCmd + RunCmd.Flags().String(FlagRPCEndpoints, os.Getenv("RPC_ENDPOINTS"), "") + RunCmd.Flags().String(FlagKafkaBootstrapServer, os.Getenv("BOOTSTRAP_SERVER"), ": to Kafka bootstrap server") + RunCmd.Flags().Int64(FlagRPCTimeoutInSeconds, rpcTimeOutInSeconds, "RPC timeout in seconds") + RunCmd.Flags().String(KafkaBlockResultsTopic, os.Getenv("BLOCK_RESULTS_TOPIC"), "Kafka topic to consume block_results message") + RunCmd.Flags().String(FlagKafkaBlockResultsConsumerGroup, os.Getenv("BLOCK_RESULTS_CONSUMER_GROUP"), "Kafka consumer group for block_results topic") + RunCmd.Flags().String(FlagKafkaAPIKey, os.Getenv("KAFKA_API_KEY"), "Kafka API key") + RunCmd.Flags().String(FlagKafkaAPISecret, os.Getenv("KAFKA_API_SECRET"), "Kafka API secret") + RunCmd.Flags().String(FlagDBConnectionString, os.Getenv("DB_CONNECTION_STRING"), "Database connection string") + RunCmd.Flags().String(FlagChain, os.Getenv("CHAIN"), "Chain ID to sweep") + RunCmd.Flags().String(FlagBlockResultsClaimCheckBucket, os.Getenv("BLOCK_RESULTS_CLAIM_CHECK_BUCKET"), "Block results claim check bucket") + RunCmd.Flags().Uint64(FlagClaimCheckThresholdInMB, uint64(threshold), "Claim check threshold in MB") + RunCmd.Flags().String(FlagID, os.Getenv("ID"), "Worker ID") + RunCmd.Flags().String(FlagEnvironment, os.Getenv("ENVIRONMENT"), "Environment") + RunCmd.Flags().String(FlagSentryDSN, os.Getenv("SENTRY_DSN"), "Sentry DSN") + RunCmd.Flags().String(FlagCommitSHA, os.Getenv("COMMIT_SHA"), "Commit SHA") + RunCmd.Flags().Float64(FlagSentryProfilesSampleRate, sentryProfilesSampleRate, "Sentry profiles sample rate") + RunCmd.Flags().Float64(FlagSentryTracesSampleRate, sentryTracesSampleRate, "Sentry traces sample rate") + + return RunCmd } diff --git a/event-indexer/cmd/migrate/cmd.go b/event-indexer/cmd/migrate/cmd.go new file mode 100644 index 00000000..244d6a65 --- /dev/null +++ b/event-indexer/cmd/migrate/cmd.go @@ -0,0 +1,63 @@ +package migrate_cmd + +import ( + "fmt" + "os" + + "github.com/spf13/cobra" + + "github.com/initia-labs/core-indexer/pkg/db" +) + +const ( + FlagDBHost = "db-host" + FlagDBUser = "db-user" + FlagMigrationsDir = "migrations-dir" +) + +// MigrateCmd is the command for managing database migrations +func MigrateCmd() *cobra.Command { + migrateCmd := &cobra.Command{ + Use: "migrate", + Short: "Manage database migrations", + Long: "Manage database migrations using GORM and Atlas", + } + + migrateCmd.AddCommand( + generateCmd(), + ) + + return migrateCmd +} + +// generateCmd generates a new migration file based on GORM models +func generateCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "generate [name]", + Short: "Generate a new migration file", + Long: "Generate a new migration file based on GORM models", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + dbHost, _ := cmd.Flags().GetString(FlagDBHost) + dbUser, _ := cmd.Flags().GetString(FlagDBUser) + migrationsDir, _ := cmd.Flags().GetString(FlagMigrationsDir) + name := args[0] + + if err := os.MkdirAll(migrationsDir, 0755); err != nil { + return fmt.Errorf("failed to create migrations directory: %w", err) + } + + if err := db.GenerateMigrationFilesWithLivePostgres(dbHost, dbUser, name, migrationsDir); err != nil { + return fmt.Errorf("failed to generate migration: %w", err) + } + + return nil + }, + } + + cmd.Flags().String(FlagDBHost, "localhost", "Database host for local migration generation") + cmd.Flags().String(FlagDBUser, "postgres", "Database user for local migration generation") + cmd.Flags().String(FlagMigrationsDir, "db/migrations", "Directory to store migration files") + + return cmd +} diff --git a/event-indexer/cmd/root.go b/event-indexer/cmd/root.go new file mode 100644 index 00000000..36e18dd1 --- /dev/null +++ b/event-indexer/cmd/root.go @@ -0,0 +1,28 @@ +package cmd + +import ( + "os" + + "github.com/spf13/cobra" + + indexer "github.com/initia-labs/core-indexer/event-indexer/cmd/indexer" + migrate "github.com/initia-labs/core-indexer/event-indexer/cmd/migrate" +) + +func Execute() { + var rootCmd = &cobra.Command{ + Use: "event-indexer", + Short: "Event Indexer Runner", + Long: "Event Indexer Runner - Polls data from RPC and indexes into database", + } + + rootCmd.AddCommand( + migrate.MigrateCmd(), + indexer.RunCmd(), + ) + + err := rootCmd.Execute() + if err != nil { + os.Exit(1) + } +} diff --git a/event-indexer/go.mod b/event-indexer/go.mod new file mode 100644 index 00000000..880f833a --- /dev/null +++ b/event-indexer/go.mod @@ -0,0 +1,248 @@ +module github.com/initia-labs/core-indexer/event-indexer + +go 1.25.8 + +require ( + github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d + github.com/confluentinc/confluent-kafka-go/v2 v2.6.1 + github.com/getsentry/sentry-go v0.29.1 + github.com/initia-labs/core-indexer/pkg v0.0.0-00010101000000-000000000000 + github.com/rs/zerolog v1.33.0 + github.com/spf13/cobra v1.9.1 + gorm.io/gorm v1.30.0 +) + +require ( + ariga.io/atlas v0.33.1 // indirect + ariga.io/atlas-go-sdk v0.6.8 // indirect + ariga.io/atlas-provider-gorm v0.5.2 // indirect + github.com/agext/levenshtein v1.2.3 // indirect + github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect + github.com/bmatcuk/doublestar v1.3.4 // indirect + github.com/cometbft/cometbft v0.38.20 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.36.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/go-jose/go-jose/v4 v4.1.3 // indirect + github.com/go-openapi/inflect v0.19.0 // indirect + github.com/go-playground/validator/v10 v10.14.0 // indirect + github.com/go-sql-driver/mysql v1.8.1 // indirect + github.com/gobwas/ws v1.1.0 // indirect + github.com/golang-migrate/migrate/v4 v4.18.3 // indirect + github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect + github.com/golang-sql/sqlexp v0.1.0 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/hcl/v2 v2.18.1 // indirect + github.com/jackc/pgx/v5 v5.9.2 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/lib/pq v1.10.9 // indirect + github.com/mattn/go-sqlite3 v1.14.22 // indirect + github.com/microsoft/go-mssqldb v1.7.2 // indirect + github.com/mitchellh/go-wordwrap v1.0.1 // indirect + github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + github.com/zclconf/go-cty v1.14.4 // indirect + github.com/zclconf/go-cty-yaml v1.1.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.uber.org/atomic v1.10.0 // indirect + gorm.io/driver/mysql v1.5.7 // indirect + gorm.io/driver/postgres v1.6.0 // indirect + gorm.io/driver/sqlite v1.5.7 // indirect + gorm.io/driver/sqlserver v1.5.4 // indirect +) + +require ( + cel.dev/expr v0.25.1 // indirect + cloud.google.com/go v0.123.0 // indirect + cloud.google.com/go/auth v0.18.2 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect + cloud.google.com/go/compute/metadata v0.9.0 // indirect + cloud.google.com/go/iam v1.5.3 // indirect + cloud.google.com/go/monitoring v1.24.3 // indirect + cloud.google.com/go/storage v1.61.3 // indirect + cosmossdk.io/api v0.7.6 // indirect + cosmossdk.io/collections v0.4.0 // indirect + cosmossdk.io/core v0.11.1 // indirect + cosmossdk.io/depinject v1.1.0 // indirect + cosmossdk.io/errors v1.0.1 // indirect + cosmossdk.io/log v1.4.1 // indirect + cosmossdk.io/math v1.4.0 // indirect + cosmossdk.io/store v1.1.1 // indirect + cosmossdk.io/x/tx v0.13.7 // indirect + filippo.io/edwards25519 v1.1.1 // indirect + github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect + github.com/99designs/keyring v1.2.2 // indirect + github.com/DataDog/datadog-go v3.2.0+incompatible // indirect + github.com/DataDog/zstd v1.5.5 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 // indirect + github.com/IGLOU-EU/go-wildcard v1.0.3 // indirect + github.com/aptos-labs/serde-reflection/serde-generate/runtime/golang v0.0.0-20231213012317-73b6bbf74833 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 // indirect + github.com/cockroachdb/errors v1.11.3 // indirect + github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v1.1.5 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/cometbft/cometbft-db v0.15.0 // indirect + github.com/cosmos/btcutil v1.0.5 // indirect + github.com/cosmos/cosmos-db v1.1.1 // indirect + github.com/cosmos/cosmos-proto v1.0.0-beta.5 // indirect + github.com/cosmos/cosmos-sdk v0.50.14 // indirect + github.com/cosmos/go-bip39 v1.0.0 // indirect + github.com/cosmos/gogogateway v1.2.0 // indirect + github.com/cosmos/gogoproto v1.7.0 // indirect + github.com/cosmos/iavl v1.2.6 // indirect + github.com/cosmos/ics23/go v0.11.0 // indirect + github.com/cosmos/ledger-cosmos-go v0.14.0 // indirect + github.com/danieljoos/wincred v1.1.2 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect + github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect + github.com/dgraph-io/badger/v4 v4.3.0 // indirect + github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/dvsekhvalnov/jose2go v1.7.0 // indirect + github.com/emicklei/dot v1.6.2 // indirect + github.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect + github.com/fatih/color v1.18.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-kit/kit v0.13.0 // indirect + github.com/go-kit/log v0.2.1 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect + github.com/gogo/googleapis v1.4.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/google/btree v1.1.3 // indirect + github.com/google/flatbuffers v23.5.26+incompatible // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/google/s2a-go v0.1.9 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect + github.com/googleapis/gax-go/v2 v2.17.0 // indirect + github.com/gorilla/handlers v1.5.2 // indirect + github.com/gorilla/mux v1.8.1 // indirect + github.com/gorilla/websocket v1.5.3 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect + github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect + github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect + github.com/hashicorp/go-hclog v1.6.3 // indirect + github.com/hashicorp/go-immutable-radix v1.3.1 // indirect + github.com/hashicorp/go-metrics v0.5.3 // indirect + github.com/hashicorp/go-plugin v1.5.2 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hashicorp/yamux v0.1.1 // indirect + github.com/hdevalence/ed25519consensus v0.1.0 // indirect + github.com/huandu/skiplist v1.2.0 // indirect + github.com/iancoleman/strcase v0.3.0 // indirect + github.com/improbable-eng/grpc-web v0.15.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/initia-labs/initia v1.4.3 + github.com/initia-labs/movevm v1.2.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/jmhodges/levigo v1.0.0 // indirect + github.com/klauspost/compress v1.18.5 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/linxGnu/grocksdb v1.10.3 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mitchellh/go-testing-interface v1.14.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mtibben/percent v0.2.1 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a // indirect + github.com/oklog/run v1.1.0 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/client_golang v1.21.0 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.62.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect + github.com/rs/cors v1.11.1 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sasha-s/go-deadlock v0.3.5 // indirect + github.com/skip-mev/connect/v2 v2.3.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.7.1 // indirect + github.com/spf13/pflag v1.0.6 // indirect + github.com/spf13/viper v1.19.0 // indirect + github.com/stretchr/testify v1.11.1 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect + github.com/tendermint/go-amino v0.16.0 // indirect + github.com/tidwall/btree v1.7.0 // indirect + github.com/ybbus/jsonrpc/v3 v3.1.5 // indirect + github.com/zondax/hid v0.9.2 // indirect + github.com/zondax/ledger-go v0.14.3 // indirect + go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.39.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect + go.opentelemetry.io/otel v1.43.0 // indirect + go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/otel/sdk v1.43.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect + go.opentelemetry.io/otel/trace v1.43.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/crypto v0.49.0 // indirect + golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect + golang.org/x/net v0.52.0 // indirect + golang.org/x/oauth2 v0.36.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.42.0 // indirect + golang.org/x/term v0.41.0 // indirect + golang.org/x/text v0.35.0 // indirect + golang.org/x/time v0.15.0 // indirect + google.golang.org/api v0.271.0 // indirect + google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 // indirect + google.golang.org/grpc v1.79.3 // indirect + google.golang.org/protobuf v1.36.11 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + gotest.tools/v3 v3.5.1 // indirect + nhooyr.io/websocket v1.8.6 // indirect + pgregory.net/rapid v1.1.0 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect +) + +// initia custom +replace ( + github.com/99designs/keyring => github.com/cosmos/keyring v1.2.0 + github.com/cometbft/cometbft => github.com/initia-labs/cometbft v0.38.21-initia.2 + github.com/cosmos/cosmos-sdk => github.com/initia-labs/cosmos-sdk v0.50.15-initia.0 + github.com/cosmos/iavl => github.com/initia-labs/iavl v1.2.6-initia.1 + github.com/noble-assets/forwarding/simapp => github.com/initia-labs/forwarding/simapp v1.0.0 + github.com/noble-assets/forwarding/v2 => github.com/initia-labs/forwarding/v2 v2.0.3-initia.3 + github.com/skip-mev/connect/v2 => github.com/initia-labs/connect/v2 v2.3.1 + github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 +) + +replace github.com/initia-labs/core-indexer/pkg => ../pkg diff --git a/event-indexer/go.sum b/event-indexer/go.sum new file mode 100644 index 00000000..ce4da177 --- /dev/null +++ b/event-indexer/go.sum @@ -0,0 +1,1579 @@ +ariga.io/atlas v0.33.1 h1:m3rn+m2jkfOZDqdZrgTDvDWh9G3Ldr77IElFDGEwDPk= +ariga.io/atlas v0.33.1/go.mod h1:WJesu2UCpGQvgUh3oVP94EiRT61nNy1W/VN5g+vqP1I= +ariga.io/atlas-go-sdk v0.6.8 h1:wonvcyOiXdrQnMrSNigLbMSaFV8yIxgA4Tb8EY2UGGE= +ariga.io/atlas-go-sdk v0.6.8/go.mod h1:9Q+/04PVyJHUse1lEE9Kp6E18xj/6mIzaUTcWYSjSnQ= +ariga.io/atlas-provider-gorm v0.5.2 h1:KuBY1PUmo6tzx3tpNjBypKJia3XrCXimjHDsxbYr9NE= +ariga.io/atlas-provider-gorm v0.5.2/go.mod h1:3a7Y0ZrenuGgoVXmGfn8q8U9qB7fJ5CprrXHMriMb0s= +cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= +cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= +cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= +cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM= +cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M= +cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= +cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= +cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= +cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= +cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= +cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= +cloud.google.com/go/logging v1.13.1 h1:O7LvmO0kGLaHY/gq8cV7T0dyp6zJhYAOtZPX4TF3QtY= +cloud.google.com/go/logging v1.13.1/go.mod h1:XAQkfkMBxQRjQek96WLPNze7vsOmay9H5PqfsNYDqvw= +cloud.google.com/go/longrunning v0.8.0 h1:LiKK77J3bx5gDLi4SMViHixjD2ohlkwBi+mKA7EhfW8= +cloud.google.com/go/longrunning v0.8.0/go.mod h1:UmErU2Onzi+fKDg2gR7dusz11Pe26aknR4kHmJJqIfk= +cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= +cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= +cloud.google.com/go/storage v1.61.3 h1:VS//ZfBuPGDvakfD9xyPW1RGF1Vy3BWUoVZXgW1KMOg= +cloud.google.com/go/storage v1.61.3/go.mod h1:JtqK8BBB7TWv0HVGHubtUdzYYrakOQIsMLffZ2Z/HWk= +cloud.google.com/go/trace v1.11.7 h1:kDNDX8JkaAG3R2nq1lIdkb7FCSi1rCmsEtKVsty7p+U= +cloud.google.com/go/trace v1.11.7/go.mod h1:TNn9d5V3fQVf6s4SCveVMIBS2LJUqo73GACmq/Tky0s= +cosmossdk.io/api v0.7.6 h1:PC20PcXy1xYKH2KU4RMurVoFjjKkCgYRbVAD4PdqUuY= +cosmossdk.io/api v0.7.6/go.mod h1:IcxpYS5fMemZGqyYtErK7OqvdM0C8kdW3dq8Q/XIG38= +cosmossdk.io/client/v2 v2.0.0-beta.4 h1:LGIzWbVTOof/IHQZeoWwxPX0fq607ONXhsfA7eUrQIg= +cosmossdk.io/client/v2 v2.0.0-beta.4/go.mod h1:c753d0sBv3AQRx6X+BOKL1aGpKjZMTZAHGiLPbVi5TE= +cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= +cosmossdk.io/collections v0.4.0/go.mod h1:oa5lUING2dP+gdDquow+QjlF45eL1t4TJDypgGd+tv0= +cosmossdk.io/core v0.11.1 h1:h9WfBey7NAiFfIcUhDVNS503I2P2HdZLebJlUIs8LPA= +cosmossdk.io/core v0.11.1/go.mod h1:OJzxcdC+RPrgGF8NJZR2uoQr56tc7gfBKhiKeDO7hH0= +cosmossdk.io/depinject v1.1.0 h1:wLan7LG35VM7Yo6ov0jId3RHWCGRhe8E8bsuARorl5E= +cosmossdk.io/depinject v1.1.0/go.mod h1:kkI5H9jCGHeKeYWXTqYdruogYrEeWvBQCw1Pj4/eCFI= +cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= +cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= +cosmossdk.io/log v1.4.1 h1:wKdjfDRbDyZRuWa8M+9nuvpVYxrEOwbD/CA8hvhU8QM= +cosmossdk.io/log v1.4.1/go.mod h1:k08v0Pyq+gCP6phvdI6RCGhLf/r425UT6Rk/m+o74rU= +cosmossdk.io/math v1.4.0 h1:XbgExXFnXmF/CccPPEto40gOO7FpWu9yWNAZPN3nkNQ= +cosmossdk.io/math v1.4.0/go.mod h1:O5PkD4apz2jZs4zqFdTr16e1dcaQCc5z6lkEnrrppuk= +cosmossdk.io/store v1.1.1 h1:NA3PioJtWDVU7cHHeyvdva5J/ggyLDkyH0hGHl2804Y= +cosmossdk.io/store v1.1.1/go.mod h1:8DwVTz83/2PSI366FERGbWSH7hL6sB7HbYp8bqksNwM= +cosmossdk.io/x/evidence v0.1.1 h1:Ks+BLTa3uftFpElLTDp9L76t2b58htjVbSZ86aoK/E4= +cosmossdk.io/x/evidence v0.1.1/go.mod h1:OoDsWlbtuyqS70LY51aX8FBTvguQqvFrt78qL7UzeNc= +cosmossdk.io/x/feegrant v0.1.1 h1:EKFWOeo/pup0yF0svDisWWKAA9Zags6Zd0P3nRvVvw8= +cosmossdk.io/x/feegrant v0.1.1/go.mod h1:2GjVVxX6G2fta8LWj7pC/ytHjryA6MHAJroBWHFNiEQ= +cosmossdk.io/x/tx v0.13.7 h1:8WSk6B/OHJLYjiZeMKhq7DK7lHDMyK0UfDbBMxVmeOI= +cosmossdk.io/x/tx v0.13.7/go.mod h1:V6DImnwJMTq5qFjeGWpXNiT/fjgE4HtmclRmTqRVM3w= +cosmossdk.io/x/upgrade v0.1.4 h1:/BWJim24QHoXde8Bc64/2BSEB6W4eTydq0X/2f8+g38= +cosmossdk.io/x/upgrade v0.1.4/go.mod h1:9v0Aj+fs97O+Ztw+tG3/tp5JSlrmT7IcFhAebQHmOPo= +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +filippo.io/edwards25519 v1.1.1 h1:YpjwWWlNmGIDyXOn8zLzqiD+9TyIlPhGFG96P39uBpw= +filippo.io/edwards25519 v1.1.1/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= +github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1/go.mod h1:RKUqNu35KJYcVG/fqTRqmuXJZYNhYkBrnC/hX7yGbTA= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1/go.mod h1:uE9zaUfEQT/nbQjVi2IblCG9iaLtZsuYZ8ne+PuQ02M= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1/go.mod h1:h8hyGFDsU5HMivxiS2iYFZsgDbU9OnnJ163x5UGVKYo= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0 h1:U2rTu3Ef+7w9FHKIAXM6ZyqF3UOWJZ12zIm8zECAFfg= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 h1:jBQA3cKT4L2rWMpgE7Yt3Hwh2aUj8KXjIGLxjHeYNNo= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0/go.mod h1:4OG6tQ9EOP/MT0NMjDlRzWoVFxfu9rN9B2X+tlSVktg= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1/go.mod h1:GpPjLhVR9dnUoJMyHWSPy71xY9/lcmpzIPZXmF0FCVY= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.1.0 h1:DRiANoJTiW6obBQe3SqZizkuV1PEgfiiGivmVocDy64= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.1.0/go.mod h1:qLIye2hwb/ZouqhpSD9Zn3SJipvpEnz1Ywl3VUk9Y0s= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 h1:D3occbWoio4EBLkbkevetNMAVX197GkzbUMtqjGWn80= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= +github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= +github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 h1:sBEjpZlNHzK1voKq9695PJSX2o5NEXl7/OL3coiIY0c= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 h1:UnDZ/zFfG1JhH/DqxIZYU/1CUAlTUScoXD/LcM2Ykk8= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0/go.mod h1:IA1C1U7jO/ENqm/vhi7V9YYpBsp+IMyqNrEN94N7tVc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0 h1:7t/qx5Ost0s0wbA/VDrByOooURhp+ikYwv20i9Y07TQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0/go.mod h1:vB2GH9GAYYJTO3mEn8oYwzEdhlayZIdQz6zdzgUIRvA= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 h1:0s6TxfCu2KHkkZPnBfsQ2y5qia0jl3MMrmBhu3nCOYk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= +github.com/IGLOU-EU/go-wildcard v1.0.3 h1:r8T46+8/9V1STciXJomTWRpPEv4nGJATDbJkdU0Nou0= +github.com/IGLOU-EU/go-wildcard v1.0.3/go.mod h1:/qeV4QLmydCbwH0UMQJmXDryrFKJknWi/jjO8IiuQfY= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/Microsoft/hcsshim v0.11.5 h1:haEcLNpj9Ka1gd3B3tAEs9CpE0c+1IhoL59w/exYU38= +github.com/Microsoft/hcsshim v0.11.5/go.mod h1:MV8xMfmECjl5HdO7U/3/hFVnkmSBjAjmA09d4bExKcU= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= +github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= +github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alitto/pond v1.8.3 h1:ydIqygCLVPqIX/USe5EaV/aSRXTRXDEI9JwuDdu+/xs= +github.com/alitto/pond v1.8.3/go.mod h1:CmvIIGd5jKLasGI3D87qDkQxjzChdKMmnXMg3fG6M6Q= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= +github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= +github.com/aptos-labs/serde-reflection/serde-generate/runtime/golang v0.0.0-20231213012317-73b6bbf74833 h1:/OtHsUoaVegyyGQ9/Ycm5vrC3xTTyj4+N/HsJ0wwAGA= +github.com/aptos-labs/serde-reflection/serde-generate/runtime/golang v0.0.0-20231213012317-73b6bbf74833/go.mod h1:zUz5maIUAS+tl1lC+lJR7HUf0vVnHk6W7bCvN+DzjME= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/aws/aws-sdk-go-v2 v1.41.4 h1:10f50G7WyU02T56ox1wWXq+zTX9I1zxG46HYuG1hH/k= +github.com/aws/aws-sdk-go-v2 v1.41.4/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 h1:3kGOqnh1pPeddVa/E37XNTaWJ8W6vrbYV9lJEkCnhuY= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI= +github.com/aws/aws-sdk-go-v2/config v1.32.12 h1:O3csC7HUGn2895eNrLytOJQdoL2xyJy0iYXhoZ1OmP0= +github.com/aws/aws-sdk-go-v2/config v1.32.12/go.mod h1:96zTvoOFR4FURjI+/5wY1vc1ABceROO4lWgWJuxgy0g= +github.com/aws/aws-sdk-go-v2/credentials v1.19.12 h1:oqtA6v+y5fZg//tcTWahyN9PEn5eDU/Wpvc2+kJ4aY8= +github.com/aws/aws-sdk-go-v2/credentials v1.19.12/go.mod h1:U3R1RtSHx6NB0DvEQFGyf/0sbrpJrluENHdPy1j/3TE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 h1:zOgq3uezl5nznfoK3ODuqbhVg1JzAGDUhXOsU0IDCAo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20/go.mod h1:z/MVwUARehy6GAg/yQ1GO2IMl0k++cu1ohP9zo887wE= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 h1:CNXO7mvgThFGqOFgbNAP2nol2qAWBOGfqR/7tQlvLmc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20/go.mod h1:oydPDJKcfMhgfcgBUZaG+toBbwy8yPWubJXBVERtI4o= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 h1:tN6W/hg+pkM+tf9XDkWUbDEjGLb+raoBMFsTodcoYKw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20/go.mod h1:YJ898MhD067hSHA6xYCx5ts/jEd8BSOLtQDL3iZsvbc= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21 h1:SwGMTMLIlvDNyhMteQ6r8IJSBPlRdXX5d4idhIGbkXA= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21/go.mod h1:UUxgWxofmOdAMuqEsSppbDtGKLfR04HGsD0HXzvhI1k= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 h1:qtJZ70afD3ISKWnoX3xB0J2otEqu3LqicRcDBqsj0hQ= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12/go.mod h1:v2pNpJbRNl4vEUWEh5ytQok0zACAKfdmKS51Hotc3pQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 h1:2HvVAIq+YqgGotK6EkMf+KIEqTISmTYh5zLpYyeTo1Y= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20/go.mod h1:V4X406Y666khGa8ghKmphma/7C0DAtEQYhkq9z4vpbk= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 h1:siU1A6xjUZ2N8zjTHSXFhB9L/2OY8Dqs0xXiLjF30jA= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20/go.mod h1:4TLZCmVJDM3FOu5P5TJP0zOlu9zWgDWU7aUxWbr+rcw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1 h1:csi9NLpFZXb9fxY7rS1xVzgPRGMt7MSNWeQ6eo247kE= +github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1/go.mod h1:qXVal5H0ChqXP63t6jze5LmFalc7+ZE7wOdLtZ0LCP0= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 h1:0GFOLzEbOyZABS3PhYfBIx2rNBACYcKty+XGkTgw1ow= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.8/go.mod h1:LXypKvk85AROkKhOG6/YEcHFPoX+prKTowKnVdcaIxE= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 h1:kiIDLZ005EcKomYYITtfsjn7dtOwHDOFy7IbPXKek2o= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.13/go.mod h1:2h/xGEowcW/g38g06g3KpRWDlT+OTfxxI0o1KqayAB8= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 h1:jzKAXIlhZhJbnYwHbvUQZEB8KfgAEuG0dc08Bkda7NU= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17/go.mod h1:Al9fFsXjv4KfbzQHGe6V4NZSZQXecFcvaIF4e70FoRA= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 h1:Cng+OOwCHmFljXIxpEVXAGMnBia8MSU6Ch5i9PgBkcU= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.9/go.mod h1:LrlIndBDdjA/EeXeyNBle+gyCwTlizzW5ycgWnvIxkk= +github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng= +github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= +github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bits-and-blooms/bitset v1.20.0 h1:2F+rfL86jE2d/bmw7OhqUg2Sj/1rURkBn3MdfoPyRVU= +github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bmatcuk/doublestar v1.3.4 h1:gPypJ5xD31uhX6Tf54sDPUOBXTqKH4c9aPY66CyQrS0= +github.com/bmatcuk/doublestar v1.3.4/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/btcutil v1.1.6 h1:zFL2+c3Lb9gEgqKNzowKUPQNb8jV7v5Oaodi/AYFd6c= +github.com/btcsuite/btcd/btcutil v1.1.6/go.mod h1:9dFymx8HpuLqBnsPELrImQeTQfKBQqzqGbbV3jK55aE= +github.com/bufbuild/protocompile v0.8.0 h1:9Kp1q6OkS9L4nM3FYbr8vlJnEwtbpDPQlQOVXfR+78s= +github.com/bufbuild/protocompile v0.8.0/go.mod h1:+Etjg4guZoAqzVk2czwEQP12yaxLJ8DxuqCJ9qHdH94= +github.com/buger/goterm v1.0.4 h1:Z9YvGmOih81P0FbVtEYTFF6YsSgxSUKEhf/f9bTMXbY= +github.com/buger/goterm v1.0.4/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d h1:S2NE3iHSwP0XV47EEXL8mWmRdEfGscSJ+7EgePNgt0s= +github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 h1:6xNmx7iTtyBRev0+D/Tv1FZd4SCg8axKApyNyRsAt/w= +github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/BuvyMxRnYBlmVaq4OLiKW6iRQfvC62cvdkI= +github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= +github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v1.1.5 h1:5AAWCBWbat0uE0blr8qzufZP5tBjkRyy/jWe1QWLnvw= +github.com/cockroachdb/pebble v1.1.5/go.mod h1:17wO9el1YEigxkP/YtV8NtCivQDgoCyBg5c4VR/eOWo= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/cometbft/cometbft-db v0.15.0 h1:VLtsRt8udD4jHCyjvrsTBpgz83qne5hnL245AcPJVRk= +github.com/cometbft/cometbft-db v0.15.0/go.mod h1:EBrFs1GDRiTqrWXYi4v90Awf/gcdD5ExzdPbg4X8+mk= +github.com/compose-spec/compose-go/v2 v2.1.3 h1:bD67uqLuL/XgkAK6ir3xZvNLFPxPScEi1KW7R5esrLE= +github.com/compose-spec/compose-go/v2 v2.1.3/go.mod h1:lFN0DrMxIncJGYAXTfWuajfwj5haBJqrBkarHcnjJKc= +github.com/confluentinc/confluent-kafka-go/v2 v2.6.1 h1:XFkytnGvk/ZcY2qU0ql4E4h+ftBaGqkLO7tlZ4kRbr4= +github.com/confluentinc/confluent-kafka-go/v2 v2.6.1/go.mod h1:hScqtFIGUI1wqHIgM3mjoqEou4VweGGGX7dMpcUKves= +github.com/containerd/console v1.0.4 h1:F2g4+oChYvBTsASRTz8NP6iIAi97J3TtSAsLbIFn4ro= +github.com/containerd/console v1.0.4/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= +github.com/containerd/containerd v1.7.18 h1:jqjZTQNfXGoEaZdW1WwPU0RqSn1Bm2Ay/KJPUuO8nao= +github.com/containerd/containerd v1.7.18/go.mod h1:IYEk9/IO6wAPUz2bCMVUbsfXjzw5UNP5fLz4PsUygQ4= +github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8= +github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/containerd/errdefs v0.1.0 h1:m0wCRBiu1WJT/Fr+iOoQHMQS/eP5myQ8lCv4Dz5ZURM= +github.com/containerd/errdefs v0.1.0/go.mod h1:YgWiiHtLmSeBrvpw+UfPijzbLaB77mEG1WwJTDETIV0= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +github.com/containerd/ttrpc v1.2.5 h1:IFckT1EFQoFBMG4c3sMdT8EP3/aKfumK1msY+Ze4oLU= +github.com/containerd/ttrpc v1.2.5/go.mod h1:YCXHsb32f+Sq5/72xHubdiJRQY9inL4a4ZQrAbN1q9o= +github.com/containerd/typeurl/v2 v2.1.1 h1:3Q4Pt7i8nYwy2KmQWIw2+1hTvwTE/6w9FqcttATPO/4= +github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3HZj1hsSQlywkQ0= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= +github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= +github.com/cosmos/cosmos-db v1.1.1 h1:FezFSU37AlBC8S98NlSagL76oqBRWq/prTPvFcEJNCM= +github.com/cosmos/cosmos-db v1.1.1/go.mod h1:AghjcIPqdhSLP/2Z0yha5xPH3nLnskz81pBx3tcVSAw= +github.com/cosmos/cosmos-proto v1.0.0-beta.5 h1:eNcayDLpip+zVLRLYafhzLvQlSmyab+RC5W7ZfmxJLA= +github.com/cosmos/cosmos-proto v1.0.0-beta.5/go.mod h1:hQGLpiIUloJBMdQMMWb/4wRApmI9hjHH05nefC0Ojec= +github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= +github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= +github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= +github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= +github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= +github.com/cosmos/gogoproto v1.7.0 h1:79USr0oyXAbxg3rspGh/m4SWNyoz/GLaAh0QlCe2fro= +github.com/cosmos/gogoproto v1.7.0/go.mod h1:yWChEv5IUEYURQasfyBW5ffkMHR/90hiHgbNgrtp4j0= +github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.2.0 h1:rM+S14DFiqmu6Rc3PuhvWqwywPsnt/CbIslSnBftPFs= +github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.2.0/go.mod h1:O5H9Ic3Pe6cmJn1eqlj5N48sLb8WQ1VWmDP4/11g/4E= +github.com/cosmos/ibc-apps/modules/rate-limiting/v8 v8.0.0 h1:AQO9NIAP3RFqvBCj7IqM/V1LCxmuvcvGUdu0RIEz/c0= +github.com/cosmos/ibc-apps/modules/rate-limiting/v8 v8.0.0/go.mod h1:/ZpKJSW/SKPkFS7jTqkPVn7kOHUUfRNzu+8aS7YOL8o= +github.com/cosmos/ibc-go/modules/capability v1.0.1 h1:ibwhrpJ3SftEEZRxCRkH0fQZ9svjthrX2+oXdZvzgGI= +github.com/cosmos/ibc-go/modules/capability v1.0.1/go.mod h1:rquyOV262nGJplkumH+/LeYs04P3eV8oB7ZM4Ygqk4E= +github.com/cosmos/ibc-go/v8 v8.7.0 h1:HqhVOkO8bDpClXE81DFQgFjroQcTvtpm0tCS7SQVKVY= +github.com/cosmos/ibc-go/v8 v8.7.0/go.mod h1:G2z+Q6ZQSMcyHI2+BVcJdvfOupb09M2h/tgpXOEdY6k= +github.com/cosmos/ics23/go v0.11.0 h1:jk5skjT0TqX5e5QJbEnwXIS2yI2vnmLOgpQPeM5RtnU= +github.com/cosmos/ics23/go v0.11.0/go.mod h1:A8OjxPE67hHST4Icw94hOxxFEJMBG031xIGF/JHNIY0= +github.com/cosmos/interchain-security/v6 v6.3.0 h1:AIsfxLUDtUGVfaqJ1WPwnYIOT5AxoSO58469iw9vNH4= +github.com/cosmos/interchain-security/v6 v6.3.0/go.mod h1:6DSiV2w+DuPkxP1KGFtaxpiwf8Xt2iusj8O53KCx96Q= +github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo= +github.com/cosmos/keyring v1.2.0/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= +github.com/cosmos/ledger-cosmos-go v0.14.0 h1:WfCHricT3rPbkPSVKRH+L4fQGKYHuGOK9Edpel8TYpE= +github.com/cosmos/ledger-cosmos-go v0.14.0/go.mod h1:E07xCWSBl3mTGofZ2QnL4cIUzMbbGVyik84QYKbX3RA= +github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= +github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= +github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.1.0 h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U0x++OzVrdms8= +github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= +github.com/dgraph-io/badger/v4 v4.3.0 h1:lcsCE1/1qrRhqP+zYx6xDZb8n7U+QlwNicpc676Ub40= +github.com/dgraph-io/badger/v4 v4.3.0/go.mod h1:Sc0T595g8zqAQRDf44n+z3wG4BOqLwceaFntt8KPxUM= +github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91 h1:Pux6+xANi0I7RRo5E1gflI4EZ2yx3BGZ75JkAIvGEOA= +github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91/go.mod h1:swkazRqnUf1N62d0Nutz7KIj2UKqsm/H8tD0nBJAXqM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dhui/dktest v0.4.5 h1:uUfYBIVREmj/Rw6MvgmqNAYzTiKOHJak+enB5Di73MM= +github.com/dhui/dktest v0.4.5/go.mod h1:tmcyeHDKagvlDrz7gDKq4UAJOLIfVZYkfD5OnHDwcCo= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/docker/buildx v0.15.1 h1:1cO6JIc0rOoC8tlxfXoh1HH1uxaNvYH1q7J7kv5enhw= +github.com/docker/buildx v0.15.1/go.mod h1:16DQgJqoggmadc1UhLaUTPqKtR+PlByN/kyXFdkhFCo= +github.com/docker/cli v27.0.3+incompatible h1:usGs0/BoBW8MWxGeEtqPMkzOY56jZ6kYlSN5BLDioCQ= +github.com/docker/cli v27.0.3+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/compose/v2 v2.28.1 h1:ORPfiVHrpnRQBDoC3F8JJyWAY8N5gWuo3FgwyivxFdM= +github.com/docker/compose/v2 v2.28.1/go.mod h1:wDtGQFHe99sPLCHXeVbCkc+Wsl4Y/2ZxiAJa/nga6rA= +github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= +github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v27.2.0+incompatible h1:Rk9nIVdfH3+Vz4cyI/uhbINhEZ/oLmc+CBXmH6fbNk4= +github.com/docker/docker v27.2.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8= +github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c/go.mod h1:CADgU4DSXK5QUlFslkQu2yW2TKzFZcXq/leZfM0UH5Q= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/dvsekhvalnov/jose2go v1.7.0 h1:bnQc8+GMnidJZA8zc6lLEAb4xNrIqHwO+9TzqvtQZPo= +github.com/dvsekhvalnov/jose2go v1.7.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203 h1:XBBHcIb256gUJtLmY22n99HaZTz+r2Z51xUPi01m3wg= +github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203/go.mod h1:E1jcSv8FaEny+OP/5k9UxZVw9YFWGj7eI4KR/iOBqCg= +github.com/emicklei/dot v1.6.2 h1:08GN+DD79cy/tzN6uLCT84+2Wk9u+wvqP+Hkx/dIR8A= +github.com/emicklei/dot v1.6.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= +github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= +github.com/envoyproxy/go-control-plane/envoy v1.36.0 h1:yg/JjO5E7ubRyKX3m07GF3reDNEnfOboJ0QySbH736g= +github.com/envoyproxy/go-control-plane/envoy v1.36.0/go.mod h1:ty89S1YCCVruQAm9OtKeEkQLTb+Lkz0k8v9W0Oxsv98= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4= +github.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA= +github.com/ethereum/go-ethereum v1.16.9 h1:UTJ93yoXD7BEMWg+9lSZ8/Zvf0oZfy2ZUmv0Gn0ZclE= +github.com/ethereum/go-ethereum v1.16.9/go.mod h1:Fs6QebQbavneQTYcA39PEKv2+zIjX7rPUZ14DER46wk= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsevents v0.2.0 h1:BRlvlqjvNTfogHfeBOFvSC9N0Ddy+wzQCQukyoD7o/c= +github.com/fsnotify/fsevents v0.2.0/go.mod h1:B3eEk39i4hz8y1zaWS/wPrAP4O6wkIl7HQwKBr1qH/w= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fvbommel/sortorder v1.0.2 h1:mV4o8B2hKboCdkJm+a7uX/SIpZob4JzUpc5GGnM45eo= +github.com/fvbommel/sortorder v1.0.2/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/getsentry/sentry-go v0.29.1 h1:DyZuChN8Hz3ARxGVV8ePaNXh1dQ7d76AiB117xcREwA= +github.com/getsentry/sentry-go v0.29.1/go.mod h1:x3AtIzN01d6SiWkderzaH28Tm0lgkafpJ5Bm3li39O0= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= +github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= +github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU= +github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= +github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= +github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= +github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/gobwas/ws v1.1.0 h1:7RFti/xnNkMJnrK7D1yQ/iCIB5OrrY/54/H930kIbHA= +github.com/gobwas/ws v1.1.0/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= +github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-migrate/migrate/v4 v4.18.3 h1:EYGkoOsvgHHfm5U/naS1RP/6PL/Xv3S4B/swMiAmDLs= +github.com/golang-migrate/migrate/v4 v4.18.3/go.mod h1:99BKpIi6ruaaXRM1A77eqZ+FWPQ3cfRa+ZVy5bmWMaY= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg= +github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= +github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= +github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= +github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8= +github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= +github.com/googleapis/gax-go/v2 v2.17.0 h1:RksgfBpxqff0EZkDWYuz9q/uWsTVz+kf43LsZ1J6SMc= +github.com/googleapis/gax-go/v2 v2.17.0/go.mod h1:mzaqghpQp4JDh3HvADwrat+6M3MOIDp5YKHhb9PAgDY= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= +github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 h1:vTCWu1wbdYo7PEZFem/rlr01+Un+wwVmI7wiegFdRLk= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72/go.mod h1:Vn+BBgKQHVQYdVQ4NZDICE1Brb+JfaONyDHr3q07oQc= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk131ebY= +github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-metrics v0.5.3 h1:M5uADWMOGCTUNU1YuC4hfknOeHNaX54LDm4oYSucoNE= +github.com/hashicorp/go-metrics v0.5.3/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-plugin v1.5.2 h1:aWv8eimFqWlsEiMrYZdPYl+FdHaBJSN4AWwGWfT1G2Y= +github.com/hashicorp/go-plugin v1.5.2/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.8.0 h1:KAkNb1HAiZd1ukkxDFGmokVZe1Xy9HG6NUp+bPle2i4= +github.com/hashicorp/go-version v1.8.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/hcl/v2 v2.18.1 h1:6nxnOJFku1EuSawSD81fuviYUV8DxFr3fp2dUi3ZYSo= +github.com/hashicorp/hcl/v2 v2.18.1/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+JtMeeGErHE= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= +github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= +github.com/holiman/uint256 v1.3.2 h1:a9EgMPSC1AAaj1SZL5zIQD3WbwTuHrMGOerLjGmM/TA= +github.com/holiman/uint256 v1.3.2/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= +github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= +github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= +github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/iancoleman/orderedmap v0.3.0 h1:5cbR2grmZR/DiVt+VJopEhtVs9YGInGIxAoMJn+Ichc= +github.com/iancoleman/orderedmap v0.3.0/go.mod h1:XuLcCUkdL5owUCQeF2Ue9uuw1EptkJDkXXS7VoV7XGE= +github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= +github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= +github.com/in-toto/in-toto-golang v0.5.0 h1:hb8bgwr0M2hGdDsLjkJ3ZqJ8JFLL/tgYdAxF/XEFBbY= +github.com/in-toto/in-toto-golang v0.5.0/go.mod h1:/Rq0IZHLV7Ku5gielPT4wPHJfH1GdHMCq8+WPxw8/BE= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/initia-labs/OPinit v1.3.0 h1:cGxJpzVOfxGO8Ql/Z6SVJCSpokkqB4jFBjo6kx9Uax8= +github.com/initia-labs/OPinit v1.3.0/go.mod h1:VZG+/Wd/9cVDbzCwZld/tve6kcJC1zemeeQvp5FKKCI= +github.com/initia-labs/OPinit/api v1.3.0 h1:MAu4XEJ2uibDVKBo0jB6b6/BGaoXjDUJC+dwhU530ag= +github.com/initia-labs/OPinit/api v1.3.0/go.mod h1:sWDfvmcxd7KD59ukB/Wz0BSpyimyptDEzz1Epe/ET+Y= +github.com/initia-labs/cometbft v0.38.21-initia.2 h1:sFFc6JnbPKFd4XdH3EXZ7TBfi3uVv34HdyHVX5gvvlQ= +github.com/initia-labs/cometbft v0.38.21-initia.2/go.mod h1:CQ/VkJXRdaWxDLyKT+JYAWV0m215oRFtymtIr7skA6o= +github.com/initia-labs/connect/v2 v2.3.1 h1:Y32LCwUHDBgUzzQHqPBJeWeItYoNu2oYD57JKbZCtjw= +github.com/initia-labs/connect/v2 v2.3.1/go.mod h1:35hM7xSgI0h3GMUTgspzKY8Ff2yCXNGNwmAdjqo3z8s= +github.com/initia-labs/cosmos-sdk v0.50.15-initia.0 h1:cgKCqzXBm8md5Q5C9VAyIGCheHhNcOGK/BwpFbett2g= +github.com/initia-labs/cosmos-sdk v0.50.15-initia.0/go.mod h1:/dinzXHi7qK0dEPZjS3LI5gMHueKQdqyjbB9chwswo0= +github.com/initia-labs/forwarding/v2 v2.0.3-initia.3 h1:Uu1VqRsSwX7rgS2A4M3Snzyzk9mJRq2v/ZD4xKHTJkM= +github.com/initia-labs/forwarding/v2 v2.0.3-initia.3/go.mod h1:N3OzYf14ton71zCxomBmpR7tOxZ2dKwhsMxUmtuJuVQ= +github.com/initia-labs/iavl v1.2.6-initia.1 h1:4vf9eiccLkob2eiM8YAM8Gf/UBniEFUKpvncM/hVoO8= +github.com/initia-labs/iavl v1.2.6-initia.1/go.mod h1:GiM43q0pB+uG53mLxLDzimxM9l/5N9UuSY3/D0huuVw= +github.com/initia-labs/initia v1.4.3 h1:cEnENL26T7hsa0oDm4hf953tUQYc1cQ3fll84jBfoa0= +github.com/initia-labs/initia v1.4.3/go.mod h1:Y7ir28A0RmL3AQpvTK/mXzyvF6RtijgH/v520xvrk3s= +github.com/initia-labs/initia/api v1.4.0 h1:1DOUBxugC9ZdtMnmmN3qFWnNjlW7I6sssvvu4/ohVtU= +github.com/initia-labs/initia/api v1.4.0/go.mod h1:YQAtPknqt4tZSj+AK0OfZ83XXah2MCna/Ko74/VQe6Q= +github.com/initia-labs/movevm v1.2.0 h1:IbpipjRIZe851FJZZzP3RGIqrOCcNsI6bDF9VC0K0do= +github.com/initia-labs/movevm v1.2.0/go.mod h1:sj/kXD7mUQASqogPTjqltIr4Uid3xxnlcbfiFvvqeXA= +github.com/initia-labs/store v0.1.1 h1:sc4PTv30oS99t0EWgFPy0pCFPYJsHngB2QfZS5XY/Xo= +github.com/initia-labs/store v0.1.1/go.mod h1:8Hgv+JpqjFYy2335pHLnMq6LmVdXyF1G17yi6uWl76M= +github.com/initia-labs/store/memiavl v0.1.1 h1:aymS3es9pPY7ysizK2K+r4TImR0W5N1C5Ld75HRMvXc= +github.com/initia-labs/store/memiavl v0.1.1/go.mod h1:510W4Nf6QAWmFLYPhqhOhO1tagdeocM0b89a/M0zMRk= +github.com/initia-labs/store/versiondb v0.1.0 h1:8lQK7Q6GUwwAc8R3IIBbj9MOlIkKCq0nwnRpjT20Ahc= +github.com/initia-labs/store/versiondb v0.1.0/go.mod h1:fP27G3qPUluu7yM8j2xcW05Brmj0QBT7nlTTFvEszNc= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.9.2 h1:3ZhOzMWnR4yJ+RW1XImIPsD1aNSz4T4fyP7zlQb56hw= +github.com/jackc/pgx/v5 v5.9.2/go.mod h1:mal1tBGAFfLHvZzaYh77YS/eC6IX9OWbRV1QIIM0Jn4= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jhump/protoreflect v1.15.6 h1:WMYJbw2Wo+KOWwZFvgY0jMoVHM6i4XIvRs2RcBj5VmI= +github.com/jhump/protoreflect v1.15.6/go.mod h1:jCHoyYQIJnaabEYnbGwyo9hUqfyUMTbJw/tAut5t97E= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= +github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE= +github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/ledgerwatch/erigon-lib v0.0.0-20230210071639-db0e7ed11263 h1:LGEzZvf33Y1NhuP5+jI/ni9l1TFS6oYPDilgy74NusM= +github.com/ledgerwatch/erigon-lib v0.0.0-20230210071639-db0e7ed11263/go.mod h1:OXgMDuUo2lZ3NpH29ZvMYbk+LxFd5ffDl2Z2mGMuY/I= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/linxGnu/grocksdb v1.10.3 h1:0laII9AQ6kFxo5SjhdTfSh9EgF20piD6TMHK6YuDm+4= +github.com/linxGnu/grocksdb v1.10.3/go.mod h1:OLQKZwiKwaJiAVCsOzWKvwiLwfZ5Vz8Md5TYR7t7pM8= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= +github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +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.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/microsoft/go-mssqldb v1.7.2 h1:CHkFJiObW7ItKTJfHo1QX7QBBD1iV+mn1eOyRP3b/PA= +github.com/microsoft/go-mssqldb v1.7.2/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q= +github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/buildkit v0.14.1 h1:2epLCZTkn4CikdImtsLtIa++7DzCimrrZCT1sway+oI= +github.com/moby/buildkit v0.14.1/go.mod h1:1XssG7cAqv5Bz1xcGMxJL123iCv5TYN4Z/qf647gfuk= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= +github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mountinfo v0.7.1 h1:/tTvQaSJRr2FshkhXiIpux6fQ2Zvc4j7tAhMTStAG2g= +github.com/moby/sys/mountinfo v0.7.1/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +github.com/moby/sys/signal v0.7.0 h1:25RW3d5TnQEoKvRbEKUGay6DCQ46IxAVTT9CUMgmsSI= +github.com/moby/sys/signal v0.7.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/moby/sys/symlink v0.2.0 h1:tk1rOM+Ljp0nFmfOIBtlV3rTDlWOwFRhjEeAhZB0nZc= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= +github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= +github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= +github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= +github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= +github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a h1:dlRvE5fWabOchtH7znfiFCcOvmIYgOeAS5ifBXBlh9Q= +github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.26.0 h1:03cDLK28U6hWvCAns6NeydX3zIm4SF3ci69ulidS32Q= +github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA= +github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= +github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/r3labs/sse v0.0.0-20210224172625-26fe804710bc h1:zAsgcP8MhzAbhMnB1QQ2O7ZhWYVGYSR2iVcjzQuPV+o= +github.com/r3labs/sse v0.0.0-20210224172625-26fe804710bc/go.mod h1:S8xSOnV3CgpNrWd0GQ/OoQfMtlg2uPRSuTzcSGrzwK8= +github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= +github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= +github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sasha-s/go-deadlock v0.3.5 h1:tNCOEEDG6tBqrNDOX35j/7hL5FcFViG6awUGROb2NsU= +github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6vCBBsiChJQ5U= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/secure-systems-lab/go-securesystemslib v0.4.0 h1:b23VGrQhTA8cN2CbBw7/FulN9fTtqYUdS5+Oxzt+DUE= +github.com/secure-systems-lab/go-securesystemslib v0.4.0/go.mod h1:FGBZgq2tXWICsxWQW1msNf49F0Pf2Op5Htayx335Qbs= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= +github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b h1:h+3JX2VoWTFuyQEo87pStk/a99dzIO1mM9KxIyLPGTU= +github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= +github.com/shibumi/go-pathspec v1.3.0 h1:QUyMZhFo0Md5B8zV8x2tesohbb5kfbpTi9rBnKh5dkI= +github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= +github.com/shirou/gopsutil/v3 v3.23.12 h1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4= +github.com/shirou/gopsutil/v3 v3.23.12/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610 h1:4JlsiRVt/YZOvrKH525T7sZXgEWUEjqSDMwE6fXNbdo= +github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610/go.mod h1:kB8gFZX07CyJnw8q9iEZijI3qJTIe1K/Y++P5VGkrcg= +github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= +github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= +github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= +github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= +github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= +github.com/testcontainers/testcontainers-go v0.33.0 h1:zJS9PfXYT5O0ZFXM2xxXfk4J5UMw/kRiISng037Gxdw= +github.com/testcontainers/testcontainers-go v0.33.0/go.mod h1:W80YpTa8D5C3Yy16icheD01UTDu+LmXIA2Keo+jWtT8= +github.com/testcontainers/testcontainers-go/modules/compose v0.33.0 h1:PyrUOF+zG+xrS3p+FesyVxMI+9U+7pwhZhyFozH3jKY= +github.com/testcontainers/testcontainers-go/modules/compose v0.33.0/go.mod h1:oqZaUnFEskdZriO51YBquku/jhgzoXHPot6xe1DqKV4= +github.com/theupdateframework/notary v0.7.0 h1:QyagRZ7wlSpjT5N2qQAh/pN+DVqgekv4DzbAiAiEL3c= +github.com/theupdateframework/notary v0.7.0/go.mod h1:c9DRxcmhHmVLDay4/2fUYdISnHqbFDGRSlXPO0AhYWw= +github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= +github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/tinylru v1.1.0 h1:XY6IUfzVTU9rpwdhKUF6nQdChgCdGjkMfLzbWyiau6I= +github.com/tidwall/tinylru v1.1.0/go.mod h1:3+bX+TJ2baOLMWTnlyNWHh4QMnFyARg2TLTQ6OFbzw8= +github.com/tidwall/wal v1.1.7 h1:emc1TRjIVsdKKSnpwGBAcsAGg0767SvUk8+ygx7Bb+4= +github.com/tidwall/wal v1.1.7/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E= +github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375 h1:QB54BJwA6x8QU9nHY3xJSZR2kX9bgpZekRKGkLTmEXA= +github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375/go.mod h1:xRroudyp5iVtxKqZCrA6n2TLFRBf8bmnjr1UD4x+z7g= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tonistiigi/fsutil v0.0.0-20240424095704-91a3fc46842c h1:+6wg/4ORAbnSoGDzg2Q1i3CeMcT/jjhye/ZfnBHy7/M= +github.com/tonistiigi/fsutil v0.0.0-20240424095704-91a3fc46842c/go.mod h1:vbbYqJlnswsbJqWUcJN8fKtBhnEgldDrcagTgnBVKKM= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea h1:SXhTLE6pb6eld/v/cCndK0AMpt1wiVFb/YYmqB3/QG0= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= +github.com/tonistiigi/vt100 v0.0.0-20240514184818-90bafcd6abab h1:H6aJ0yKQ0gF49Qb2z5hI1UHxSQt4JMyxebFR15KnApw= +github.com/tonistiigi/vt100 v0.0.0-20240514184818-90bafcd6abab/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= +github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/ybbus/jsonrpc/v3 v3.1.5 h1:0cC/QzS8OCuXYqqDbYnKKhsEe+IZLrNlDx8KPCieeW0= +github.com/ybbus/jsonrpc/v3 v3.1.5/go.mod h1:U1QbyNfL5Pvi2roT0OpRbJeyvGxfWYSgKJHjxWdAEeE= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= +github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/zbiljic/go-filelock v0.0.0-20170914061330-1dbf7103ab7d h1:XQyeLr7N9iY9mi+TGgsBFkj54+j3fdoo8e2u6zrGP5A= +github.com/zbiljic/go-filelock v0.0.0-20170914061330-1dbf7103ab7d/go.mod h1:hoMeDjlNXTNqVwrCk8YDyaBS2g5vFfEX2ezMi4vb6CY= +github.com/zclconf/go-cty v1.14.4 h1:uXXczd9QDGsgu0i/QFR/hzI5NYCHLf6NQw/atrbnhq8= +github.com/zclconf/go-cty v1.14.4/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +github.com/zclconf/go-cty-yaml v1.1.0 h1:nP+jp0qPHv2IhUVqmQSzjvqAWcObN0KBkUl2rWBdig0= +github.com/zclconf/go-cty-yaml v1.1.0/go.mod h1:9YLUH4g7lOhVWqUbctnVlZ5KLpg7JAprQNgxSZ1Gyxs= +github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= +github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= +github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1UpHb342ycI= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5 h1:qxen9oVGzDdIRP6ejyAJc760RwW4SnVDiTYTzwnXuxo= +go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5/go.mod h1:eW0HG9/oHQhvRCvb1/pIXW4cOvtDqeQK+XSi3TnwaXY= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/contrib/detectors/gcp v1.39.0 h1:kWRNZMsfBHZ+uHjiH4y7Etn2FK26LAGkNFw7RHv1DhE= +go.opentelemetry.io/contrib/detectors/gcp v1.39.0/go.mod h1:t/OGqzHBa5v6RHZwrDBJ2OirWc+4q/w2fTbLZwAKjTk= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 h1:YH4g8lQroajqUwWbq/tr2QX1JFmEXaDLgG+ew9bLMWo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0/go.mod h1:fvPi2qXDqFs8M4B4fmJhE92TyQs9Ydjlg3RvfUp+NbQ= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.46.1 h1:gbhw/u49SS3gkPWiYweQNJGm/uJN5GkI/FrosxSHT7A= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.46.1/go.mod h1:GnOaBaFQ2we3b9AGWJpsBa7v1S5RlQzlC3O7dRMxZhM= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0 h1:wNMDy/LVGLj2h3p6zg4d0gypKfWKSWI14E1C4smOgl8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0/go.mod h1:YfbDdXAAkemWJK3H/DshvlrxqFB2rtW4rY6ky/3x/H0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 h1:digkEZCJWobwBqMwC0cwCq8/wkkRy/OowZg5OArWZrM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0/go.mod h1:/OpE/y70qVkndM0TrxT4KBoN3RsFZP0QaofcfYrj76I= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0 h1:ZrPRak/kS4xI3AVXy8F7pipuDXmDsrO8Lg+yQjBLjw0= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0/go.mod h1:3y6kQCWztq6hyW8Z9YxQDDm0Je9AJoFar2G0yDcmhRk= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= +go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4= +go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= +go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +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-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= +golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +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.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/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-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= +golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= +golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/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/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/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-20201207223542-d4d67f95c62d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/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.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +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.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.41.0 h1:QCgPso/Q3RTJx2Th4bDLqML4W6iJiaXFq2/ftQF13YU= +golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= +golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= +golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +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-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.271.0 h1:cIPN4qcUc61jlh7oXu6pwOQqbJW2GqYh5PS6rB2C/JY= +google.golang.org/api v0.271.0/go.mod h1:CGT29bhwkbF+i11qkRUJb2KMKqcJ1hdFceEIRd9u64Q= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 h1:VQZ/yAbAtjkHgH80teYd2em3xtIkkHd7ZhqfH2N9CsM= +google.golang.org/genproto v0.0.0-20260128011058-8636f8732409/go.mod h1:rxKD3IEILWEu3P44seeNOAwZN4SaoKaQ/2eTg4mM6EM= +google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20 h1:7ei4lp52gK1uSejlA8AZl5AJjeLUOHBQscRQZUgAcu0= +google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20/go.mod h1:ZdbssH/1SOVnjnDlXzxDHK2MCidiqXtbYccJNzNYPEE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 h1:ggcbiqK8WWh6l1dnltU4BgWGIGo+EVYxCaAPih/zQXQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= +google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/cenkalti/backoff.v1 v1.1.0 h1:Arh75ttbsvlpVA7WtVpH4u9h6Zl46xuptxqLxPiSo4Y= +gopkg.in/cenkalti/backoff.v1 v1.1.0/go.mod h1:J6Vskwqd+OMVJl8C33mmtxTBs2gyzfv7UDAkHu8BrjI= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo= +gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= +gorm.io/driver/postgres v1.6.0 h1:2dxzU8xJ+ivvqTRph34QX+WrRaJlmfyPqXmoGVjMBa4= +gorm.io/driver/postgres v1.6.0/go.mod h1:vUw0mrGgrTK+uPHEhAdV4sfFELrByKVGnaVRkXDhtWo= +gorm.io/driver/sqlite v1.5.7 h1:8NvsrhP0ifM7LX9G4zPB97NwovUakUxc+2V2uuf3Z1I= +gorm.io/driver/sqlite v1.5.7/go.mod h1:U+J8craQU6Fzkcvu8oLeAQmi50TkwPEhHDEjQZXDah4= +gorm.io/driver/sqlserver v1.5.4 h1:xA+Y1KDNspv79q43bPyjDMUgHoYHLhXYmdFcYPobg8g= +gorm.io/driver/sqlserver v1.5.4/go.mod h1:+frZ/qYmuna11zHPlh5oc2O6ZA/lS88Keb0XSH1Zh/g= +gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.30.0 h1:qbT5aPv1UH8gI99OsRlvDToLxW5zR7FzS9acZDOZcgs= +gorm.io/gorm v1.30.0/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +k8s.io/api v0.29.2 h1:hBC7B9+MU+ptchxEqTNW2DkUosJpp1P+Wn6YncZ474A= +k8s.io/api v0.29.2/go.mod h1:sdIaaKuU7P44aoyyLlikSLayT6Vb7bvJNCX105xZXY0= +k8s.io/apimachinery v0.29.2 h1:EWGpfJ856oj11C52NRCHuU7rFDwxev48z+6DSlGNsV8= +k8s.io/apimachinery v0.29.2/go.mod h1:6HVkd1FwxIagpYrHSwJlQqZI3G9LfYWRPAkUvLnXTKU= +k8s.io/client-go v0.29.2 h1:FEg85el1TeZp+/vYJM7hkDlSTFZ+c5nnK44DJ4FyoRg= +k8s.io/client-go v0.29.2/go.mod h1:knlvFZE58VpqbQpJNbCbctTVXcd35mMyAAwBdpt4jrA= +k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= +nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= +pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= +tags.cncf.io/container-device-interface v0.7.2 h1:MLqGnWfOr1wB7m08ieI4YJ3IoLKKozEnnNYBtacDPQU= +tags.cncf.io/container-device-interface v0.7.2/go.mod h1:Xb1PvXv2BhfNb3tla4r9JL129ck1Lxv9KuU6eVOfKto= diff --git a/event-indexer/indexer/block_result.go b/event-indexer/indexer/block_result.go new file mode 100644 index 00000000..adc9927b --- /dev/null +++ b/event-indexer/indexer/block_result.go @@ -0,0 +1,185 @@ +package indexer + +import ( + "context" + "errors" + "fmt" + "strings" + + movetypes "github.com/initia-labs/initia/x/move/types" + "gorm.io/gorm" + + "github.com/initia-labs/core-indexer/pkg/db" + indexererrors "github.com/initia-labs/core-indexer/pkg/errors" + "github.com/initia-labs/core-indexer/pkg/mq" + "github.com/initia-labs/core-indexer/pkg/sentry_integration" +) + +func (f *Indexer) parseAndInsertTransactionEvents(parentCtx context.Context, dbTx *gorm.DB, blockResults *mq.BlockResultMsg) error { + span, ctx := sentry_integration.StartSentrySpan(parentCtx, "parseAndInsertTransactionEvents", "Parse block_results message and insert transaction_events into the database") + defer span.Finish() + + txEvents := make([]*db.TransactionEvent, 0) + for _, tx := range blockResults.Txs { + if tx.ExecTxResults.Log == "tx parse error" { + continue + } + + // idx ensures EventIndex is unique within each transaction. + idx := 0 + for _, event := range tx.ExecTxResults.Events { + for _, attr := range event.Attributes { + txEvents = append(txEvents, &db.TransactionEvent{ + TransactionHash: tx.Hash, + BlockHeight: blockResults.Height, + EventKey: fmt.Sprintf("%s.%s", event.Type, attr.Key), + EventValue: attr.Value, + EventIndex: idx, + }) + idx++ + } + } + } + + if err := db.InsertTransactionEventsIgnoreConflict(ctx, dbTx, txEvents); err != nil { + logger.Error().Msgf("Error inserting transaction_events: %v", err) + return err + } + + return nil +} + +func (f *Indexer) parseAndInsertMoveEvents(parentCtx context.Context, dbTx *gorm.DB, blockResults *mq.BlockResultMsg) error { + span, ctx := sentry_integration.StartSentrySpan(parentCtx, "parseAndInsertMoveEvents", "Parse block_results message and insert move_events into the database") + defer span.Finish() + + moveEvents := make([]*db.MoveEvent, 0) + for _, tx := range blockResults.Txs { + if strings.Contains(tx.ExecTxResults.Log, indexererrors.TxPareserError) || strings.Contains(tx.ExecTxResults.Log, indexererrors.TxPareserErrorV2) { + continue + } + + // idx ensures EventIndex is unique within each transaction. + idx := 0 + for _, event := range tx.ExecTxResults.Events { + if event.Type == movetypes.EventTypeMove { + moveEvent := &db.MoveEvent{ + BlockHeight: blockResults.Height, + TransactionHash: tx.Hash, + EventIndex: idx, + } + for _, attr := range event.Attributes { + switch attr.Key { + case movetypes.AttributeKeyTypeTag: + moveEvent.TypeTag = attr.Value + case movetypes.AttributeKeyData: + moveEvent.Data = []byte(attr.Value) + } + } + moveEvents = append(moveEvents, moveEvent) + idx++ + } + } + } + + if err := db.InsertMoveEventsIgnoreConflict(ctx, dbTx, moveEvents); err != nil { + logger.Error().Msgf("Error inserting move_events: %v", err) + return err + } + + return nil +} + +func (f *Indexer) parseAndInsertFinalizeBlockEvents(parentCtx context.Context, dbTx *gorm.DB, blockResults *mq.BlockResultMsg) error { + span, ctx := sentry_integration.StartSentrySpan(parentCtx, "parseAndInsertFinalizeBlockEvents", "Parse block_results message and insert finalize_block_events into the database") + defer span.Finish() + + finalizeBlockEvents := make([]*db.FinalizeBlockEvent, 0) + // id ensures EventIndex is unique within each block. + idx := 0 + for _, event := range blockResults.FinalizeBlockEvents { + // Check if the last attribute key is "mode" + // We set mode to the value of the last attribute key "mode" here; since in CometBFT the "mode" will get + // append at the end. + // There is a case, however, where this may not apply. Ones being messages executed in the upgrade handler. + // Optimistically, since events emitted from the upgrade handler do not have the mode attributes appended, + // they also won't be passed to the function `sdk.MarkEventsToIndex`. + // Thus, we can safely assume they do not belong to the finalized block events set. + + attrs := event.Attributes + if len(attrs) == 0 { + continue + } + + // Check if at least one attribute has index: true + hasIndexedAttr := false + for _, attr := range attrs { + if attr.Index { + hasIndexedAttr = true + break + } + } + + // If there are indexed attributes, enforce the "mode" key rule + if hasIndexedAttr { + if attrs[len(attrs)-1].Key != "mode" { + err := fmt.Errorf("expected 'mode' as the last attribute in event, but found '%s'", attrs[len(attrs)-1].Key) + logger.Error().Msgf("%v", err) + return err + } + + mode := attrs[len(attrs)-1].Value + + // Process all attributes except the last one (which should be "mode") + for _, attr := range attrs[:len(attrs)-1] { + finalizeBlockEvents = append(finalizeBlockEvents, &db.FinalizeBlockEvent{ + BlockHeight: blockResults.Height, + EventKey: fmt.Sprintf("%s.%s", event.Type, attr.Key), + EventValue: attr.Value, + EventIndex: idx, + Mode: mode, + }) + idx++ + } + } + } + + if err := db.InsertFinalizeBlockEventsIgnoreConflict(ctx, dbTx, finalizeBlockEvents); err != nil { + logger.Error().Msgf("Error inserting finalize_block_events: %v", err) + return err + } + + return nil +} + +func (f *Indexer) processBlockResults(parentCtx context.Context, blockResults *mq.BlockResultMsg) error { + span, ctx := sentry_integration.StartSentrySpan(parentCtx, "processBlockResults", "Parse block_results message and insert tx events into the database") + defer span.Finish() + + logger.Info().Msgf("Processing block_results at height: %d", blockResults.Height) + + if err := f.dbClient.WithContext(ctx).Transaction(func(dbTx *gorm.DB) error { + if err := f.parseAndInsertTransactionEvents(ctx, dbTx, blockResults); err != nil { + logger.Error().Int64("height", blockResults.Height).Msgf("Error inserting transaction_events: %v", err) + return err + } + + if err := f.parseAndInsertMoveEvents(ctx, dbTx, blockResults); err != nil { + logger.Error().Int64("height", blockResults.Height).Msgf("Error inserting move_events: %v", err) + return err + } + + if err := f.parseAndInsertFinalizeBlockEvents(ctx, dbTx, blockResults); err != nil { + logger.Error().Int64("height", blockResults.Height).Msgf("Error inserting finalize_block_events: %v", err) + return err + } + return nil + }); err != nil { + logger.Error().Int64("height", blockResults.Height).Msgf("Error processing block: %v", err) + return errors.Join(indexererrors.ErrorNonRetryable, err) + } + + logger.Info().Int64("height", blockResults.Height).Msgf("Successfully flushed block: %d", blockResults.Height) + + return nil +} diff --git a/informative-indexer/flusher/flusher.go b/event-indexer/indexer/indexer.go similarity index 67% rename from informative-indexer/flusher/flusher.go rename to event-indexer/indexer/indexer.go index 506e10a1..e792ae04 100644 --- a/informative-indexer/flusher/flusher.go +++ b/event-indexer/indexer/indexer.go @@ -1,4 +1,4 @@ -package flusher +package indexer import ( "context" @@ -13,28 +13,32 @@ import ( "github.com/certifi/gocertifi" "github.com/confluentinc/confluent-kafka-go/v2/kafka" "github.com/getsentry/sentry-go" - "github.com/jackc/pgx/v5/pgxpool" "github.com/rs/zerolog" "github.com/rs/zerolog/log" - - "github.com/initia-labs/core-indexer/informative-indexer/common" - "github.com/initia-labs/core-indexer/informative-indexer/db" - "github.com/initia-labs/core-indexer/informative-indexer/mq" - "github.com/initia-labs/core-indexer/informative-indexer/storage" + "gorm.io/gorm" + + "github.com/initia-labs/core-indexer/pkg/cosmosrpc" + "github.com/initia-labs/core-indexer/pkg/db" + indexererrors "github.com/initia-labs/core-indexer/pkg/errors" + "github.com/initia-labs/core-indexer/pkg/mq" + "github.com/initia-labs/core-indexer/pkg/sentry_integration" + "github.com/initia-labs/core-indexer/pkg/storage" ) var logger *zerolog.Logger -type Flusher struct { +type Indexer struct { consumer *mq.Consumer producer *mq.Producer - dbClient *pgxpool.Pool + dbClient *gorm.DB storageClient storage.Client config *Config + + rpcClient cosmosrpc.CosmosJSONRPCHub } type Config struct { - // ID for the current flusher + // ID for the current indexer ID string // Chain id @@ -42,6 +46,9 @@ type Config struct { DBConnectionString string + RPCEndpoints string + RPCTimeoutInSeconds int64 + // Kafka config KafkaBootstrapServer string KafkaBlockResultsTopic string @@ -60,8 +67,8 @@ type Config struct { SentryTracesSampleRate float64 } -func NewFlusher(config *Config) (*Flusher, error) { - logger = zerolog.Ctx(log.With().Str("component", "informative-indexer-flusher"). +func New(config *Config) (*Indexer, error) { + logger = zerolog.Ctx(log.With().Str("component", "event-indexer"). Str("chain", config.Chain). Str("id", config.ID). Str("environment", config.Environment). @@ -71,7 +78,7 @@ func NewFlusher(config *Config) (*Flusher, error) { sentryClientOptions := sentry.ClientOptions{ Dsn: config.SentryDSN, - ServerName: config.Chain + "-informative-indexer-flusher", + ServerName: config.Chain + "-event-indexer", EnableTracing: true, ProfilesSampleRate: config.SentryProfilesSampleRate, TracesSampleRate: config.SentryTracesSampleRate, @@ -80,7 +87,7 @@ func NewFlusher(config *Config) (*Flusher, error) { Tags: map[string]string{ "chain": config.Chain, "environment": config.Environment, - "component": "informative-indexer-flusher", + "component": "event-indexer", "commit_sha": config.CommitSHA, }, } @@ -93,7 +100,6 @@ func NewFlusher(config *Config) (*Flusher, error) { } err = sentry.Init(sentryClientOptions) - if err != nil { logger.Fatal().Msgf("Sentry: Error initializing sentry: %v\n", err) return nil, err @@ -127,7 +133,7 @@ func NewFlusher(config *Config) (*Flusher, error) { } if err != nil { - common.CaptureCurrentHubException(err, sentry.LevelFatal) + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) logger.Fatal().Msgf("Kafka: Error creating consumer: %v\n", err) return nil, err } @@ -160,14 +166,14 @@ func NewFlusher(config *Config) (*Flusher, error) { } if err != nil { - common.CaptureCurrentHubException(err, sentry.LevelFatal) + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) logger.Fatal().Msgf("Kafka: Error creating producer: %v\n", err) return nil, err } dbClient, err := db.NewClient(config.DBConnectionString) if err != nil { - common.CaptureCurrentHubException(err, sentry.LevelFatal) + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) logger.Fatal().Msgf("DB: Error creating DB client: %v\n", err) return nil, err } @@ -183,26 +189,57 @@ func NewFlusher(config *Config) (*Flusher, error) { } else { storageClient, err = storage.NewGCSClient() if err != nil { - common.CaptureCurrentHubException(err, sentry.LevelFatal) + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) logger.Fatal().Msgf("Storage: Error creating storage client: %v\n", err) return nil, err } } - return &Flusher{ + if config.RPCEndpoints == "" { + sentry_integration.CaptureCurrentHubException(errors.New("RPC: No RPC endpoints provided"), sentry.LevelFatal) + logger.Fatal().Msgf("RPC: No RPC endpoints provided\n") + return nil, fmt.Errorf("RPC: No RPC endpoints provided") + } + + var rpcEndpoints mq.RPCEndpoints + err = json.Unmarshal([]byte(config.RPCEndpoints), &rpcEndpoints) + if err != nil { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) + logger.Fatal().Msgf("RPC: Error unmarshalling RPC endpoints: %v\n", err) + return nil, err + } + + clientConfigs := make([]cosmosrpc.ClientConfig, 0) + for _, rpc := range rpcEndpoints.RPCs { + clientConfigs = append(clientConfigs, cosmosrpc.ClientConfig{ + URL: rpc.URL, + ClientOption: &cosmosrpc.ClientOption{CustomHeaders: rpc.Headers}, + }) + } + + rpcClient := cosmosrpc.NewHub(clientConfigs, logger, time.Duration(config.RPCTimeoutInSeconds)*time.Second) + err = rpcClient.Rebalance(context.Background()) + if err != nil { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) + logger.Fatal().Msgf("RPC: Error Rebalancing RPC endpoints: %v\n", err) + return nil, err + } + + return &Indexer{ consumer: consumer, producer: producer, dbClient: dbClient, storageClient: storageClient, config: config, + rpcClient: rpcClient, }, nil } -func (f *Flusher) parseBlockResults(parentCtx context.Context, blockResultsBytes []byte) (common.BlockResultMsg, error) { - span, _ := common.StartSentrySpan(parentCtx, "parseBlockResults", "Parsing block_results") +func (f *Indexer) parseBlockResults(parentCtx context.Context, blockResultsBytes []byte) (mq.BlockResultMsg, error) { + span, _ := sentry_integration.StartSentrySpan(parentCtx, "parseBlockResults", "Parsing block_results") defer span.Finish() - var blockResultsMsg common.BlockResultMsg + var blockResultsMsg mq.BlockResultMsg err := json.Unmarshal(blockResultsBytes, &blockResultsMsg) if err != nil { logger.Error().Msgf("Error unmarshalling message: %v", err) @@ -212,16 +249,16 @@ func (f *Flusher) parseBlockResults(parentCtx context.Context, blockResultsBytes return blockResultsMsg, err } -func (f *Flusher) processUntilSucceeds(ctx context.Context, blockResultsMsg common.BlockResultMsg) error { - // Process the block_results until success +func (f *Indexer) processUntilSucceeds(ctx context.Context, blockResults mq.BlockResultMsg) error { + // // Process the block_results until success for { - err := f.processBlockResults(ctx, &blockResultsMsg) + err := f.processBlockResults(ctx, &blockResults) if err != nil { - if errors.Is(err, ErrorNonRetryable) { + if errors.Is(err, indexererrors.ErrorNonRetryable) { return err } - common.CaptureCurrentHubException(err, sentry.LevelWarning) + sentry_integration.CaptureCurrentHubException(err, sentry.LevelWarning) logger.Error().Msgf("Error processing block_results: %v, retrying...", err) continue } @@ -231,9 +268,9 @@ func (f *Flusher) processUntilSucceeds(ctx context.Context, blockResultsMsg comm return nil } -func (f *Flusher) processClaimCheckMessage(key []byte, messageValue []byte) ([]byte, error) { - if strings.HasPrefix(string(key), common.NEW_BLOCK_RESULTS_CLAIM_CHECK_KAFKA_MESSAGE_KEY) { - var claimCheckBlockResultsMsg common.ClaimCheckMsg +func (f *Indexer) processClaimCheckMessage(key []byte, messageValue []byte) ([]byte, error) { + if strings.HasPrefix(string(key), mq.NEW_BLOCK_RESULTS_CLAIM_CHECK_KAFKA_MESSAGE_KEY) { + var claimCheckBlockResultsMsg mq.ClaimCheckMsg err := json.Unmarshal(messageValue, &claimCheckBlockResultsMsg) if err != nil { logger.Fatal().Msgf("Error unmarshalling message: %v", err) @@ -255,7 +292,7 @@ func (f *Flusher) processClaimCheckMessage(key []byte, messageValue []byte) ([]b return messageValue, nil } -func (f *Flusher) processKafkaMessage(ctx context.Context, message *kafka.Message) error { +func (f *Indexer) processKafkaMessage(ctx context.Context, message *kafka.Message) error { messageValue, err := f.processClaimCheckMessage(message.Key, message.Value) if err != nil { logger.Error().Msgf("Error processing claim check message: %v", err) @@ -280,8 +317,11 @@ func (f *Flusher) processKafkaMessage(ctx context.Context, message *kafka.Messag return nil } -func (f *Flusher) close() { - f.dbClient.Close() +func (f *Indexer) close() { + sqlDB, err := f.dbClient.DB() + if err == nil { + sqlDB.Close() + } f.producer.Flush(30000) f.producer.Close() @@ -289,14 +329,14 @@ func (f *Flusher) close() { f.consumer.Close() } -func (f *Flusher) StartFlushing(stopCtx context.Context) { - logger.Info().Msgf("Starting flusher...") +func (f *Indexer) StartIndexing(stopCtx context.Context) { + logger.Info().Msgf("Starting indexer...") f.producer.ListenToKafkaProduceEvents(logger) err := f.consumer.SubscribeTopics([]string{f.config.KafkaBlockResultsTopic}, nil) if err != nil { - common.CaptureCurrentHubException(err, sentry.LevelFatal) + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) logger.Fatal().Msgf("Failed to subscribe to topic: %s\n", err) } @@ -310,13 +350,12 @@ func (f *Flusher) StartFlushing(stopCtx context.Context) { ctx := context.Background() message, err := f.consumer.ReadMessage(10 * time.Second) - if err != nil { if err.(kafka.Error).IsTimeout() { continue } - common.CaptureCurrentHubException(err, sentry.LevelWarning) + sentry_integration.CaptureCurrentHubException(err, sentry.LevelWarning) logger.Error().Msgf("Error reading message: %v", err) continue } @@ -327,17 +366,17 @@ func (f *Flusher) StartFlushing(stopCtx context.Context) { scope.SetTag("offset", message.TopicPartition.Offset.String()) }) - transaction, ctx := common.StartSentryTransaction(ctx, "Flush", "Process and flush informative block_results messages") + transaction, ctx := sentry_integration.StartSentryTransaction(ctx, "Index", "Process and index event block_results messages") err = f.processKafkaMessage(ctx, message) if err != nil { - common.CaptureCurrentHubException(err, sentry.LevelError) + sentry_integration.CaptureCurrentHubException(err, sentry.LevelError) logger.Warn().Msgf("Producing message to DLQ: %d, %d, %v", message.TopicPartition.Partition, message.TopicPartition.Offset, err) - f.producer.ProduceToDLQ(message, err, logger) + f.producer.ProduceToDLQ(f.config.Chain, "event-indexer-block-results", message, err, logger) } _, err = f.consumer.CommitMessage(message) if err != nil { - common.CaptureCurrentHubException(err, sentry.LevelError) + sentry_integration.CaptureCurrentHubException(err, sentry.LevelError) logger.Error().Msgf("Non-retryable Error committing message: %v", err) } transaction.Finish() @@ -345,13 +384,13 @@ func (f *Flusher) StartFlushing(stopCtx context.Context) { } } -func (f *Flusher) Flush() { +func (f *Indexer) Run() { // graceful shutdown ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer stop() defer sentry.Flush(2 * time.Second) - f.StartFlushing(ctx) + f.StartIndexing(ctx) logger.Info().Msgf("Shutting down ...") f.close() diff --git a/event-indexer/main.go b/event-indexer/main.go new file mode 100644 index 00000000..bff33a2d --- /dev/null +++ b/event-indexer/main.go @@ -0,0 +1,7 @@ +package main + +import "github.com/initia-labs/core-indexer/event-indexer/cmd" + +func main() { + cmd.Execute() +} diff --git a/event-indexer/run.sh b/event-indexer/run.sh new file mode 100755 index 00000000..bb15d3a6 --- /dev/null +++ b/event-indexer/run.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +set -e + +SCRIPT_DIR=$(cd $(dirname $0) ; pwd -P) + +TASK=$1 +ARGS=${@:2} + + +help__run="run <..args> : run run" +task__run() { + local chain=$1 + + if [ -z "$chain" ]; then + echo "usage: $0 run " + exit + fi + + go build -o event-indexer . + + source .env + + ./event-indexer run --bootstrap-server $KAFKA_BOOTSTRAP_SERVER \ + --block-results-topic ${chain}-local-generic-indexer-block-results-messages \ + --kafka-api-key $KAFKA_API_KEY \ + --kafka-api-secret $KAFKA_API_SECRET \ + --block-results-consumer-group ${chain}-local-event-indexer \ + --block-results-claim-check-bucket ${chain}-local-event-indexer-large-block-results \ + --claim-check-threshold-mb 1 \ + --db $DB_CONNECTION_STRING \ + --chain $chain \ + --id 1 +} + +list_all_helps() { + compgen -v | egrep "^help__.*" +} + +NEW_LINE=$'\n' +if type -t "task__$TASK" &>/dev/null; then + task__$TASK $ARGS +else + echo "usage: $0 [<..args>]" + echo "task:" + + HELPS="" + for help in $(list_all_helps) + do + + HELPS="$HELPS ${help/help__/} |-- ${!help}$NEW_LINE" + done + + echo "$HELPS" | column -t -s "|" + exit +fi diff --git a/generic-indexer/.dockerignore b/generic-indexer/.dockerignore new file mode 100644 index 00000000..cc95c092 --- /dev/null +++ b/generic-indexer/.dockerignore @@ -0,0 +1,3 @@ +.env* +*.bin +*.md diff --git a/generic-indexer/README.md b/generic-indexer/README.md new file mode 100644 index 00000000..1fbd4ebb --- /dev/null +++ b/generic-indexer/README.md @@ -0,0 +1,28 @@ +# Generic Indexer + +### Terms + +Indexer = service that polls block to be indexed from Kafka and indexes them in NDS +Fw = num of Indexer workers + +### Pseudo code + +1. Get last indexed block from NDS +2. Query next Sw blocks - each Sweeper worker queries one +3. Each Sweeper worker calls rpc's `block` method, then enqueue the response, may be in the form of + +``` +{ + "height": "123456", + "hash": "wfwefwefw", + "timestamp": "fwefwefweffw", + "txs": ["tx1_hash", "tx2_hash", ...] +} +``` + +1. Each Indexer worker subscribes to a Kafka partition + 1. Reads a message from the partition + 2. Queries RPC to get all tx data from that block (should have multiple goroutine for this task) + 3. Check if all calls return successfully, if not retry 3.2 + 4. Open a DB transaction, insert into `blocks` and insert all txs into `transactions` (make sure block timestamp and indexed timestamp is in both schemas). For duplicate txs -> ignore, other errors -> rollback + 5. Repeat 3.1 diff --git a/generic-indexer/cmd/indexer/cmd.go b/generic-indexer/cmd/indexer/cmd.go new file mode 100644 index 00000000..ed451a55 --- /dev/null +++ b/generic-indexer/cmd/indexer/cmd.go @@ -0,0 +1,164 @@ +package indexer_cmd + +import ( + "os" + "strconv" + + "github.com/spf13/cobra" + + "github.com/initia-labs/core-indexer/generic-indexer/indexer" +) + +// List of CLI flags +const ( + FlagID = "id" + FlagRPCEndpoints = "rpcs" + FlagKafkaBootstrapServer = "bootstrap-server" + FlagDBConnectionString = "db" + FlagNumWorkers = "workers" + FlagChain = "chain" + KafkaBlockTopic = "block-topic" + KafkaTxResponseTopic = "tx-topic" + FlagKafkaAPIKey = "kafka-api-key" + FlagKafkaAPISecret = "kafka-api-secret" + FlagAWSAccessKey = "aws-access-key" + FlagAWSSecretKey = "aws-secret-key" + FlagBlockClaimCheckBucket = "block-claim-check-bucket" + FlagClaimCheckThresholdInMB = "claim-check-threshold-mb" + FlagLCDTxResponseClaimCheckBucket = "lcd-tx-response-claim-check-bucket" + FlagKafkaBlockConsumerGroup = "block-consumer-group" + FlagEnvironment = "environment" + FlagRebalanceInterval = "rebalance-interval" + FlagRPCTimeoutInSeconds = "rpc-timeout-in-seconds" + FlagSentryDSN = "sentry-dsn" + FlagCommitSHA = "commit-sha" + FlagSentryProfilesSampleRate = "sentry-profiles-sample-rate" + FlagSentryTracesSampleRate = "sentry-traces-sample-rate" + FlagBlockResultsClaimCheckBucket = "block-results-claim-check-bucket" +) + +// IndexerCmd consumes from Kafka and indexes into database. +func IndexerCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "run", + Short: "Consumes from Kafka and indexes the blockchain for data", + Args: cobra.ExactArgs(0), + RunE: func(cmd *cobra.Command, args []string) error { + rpcEndpoints, _ := cmd.Flags().GetString(FlagRPCEndpoints) + kafkaBootstrapServer, _ := cmd.Flags().GetString(FlagKafkaBootstrapServer) + chain, _ := cmd.Flags().GetString(FlagChain) + dbConnectionString, _ := cmd.Flags().GetString(FlagDBConnectionString) + kafkaBlockTopic, _ := cmd.Flags().GetString(KafkaBlockTopic) + kafkaTxResponseTopic, _ := cmd.Flags().GetString(KafkaTxResponseTopic) + kafkaAPIKey, _ := cmd.Flags().GetString(FlagKafkaAPIKey) + kafkaAPISecret, _ := cmd.Flags().GetString(FlagKafkaAPISecret) + kafkaBlockConsumerGroup, _ := cmd.Flags().GetString(FlagKafkaBlockConsumerGroup) + + numWorkers, _ := cmd.Flags().GetUint64(FlagNumWorkers) + + awsAccessKey, _ := cmd.Flags().GetString(FlagAWSAccessKey) + awsSecretKey, _ := cmd.Flags().GetString(FlagAWSSecretKey) + blockClaimCheckBucket, _ := cmd.Flags().GetString(FlagBlockClaimCheckBucket) + claimCheckThresholdInMB, _ := cmd.Flags().GetUint64(FlagClaimCheckThresholdInMB) + lcdTxResponseClaimCheckBucket, _ := cmd.Flags().GetString(FlagLCDTxResponseClaimCheckBucket) + + workerID, _ := cmd.Flags().GetString(FlagID) + + environment, _ := cmd.Flags().GetString(FlagEnvironment) + rebalanceInterval, _ := cmd.Flags().GetInt64(FlagRebalanceInterval) + rpcTimeOutInSeconds, _ := cmd.Flags().GetInt64(FlagRPCTimeoutInSeconds) + + sentryDSN, _ := cmd.Flags().GetString(FlagSentryDSN) + commitSHA, _ := cmd.Flags().GetString(FlagCommitSHA) + sentryProfilesSampleRate, _ := cmd.Flags().GetFloat64(FlagSentryProfilesSampleRate) + sentryTracesSampleRate, _ := cmd.Flags().GetFloat64(FlagSentryTracesSampleRate) + blockResultsClaimCheckBucket, _ := cmd.Flags().GetString(FlagBlockResultsClaimCheckBucket) + + f, err := indexer.New(&indexer.IndexerConfig{ + ID: workerID, + RPCEndpoints: rpcEndpoints, + KafkaBootstrapServer: kafkaBootstrapServer, + KafkaBlockTopic: kafkaBlockTopic, + KafkaTxResponseTopic: kafkaTxResponseTopic, + KafkaAPIKey: kafkaAPIKey, + KafkaAPISecret: kafkaAPISecret, + KafkaBlockConsumerGroup: kafkaBlockConsumerGroup, + NumWorkers: int64(numWorkers), + Chain: chain, + DBConnectionString: dbConnectionString, + AWSAccessKey: awsAccessKey, + AWSSecretKey: awsSecretKey, + BlockClaimCheckBucket: blockClaimCheckBucket, + ClaimCheckThresholdInMB: int64(claimCheckThresholdInMB), + LCDTxResponseClaimCheckBucket: lcdTxResponseClaimCheckBucket, + Environment: environment, + RebalanceInterval: rebalanceInterval, + RPCTimeOutInSeconds: rpcTimeOutInSeconds, + SentryDSN: sentryDSN, + CommitSHA: commitSHA, + SentryProfilesSampleRate: sentryProfilesSampleRate, + SentryTracesSampleRate: sentryTracesSampleRate, + BlockResultsClaimCheckBucket: blockResultsClaimCheckBucket, + }) + + if err != nil { + return err + } + + f.Run() + + return nil + }, + } + + threshold, err := strconv.ParseInt(os.Getenv("CLAIM_CHECK_THRESHOLD_IN_MB"), 10, 64) + if err != nil { + threshold = 1 + } + + rebalanceInterval, err := strconv.ParseInt(os.Getenv("REBALANCE_INTERVAL"), 10, 64) + if err != nil { + rebalanceInterval = 0 + } + rpcTimeOutInSeconds, err := strconv.ParseInt(os.Getenv("RPC_TIMEOUT_IN_SECONDS"), 10, 64) + if err != nil { + rpcTimeOutInSeconds = 30 + } + + sentryProfilesSampleRate, err := strconv.ParseFloat(os.Getenv("SENTRY_PROFILES_SAMPLE_RATE"), 64) + if err != nil { + sentryProfilesSampleRate = 0.01 + } + + sentryTracesSampleRate, err := strconv.ParseFloat(os.Getenv("SENTRY_TRACES_SAMPLE_RATE"), 64) + if err != nil { + sentryTracesSampleRate = 0.01 + } + + cmd.Flags().String(FlagRPCEndpoints, os.Getenv("RPC_ENDPOINTS"), "") + cmd.Flags().String(FlagKafkaBootstrapServer, os.Getenv("BOOTSTRAP_SERVER"), ": to Kafka bootstrap server") + cmd.Flags().String(KafkaBlockTopic, os.Getenv("BLOCK_TOPIC"), "Kafka topic about Blocks to consume") + cmd.Flags().String(KafkaTxResponseTopic, os.Getenv("TX_TOPIC"), "Kafka topic about TxResponses to produce") + cmd.Flags().String(FlagKafkaBlockConsumerGroup, os.Getenv("BLOCK_CONSUMER_GROUP"), "Kafka consumer group for block topic") + cmd.Flags().String(FlagKafkaAPIKey, os.Getenv("KAFKA_API_KEY"), "Kafka API key") + cmd.Flags().String(FlagKafkaAPISecret, os.Getenv("KAFKA_API_SECRET"), "Kafka API secret") + cmd.Flags().String(FlagDBConnectionString, os.Getenv("DB_CONNECTION_STRING"), "Database connection string") + cmd.Flags().Uint64(FlagNumWorkers, 10, "Worker count") + cmd.Flags().String(FlagChain, os.Getenv("CHAIN"), "Chain ID to sweep") + cmd.Flags().String(FlagAWSAccessKey, os.Getenv("AWS_ACCESS_KEY"), "AWS access key") + cmd.Flags().String(FlagAWSSecretKey, os.Getenv("AWS_SECRET_KEY"), "AWS secret key") + cmd.Flags().String(FlagBlockClaimCheckBucket, os.Getenv("BLOCK_CLAIM_CHECK_BUCKET"), "Block claim check bucket") + cmd.Flags().Uint64(FlagClaimCheckThresholdInMB, uint64(threshold), "Claim check threshold in MB") + cmd.Flags().String(FlagLCDTxResponseClaimCheckBucket, os.Getenv("TX_CLAIM_CHECK_BUCKET"), "LCD TxResponse claim check bucket") + cmd.Flags().String(FlagID, os.Getenv("ID"), "Worker ID") + cmd.Flags().String(FlagEnvironment, os.Getenv("ENVIRONMENT"), "Environment") + cmd.Flags().Int64(FlagRebalanceInterval, rebalanceInterval, "RPC providers rebalance interval") + cmd.Flags().Int64(FlagRPCTimeoutInSeconds, rpcTimeOutInSeconds, "RPC timeout in seconds") + cmd.Flags().String(FlagSentryDSN, os.Getenv("SENTRY_DSN"), "Sentry DSN") + cmd.Flags().String(FlagCommitSHA, os.Getenv("COMMIT_SHA"), "Commit SHA") + cmd.Flags().Float64(FlagSentryProfilesSampleRate, sentryProfilesSampleRate, "Sentry profiles sample rate") + cmd.Flags().Float64(FlagSentryTracesSampleRate, sentryTracesSampleRate, "Sentry traces sample rate") + cmd.Flags().String(FlagBlockResultsClaimCheckBucket, os.Getenv("BLOCK_RESULTS_CLAIM_CHECK_BUCKET"), "Block results claim check bucket") + + return cmd +} diff --git a/generic-indexer/cmd/indexercron/cmd.go b/generic-indexer/cmd/indexercron/cmd.go new file mode 100644 index 00000000..f2ddfd66 --- /dev/null +++ b/generic-indexer/cmd/indexercron/cmd.go @@ -0,0 +1,130 @@ +package indexercron_cmd + +import ( + "os" + "strconv" + + indexercron "github.com/initia-labs/core-indexer/generic-indexer/indexer-cron" + "github.com/spf13/cobra" +) + +// List of CLI flags +const ( + FlagRPCEndpoints = "rpcs" + FlagDBConnectionString = "db" + FlagChain = "chain" + FlagValidatorUpdateInterval = "validator-update-interval" + FlagValidatorUptimeUpdateInterval = "validator-uptime-update-interval" + FlagValidatorIdentityImageUpdateInterval = "validator-identity-image-update-interval" + FlagEnvironment = "environment" + FlagKeepLatestCommitSignatures = "keep-latest-commit-signatures" + FlagRPCTimeoutInSeconds = "rpc-timeout-in-seconds" + FlagSentryDSN = "sentry-dsn" + FlagCommitSHA = "commit-sha" + FlagSentryProfilesSampleRate = "sentry-profiles-sample-rate" + FlagSentryTracesSampleRate = "sentry-traces-sample-rate" +) + +// IndexerCronCmd runs cron jobs +func IndexerCronCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "cron", + Short: "Runs cron jobs to update periodically data", + Args: cobra.ExactArgs(0), + RunE: func(cmd *cobra.Command, args []string) error { + rpcEndpoints, _ := cmd.Flags().GetString(FlagRPCEndpoints) + chain, _ := cmd.Flags().GetString(FlagChain) + dbConnectionString, err := cmd.Flags().GetString(FlagDBConnectionString) + if err != nil { + panic(err) + } + + validatorUpdateInterval, _ := cmd.Flags().GetInt64(FlagValidatorUpdateInterval) + validatorUptimeUpdateInterval, _ := cmd.Flags().GetInt64(FlagValidatorUptimeUpdateInterval) + validatorIdentityImageUpdateInterval, _ := cmd.Flags().GetInt64(FlagValidatorIdentityImageUpdateInterval) + environment, _ := cmd.Flags().GetString(FlagEnvironment) + keepLatestCommitSignatures, _ := cmd.Flags().GetInt64(FlagKeepLatestCommitSignatures) + rpcTimeOutInSeconds, _ := cmd.Flags().GetInt64(FlagRPCTimeoutInSeconds) + + sentryDSN, _ := cmd.Flags().GetString(FlagSentryDSN) + commitSHA, _ := cmd.Flags().GetString(FlagCommitSHA) + sentryProfilesSampleRate, _ := cmd.Flags().GetFloat64(FlagSentryProfilesSampleRate) + sentryTracesSampleRate, _ := cmd.Flags().GetFloat64(FlagSentryTracesSampleRate) + + f, err := indexercron.New(&indexercron.IndexerCronConfig{ + RPCEndpoints: rpcEndpoints, + Chain: chain, + DBConnectionString: dbConnectionString, + ValidatorUpdateIntervalInSeconds: int64(validatorUpdateInterval), + ValidatorUptimeUpdateIntervalInSeconds: int64(validatorUptimeUpdateInterval), + ValidatorIdentityImageUpdateIntervalInSeconds: int64(validatorIdentityImageUpdateInterval), + Environment: environment, + KeepLatestCommitSignatures: keepLatestCommitSignatures, + RPCTimeOutInSeconds: rpcTimeOutInSeconds, + SentryDSN: sentryDSN, + CommitSHA: commitSHA, + SentryProfilesSampleRate: sentryProfilesSampleRate, + SentryTracesSampleRate: sentryTracesSampleRate, + }) + + if err != nil { + return err + } + + f.Run() + + return nil + }, + } + + validatorUpdateInterval, err := strconv.Atoi(os.Getenv("VALIDATOR_UPDATE_INTERVAL")) + if err != nil { + validatorUpdateInterval = 60 + } + + validatorUptimeUpdateInterval, err := strconv.Atoi(os.Getenv("VALIDATOR_UPTIME_UPDATE_INTERVAL")) + if err != nil { + validatorUptimeUpdateInterval = 60 + } + + validatorIdentityImageUpdateInterval, err := strconv.Atoi(os.Getenv("VALIDATOR_IDENTITY_IMAGE_UPDATE_INTERVAL")) + if err != nil { + validatorIdentityImageUpdateInterval = 600 // 10 minutes default + } + + keepLatestCommitSignatures, err := strconv.Atoi(os.Getenv("KEEP_LATEST_COMMIT_SIGNATURES")) + if err != nil { + keepLatestCommitSignatures = 11000 + } + + rpcTimeOutInSeconds, err := strconv.ParseInt(os.Getenv("RPC_TIMEOUT_IN_SECONDS"), 10, 64) + if err != nil { + rpcTimeOutInSeconds = 30 + } + + sentryProfilesSampleRate, err := strconv.ParseFloat(os.Getenv("SENTRY_PROFILES_SAMPLE_RATE"), 64) + if err != nil { + sentryProfilesSampleRate = 0.05 + } + + sentryTracesSampleRate, err := strconv.ParseFloat(os.Getenv("SENTRY_TRACES_SAMPLE_RATE"), 64) + if err != nil { + sentryTracesSampleRate = 0.05 + } + + cmd.Flags().String(FlagRPCEndpoints, os.Getenv("RPC_ENDPOINTS"), "") + cmd.Flags().String(FlagDBConnectionString, os.Getenv("DB_CONNECTION_STRING"), "Database connection string") + cmd.Flags().String(FlagChain, os.Getenv("CHAIN"), "Chain ID to run validator crons") + cmd.Flags().Int64(FlagValidatorUpdateInterval, int64(validatorUpdateInterval), "Interval to update validators") + cmd.Flags().Int64(FlagValidatorUptimeUpdateInterval, int64(validatorUptimeUpdateInterval), "Interval to update validators") + cmd.Flags().Int64(FlagValidatorIdentityImageUpdateInterval, int64(validatorIdentityImageUpdateInterval), "Interval to update validator identity images from Keybase") + cmd.Flags().String(FlagEnvironment, os.Getenv("ENVIRONMENT"), "Environment") + cmd.Flags().Int64(FlagKeepLatestCommitSignatures, int64(keepLatestCommitSignatures), "Keep latest commit signatures") + cmd.Flags().Int64(FlagRPCTimeoutInSeconds, rpcTimeOutInSeconds, "RPC timeout in seconds") + cmd.Flags().String(FlagSentryDSN, os.Getenv("SENTRY_DSN"), "Sentry DSN") + cmd.Flags().String(FlagCommitSHA, os.Getenv("COMMIT_SHA"), "Commit SHA") + cmd.Flags().Float64(FlagSentryProfilesSampleRate, sentryProfilesSampleRate, "Sentry profiles sample rate") + cmd.Flags().Float64(FlagSentryTracesSampleRate, sentryTracesSampleRate, "Sentry traces sample rate") + + return cmd +} diff --git a/generic-indexer/cmd/root.go b/generic-indexer/cmd/root.go new file mode 100644 index 00000000..26b1ef45 --- /dev/null +++ b/generic-indexer/cmd/root.go @@ -0,0 +1,30 @@ +package cmd + +import ( + "os" + + "github.com/spf13/cobra" + + indexer "github.com/initia-labs/core-indexer/generic-indexer/cmd/indexer" + indexercron "github.com/initia-labs/core-indexer/generic-indexer/cmd/indexercron" +) + +// Execute adds all child commands to the root command and sets flags appropriately. +// This is called by main.main(). It only needs to happen once to the rootCmd. +func Execute() { + var rootCmd = &cobra.Command{ + Use: "generic-indexer", + Short: "Generic Indexer Runner", + Long: `Generic Indexer Runner - Polls block data from Tendermint RPC and indexes into database`, + } + + rootCmd.AddCommand( + indexer.IndexerCmd(), + indexercron.IndexerCronCmd(), + ) + + err := rootCmd.Execute() + if err != nil { + os.Exit(1) + } +} diff --git a/generic-indexer/go.mod b/generic-indexer/go.mod new file mode 100644 index 00000000..ed70193d --- /dev/null +++ b/generic-indexer/go.mod @@ -0,0 +1,321 @@ +module github.com/initia-labs/core-indexer/generic-indexer + +go 1.25.8 + +require ( + github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d + github.com/cometbft/cometbft v0.38.20 + github.com/confluentinc/confluent-kafka-go/v2 v2.6.1 + github.com/cosmos/cosmos-sdk v0.50.14 + github.com/getsentry/sentry-go v0.29.1 + github.com/h2non/bimg v1.1.9 + github.com/initia-labs/core-indexer/pkg v0.0.0-00010101000000-000000000000 + github.com/initia-labs/initia v1.4.3 + github.com/initia-labs/movevm v1.2.0 + github.com/robfig/cron/v3 v3.0.1 + github.com/rs/zerolog v1.33.0 + github.com/spf13/cobra v1.9.1 + gorm.io/gorm v1.30.0 +) + +require ( + ariga.io/atlas v0.33.1 // indirect + ariga.io/atlas-go-sdk v0.6.8 // indirect + ariga.io/atlas-provider-gorm v0.5.2 // indirect + cel.dev/expr v0.25.1 // indirect + cloud.google.com/go v0.123.0 // indirect + cloud.google.com/go/auth v0.18.2 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect + cloud.google.com/go/compute/metadata v0.9.0 // indirect + cloud.google.com/go/iam v1.5.3 // indirect + cloud.google.com/go/monitoring v1.24.3 // indirect + cloud.google.com/go/storage v1.61.3 // indirect + cosmossdk.io/api v0.7.6 // indirect + cosmossdk.io/client/v2 v2.0.0-beta.4 // indirect + cosmossdk.io/collections v0.4.0 // indirect + cosmossdk.io/core v0.11.1 // indirect + cosmossdk.io/depinject v1.1.0 // indirect + cosmossdk.io/errors v1.0.1 // indirect + cosmossdk.io/log v1.4.1 // indirect + cosmossdk.io/math v1.4.0 // indirect + cosmossdk.io/store v1.1.1 // indirect + cosmossdk.io/x/evidence v0.1.1 // indirect + cosmossdk.io/x/feegrant v0.1.1 // indirect + cosmossdk.io/x/tx v0.13.7 // indirect + cosmossdk.io/x/upgrade v0.1.4 // indirect + filippo.io/edwards25519 v1.1.1 // indirect + github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect + github.com/99designs/keyring v1.2.2 // indirect + github.com/DataDog/datadog-go v3.2.0+incompatible // indirect + github.com/DataDog/zstd v1.5.5 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 // indirect + github.com/IGLOU-EU/go-wildcard v1.0.3 // indirect + github.com/agext/levenshtein v1.2.3 // indirect + github.com/alitto/pond v1.8.3 // indirect + github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect + github.com/aptos-labs/serde-reflection/serde-generate/runtime/golang v0.0.0-20231213012317-73b6bbf74833 // indirect + github.com/aws/aws-sdk-go-v2 v1.41.4 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 // indirect + github.com/aws/aws-sdk-go-v2/config v1.32.12 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.12 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 // indirect + github.com/aws/smithy-go v1.24.2 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect + github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect + github.com/bits-and-blooms/bitset v1.20.0 // indirect + github.com/bmatcuk/doublestar v1.3.4 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/chzyer/readline v1.5.1 // indirect + github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 // indirect + github.com/cockroachdb/apd/v2 v2.0.2 // indirect + github.com/cockroachdb/errors v1.11.3 // indirect + github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v1.1.5 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/cometbft/cometbft-db v0.15.0 // indirect + github.com/cosmos/btcutil v1.0.5 // indirect + github.com/cosmos/cosmos-db v1.1.1 // indirect + github.com/cosmos/cosmos-proto v1.0.0-beta.5 // indirect + github.com/cosmos/go-bip39 v1.0.0 // indirect + github.com/cosmos/gogogateway v1.2.0 // indirect + github.com/cosmos/gogoproto v1.7.0 // indirect + github.com/cosmos/iavl v1.2.6 // indirect + github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.2.0 // indirect + github.com/cosmos/ibc-apps/modules/rate-limiting/v8 v8.0.0 // indirect + github.com/cosmos/ibc-go/modules/capability v1.0.1 // indirect + github.com/cosmos/ibc-go/v8 v8.7.0 // indirect + github.com/cosmos/ics23/go v0.11.0 // indirect + github.com/cosmos/interchain-security/v6 v6.3.0 // indirect + github.com/cosmos/ledger-cosmos-go v0.14.0 // indirect + github.com/danieljoos/wincred v1.1.2 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect + github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect + github.com/dgraph-io/badger/v4 v4.3.0 // indirect + github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/dvsekhvalnov/jose2go v1.7.0 // indirect + github.com/emicklei/dot v1.6.2 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.36.0 // indirect + github.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect + github.com/ethereum/go-ethereum v1.16.9 // indirect + github.com/fatih/color v1.18.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-jose/go-jose/v4 v4.1.3 // indirect + github.com/go-kit/kit v0.13.0 // indirect + github.com/go-kit/log v0.2.1 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-openapi/inflect v0.19.0 // indirect + github.com/go-sql-driver/mysql v1.8.1 // indirect + github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect + github.com/gogo/googleapis v1.4.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-migrate/migrate/v4 v4.18.3 // indirect + github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect + github.com/golang-sql/sqlexp v0.1.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/mock v1.6.0 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/google/btree v1.1.3 // indirect + github.com/google/flatbuffers v23.5.26+incompatible // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/google/orderedcode v0.0.1 // indirect + github.com/google/s2a-go v0.1.9 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect + github.com/googleapis/gax-go/v2 v2.17.0 // indirect + github.com/gorilla/handlers v1.5.2 // indirect + github.com/gorilla/mux v1.8.1 // indirect + github.com/gorilla/websocket v1.5.3 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect + github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect + github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-getter v1.8.6 // indirect + github.com/hashicorp/go-hclog v1.6.3 // indirect + github.com/hashicorp/go-immutable-radix v1.3.1 // indirect + github.com/hashicorp/go-metrics v0.5.3 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-plugin v1.5.2 // indirect + github.com/hashicorp/go-version v1.8.0 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hashicorp/hcl/v2 v2.18.1 // indirect + github.com/hashicorp/yamux v0.1.1 // indirect + github.com/hdevalence/ed25519consensus v0.1.0 // indirect + github.com/holiman/uint256 v1.3.2 // indirect + github.com/huandu/skiplist v1.2.0 // indirect + github.com/iancoleman/orderedmap v0.3.0 // indirect + github.com/iancoleman/strcase v0.3.0 // indirect + github.com/improbable-eng/grpc-web v0.15.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/initia-labs/OPinit v1.3.0 // indirect + github.com/initia-labs/OPinit/api v1.3.0 // indirect + github.com/initia-labs/initia/api v1.4.0 // indirect + github.com/initia-labs/store v0.1.1 // indirect + github.com/initia-labs/store/memiavl v0.1.1 // indirect + github.com/initia-labs/store/versiondb v0.1.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/pgx/v5 v5.9.2 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/jmhodges/levigo v1.0.0 // indirect + github.com/klauspost/compress v1.18.5 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/ledgerwatch/erigon-lib v0.0.0-20230210071639-db0e7ed11263 // indirect + github.com/lib/pq v1.10.9 // indirect + github.com/linxGnu/grocksdb v1.10.3 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/manifoldco/promptui v0.9.0 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-sqlite3 v1.14.22 // indirect + github.com/microsoft/go-mssqldb v1.7.2 // indirect + github.com/minio/highwayhash v1.0.3 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/go-testing-interface v1.14.1 // indirect + github.com/mitchellh/go-wordwrap v1.0.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mtibben/percent v0.2.1 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/noble-assets/forwarding/v2 v2.0.3 // indirect + github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a // indirect + github.com/oklog/run v1.1.0 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/client_golang v1.21.0 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.62.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/rakyll/statik v0.1.7 // indirect + github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect + github.com/rs/cors v1.11.1 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sasha-s/go-deadlock v0.3.5 // indirect + github.com/skip-mev/connect/v2 v2.3.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.7.1 // indirect + github.com/spf13/pflag v1.0.6 // indirect + github.com/spf13/viper v1.19.0 // indirect + github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect + github.com/stretchr/testify v1.11.1 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect + github.com/tendermint/go-amino v0.16.0 // indirect + github.com/tidwall/btree v1.7.0 // indirect + github.com/tidwall/gjson v1.18.0 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.0 // indirect + github.com/tidwall/tinylru v1.1.0 // indirect + github.com/tidwall/wal v1.1.7 // indirect + github.com/ulikunitz/xz v0.5.15 // indirect + github.com/ybbus/jsonrpc/v3 v3.1.5 // indirect + github.com/zbiljic/go-filelock v0.0.0-20170914061330-1dbf7103ab7d // indirect + github.com/zclconf/go-cty v1.14.4 // indirect + github.com/zclconf/go-cty-yaml v1.1.0 // indirect + github.com/zondax/hid v0.9.2 // indirect + github.com/zondax/ledger-go v0.14.3 // indirect + go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.39.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect + go.opentelemetry.io/otel v1.43.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 // indirect + go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/otel/sdk v1.43.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect + go.opentelemetry.io/otel/trace v1.43.0 // indirect + go.uber.org/atomic v1.10.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/crypto v0.49.0 // indirect + golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect + golang.org/x/net v0.52.0 // indirect + golang.org/x/oauth2 v0.36.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.42.0 // indirect + golang.org/x/term v0.41.0 // indirect + golang.org/x/text v0.35.0 // indirect + golang.org/x/time v0.15.0 // indirect + google.golang.org/api v0.271.0 // indirect + google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 // indirect + google.golang.org/grpc v1.79.3 // indirect + google.golang.org/protobuf v1.36.11 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + gorm.io/driver/mysql v1.5.7 // indirect + gorm.io/driver/postgres v1.6.0 // indirect + gorm.io/driver/sqlite v1.5.7 // indirect + gorm.io/driver/sqlserver v1.5.4 // indirect + gotest.tools/v3 v3.5.1 // indirect + nhooyr.io/websocket v1.8.6 // indirect + pgregory.net/rapid v1.1.0 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect +) + +// initia custom +replace ( + github.com/cometbft/cometbft => github.com/initia-labs/cometbft v0.38.21-initia.2 + github.com/cosmos/cosmos-sdk => github.com/initia-labs/cosmos-sdk v0.50.15-initia.0 + github.com/cosmos/iavl => github.com/initia-labs/iavl v1.2.6-initia.1 + github.com/noble-assets/forwarding/simapp => github.com/initia-labs/forwarding/simapp v1.0.0 + github.com/noble-assets/forwarding/v2 => github.com/initia-labs/forwarding/v2 v2.0.3-initia.3 + github.com/skip-mev/connect/v2 => github.com/initia-labs/connect/v2 v2.3.1 +) + +replace ( + // use cosmos fork of keyring + github.com/99designs/keyring => github.com/cosmos/keyring v1.2.0 + + // dgrijalva/jwt-go is deprecated and doesn't receive security updates. + // TODO: remove it: https://github.com/cosmos/cosmos-sdk/issues/13134 + github.com/dgrijalva/jwt-go => github.com/golang-jwt/jwt/v4 v4.4.2 + // Fix upstream GHSA-h395-qcrw-5vmq vulnerability. + // TODO Remove it: https://github.com/cosmos/cosmos-sdk/issues/10409 + github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.8.1 + + github.com/initia-labs/core-indexer/pkg => ../pkg + // Downgraded to avoid bugs in following commits which caused simulations to fail. + github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 +) diff --git a/generic-indexer/go.sum b/generic-indexer/go.sum new file mode 100644 index 00000000..52cbff0a --- /dev/null +++ b/generic-indexer/go.sum @@ -0,0 +1,1606 @@ +ariga.io/atlas v0.33.1 h1:m3rn+m2jkfOZDqdZrgTDvDWh9G3Ldr77IElFDGEwDPk= +ariga.io/atlas v0.33.1/go.mod h1:WJesu2UCpGQvgUh3oVP94EiRT61nNy1W/VN5g+vqP1I= +ariga.io/atlas-go-sdk v0.6.8 h1:wonvcyOiXdrQnMrSNigLbMSaFV8yIxgA4Tb8EY2UGGE= +ariga.io/atlas-go-sdk v0.6.8/go.mod h1:9Q+/04PVyJHUse1lEE9Kp6E18xj/6mIzaUTcWYSjSnQ= +ariga.io/atlas-provider-gorm v0.5.2 h1:KuBY1PUmo6tzx3tpNjBypKJia3XrCXimjHDsxbYr9NE= +ariga.io/atlas-provider-gorm v0.5.2/go.mod h1:3a7Y0ZrenuGgoVXmGfn8q8U9qB7fJ5CprrXHMriMb0s= +cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= +cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= +cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= +cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM= +cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M= +cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= +cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= +cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= +cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= +cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= +cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= +cloud.google.com/go/logging v1.13.1 h1:O7LvmO0kGLaHY/gq8cV7T0dyp6zJhYAOtZPX4TF3QtY= +cloud.google.com/go/logging v1.13.1/go.mod h1:XAQkfkMBxQRjQek96WLPNze7vsOmay9H5PqfsNYDqvw= +cloud.google.com/go/longrunning v0.8.0 h1:LiKK77J3bx5gDLi4SMViHixjD2ohlkwBi+mKA7EhfW8= +cloud.google.com/go/longrunning v0.8.0/go.mod h1:UmErU2Onzi+fKDg2gR7dusz11Pe26aknR4kHmJJqIfk= +cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= +cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= +cloud.google.com/go/storage v1.61.3 h1:VS//ZfBuPGDvakfD9xyPW1RGF1Vy3BWUoVZXgW1KMOg= +cloud.google.com/go/storage v1.61.3/go.mod h1:JtqK8BBB7TWv0HVGHubtUdzYYrakOQIsMLffZ2Z/HWk= +cloud.google.com/go/trace v1.11.7 h1:kDNDX8JkaAG3R2nq1lIdkb7FCSi1rCmsEtKVsty7p+U= +cloud.google.com/go/trace v1.11.7/go.mod h1:TNn9d5V3fQVf6s4SCveVMIBS2LJUqo73GACmq/Tky0s= +cosmossdk.io/api v0.7.6 h1:PC20PcXy1xYKH2KU4RMurVoFjjKkCgYRbVAD4PdqUuY= +cosmossdk.io/api v0.7.6/go.mod h1:IcxpYS5fMemZGqyYtErK7OqvdM0C8kdW3dq8Q/XIG38= +cosmossdk.io/client/v2 v2.0.0-beta.4 h1:LGIzWbVTOof/IHQZeoWwxPX0fq607ONXhsfA7eUrQIg= +cosmossdk.io/client/v2 v2.0.0-beta.4/go.mod h1:c753d0sBv3AQRx6X+BOKL1aGpKjZMTZAHGiLPbVi5TE= +cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= +cosmossdk.io/collections v0.4.0/go.mod h1:oa5lUING2dP+gdDquow+QjlF45eL1t4TJDypgGd+tv0= +cosmossdk.io/core v0.11.1 h1:h9WfBey7NAiFfIcUhDVNS503I2P2HdZLebJlUIs8LPA= +cosmossdk.io/core v0.11.1/go.mod h1:OJzxcdC+RPrgGF8NJZR2uoQr56tc7gfBKhiKeDO7hH0= +cosmossdk.io/depinject v1.1.0 h1:wLan7LG35VM7Yo6ov0jId3RHWCGRhe8E8bsuARorl5E= +cosmossdk.io/depinject v1.1.0/go.mod h1:kkI5H9jCGHeKeYWXTqYdruogYrEeWvBQCw1Pj4/eCFI= +cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= +cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= +cosmossdk.io/log v1.4.1 h1:wKdjfDRbDyZRuWa8M+9nuvpVYxrEOwbD/CA8hvhU8QM= +cosmossdk.io/log v1.4.1/go.mod h1:k08v0Pyq+gCP6phvdI6RCGhLf/r425UT6Rk/m+o74rU= +cosmossdk.io/math v1.4.0 h1:XbgExXFnXmF/CccPPEto40gOO7FpWu9yWNAZPN3nkNQ= +cosmossdk.io/math v1.4.0/go.mod h1:O5PkD4apz2jZs4zqFdTr16e1dcaQCc5z6lkEnrrppuk= +cosmossdk.io/store v1.1.1 h1:NA3PioJtWDVU7cHHeyvdva5J/ggyLDkyH0hGHl2804Y= +cosmossdk.io/store v1.1.1/go.mod h1:8DwVTz83/2PSI366FERGbWSH7hL6sB7HbYp8bqksNwM= +cosmossdk.io/x/circuit v0.1.1 h1:KPJCnLChWrxD4jLwUiuQaf5mFD/1m7Omyo7oooefBVQ= +cosmossdk.io/x/circuit v0.1.1/go.mod h1:B6f/urRuQH8gjt4eLIXfZJucrbreuYrKh5CSjaOxr+Q= +cosmossdk.io/x/evidence v0.1.1 h1:Ks+BLTa3uftFpElLTDp9L76t2b58htjVbSZ86aoK/E4= +cosmossdk.io/x/evidence v0.1.1/go.mod h1:OoDsWlbtuyqS70LY51aX8FBTvguQqvFrt78qL7UzeNc= +cosmossdk.io/x/feegrant v0.1.1 h1:EKFWOeo/pup0yF0svDisWWKAA9Zags6Zd0P3nRvVvw8= +cosmossdk.io/x/feegrant v0.1.1/go.mod h1:2GjVVxX6G2fta8LWj7pC/ytHjryA6MHAJroBWHFNiEQ= +cosmossdk.io/x/tx v0.13.7 h1:8WSk6B/OHJLYjiZeMKhq7DK7lHDMyK0UfDbBMxVmeOI= +cosmossdk.io/x/tx v0.13.7/go.mod h1:V6DImnwJMTq5qFjeGWpXNiT/fjgE4HtmclRmTqRVM3w= +cosmossdk.io/x/upgrade v0.1.4 h1:/BWJim24QHoXde8Bc64/2BSEB6W4eTydq0X/2f8+g38= +cosmossdk.io/x/upgrade v0.1.4/go.mod h1:9v0Aj+fs97O+Ztw+tG3/tp5JSlrmT7IcFhAebQHmOPo= +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +filippo.io/edwards25519 v1.1.1 h1:YpjwWWlNmGIDyXOn8zLzqiD+9TyIlPhGFG96P39uBpw= +filippo.io/edwards25519 v1.1.1/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= +github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1/go.mod h1:RKUqNu35KJYcVG/fqTRqmuXJZYNhYkBrnC/hX7yGbTA= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1/go.mod h1:uE9zaUfEQT/nbQjVi2IblCG9iaLtZsuYZ8ne+PuQ02M= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1/go.mod h1:h8hyGFDsU5HMivxiS2iYFZsgDbU9OnnJ163x5UGVKYo= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0 h1:U2rTu3Ef+7w9FHKIAXM6ZyqF3UOWJZ12zIm8zECAFfg= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 h1:jBQA3cKT4L2rWMpgE7Yt3Hwh2aUj8KXjIGLxjHeYNNo= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0/go.mod h1:4OG6tQ9EOP/MT0NMjDlRzWoVFxfu9rN9B2X+tlSVktg= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1/go.mod h1:GpPjLhVR9dnUoJMyHWSPy71xY9/lcmpzIPZXmF0FCVY= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.1.0 h1:DRiANoJTiW6obBQe3SqZizkuV1PEgfiiGivmVocDy64= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.1.0/go.mod h1:qLIye2hwb/ZouqhpSD9Zn3SJipvpEnz1Ywl3VUk9Y0s= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 h1:D3occbWoio4EBLkbkevetNMAVX197GkzbUMtqjGWn80= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= +github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= +github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 h1:sBEjpZlNHzK1voKq9695PJSX2o5NEXl7/OL3coiIY0c= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 h1:UnDZ/zFfG1JhH/DqxIZYU/1CUAlTUScoXD/LcM2Ykk8= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0/go.mod h1:IA1C1U7jO/ENqm/vhi7V9YYpBsp+IMyqNrEN94N7tVc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0 h1:7t/qx5Ost0s0wbA/VDrByOooURhp+ikYwv20i9Y07TQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0/go.mod h1:vB2GH9GAYYJTO3mEn8oYwzEdhlayZIdQz6zdzgUIRvA= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 h1:0s6TxfCu2KHkkZPnBfsQ2y5qia0jl3MMrmBhu3nCOYk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= +github.com/IGLOU-EU/go-wildcard v1.0.3 h1:r8T46+8/9V1STciXJomTWRpPEv4nGJATDbJkdU0Nou0= +github.com/IGLOU-EU/go-wildcard v1.0.3/go.mod h1:/qeV4QLmydCbwH0UMQJmXDryrFKJknWi/jjO8IiuQfY= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/Microsoft/hcsshim v0.11.5 h1:haEcLNpj9Ka1gd3B3tAEs9CpE0c+1IhoL59w/exYU38= +github.com/Microsoft/hcsshim v0.11.5/go.mod h1:MV8xMfmECjl5HdO7U/3/hFVnkmSBjAjmA09d4bExKcU= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= +github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= +github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alitto/pond v1.8.3 h1:ydIqygCLVPqIX/USe5EaV/aSRXTRXDEI9JwuDdu+/xs= +github.com/alitto/pond v1.8.3/go.mod h1:CmvIIGd5jKLasGI3D87qDkQxjzChdKMmnXMg3fG6M6Q= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= +github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= +github.com/aptos-labs/serde-reflection/serde-generate/runtime/golang v0.0.0-20231213012317-73b6bbf74833 h1:/OtHsUoaVegyyGQ9/Ycm5vrC3xTTyj4+N/HsJ0wwAGA= +github.com/aptos-labs/serde-reflection/serde-generate/runtime/golang v0.0.0-20231213012317-73b6bbf74833/go.mod h1:zUz5maIUAS+tl1lC+lJR7HUf0vVnHk6W7bCvN+DzjME= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/aws/aws-sdk-go-v2 v1.41.4 h1:10f50G7WyU02T56ox1wWXq+zTX9I1zxG46HYuG1hH/k= +github.com/aws/aws-sdk-go-v2 v1.41.4/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 h1:3kGOqnh1pPeddVa/E37XNTaWJ8W6vrbYV9lJEkCnhuY= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI= +github.com/aws/aws-sdk-go-v2/config v1.32.12 h1:O3csC7HUGn2895eNrLytOJQdoL2xyJy0iYXhoZ1OmP0= +github.com/aws/aws-sdk-go-v2/config v1.32.12/go.mod h1:96zTvoOFR4FURjI+/5wY1vc1ABceROO4lWgWJuxgy0g= +github.com/aws/aws-sdk-go-v2/credentials v1.19.12 h1:oqtA6v+y5fZg//tcTWahyN9PEn5eDU/Wpvc2+kJ4aY8= +github.com/aws/aws-sdk-go-v2/credentials v1.19.12/go.mod h1:U3R1RtSHx6NB0DvEQFGyf/0sbrpJrluENHdPy1j/3TE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 h1:zOgq3uezl5nznfoK3ODuqbhVg1JzAGDUhXOsU0IDCAo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20/go.mod h1:z/MVwUARehy6GAg/yQ1GO2IMl0k++cu1ohP9zo887wE= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 h1:CNXO7mvgThFGqOFgbNAP2nol2qAWBOGfqR/7tQlvLmc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20/go.mod h1:oydPDJKcfMhgfcgBUZaG+toBbwy8yPWubJXBVERtI4o= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 h1:tN6W/hg+pkM+tf9XDkWUbDEjGLb+raoBMFsTodcoYKw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20/go.mod h1:YJ898MhD067hSHA6xYCx5ts/jEd8BSOLtQDL3iZsvbc= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21 h1:SwGMTMLIlvDNyhMteQ6r8IJSBPlRdXX5d4idhIGbkXA= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21/go.mod h1:UUxgWxofmOdAMuqEsSppbDtGKLfR04HGsD0HXzvhI1k= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 h1:qtJZ70afD3ISKWnoX3xB0J2otEqu3LqicRcDBqsj0hQ= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12/go.mod h1:v2pNpJbRNl4vEUWEh5ytQok0zACAKfdmKS51Hotc3pQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 h1:2HvVAIq+YqgGotK6EkMf+KIEqTISmTYh5zLpYyeTo1Y= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20/go.mod h1:V4X406Y666khGa8ghKmphma/7C0DAtEQYhkq9z4vpbk= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 h1:siU1A6xjUZ2N8zjTHSXFhB9L/2OY8Dqs0xXiLjF30jA= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20/go.mod h1:4TLZCmVJDM3FOu5P5TJP0zOlu9zWgDWU7aUxWbr+rcw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1 h1:csi9NLpFZXb9fxY7rS1xVzgPRGMt7MSNWeQ6eo247kE= +github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1/go.mod h1:qXVal5H0ChqXP63t6jze5LmFalc7+ZE7wOdLtZ0LCP0= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 h1:0GFOLzEbOyZABS3PhYfBIx2rNBACYcKty+XGkTgw1ow= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.8/go.mod h1:LXypKvk85AROkKhOG6/YEcHFPoX+prKTowKnVdcaIxE= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 h1:kiIDLZ005EcKomYYITtfsjn7dtOwHDOFy7IbPXKek2o= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.13/go.mod h1:2h/xGEowcW/g38g06g3KpRWDlT+OTfxxI0o1KqayAB8= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 h1:jzKAXIlhZhJbnYwHbvUQZEB8KfgAEuG0dc08Bkda7NU= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17/go.mod h1:Al9fFsXjv4KfbzQHGe6V4NZSZQXecFcvaIF4e70FoRA= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 h1:Cng+OOwCHmFljXIxpEVXAGMnBia8MSU6Ch5i9PgBkcU= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.9/go.mod h1:LrlIndBDdjA/EeXeyNBle+gyCwTlizzW5ycgWnvIxkk= +github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng= +github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= +github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bits-and-blooms/bitset v1.20.0 h1:2F+rfL86jE2d/bmw7OhqUg2Sj/1rURkBn3MdfoPyRVU= +github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bmatcuk/doublestar v1.3.4 h1:gPypJ5xD31uhX6Tf54sDPUOBXTqKH4c9aPY66CyQrS0= +github.com/bmatcuk/doublestar v1.3.4/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/btcutil v1.1.6 h1:zFL2+c3Lb9gEgqKNzowKUPQNb8jV7v5Oaodi/AYFd6c= +github.com/btcsuite/btcd/btcutil v1.1.6/go.mod h1:9dFymx8HpuLqBnsPELrImQeTQfKBQqzqGbbV3jK55aE= +github.com/bufbuild/protocompile v0.8.0 h1:9Kp1q6OkS9L4nM3FYbr8vlJnEwtbpDPQlQOVXfR+78s= +github.com/bufbuild/protocompile v0.8.0/go.mod h1:+Etjg4guZoAqzVk2czwEQP12yaxLJ8DxuqCJ9qHdH94= +github.com/buger/goterm v1.0.4 h1:Z9YvGmOih81P0FbVtEYTFF6YsSgxSUKEhf/f9bTMXbY= +github.com/buger/goterm v1.0.4/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d h1:S2NE3iHSwP0XV47EEXL8mWmRdEfGscSJ+7EgePNgt0s= +github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= +github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= +github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 h1:6xNmx7iTtyBRev0+D/Tv1FZd4SCg8axKApyNyRsAt/w= +github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/BuvyMxRnYBlmVaq4OLiKW6iRQfvC62cvdkI= +github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= +github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v1.1.5 h1:5AAWCBWbat0uE0blr8qzufZP5tBjkRyy/jWe1QWLnvw= +github.com/cockroachdb/pebble v1.1.5/go.mod h1:17wO9el1YEigxkP/YtV8NtCivQDgoCyBg5c4VR/eOWo= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/cometbft/cometbft-db v0.15.0 h1:VLtsRt8udD4jHCyjvrsTBpgz83qne5hnL245AcPJVRk= +github.com/cometbft/cometbft-db v0.15.0/go.mod h1:EBrFs1GDRiTqrWXYi4v90Awf/gcdD5ExzdPbg4X8+mk= +github.com/compose-spec/compose-go/v2 v2.1.3 h1:bD67uqLuL/XgkAK6ir3xZvNLFPxPScEi1KW7R5esrLE= +github.com/compose-spec/compose-go/v2 v2.1.3/go.mod h1:lFN0DrMxIncJGYAXTfWuajfwj5haBJqrBkarHcnjJKc= +github.com/confluentinc/confluent-kafka-go/v2 v2.6.1 h1:XFkytnGvk/ZcY2qU0ql4E4h+ftBaGqkLO7tlZ4kRbr4= +github.com/confluentinc/confluent-kafka-go/v2 v2.6.1/go.mod h1:hScqtFIGUI1wqHIgM3mjoqEou4VweGGGX7dMpcUKves= +github.com/containerd/console v1.0.4 h1:F2g4+oChYvBTsASRTz8NP6iIAi97J3TtSAsLbIFn4ro= +github.com/containerd/console v1.0.4/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= +github.com/containerd/containerd v1.7.18 h1:jqjZTQNfXGoEaZdW1WwPU0RqSn1Bm2Ay/KJPUuO8nao= +github.com/containerd/containerd v1.7.18/go.mod h1:IYEk9/IO6wAPUz2bCMVUbsfXjzw5UNP5fLz4PsUygQ4= +github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8= +github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/containerd/errdefs v0.1.0 h1:m0wCRBiu1WJT/Fr+iOoQHMQS/eP5myQ8lCv4Dz5ZURM= +github.com/containerd/errdefs v0.1.0/go.mod h1:YgWiiHtLmSeBrvpw+UfPijzbLaB77mEG1WwJTDETIV0= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +github.com/containerd/ttrpc v1.2.5 h1:IFckT1EFQoFBMG4c3sMdT8EP3/aKfumK1msY+Ze4oLU= +github.com/containerd/ttrpc v1.2.5/go.mod h1:YCXHsb32f+Sq5/72xHubdiJRQY9inL4a4ZQrAbN1q9o= +github.com/containerd/typeurl/v2 v2.1.1 h1:3Q4Pt7i8nYwy2KmQWIw2+1hTvwTE/6w9FqcttATPO/4= +github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3HZj1hsSQlywkQ0= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= +github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= +github.com/cosmos/cosmos-db v1.1.1 h1:FezFSU37AlBC8S98NlSagL76oqBRWq/prTPvFcEJNCM= +github.com/cosmos/cosmos-db v1.1.1/go.mod h1:AghjcIPqdhSLP/2Z0yha5xPH3nLnskz81pBx3tcVSAw= +github.com/cosmos/cosmos-proto v1.0.0-beta.5 h1:eNcayDLpip+zVLRLYafhzLvQlSmyab+RC5W7ZfmxJLA= +github.com/cosmos/cosmos-proto v1.0.0-beta.5/go.mod h1:hQGLpiIUloJBMdQMMWb/4wRApmI9hjHH05nefC0Ojec= +github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= +github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= +github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= +github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= +github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= +github.com/cosmos/gogoproto v1.7.0 h1:79USr0oyXAbxg3rspGh/m4SWNyoz/GLaAh0QlCe2fro= +github.com/cosmos/gogoproto v1.7.0/go.mod h1:yWChEv5IUEYURQasfyBW5ffkMHR/90hiHgbNgrtp4j0= +github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.2.0 h1:rM+S14DFiqmu6Rc3PuhvWqwywPsnt/CbIslSnBftPFs= +github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.2.0/go.mod h1:O5H9Ic3Pe6cmJn1eqlj5N48sLb8WQ1VWmDP4/11g/4E= +github.com/cosmos/ibc-apps/modules/rate-limiting/v8 v8.0.0 h1:AQO9NIAP3RFqvBCj7IqM/V1LCxmuvcvGUdu0RIEz/c0= +github.com/cosmos/ibc-apps/modules/rate-limiting/v8 v8.0.0/go.mod h1:/ZpKJSW/SKPkFS7jTqkPVn7kOHUUfRNzu+8aS7YOL8o= +github.com/cosmos/ibc-go/modules/capability v1.0.1 h1:ibwhrpJ3SftEEZRxCRkH0fQZ9svjthrX2+oXdZvzgGI= +github.com/cosmos/ibc-go/modules/capability v1.0.1/go.mod h1:rquyOV262nGJplkumH+/LeYs04P3eV8oB7ZM4Ygqk4E= +github.com/cosmos/ibc-go/v8 v8.7.0 h1:HqhVOkO8bDpClXE81DFQgFjroQcTvtpm0tCS7SQVKVY= +github.com/cosmos/ibc-go/v8 v8.7.0/go.mod h1:G2z+Q6ZQSMcyHI2+BVcJdvfOupb09M2h/tgpXOEdY6k= +github.com/cosmos/ics23/go v0.11.0 h1:jk5skjT0TqX5e5QJbEnwXIS2yI2vnmLOgpQPeM5RtnU= +github.com/cosmos/ics23/go v0.11.0/go.mod h1:A8OjxPE67hHST4Icw94hOxxFEJMBG031xIGF/JHNIY0= +github.com/cosmos/interchain-security/v6 v6.3.0 h1:AIsfxLUDtUGVfaqJ1WPwnYIOT5AxoSO58469iw9vNH4= +github.com/cosmos/interchain-security/v6 v6.3.0/go.mod h1:6DSiV2w+DuPkxP1KGFtaxpiwf8Xt2iusj8O53KCx96Q= +github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo= +github.com/cosmos/keyring v1.2.0/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= +github.com/cosmos/ledger-cosmos-go v0.14.0 h1:WfCHricT3rPbkPSVKRH+L4fQGKYHuGOK9Edpel8TYpE= +github.com/cosmos/ledger-cosmos-go v0.14.0/go.mod h1:E07xCWSBl3mTGofZ2QnL4cIUzMbbGVyik84QYKbX3RA= +github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= +github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= +github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.1.0 h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U0x++OzVrdms8= +github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= +github.com/dgraph-io/badger/v4 v4.3.0 h1:lcsCE1/1qrRhqP+zYx6xDZb8n7U+QlwNicpc676Ub40= +github.com/dgraph-io/badger/v4 v4.3.0/go.mod h1:Sc0T595g8zqAQRDf44n+z3wG4BOqLwceaFntt8KPxUM= +github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91 h1:Pux6+xANi0I7RRo5E1gflI4EZ2yx3BGZ75JkAIvGEOA= +github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91/go.mod h1:swkazRqnUf1N62d0Nutz7KIj2UKqsm/H8tD0nBJAXqM= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dhui/dktest v0.4.5 h1:uUfYBIVREmj/Rw6MvgmqNAYzTiKOHJak+enB5Di73MM= +github.com/dhui/dktest v0.4.5/go.mod h1:tmcyeHDKagvlDrz7gDKq4UAJOLIfVZYkfD5OnHDwcCo= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/docker/buildx v0.15.1 h1:1cO6JIc0rOoC8tlxfXoh1HH1uxaNvYH1q7J7kv5enhw= +github.com/docker/buildx v0.15.1/go.mod h1:16DQgJqoggmadc1UhLaUTPqKtR+PlByN/kyXFdkhFCo= +github.com/docker/cli v27.0.3+incompatible h1:usGs0/BoBW8MWxGeEtqPMkzOY56jZ6kYlSN5BLDioCQ= +github.com/docker/cli v27.0.3+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/compose/v2 v2.28.1 h1:ORPfiVHrpnRQBDoC3F8JJyWAY8N5gWuo3FgwyivxFdM= +github.com/docker/compose/v2 v2.28.1/go.mod h1:wDtGQFHe99sPLCHXeVbCkc+Wsl4Y/2ZxiAJa/nga6rA= +github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= +github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v27.2.0+incompatible h1:Rk9nIVdfH3+Vz4cyI/uhbINhEZ/oLmc+CBXmH6fbNk4= +github.com/docker/docker v27.2.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8= +github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c/go.mod h1:CADgU4DSXK5QUlFslkQu2yW2TKzFZcXq/leZfM0UH5Q= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/dvsekhvalnov/jose2go v1.7.0 h1:bnQc8+GMnidJZA8zc6lLEAb4xNrIqHwO+9TzqvtQZPo= +github.com/dvsekhvalnov/jose2go v1.7.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203 h1:XBBHcIb256gUJtLmY22n99HaZTz+r2Z51xUPi01m3wg= +github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203/go.mod h1:E1jcSv8FaEny+OP/5k9UxZVw9YFWGj7eI4KR/iOBqCg= +github.com/emicklei/dot v1.6.2 h1:08GN+DD79cy/tzN6uLCT84+2Wk9u+wvqP+Hkx/dIR8A= +github.com/emicklei/dot v1.6.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= +github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= +github.com/envoyproxy/go-control-plane/envoy v1.36.0 h1:yg/JjO5E7ubRyKX3m07GF3reDNEnfOboJ0QySbH736g= +github.com/envoyproxy/go-control-plane/envoy v1.36.0/go.mod h1:ty89S1YCCVruQAm9OtKeEkQLTb+Lkz0k8v9W0Oxsv98= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4= +github.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA= +github.com/ethereum/go-ethereum v1.16.9 h1:UTJ93yoXD7BEMWg+9lSZ8/Zvf0oZfy2ZUmv0Gn0ZclE= +github.com/ethereum/go-ethereum v1.16.9/go.mod h1:Fs6QebQbavneQTYcA39PEKv2+zIjX7rPUZ14DER46wk= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsevents v0.2.0 h1:BRlvlqjvNTfogHfeBOFvSC9N0Ddy+wzQCQukyoD7o/c= +github.com/fsnotify/fsevents v0.2.0/go.mod h1:B3eEk39i4hz8y1zaWS/wPrAP4O6wkIl7HQwKBr1qH/w= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fvbommel/sortorder v1.0.2 h1:mV4o8B2hKboCdkJm+a7uX/SIpZob4JzUpc5GGnM45eo= +github.com/fvbommel/sortorder v1.0.2/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/getsentry/sentry-go v0.29.1 h1:DyZuChN8Hz3ARxGVV8ePaNXh1dQ7d76AiB117xcREwA= +github.com/getsentry/sentry-go v0.29.1/go.mod h1:x3AtIzN01d6SiWkderzaH28Tm0lgkafpJ5Bm3li39O0= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= +github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= +github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU= +github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= +github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= +github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= +github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= +github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/gobwas/ws v1.1.0 h1:7RFti/xnNkMJnrK7D1yQ/iCIB5OrrY/54/H930kIbHA= +github.com/gobwas/ws v1.1.0/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0= +github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= +github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-migrate/migrate/v4 v4.18.3 h1:EYGkoOsvgHHfm5U/naS1RP/6PL/Xv3S4B/swMiAmDLs= +github.com/golang-migrate/migrate/v4 v4.18.3/go.mod h1:99BKpIi6ruaaXRM1A77eqZ+FWPQ3cfRa+ZVy5bmWMaY= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg= +github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= +github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= +github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= +github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8= +github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= +github.com/googleapis/gax-go/v2 v2.17.0 h1:RksgfBpxqff0EZkDWYuz9q/uWsTVz+kf43LsZ1J6SMc= +github.com/googleapis/gax-go/v2 v2.17.0/go.mod h1:mzaqghpQp4JDh3HvADwrat+6M3MOIDp5YKHhb9PAgDY= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= +github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= +github.com/h2non/bimg v1.1.9 h1:WH20Nxko9l/HFm4kZCA3Phbgu2cbHvYzxwxn9YROEGg= +github.com/h2non/bimg v1.1.9/go.mod h1:R3+UiYwkK4rQl6KVFTOFJHitgLbZXBZNFh2cv3AEbp8= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 h1:vTCWu1wbdYo7PEZFem/rlr01+Un+wwVmI7wiegFdRLk= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72/go.mod h1:Vn+BBgKQHVQYdVQ4NZDICE1Brb+JfaONyDHr3q07oQc= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk131ebY= +github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-metrics v0.5.3 h1:M5uADWMOGCTUNU1YuC4hfknOeHNaX54LDm4oYSucoNE= +github.com/hashicorp/go-metrics v0.5.3/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-plugin v1.5.2 h1:aWv8eimFqWlsEiMrYZdPYl+FdHaBJSN4AWwGWfT1G2Y= +github.com/hashicorp/go-plugin v1.5.2/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.8.0 h1:KAkNb1HAiZd1ukkxDFGmokVZe1Xy9HG6NUp+bPle2i4= +github.com/hashicorp/go-version v1.8.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/hcl/v2 v2.18.1 h1:6nxnOJFku1EuSawSD81fuviYUV8DxFr3fp2dUi3ZYSo= +github.com/hashicorp/hcl/v2 v2.18.1/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+JtMeeGErHE= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= +github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= +github.com/holiman/uint256 v1.3.2 h1:a9EgMPSC1AAaj1SZL5zIQD3WbwTuHrMGOerLjGmM/TA= +github.com/holiman/uint256 v1.3.2/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= +github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= +github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= +github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/iancoleman/orderedmap v0.3.0 h1:5cbR2grmZR/DiVt+VJopEhtVs9YGInGIxAoMJn+Ichc= +github.com/iancoleman/orderedmap v0.3.0/go.mod h1:XuLcCUkdL5owUCQeF2Ue9uuw1EptkJDkXXS7VoV7XGE= +github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= +github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= +github.com/in-toto/in-toto-golang v0.5.0 h1:hb8bgwr0M2hGdDsLjkJ3ZqJ8JFLL/tgYdAxF/XEFBbY= +github.com/in-toto/in-toto-golang v0.5.0/go.mod h1:/Rq0IZHLV7Ku5gielPT4wPHJfH1GdHMCq8+WPxw8/BE= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/initia-labs/OPinit v1.3.0 h1:cGxJpzVOfxGO8Ql/Z6SVJCSpokkqB4jFBjo6kx9Uax8= +github.com/initia-labs/OPinit v1.3.0/go.mod h1:VZG+/Wd/9cVDbzCwZld/tve6kcJC1zemeeQvp5FKKCI= +github.com/initia-labs/OPinit/api v1.3.0 h1:MAu4XEJ2uibDVKBo0jB6b6/BGaoXjDUJC+dwhU530ag= +github.com/initia-labs/OPinit/api v1.3.0/go.mod h1:sWDfvmcxd7KD59ukB/Wz0BSpyimyptDEzz1Epe/ET+Y= +github.com/initia-labs/cometbft v0.38.21-initia.2 h1:sFFc6JnbPKFd4XdH3EXZ7TBfi3uVv34HdyHVX5gvvlQ= +github.com/initia-labs/cometbft v0.38.21-initia.2/go.mod h1:CQ/VkJXRdaWxDLyKT+JYAWV0m215oRFtymtIr7skA6o= +github.com/initia-labs/connect/v2 v2.3.1 h1:Y32LCwUHDBgUzzQHqPBJeWeItYoNu2oYD57JKbZCtjw= +github.com/initia-labs/connect/v2 v2.3.1/go.mod h1:35hM7xSgI0h3GMUTgspzKY8Ff2yCXNGNwmAdjqo3z8s= +github.com/initia-labs/cosmos-sdk v0.50.15-initia.0 h1:cgKCqzXBm8md5Q5C9VAyIGCheHhNcOGK/BwpFbett2g= +github.com/initia-labs/cosmos-sdk v0.50.15-initia.0/go.mod h1:/dinzXHi7qK0dEPZjS3LI5gMHueKQdqyjbB9chwswo0= +github.com/initia-labs/forwarding/simapp v1.0.0 h1:MNHLACO0053BAMO3+Ra2ZTlTTB5WieFElguDQH5d8fc= +github.com/initia-labs/forwarding/simapp v1.0.0/go.mod h1:MOIDS73NjoIvTZ3OxUmJXY+Ry7xxXumrXPVZrAeJOhY= +github.com/initia-labs/forwarding/v2 v2.0.3-initia.3 h1:Uu1VqRsSwX7rgS2A4M3Snzyzk9mJRq2v/ZD4xKHTJkM= +github.com/initia-labs/forwarding/v2 v2.0.3-initia.3/go.mod h1:N3OzYf14ton71zCxomBmpR7tOxZ2dKwhsMxUmtuJuVQ= +github.com/initia-labs/iavl v1.2.6-initia.1 h1:4vf9eiccLkob2eiM8YAM8Gf/UBniEFUKpvncM/hVoO8= +github.com/initia-labs/iavl v1.2.6-initia.1/go.mod h1:GiM43q0pB+uG53mLxLDzimxM9l/5N9UuSY3/D0huuVw= +github.com/initia-labs/initia v1.4.3 h1:cEnENL26T7hsa0oDm4hf953tUQYc1cQ3fll84jBfoa0= +github.com/initia-labs/initia v1.4.3/go.mod h1:Y7ir28A0RmL3AQpvTK/mXzyvF6RtijgH/v520xvrk3s= +github.com/initia-labs/initia/api v1.4.0 h1:1DOUBxugC9ZdtMnmmN3qFWnNjlW7I6sssvvu4/ohVtU= +github.com/initia-labs/initia/api v1.4.0/go.mod h1:YQAtPknqt4tZSj+AK0OfZ83XXah2MCna/Ko74/VQe6Q= +github.com/initia-labs/movevm v1.2.0 h1:IbpipjRIZe851FJZZzP3RGIqrOCcNsI6bDF9VC0K0do= +github.com/initia-labs/movevm v1.2.0/go.mod h1:sj/kXD7mUQASqogPTjqltIr4Uid3xxnlcbfiFvvqeXA= +github.com/initia-labs/store v0.1.1 h1:sc4PTv30oS99t0EWgFPy0pCFPYJsHngB2QfZS5XY/Xo= +github.com/initia-labs/store v0.1.1/go.mod h1:8Hgv+JpqjFYy2335pHLnMq6LmVdXyF1G17yi6uWl76M= +github.com/initia-labs/store/memiavl v0.1.1 h1:aymS3es9pPY7ysizK2K+r4TImR0W5N1C5Ld75HRMvXc= +github.com/initia-labs/store/memiavl v0.1.1/go.mod h1:510W4Nf6QAWmFLYPhqhOhO1tagdeocM0b89a/M0zMRk= +github.com/initia-labs/store/versiondb v0.1.0 h1:8lQK7Q6GUwwAc8R3IIBbj9MOlIkKCq0nwnRpjT20Ahc= +github.com/initia-labs/store/versiondb v0.1.0/go.mod h1:fP27G3qPUluu7yM8j2xcW05Brmj0QBT7nlTTFvEszNc= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.9.2 h1:3ZhOzMWnR4yJ+RW1XImIPsD1aNSz4T4fyP7zlQb56hw= +github.com/jackc/pgx/v5 v5.9.2/go.mod h1:mal1tBGAFfLHvZzaYh77YS/eC6IX9OWbRV1QIIM0Jn4= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jhump/protoreflect v1.15.6 h1:WMYJbw2Wo+KOWwZFvgY0jMoVHM6i4XIvRs2RcBj5VmI= +github.com/jhump/protoreflect v1.15.6/go.mod h1:jCHoyYQIJnaabEYnbGwyo9hUqfyUMTbJw/tAut5t97E= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= +github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE= +github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/ledgerwatch/erigon-lib v0.0.0-20230210071639-db0e7ed11263 h1:LGEzZvf33Y1NhuP5+jI/ni9l1TFS6oYPDilgy74NusM= +github.com/ledgerwatch/erigon-lib v0.0.0-20230210071639-db0e7ed11263/go.mod h1:OXgMDuUo2lZ3NpH29ZvMYbk+LxFd5ffDl2Z2mGMuY/I= +github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/linxGnu/grocksdb v1.10.3 h1:0laII9AQ6kFxo5SjhdTfSh9EgF20piD6TMHK6YuDm+4= +github.com/linxGnu/grocksdb v1.10.3/go.mod h1:OLQKZwiKwaJiAVCsOzWKvwiLwfZ5Vz8Md5TYR7t7pM8= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= +github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +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.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/microsoft/go-mssqldb v1.7.2 h1:CHkFJiObW7ItKTJfHo1QX7QBBD1iV+mn1eOyRP3b/PA= +github.com/microsoft/go-mssqldb v1.7.2/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q= +github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/buildkit v0.14.1 h1:2epLCZTkn4CikdImtsLtIa++7DzCimrrZCT1sway+oI= +github.com/moby/buildkit v0.14.1/go.mod h1:1XssG7cAqv5Bz1xcGMxJL123iCv5TYN4Z/qf647gfuk= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= +github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mountinfo v0.7.1 h1:/tTvQaSJRr2FshkhXiIpux6fQ2Zvc4j7tAhMTStAG2g= +github.com/moby/sys/mountinfo v0.7.1/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +github.com/moby/sys/signal v0.7.0 h1:25RW3d5TnQEoKvRbEKUGay6DCQ46IxAVTT9CUMgmsSI= +github.com/moby/sys/signal v0.7.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/moby/sys/symlink v0.2.0 h1:tk1rOM+Ljp0nFmfOIBtlV3rTDlWOwFRhjEeAhZB0nZc= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= +github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= +github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= +github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= +github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= +github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a h1:dlRvE5fWabOchtH7znfiFCcOvmIYgOeAS5ifBXBlh9Q= +github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= +github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA= +github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= +github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/r3labs/sse v0.0.0-20210224172625-26fe804710bc h1:zAsgcP8MhzAbhMnB1QQ2O7ZhWYVGYSR2iVcjzQuPV+o= +github.com/r3labs/sse v0.0.0-20210224172625-26fe804710bc/go.mod h1:S8xSOnV3CgpNrWd0GQ/OoQfMtlg2uPRSuTzcSGrzwK8= +github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= +github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= +github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= +github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sasha-s/go-deadlock v0.3.5 h1:tNCOEEDG6tBqrNDOX35j/7hL5FcFViG6awUGROb2NsU= +github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6vCBBsiChJQ5U= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/secure-systems-lab/go-securesystemslib v0.4.0 h1:b23VGrQhTA8cN2CbBw7/FulN9fTtqYUdS5+Oxzt+DUE= +github.com/secure-systems-lab/go-securesystemslib v0.4.0/go.mod h1:FGBZgq2tXWICsxWQW1msNf49F0Pf2Op5Htayx335Qbs= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= +github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b h1:h+3JX2VoWTFuyQEo87pStk/a99dzIO1mM9KxIyLPGTU= +github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= +github.com/shibumi/go-pathspec v1.3.0 h1:QUyMZhFo0Md5B8zV8x2tesohbb5kfbpTi9rBnKh5dkI= +github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= +github.com/shirou/gopsutil/v3 v3.23.12 h1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4= +github.com/shirou/gopsutil/v3 v3.23.12/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610 h1:4JlsiRVt/YZOvrKH525T7sZXgEWUEjqSDMwE6fXNbdo= +github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610/go.mod h1:kB8gFZX07CyJnw8q9iEZijI3qJTIe1K/Y++P5VGkrcg= +github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= +github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= +github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= +github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= +github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= +github.com/testcontainers/testcontainers-go v0.33.0 h1:zJS9PfXYT5O0ZFXM2xxXfk4J5UMw/kRiISng037Gxdw= +github.com/testcontainers/testcontainers-go v0.33.0/go.mod h1:W80YpTa8D5C3Yy16icheD01UTDu+LmXIA2Keo+jWtT8= +github.com/testcontainers/testcontainers-go/modules/compose v0.33.0 h1:PyrUOF+zG+xrS3p+FesyVxMI+9U+7pwhZhyFozH3jKY= +github.com/testcontainers/testcontainers-go/modules/compose v0.33.0/go.mod h1:oqZaUnFEskdZriO51YBquku/jhgzoXHPot6xe1DqKV4= +github.com/theupdateframework/notary v0.7.0 h1:QyagRZ7wlSpjT5N2qQAh/pN+DVqgekv4DzbAiAiEL3c= +github.com/theupdateframework/notary v0.7.0/go.mod h1:c9DRxcmhHmVLDay4/2fUYdISnHqbFDGRSlXPO0AhYWw= +github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= +github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= +github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/tinylru v1.1.0 h1:XY6IUfzVTU9rpwdhKUF6nQdChgCdGjkMfLzbWyiau6I= +github.com/tidwall/tinylru v1.1.0/go.mod h1:3+bX+TJ2baOLMWTnlyNWHh4QMnFyARg2TLTQ6OFbzw8= +github.com/tidwall/wal v1.1.7 h1:emc1TRjIVsdKKSnpwGBAcsAGg0767SvUk8+ygx7Bb+4= +github.com/tidwall/wal v1.1.7/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E= +github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375 h1:QB54BJwA6x8QU9nHY3xJSZR2kX9bgpZekRKGkLTmEXA= +github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375/go.mod h1:xRroudyp5iVtxKqZCrA6n2TLFRBf8bmnjr1UD4x+z7g= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tonistiigi/fsutil v0.0.0-20240424095704-91a3fc46842c h1:+6wg/4ORAbnSoGDzg2Q1i3CeMcT/jjhye/ZfnBHy7/M= +github.com/tonistiigi/fsutil v0.0.0-20240424095704-91a3fc46842c/go.mod h1:vbbYqJlnswsbJqWUcJN8fKtBhnEgldDrcagTgnBVKKM= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea h1:SXhTLE6pb6eld/v/cCndK0AMpt1wiVFb/YYmqB3/QG0= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= +github.com/tonistiigi/vt100 v0.0.0-20240514184818-90bafcd6abab h1:H6aJ0yKQ0gF49Qb2z5hI1UHxSQt4JMyxebFR15KnApw= +github.com/tonistiigi/vt100 v0.0.0-20240514184818-90bafcd6abab/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= +github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= +github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= +github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/ybbus/jsonrpc/v3 v3.1.5 h1:0cC/QzS8OCuXYqqDbYnKKhsEe+IZLrNlDx8KPCieeW0= +github.com/ybbus/jsonrpc/v3 v3.1.5/go.mod h1:U1QbyNfL5Pvi2roT0OpRbJeyvGxfWYSgKJHjxWdAEeE= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= +github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/zbiljic/go-filelock v0.0.0-20170914061330-1dbf7103ab7d h1:XQyeLr7N9iY9mi+TGgsBFkj54+j3fdoo8e2u6zrGP5A= +github.com/zbiljic/go-filelock v0.0.0-20170914061330-1dbf7103ab7d/go.mod h1:hoMeDjlNXTNqVwrCk8YDyaBS2g5vFfEX2ezMi4vb6CY= +github.com/zclconf/go-cty v1.14.4 h1:uXXczd9QDGsgu0i/QFR/hzI5NYCHLf6NQw/atrbnhq8= +github.com/zclconf/go-cty v1.14.4/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +github.com/zclconf/go-cty-yaml v1.1.0 h1:nP+jp0qPHv2IhUVqmQSzjvqAWcObN0KBkUl2rWBdig0= +github.com/zclconf/go-cty-yaml v1.1.0/go.mod h1:9YLUH4g7lOhVWqUbctnVlZ5KLpg7JAprQNgxSZ1Gyxs= +github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= +github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= +github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1UpHb342ycI= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5 h1:qxen9oVGzDdIRP6ejyAJc760RwW4SnVDiTYTzwnXuxo= +go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5/go.mod h1:eW0HG9/oHQhvRCvb1/pIXW4cOvtDqeQK+XSi3TnwaXY= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/contrib/detectors/gcp v1.39.0 h1:kWRNZMsfBHZ+uHjiH4y7Etn2FK26LAGkNFw7RHv1DhE= +go.opentelemetry.io/contrib/detectors/gcp v1.39.0/go.mod h1:t/OGqzHBa5v6RHZwrDBJ2OirWc+4q/w2fTbLZwAKjTk= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 h1:YH4g8lQroajqUwWbq/tr2QX1JFmEXaDLgG+ew9bLMWo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0/go.mod h1:fvPi2qXDqFs8M4B4fmJhE92TyQs9Ydjlg3RvfUp+NbQ= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.46.1 h1:gbhw/u49SS3gkPWiYweQNJGm/uJN5GkI/FrosxSHT7A= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.46.1/go.mod h1:GnOaBaFQ2we3b9AGWJpsBa7v1S5RlQzlC3O7dRMxZhM= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0 h1:wNMDy/LVGLj2h3p6zg4d0gypKfWKSWI14E1C4smOgl8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0/go.mod h1:YfbDdXAAkemWJK3H/DshvlrxqFB2rtW4rY6ky/3x/H0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 h1:umZgi92IyxfXd/l4kaDhnKgY8rnN/cZcF1LKc6I8OQ8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0/go.mod h1:4lVs6obhSVRb1EW5FhOuBTyiQhtRtAnnva9vD3yRfq8= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0 h1:ZrPRak/kS4xI3AVXy8F7pipuDXmDsrO8Lg+yQjBLjw0= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0/go.mod h1:3y6kQCWztq6hyW8Z9YxQDDm0Je9AJoFar2G0yDcmhRk= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= +go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4= +go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= +go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +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-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= +golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/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.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/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-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= +golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= +golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/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-20210220032951-036812b2e83c/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/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/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-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/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.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +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.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.41.0 h1:QCgPso/Q3RTJx2Th4bDLqML4W6iJiaXFq2/ftQF13YU= +golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= +golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= +golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +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-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.271.0 h1:cIPN4qcUc61jlh7oXu6pwOQqbJW2GqYh5PS6rB2C/JY= +google.golang.org/api v0.271.0/go.mod h1:CGT29bhwkbF+i11qkRUJb2KMKqcJ1hdFceEIRd9u64Q= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 h1:VQZ/yAbAtjkHgH80teYd2em3xtIkkHd7ZhqfH2N9CsM= +google.golang.org/genproto v0.0.0-20260128011058-8636f8732409/go.mod h1:rxKD3IEILWEu3P44seeNOAwZN4SaoKaQ/2eTg4mM6EM= +google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20 h1:7ei4lp52gK1uSejlA8AZl5AJjeLUOHBQscRQZUgAcu0= +google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20/go.mod h1:ZdbssH/1SOVnjnDlXzxDHK2MCidiqXtbYccJNzNYPEE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 h1:ggcbiqK8WWh6l1dnltU4BgWGIGo+EVYxCaAPih/zQXQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= +google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/cenkalti/backoff.v1 v1.1.0 h1:Arh75ttbsvlpVA7WtVpH4u9h6Zl46xuptxqLxPiSo4Y= +gopkg.in/cenkalti/backoff.v1 v1.1.0/go.mod h1:J6Vskwqd+OMVJl8C33mmtxTBs2gyzfv7UDAkHu8BrjI= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo= +gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= +gorm.io/driver/postgres v1.6.0 h1:2dxzU8xJ+ivvqTRph34QX+WrRaJlmfyPqXmoGVjMBa4= +gorm.io/driver/postgres v1.6.0/go.mod h1:vUw0mrGgrTK+uPHEhAdV4sfFELrByKVGnaVRkXDhtWo= +gorm.io/driver/sqlite v1.5.7 h1:8NvsrhP0ifM7LX9G4zPB97NwovUakUxc+2V2uuf3Z1I= +gorm.io/driver/sqlite v1.5.7/go.mod h1:U+J8craQU6Fzkcvu8oLeAQmi50TkwPEhHDEjQZXDah4= +gorm.io/driver/sqlserver v1.5.4 h1:xA+Y1KDNspv79q43bPyjDMUgHoYHLhXYmdFcYPobg8g= +gorm.io/driver/sqlserver v1.5.4/go.mod h1:+frZ/qYmuna11zHPlh5oc2O6ZA/lS88Keb0XSH1Zh/g= +gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.30.0 h1:qbT5aPv1UH8gI99OsRlvDToLxW5zR7FzS9acZDOZcgs= +gorm.io/gorm v1.30.0/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +k8s.io/api v0.29.2 h1:hBC7B9+MU+ptchxEqTNW2DkUosJpp1P+Wn6YncZ474A= +k8s.io/api v0.29.2/go.mod h1:sdIaaKuU7P44aoyyLlikSLayT6Vb7bvJNCX105xZXY0= +k8s.io/apimachinery v0.29.2 h1:EWGpfJ856oj11C52NRCHuU7rFDwxev48z+6DSlGNsV8= +k8s.io/apimachinery v0.29.2/go.mod h1:6HVkd1FwxIagpYrHSwJlQqZI3G9LfYWRPAkUvLnXTKU= +k8s.io/client-go v0.29.2 h1:FEg85el1TeZp+/vYJM7hkDlSTFZ+c5nnK44DJ4FyoRg= +k8s.io/client-go v0.29.2/go.mod h1:knlvFZE58VpqbQpJNbCbctTVXcd35mMyAAwBdpt4jrA= +k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= +nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= +pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= +tags.cncf.io/container-device-interface v0.7.2 h1:MLqGnWfOr1wB7m08ieI4YJ3IoLKKozEnnNYBtacDPQU= +tags.cncf.io/container-device-interface v0.7.2/go.mod h1:Xb1PvXv2BhfNb3tla4r9JL129ck1Lxv9KuU6eVOfKto= diff --git a/generic-indexer/indexer-cron/indexer-cron.go b/generic-indexer/indexer-cron/indexer-cron.go new file mode 100644 index 00000000..c0ac391f --- /dev/null +++ b/generic-indexer/indexer-cron/indexer-cron.go @@ -0,0 +1,232 @@ +package indexercron + +import ( + "context" + "encoding/json" + "fmt" + "os/signal" + "syscall" + "time" + + "github.com/certifi/gocertifi" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/types" + "github.com/getsentry/sentry-go" + initiaapp "github.com/initia-labs/initia/app" + "github.com/robfig/cron/v3" + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" + "gorm.io/gorm" + + "github.com/initia-labs/core-indexer/pkg/cosmosrpc" + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/mq" + "github.com/initia-labs/core-indexer/pkg/sentry_integration" +) + +type IndexerCron struct { + dbClient *gorm.DB + rpcClient cosmosrpc.CosmosJSONRPCHub + interfaceRegistry codectypes.InterfaceRegistry + DBConnectionString string + config *IndexerCronConfig +} + +type IndexerCronConfig struct { + RPCEndpoints string + Chain string + DBConnectionString string + ValidatorUpdateIntervalInSeconds int64 + ValidatorUptimeUpdateIntervalInSeconds int64 + ValidatorIdentityImageUpdateIntervalInSeconds int64 + Environment string + KeepLatestCommitSignatures int64 + RPCTimeOutInSeconds int64 + SentryDSN string + CommitSHA string + SentryProfilesSampleRate float64 + SentryTracesSampleRate float64 +} + +func New(config *IndexerCronConfig) (*IndexerCron, error) { + logger := zerolog.Ctx(log.With(). + Str("component", "indexer-cron").Str("environment", config.Environment). + Str("commit_sha", config.CommitSHA). + Logger().WithContext(context.Background())) + + sentryClientOptions := sentry.ClientOptions{ + Dsn: config.SentryDSN, + ServerName: config.Chain + "-indexer-cron", + EnableTracing: true, + ProfilesSampleRate: config.SentryProfilesSampleRate, + TracesSampleRate: config.SentryTracesSampleRate, + Environment: config.Environment, + Release: config.CommitSHA, + Tags: map[string]string{ + "chain": config.Chain, + "environment": config.Environment, + "component": "indexer-cron", + "commit_sha": config.CommitSHA, + }, + } + + rootCAs, err := gocertifi.CACerts() + if err != nil { + logger.Fatal().Msgf("Sentry: Error getting root CAs: %v", err) + } else { + sentryClientOptions.CaCerts = rootCAs + } + + err = sentry.Init(sentryClientOptions) + if err != nil { + logger.Fatal().Msgf("Sentry: Error initializing sentry: %v", err) + return nil, err + } + + var rpcEndpoints mq.RPCEndpoints + err = json.Unmarshal([]byte(config.RPCEndpoints), &rpcEndpoints) + if err != nil { + sentry_integration.CaptureCurrentHubException(fmt.Errorf("RPC: Error unmarshalling RPC endpoints: %v", err), sentry.LevelFatal) + logger.Fatal().Msgf("RPC: Error unmarshalling RPC endpoints: %v", err) + return nil, err + } + + if len(rpcEndpoints.RPCs) == 0 { + logger.Fatal().Msgf("RPC: No RPC endpoints provided") + return nil, fmt.Errorf("RPC: No RPC endpoints provided") + } + + clientConfigs := make([]cosmosrpc.ClientConfig, 0) + for _, rpc := range rpcEndpoints.RPCs { + clientConfigs = append(clientConfigs, cosmosrpc.ClientConfig{ + URL: rpc.URL, + ClientOption: &cosmosrpc.ClientOption{CustomHeaders: rpc.Headers}, + }) + } + rpcClient := cosmosrpc.NewHub(clientConfigs, logger, time.Duration(config.RPCTimeOutInSeconds)*time.Second) + dbClient, err := db.NewClient(config.DBConnectionString) + if err != nil { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) + logger.Fatal().Msgf("DB: Error creating DB client. Error: %v", err) + return nil, err + } + + sdkConfig := types.GetConfig() + sdkConfig.SetCoinType(initiaapp.CoinType) + + accountPubKeyPrefix := initiaapp.AccountAddressPrefix + "pub" + validatorAddressPrefix := initiaapp.AccountAddressPrefix + "valoper" + validatorPubKeyPrefix := initiaapp.AccountAddressPrefix + "valoperpub" + consNodeAddressPrefix := initiaapp.AccountAddressPrefix + "valcons" + consNodePubKeyPrefix := initiaapp.AccountAddressPrefix + "valconspub" + + sdkConfig.SetBech32PrefixForAccount(initiaapp.AccountAddressPrefix, accountPubKeyPrefix) + sdkConfig.SetBech32PrefixForValidator(validatorAddressPrefix, validatorPubKeyPrefix) + sdkConfig.SetBech32PrefixForConsensusNode(consNodeAddressPrefix, consNodePubKeyPrefix) + sdkConfig.SetAddressVerifier(initiaapp.VerifyAddressLen()) + sdkConfig.Seal() + + return &IndexerCron{ + rpcClient: rpcClient, + dbClient: dbClient, + config: config, + interfaceRegistry: initiaapp.MakeEncodingConfig().InterfaceRegistry, + }, nil +} + +func createCronHubAndContext(name string) (*sentry.Hub, context.Context) { + hub := sentry.CurrentHub().Clone() + hub.ConfigureScope(func(scope *sentry.Scope) { + scope.SetTag("function_name", name) + }) + + ctx := sentry.SetHubOnContext(context.Background(), hub) + return hub, ctx +} + +func (v *IndexerCron) Run() { + c := cron.New() + updateValidatorsHub, updateValidatorsCtx := createCronHubAndContext("updateValidators") + if _, err := c.AddFunc(fmt.Sprintf("@every %ds", v.config.ValidatorUpdateIntervalInSeconds), func() { + err := updateValidators( + updateValidatorsCtx, + v.dbClient, + v.rpcClient, + v.interfaceRegistry, + v.config, + ) + if err != nil { + sentry_integration.CaptureException(updateValidatorsHub, err, sentry.LevelError) + } + }); err != nil { + log.Error().Err(err).Msg("cron: failed to schedule updateValidators") + } + + updateValidatorUptimeLast10000Hub, updateValidatorUptimeLast10000Ctx := createCronHubAndContext("updateValidatorUptimeLast10000") + if _, err := c.AddFunc(fmt.Sprintf("@every %ds", v.config.ValidatorUptimeUpdateIntervalInSeconds), func() { + err := updateValidatorUptimeLast10000(updateValidatorUptimeLast10000Ctx, v.dbClient, v.config) + if err != nil { + sentry_integration.CaptureException(updateValidatorUptimeLast10000Hub, err, sentry.LevelError) + } + }); err != nil { + log.Error().Err(err).Msg("cron: failed to schedule updateValidatorUptimeLast10000") + } + + updateValidatorHistoricalPowerHub, updateValidatorHistoricalPowerCtx := createCronHubAndContext("updateValidatorHistoricalPower") + if _, err := c.AddFunc("0 * * * *", func() { + err := updateValidatorHistoricalPower(updateValidatorHistoricalPowerCtx, v.dbClient, v.rpcClient, v.config) + if err != nil { + sentry_integration.CaptureException(updateValidatorHistoricalPowerHub, err, sentry.LevelError) + } + }); err != nil { + log.Error().Err(err).Msg("cron: failed to schedule updateValidatorHistoricalPower") + } + + pruneCommitSignaturesHub, pruneCommitSignaturesCtx := createCronHubAndContext("pruneCommitSignatures") + if _, err := c.AddFunc("0 * * * *", func() { + err := pruneCommitSignatures(pruneCommitSignaturesCtx, v.dbClient, v.config) + if err != nil { + sentry_integration.CaptureException(pruneCommitSignaturesHub, err, sentry.LevelError) + } + }); err != nil { + log.Error().Err(err).Msg("cron: failed to schedule pruneCommitSignatures") + } + + updateValidatorIdentityImagesHub, updateValidatorIdentityImagesCtx := createCronHubAndContext("updateValidatorIdentityImages") + if _, err := c.AddFunc(fmt.Sprintf("@every %ds", v.config.ValidatorIdentityImageUpdateIntervalInSeconds), func() { + logger := zerolog.Ctx(log.With(). + Str("component", "indexer-cron"). + Str("function_name", "updateValidatorIdentityImages"). + Str("chain", v.config.Chain). + Str("environment", v.config.Environment). + Logger().WithContext(updateValidatorIdentityImagesCtx)) + err := updateValidatorImages(updateValidatorIdentityImagesCtx, v.dbClient, logger) + if err != nil { + sentry_integration.CaptureException(updateValidatorIdentityImagesHub, err, sentry.LevelError) + } + }); err != nil { + log.Error().Err(err).Msg("cron: failed to schedule updateValidatorIdentityImages") + } + + // Start the Cron job scheduler + c.Start() + + // wait for the scheduler to be terminated by signals + ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) + defer stop() + defer sentry.Flush(2 * time.Second) + <-ctx.Done() + + // wait for all running crons to finish + stopCtx := c.Stop() + <-stopCtx.Done() + + sqlDB, err := v.dbClient.DB() + if err != nil { + log.Error().Err(err).Msg("DB: error getting underlying SQL DB for shutdown") + return + } + if err := sqlDB.Close(); err != nil { + log.Error().Err(err).Msg("DB: error closing SQL DB") + } +} diff --git a/generic-indexer/indexer-cron/jobs.go b/generic-indexer/indexer-cron/jobs.go new file mode 100644 index 00000000..70585188 --- /dev/null +++ b/generic-indexer/indexer-cron/jobs.go @@ -0,0 +1,443 @@ +package indexercron + +import ( + "context" + "encoding/base64" + "encoding/json" + "fmt" + "io" + "net/http" + "sort" + "sync" + "time" + + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/h2non/bimg" + mstakingtypes "github.com/initia-labs/initia/x/mstaking/types" + vmtypes "github.com/initia-labs/movevm/types" + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" + "gorm.io/gorm" + + "github.com/initia-labs/core-indexer/pkg/cosmosrpc" + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/sentry_integration" +) + +// updateValidatorHistoricalPower updates the historical power of validators in the database. +func updateValidatorHistoricalPower(parentCtx context.Context, dbClient *gorm.DB, rpcClient cosmosrpc.CosmosJSONRPCHub, config *IndexerCronConfig) error { + transaction, ctx := sentry_integration.StartSentryTransaction(parentCtx, "updateValidatorHistoricalPower", "Update all validator historical power in the database") + defer transaction.Finish() + // Create a logger with contextual information + logger := zerolog.Ctx(log.With(). + Str("component", "indexer-cron"). + Str("function_name", "updateValidatorHistoricalPower"). + Str("chain", config.Chain). + Str("environment", config.Environment). + Logger(). + WithContext(ctx)) + + logger.Info().Msgf("Starting updateValidatorHistoricalPower task ...") + + err := rpcClient.Rebalance(ctx) + if err != nil { + logger.Error().Msgf("Error rebalancing clients: %v", err) + return err + } + timestamp := time.Now() + + span, valInfoSpanCtx := sentry_integration.StartSentrySpan(ctx, "getValidatorInfos", "Get all validator infos from RPC endpoints") + // Use "" to fetch all validators (bonded, unbonding, unbonded) for historical power + valInfos, err := rpcClient.Validators(valInfoSpanCtx, "", nil) + if err != nil { + logger.Error().Msgf("Error cannot get Validator info from all RPC endpoints: %v", err) + return err + } + span.Finish() + + hpInfos := make([]db.ValidatorHistoricalPower, 0) + for _, valInfo := range *valInfos { + hpInfo, err := db.NewValidatorHistoricalPower(valInfo, timestamp) + if err != nil { + logger.Error().Msgf("Error new validator historical info: %v", err) + return err + } + hpInfos = append(hpInfos, hpInfo) + } + + if err := dbClient.WithContext(ctx).Transaction(func(dbTx *gorm.DB) error { + // Insert historical voting powers into the database + err = db.InsertHistoricalVotingPowers(ctx, dbTx, hpInfos) + if err != nil { + logger.Error().Msgf("Error inserting historical voting powers into database: %v", err) + return err + } + return nil + }); err != nil { + logger.Error().Msgf("Error inserting historical voting powers into database: %v", err) + return err + } + + // Log a success message + logger.Info().Msgf("Successfully updated validator historical power") + + return nil +} + +// calculateValidatorVoteCountsFromVotes aggregates votes per validator and returns ValidatorVoteCount with Last10000 set. +// Result is sorted by ValidatorAddress for determinism. +func calculateValidatorVoteCountsFromVotes(votes []db.ValidatorCommitSignature) []db.ValidatorVoteCount { + m := make(map[string]int32) + for _, vote := range votes { + m[vote.ValidatorAddress]++ + } + addrs := make([]string, 0, len(m)) + for addr := range m { + addrs = append(addrs, addr) + } + sort.Strings(addrs) + out := make([]db.ValidatorVoteCount, 0, len(addrs)) + for _, addr := range addrs { + out = append(out, db.ValidatorVoteCount{ValidatorAddress: addr, Last10000: m[addr]}) + } + return out +} + +// updateValidatorUptimeLast10000 updates validator_vote_counts.last_10000 (signed blocks in last 10,000). API uses for SignedBlocks and uptime. +func updateValidatorUptimeLast10000(parentCtx context.Context, dbClient *gorm.DB, config *IndexerCronConfig) error { + transaction, ctx := sentry_integration.StartSentryTransaction(parentCtx, "updateValidatorUptimeLast10000", "Update validator vote counts for last 10,000 blocks") + defer transaction.Finish() + logger := zerolog.Ctx(log.With(). + Str("component", "indexer-cron"). + Str("function_name", "updateValidatorUptimeLast10000"). + Str("chain", config.Chain). + Str("environment", config.Environment). + Logger(). + WithContext(ctx)) + + logger.Info().Msg("Starting updateValidatorUptimeLast10000 task ...") + + if err := dbClient.WithContext(ctx).Transaction(func(dbTx *gorm.DB) error { + height, err := db.QueryLatestInformativeBlockHeight(ctx, dbTx) + if err != nil { + logger.Error().Msgf("Error querying latest block height: %v", err) + return err + } + votes, err := db.QueryValidatorCommitSignatures(ctx, dbTx, height, 10000) + if err != nil { + logger.Error().Msgf("Error fetching validator commit signatures for last 10,000 blocks: %v", err) + return err + } + counts := calculateValidatorVoteCountsFromVotes(votes) + if err := db.UpsertValidatorVoteCountLast10000(ctx, dbTx, counts); err != nil { + logger.Error().Msgf("Error upserting validator vote counts: %v", err) + return err + } + return nil + }); err != nil { + return err + } + logger.Info().Msg("Successfully updated validator vote counts for latest 10,000 blocks") + return nil +} + +func updateValidators(parentCtx context.Context, dbClient *gorm.DB, rpcClient cosmosrpc.CosmosJSONRPCHub, interfaceRegistry codectypes.InterfaceRegistry, config *IndexerCronConfig) error { + transaction, ctx := sentry_integration.StartSentryTransaction(parentCtx, "updateValidators", "Update all validator details in the database") + defer transaction.Finish() + // Create a logger with contextual information + logger := zerolog.Ctx(log.With(). + Str("component", "indexer-cron"). + Str("function_name", "updateValidators"). + Str("chain", config.Chain). + Str("environment", config.Environment). + Logger(). + WithContext(ctx)) + + logger.Info().Msgf("Starting updateValidators task ...") + + err := rpcClient.Rebalance(ctx) + if err != nil { + logger.Error().Msgf("Error rebalancing clients: %v", err) + return err + } + + span, valInfoSpanCtx := sentry_integration.StartSentrySpan(ctx, "getValidatorInfos", "Get all validator infos from RPC endpoints") + // Use "" to fetch all validators (bonded, unbonding, unbonded) so DB stays in sync + valInfos, err := rpcClient.Validators(valInfoSpanCtx, "", nil) + if err != nil { + logger.Error().Msgf("Error cannot get Validator info from all RPC endpoints: %v", err) + return err + } + span.Finish() + + addresses := make([]string, 0) + vals := make(map[string]mstakingtypes.Validator) + for _, valInfo := range *valInfos { + bz, err := sdk.GetFromBech32(valInfo.OperatorAddress, "initvaloper") + if err != nil { + logger.Error().Msgf("Error getting bech32 from validator address: %v", err) + return err + } + acc := sdk.ValAddress(bz) + address := sdk.AccAddress(acc).String() + addresses = append(addresses, address) + vals[address] = valInfo + } + + if err := dbClient.WithContext(ctx).Transaction(func(dbTx *gorm.DB) error { + accounts := make([]db.Account, 0, len(addresses)) + vmAddresses := make([]db.VMAddress, 0, len(addresses)) + for _, address := range addresses { + accAddr, err := sdk.AccAddressFromBech32(address) + if err != nil { + logger.Error().Msgf("Error getting account address from validator address: %v", err) + return err + } + vmAddr, _ := vmtypes.NewAccountAddressFromBytes(accAddr) + vmAddresses = append(vmAddresses, db.VMAddress{VMAddress: vmAddr.String()}) + accounts = append(accounts, db.Account{ + Address: address, + VMAddressID: vmAddr.String(), + Type: string(db.BaseAccount), + }) + } + + err = db.InsertVMAddressesIgnoreConflict(ctx, dbTx, vmAddresses) + if err != nil { + logger.Error().Msgf("Error: Failed to insert vm addresses %v into the database: %v", addresses, err) + return err + } + err = db.InsertAccountsIgnoreConflict(ctx, dbTx, accounts) + if err != nil { + logger.Error().Msgf("Error: Failed to insert accounts %v into the database: %v", addresses, err) + return err + } + + dbVals := make([]db.Validator, 0) + for _, acc := range addresses { + valInfo := vals[acc] + valInfo.UnpackInterfaces(interfaceRegistry) + consAddr, err := valInfo.GetConsAddr() + if err != nil { + logger.Error().Msgf("Error getting consensus address for validator: %v", err) + return err + } + dbVals = append(dbVals, db.NewValidator(valInfo, acc, consAddr)) + } + + err = db.UpsertValidators( + ctx, + dbTx, + dbVals, + ) + if err != nil { + logger.Error().Msgf("Error upserting validators into the database: %v", err) + return err + } + return nil + }); err != nil { + logger.Error().Msgf("Error upserting validators into the database: %v", err) + return err + } + + // Log success message + logger.Info().Msgf("Successfully updated validators") + + return nil +} + +// keybaseResponse represents the structure of Keybase API response +type keybaseResponse struct { + Them []struct { + Pictures struct { + Primary struct { + URL string `json:"url"` + } `json:"primary"` + } `json:"pictures"` + } `json:"them"` +} + +const avatarSize = 36 + +// normalizeImageToJPEG uses bimg (libvips) to convert the image to JPEG and resize to avatarSize×avatarSize. +// Returns nil on failure so caller can keep the original bytes. +// Requires libvips to be installed on the system (e.g. apt install libvips-dev, brew install vips). +func normalizeImageToJPEG(data []byte) []byte { + opts := bimg.Options{ + Width: avatarSize, + Height: avatarSize, + Type: bimg.JPEG, + Quality: 80, + Crop: false, // fit whole image within 36×36 + } + out, err := bimg.NewImage(data).Process(opts) + if err != nil { + return nil + } + return out +} + +// keybaseImageCache caches Keybase identity -> base64 image in memory to avoid repeated API calls. +var ( + keybaseImageCache = make(map[string]string) + keybaseImageCacheMu sync.RWMutex +) + +// fetchImageDataFromKeybase fetches the validator image from Keybase API and returns it as base64. +// Results are cached in memory by identity so each identity is only fetched once per process. +// Second return is true if the result was from cache (no Keybase call). +func fetchImageDataFromKeybase(identity string) (string, bool) { + if identity == "" { + return "", false + } + keybaseImageCacheMu.RLock() + cached, ok := keybaseImageCache[identity] + keybaseImageCacheMu.RUnlock() + if ok { + return cached, true + } + + // First, get the image URL from Keybase API + client := &http.Client{Timeout: 10 * time.Second} + url := fmt.Sprintf("https://keybase.io/_/api/1.0/user/lookup.json?key_suffix=%s&fields=pictures", identity) + + resp, err := client.Get(url) + if err != nil { + return "", false + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return "", false + } + + body, err := io.ReadAll(resp.Body) + if err != nil { + return "", false + } + + var keybaseResp keybaseResponse + if err := json.Unmarshal(body, &keybaseResp); err != nil { + return "", false + } + + imageURL := "" + if len(keybaseResp.Them) > 0 && keybaseResp.Them[0].Pictures.Primary.URL != "" { + imageURL = keybaseResp.Them[0].Pictures.Primary.URL + } + + if imageURL == "" { + return "", false + } + + // Now fetch the actual image data from the URL + imageResp, err := client.Get(imageURL) + if err != nil { + return "", false + } + defer imageResp.Body.Close() + + if imageResp.StatusCode != http.StatusOK { + return "", false + } + + imageData, err := io.ReadAll(imageResp.Body) + if err != nil { + return "", false + } + + // Normalize to JPEG to reduce stored size (avatars from Keybase may be PNG or large JPEGs) + if normalized := normalizeImageToJPEG(imageData); normalized != nil { + imageData = normalized + } + + // Convert to base64 and cache + base64Image := base64.StdEncoding.EncodeToString(imageData) + keybaseImageCacheMu.Lock() + keybaseImageCache[identity] = base64Image + keybaseImageCacheMu.Unlock() + return base64Image, false +} + +// updateValidatorImages fetches and updates image data (base64-encoded) only for validators that have +// identity but no cached image in DB. Keybase results are cached in memory by identity (one fetch per identity per process). +func updateValidatorImages(ctx context.Context, dbClient *gorm.DB, logger *zerolog.Logger) error { + // Only validators with identity and no image yet — DB is source of truth; memory cache avoids duplicate Keybase calls + var validators []db.Validator + if err := dbClient.WithContext(ctx). + Model(&db.Validator{}). + Where("identity != ''"). + Find(&validators).Error; err != nil { + logger.Error().Err(err).Msg("Failed to query validators for image update") + return err + } + + if len(validators) == 0 { + logger.Debug().Msg("No validators missing cached images, skipping") + return nil + } + + logger.Info().Msgf("Updating images for %d validators (in-memory cache used per identity)", len(validators)) + + var toUpsert []db.Validator + for _, val := range validators { + imageData, _ := fetchImageDataFromKeybase(val.Identity) + if imageData == "" { + continue + } + toUpsert = append(toUpsert, db.Validator{OperatorAddress: val.OperatorAddress, IdentityImage: imageData}) + } + + if len(toUpsert) > 0 { + if err := db.UpsertValidatorIdentityImages(ctx, dbClient, toUpsert); err != nil { + logger.Warn().Err(err).Msg("Failed to upsert validator identity images") + } + } + + logger.Info().Msg("Validator image update completed") + return nil +} + +func pruneCommitSignatures(parenCtx context.Context, dbClient *gorm.DB, config *IndexerCronConfig) error { + transaction, ctx := sentry_integration.StartSentryTransaction(parenCtx, "pruneCommitSignatures", "Prune commit signatures in the database") + defer transaction.Finish() + // Create a logger with contextual information + logger := zerolog.Ctx(log.With(). + Str("component", "indexer-cron"). + Str("function_name", "pruneCommitSignatures"). + Str("chain", config.Chain). + Str("environment", config.Environment). + Logger(). + WithContext(ctx)) + + logger.Info().Msgf("Starting pruneCommitSignatures task ...") + + err := dbClient.WithContext(ctx).Transaction(func(dbTx *gorm.DB) error { + latest, err := db.QueryLatestInformativeBlockHeight( + ctx, + dbTx, + ) + if err != nil { + logger.Error().Msgf("Error querying latest validator vote signature: %v", err) + return err + } + + err = db.DeleteValidatorCommitSignatures(ctx, dbTx, latest-config.KeepLatestCommitSignatures) + if err != nil { + logger.Error().Msgf("Error pruning validator vote signatures: %v", err) + return err + } + + // Log success message + logger.Info().Msgf("Successfully pruned validators") + + return nil + }) + if err != nil { + logger.Error().Msgf("Error pruning validator vote signatures: %v", err) + return err + } + + return nil +} diff --git a/generic-indexer/indexer/accounts.go b/generic-indexer/indexer/accounts.go new file mode 100644 index 00000000..8fea4685 --- /dev/null +++ b/generic-indexer/indexer/accounts.go @@ -0,0 +1,26 @@ +package indexer + +import ( + abci "github.com/cometbft/cometbft/abci/types" + + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/parser" +) + +func (f *Indexer) getAccountTransactions(txHash string, height int64, events []abci.Event, signer string) (map[string]db.Account, []db.AccountTransaction, error) { + relatedAccs, err := parser.GrepAddressesFromEvents(events) + if err != nil { + logger.Error().Msgf("Error grep addresses from tx: %v", err) + return nil, nil, err + } + + accs := make(map[string]db.Account) + for _, acc := range relatedAccs { + accs[acc.String()] = db.NewAccountFromSDKAddress(acc) + } + accTxs := make([]db.AccountTransaction, 0) + for acc := range accs { + accTxs = append(accTxs, db.NewAccountTx(db.GetTxID(txHash, height), height, acc, signer)) + } + return accs, accTxs, nil +} diff --git a/generic-indexer/indexer/block_results.go b/generic-indexer/indexer/block_results.go new file mode 100644 index 00000000..1f2595e3 --- /dev/null +++ b/generic-indexer/indexer/block_results.go @@ -0,0 +1,147 @@ +package indexer + +import ( + "context" + "encoding/hex" + "errors" + "fmt" + "maps" + "strings" + + "github.com/confluentinc/confluent-kafka-go/v2/kafka" + "github.com/rs/zerolog" + "gorm.io/gorm" + + "github.com/initia-labs/core-indexer/pkg/db" + indexererrors "github.com/initia-labs/core-indexer/pkg/errors" + "github.com/initia-labs/core-indexer/pkg/mq" + "github.com/initia-labs/core-indexer/pkg/sentry_integration" + "github.com/initia-labs/core-indexer/pkg/txparser" +) + +func (f *Indexer) produceTxResultMessage(txHash string, height int64, txResultJsonBytes []byte, logger *zerolog.Logger) { + messageKey := mq.NEW_LCD_TX_RESPONSE_KAFKA_MESSAGE_KEY + fmt.Sprintf("_%s", txHash) + kafkaMessage := kafka.Message{ + TopicPartition: kafka.TopicPartition{Topic: &f.config.KafkaTxResponseTopic, Partition: int32(kafka.PartitionAny)}, + Headers: []kafka.Header{ + {Key: "height", Value: fmt.Append(nil, height)}, + {Key: "tx_hash", Value: fmt.Append(nil, txHash)}, + {Key: "service", Value: fmt.Append(nil, "generic-indexer")}, + }, + Key: []byte(messageKey), + Value: txResultJsonBytes, + } + + f.producer.ProduceWithClaimCheck(&mq.ProduceWithClaimCheckInput{ + Topic: f.config.KafkaTxResponseTopic, + Key: kafkaMessage.Key, + MessageInBytes: kafkaMessage.Value, + + ClaimCheckKey: []byte(mq.NEW_LCD_TX_RESPONSE_CLAIM_CHECK_KAFKA_MESSAGE_KEY + fmt.Sprintf("_%s", txHash)), + ClaimCheckThresholdInMB: f.config.ClaimCheckThresholdInMB, + ClaimCheckBucket: f.config.LCDTxResponseClaimCheckBucket, + ClaimCheckObjectPath: db.GetTxID(txHash, height), + + StorageClient: f.storageClient, + + Headers: kafkaMessage.Headers, + }, logger) +} + +func (f *Indexer) decodeAndInsertTxs(parentCtx context.Context, dbTx *gorm.DB, blockResults *mq.BlockResultMsg) (err error) { + defer func() { + // recover from panic if one occurred. Set err to nil otherwise. + if recover() != nil { + err = fmt.Errorf("%w: panic inside DecodeAndInsertTxs, possibly invalid message", indexererrors.ErrorNonRetryable) + } + }() + + span, ctx := sentry_integration.StartSentrySpan(parentCtx, "decodeAndInsertTxs", "Decode txs in the block and insert them into DB") + defer span.Finish() + + txs := make([]db.Transaction, 0) + accounts := make(map[string]db.Account) + accTxs := make([]db.AccountTransaction, 0) + + for i, txResult := range blockResults.Txs { + if strings.Contains(txResult.ExecTxResults.Log, indexererrors.TxPareserError) || strings.Contains(txResult.ExecTxResults.Log, indexererrors.TxPareserErrorV2) { + continue + } + + txResultJsonDict, txResultJsonByte, err := txparser.GetTxResponse(f.encodingConfig, i, &txResult, blockResults) + if err != nil { + return fmt.Errorf("failed to get tx response: %w", err) + } + txData, err := txparser.ParseTransaction(f.encodingConfig, i, &txResult, txResultJsonDict, blockResults) + if err != nil { + return fmt.Errorf("failed to parse DB transaction: %v", err) + } + + accs, accTx, err := f.getAccountTransactions(txResult.Hash, blockResults.Height, txResult.ExecTxResults.Events, txData.Sender) + if err != nil { + return fmt.Errorf("error processing account transaction: %v", err) + } + maps.Copy(accounts, accs) + accTxs = append(accTxs, accTx...) + + txs = append(txs, *txData) + f.produceTxResultMessage(txResult.Hash, blockResults.Height, txResultJsonByte, logger) + } + + if err := db.InsertVMAddressesAndAccountsIgnoreConflict(ctx, dbTx, accounts); err != nil { + return fmt.Errorf("error inserting vm addresses and accounts: %v", err) + } + + if err = db.InsertTransactionIgnoreConflict(ctx, dbTx, txs); err != nil { + return fmt.Errorf("error inserting transactions: %v", err) + } + + if err = db.InsertAccountTxsIgnoreConflict(ctx, dbTx, accTxs); err != nil { + return fmt.Errorf("error inserting account transactions: %v", err) + } + return nil +} + +func (f *Indexer) processBlockResults(parentCtx context.Context, blockResults *mq.BlockResultMsg) error { + span, ctx := sentry_integration.StartSentrySpan(parentCtx, "processBlock", "Parse Block and insert blocks & transactions into DB") + defer span.Finish() + + logger.Info().Msgf("Processing block: %d", blockResults.Height) + if err := f.dbClient.WithContext(ctx).Transaction(func(dbTx *gorm.DB) error { + hashBytes, err := hex.DecodeString(blockResults.Hash) + if err != nil { + return indexererrors.ErrorNonRetryable + } + + proposer, err := db.QueryValidatorAddress(ctx, dbTx, blockResults.ProposerConsensusAddress) + if err != nil { + logger.Error().Int64("height", blockResults.Height).Msgf("Error querying validator address: %v", err) + return err + } + + err = db.InsertBlockIgnoreConflict(ctx, dbTx, db.Block{ + Height: blockResults.Height, + Hash: hashBytes, + Proposer: proposer, + Timestamp: blockResults.Timestamp, + }) + if err != nil { + logger.Error().Int64("height", blockResults.Height).Msgf("Error inserting block: %v", err) + return err + } + + err = f.decodeAndInsertTxs(ctx, dbTx, blockResults) + if err != nil { + logger.Error().Int64("height", blockResults.Height).Msgf("Error inserting transactions: %v", err) + return errors.Join(indexererrors.ErrorNonRetryable, err) + } + return nil + }); err != nil { + logger.Error().Int64("height", blockResults.Height).Msgf("Error processing block: %v", err) + return errors.Join(indexererrors.ErrorNonRetryable, err) + } + + logger.Info().Int64("height", blockResults.Height).Msgf("Successfully indexed block: %d", blockResults.Height) + + return nil +} diff --git a/generic-indexer/indexer/indexer.go b/generic-indexer/indexer/indexer.go new file mode 100644 index 00000000..b0c6466a --- /dev/null +++ b/generic-indexer/indexer/indexer.go @@ -0,0 +1,409 @@ +package indexer + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "os/signal" + "strings" + "syscall" + "time" + + "github.com/certifi/gocertifi" + "github.com/confluentinc/confluent-kafka-go/v2/kafka" + "github.com/cosmos/cosmos-sdk/types" + "github.com/getsentry/sentry-go" + initiaapp "github.com/initia-labs/initia/app" + "github.com/initia-labs/initia/app/params" + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" + "gorm.io/gorm" + + "github.com/initia-labs/core-indexer/pkg/cosmosrpc" + "github.com/initia-labs/core-indexer/pkg/db" + indexererrors "github.com/initia-labs/core-indexer/pkg/errors" + "github.com/initia-labs/core-indexer/pkg/mq" + "github.com/initia-labs/core-indexer/pkg/sentry_integration" + "github.com/initia-labs/core-indexer/pkg/storage" +) + +var logger *zerolog.Logger + +type Indexer struct { + consumer *mq.Consumer + producer *mq.Producer + rpcClient cosmosrpc.CosmosJSONRPCHub + dbClient *gorm.DB + storageClient storage.Client + + config *IndexerConfig + encodingConfig *params.EncodingConfig +} + +type IndexerConfig struct { + // Worker ID. There supposed to be multiple workers running in parallel + ID string + + RPCEndpoints string + NumWorkers int64 + + // Chain ID to sweep + Chain string + + DBConnectionString string + + // Kafka config + KafkaBootstrapServer string + KafkaBlockTopic string + KafkaTxResponseTopic string + KafkaAPIKey string + KafkaAPISecret string + KafkaBlockConsumerGroup string + + // Claim check config + ClaimCheckThresholdInMB int64 + BlockClaimCheckBucket string + LCDTxResponseClaimCheckBucket string + BlockResultsClaimCheckBucket string + + // AWS + AWSAccessKey string + AWSSecretKey string + + // Functionality control + DisableLCDTXResponse bool + DisableIndexingAccountTransaction bool + + Environment string + RebalanceInterval int64 + RPCTimeOutInSeconds int64 + + SentryDSN string + CommitSHA string + SentryProfilesSampleRate float64 + SentryTracesSampleRate float64 +} + +func New(config *IndexerConfig) (*Indexer, error) { + logger = zerolog.Ctx(log.With().Str("component", "generic-indexer"). + Str("chain", config.Chain). + Str("id", config.ID). + Str("environment", config.Environment). + Str("commit_sha", config.CommitSHA). + Logger().WithContext(context.Background()), + ) + + sentryClientOptions := sentry.ClientOptions{ + Dsn: config.SentryDSN, + ServerName: config.Chain + "-generic-indexer", + EnableTracing: true, + ProfilesSampleRate: config.SentryProfilesSampleRate, + TracesSampleRate: config.SentryTracesSampleRate, + Environment: config.Environment, + Release: config.CommitSHA, + Tags: map[string]string{ + "chain": config.Chain, + "environment": config.Environment, + "component": "generic-indexer", + "commit_sha": config.CommitSHA, + }, + } + + rootCAs, err := gocertifi.CACerts() + if err != nil { + logger.Fatal().Msgf("Sentry: Error getting root CAs: %v\n", err) + } else { + sentryClientOptions.CaCerts = rootCAs + } + + err = sentry.Init(sentryClientOptions) + if err != nil { + logger.Fatal().Msgf("Sentry: Error initializing sentry: %v\n", err) + return nil, err + } + + if config.RPCEndpoints == "" { + sentry_integration.CaptureCurrentHubException(errors.New("RPC: No RPC endpoints provided"), sentry.LevelFatal) + logger.Fatal().Msgf("RPC: No RPC endpoints provided\n") + return nil, fmt.Errorf("RPC: No RPC endpoints provided") + } + + var rpcEndpoints mq.RPCEndpoints + err = json.Unmarshal([]byte(config.RPCEndpoints), &rpcEndpoints) + if err != nil { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) + logger.Fatal().Msgf("RPC: Error unmarshalling RPC endpoints: %v\n", err) + return nil, err + } + + clientConfigs := make([]cosmosrpc.ClientConfig, 0) + for _, rpc := range rpcEndpoints.RPCs { + clientConfigs = append(clientConfigs, cosmosrpc.ClientConfig{ + URL: rpc.URL, + ClientOption: &cosmosrpc.ClientOption{CustomHeaders: rpc.Headers}, + }) + } + + rpcClient := cosmosrpc.NewHub(clientConfigs, logger, time.Duration(config.RPCTimeOutInSeconds)*time.Second) + err = rpcClient.Rebalance(context.Background()) + if err != nil { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) + logger.Fatal().Msgf("RPC: Error rebalancing RPC endpoints: %v\n", err) + return nil, err + } + + consumer, err := mq.NewConsumer(&kafka.ConfigMap{ + "bootstrap.servers": config.KafkaBootstrapServer, + "group.id": config.KafkaBlockConsumerGroup, + "client.id": config.KafkaBlockConsumerGroup + "-" + config.ID, + "enable.auto.commit": false, + "auto.offset.reset": "earliest", + "security.protocol": "SASL_SSL", + "sasl.mechanisms": "PLAIN", + "sasl.username": config.KafkaAPIKey, + "sasl.password": config.KafkaAPISecret, + "max.poll.interval.ms": 600000, + }) + if err != nil { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) + logger.Fatal().Msgf("Kafka: Error creating consumer. Error: %v\n", err) + return nil, err + } + + producer, err := mq.NewProducer(&kafka.ConfigMap{ + "bootstrap.servers": config.KafkaBootstrapServer, + "client.id": config.KafkaBlockConsumerGroup + "-" + config.ID, + "acks": "all", + "linger.ms": 200, + "security.protocol": "SASL_SSL", + "sasl.mechanisms": "PLAIN", + "sasl.username": config.KafkaAPIKey, + "sasl.password": config.KafkaAPISecret, + "message.max.bytes": 7340032, + "compression.codec": "lz4", + }) + if err != nil { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) + logger.Fatal().Msgf("Kafka: Error creating producer. Error: %v\n", err) + return nil, err + } + + dbClient, err := db.NewClient(config.DBConnectionString) + if err != nil { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) + logger.Fatal().Msgf("DB: Error creating DB client. Error: %v\n", err) + return nil, err + } + + storageClient, err := storage.NewGCSClient() + if err != nil { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) + logger.Fatal().Msgf("Storage: Error creating storage client. Error: %v\n", err) + return nil, err + } + sdkConfig := types.GetConfig() + sdkConfig.SetCoinType(initiaapp.CoinType) + + accountPubKeyPrefix := initiaapp.AccountAddressPrefix + "pub" + validatorAddressPrefix := initiaapp.AccountAddressPrefix + "valoper" + validatorPubKeyPrefix := initiaapp.AccountAddressPrefix + "valoperpub" + consNodeAddressPrefix := initiaapp.AccountAddressPrefix + "valcons" + consNodePubKeyPrefix := initiaapp.AccountAddressPrefix + "valconspub" + + sdkConfig.SetBech32PrefixForAccount(initiaapp.AccountAddressPrefix, accountPubKeyPrefix) + sdkConfig.SetBech32PrefixForValidator(validatorAddressPrefix, validatorPubKeyPrefix) + sdkConfig.SetBech32PrefixForConsensusNode(consNodeAddressPrefix, consNodePubKeyPrefix) + sdkConfig.SetAddressVerifier(initiaapp.VerifyAddressLen()) + sdkConfig.Seal() + + encodingConfig := initiaapp.MakeEncodingConfig() + return &Indexer{ + consumer: consumer, + producer: producer, + rpcClient: rpcClient, + dbClient: dbClient, + storageClient: storageClient, + config: config, + encodingConfig: &encodingConfig, + }, nil +} + +func (f Indexer) WithCustomRPCClient(rpcClient cosmosrpc.CosmosJSONRPCHub) *Indexer { + f.rpcClient = rpcClient + return &f +} + +func (f *Indexer) parseBlockAndRebalanceRPCClient(parentCtx context.Context, blockBytes []byte) (mq.BlockResultMsg, error) { + span, ctx := sentry_integration.StartSentrySpan(parentCtx, "parseBlockAndRebalanceRPCClient", "Parsing block and rebalancing RPC clients") + defer span.Finish() + + var blockMsg mq.BlockResultMsg + err := json.Unmarshal(blockBytes, &blockMsg) + if err != nil { + logger.Error().Msgf("Error unmarshalling message: %v", err) + return blockMsg, err + } + + if blockMsg.Version != 0 { + return blockMsg, fmt.Errorf("invalid version: %d", blockMsg.Version) + } + + if f.config.RebalanceInterval != 0 && blockMsg.Height%f.config.RebalanceInterval == 0 { + err := f.rpcClient.Rebalance(ctx) + if err != nil { + logger.Error().Msgf("Error rebalancing clients: %v", err) + return blockMsg, err + } + actives := f.rpcClient.GetActiveClients() + for _, active := range actives { + logger.Info().Msgf("Active client url: %s, latest height: %d", active.Client.GetIdentifier(), active.Height) + } + } + return blockMsg, err +} + +func (f *Indexer) processUntilSucceeds(ctx context.Context, blockResults mq.BlockResultMsg) error { + // Process the block until success + for { + err := f.processBlockResults(ctx, &blockResults) + if err != nil { + if errors.Is(err, indexererrors.ErrorNonRetryable) { + return err + } + + sentry_integration.CaptureCurrentHubException(err, sentry.LevelWarning) + logger.Error().Msgf("Error processing block: %v, retrying...", err) + continue + } + break + } + + return nil +} + +func (f *Indexer) processClaimCheckMessage(key []byte, messageValue []byte) ([]byte, error) { + if strings.HasPrefix(string(key), mq.NEW_BLOCK_RESULTS_CLAIM_CHECK_KAFKA_MESSAGE_KEY) { + var claimCheckBlockResultsMsg mq.ClaimCheckMsg + err := json.Unmarshal(messageValue, &claimCheckBlockResultsMsg) + if err != nil { + logger.Fatal().Msgf("Error unmarshalling message: %v", err) + return nil, err + } + + var claimCheckBlockResultsMsgBytes []byte + for { + claimCheckBlockResultsMsgBytes, err = f.storageClient.ReadFile(f.config.BlockResultsClaimCheckBucket, claimCheckBlockResultsMsg.ObjectPath) + if err == nil { + break + } + + logger.Error().Msgf("Error reading block_results from storage: %v", err) + } + + messageValue = claimCheckBlockResultsMsgBytes + } + return messageValue, nil +} + +func (f *Indexer) processKafkaMessage(ctx context.Context, message *kafka.Message) error { + messageValue, err := f.processClaimCheckMessage(message.Key, message.Value) + if err != nil { + logger.Error().Msgf("Error processing claim check message: %v", err) + return err + } + blockMsg, err := f.parseBlockAndRebalanceRPCClient(ctx, messageValue) + if err != nil { + logger.Error().Msgf("Error processing block message: %v", err) + return err + } + + sentry.ConfigureScope(func(scope *sentry.Scope) { + scope.SetTag("height", fmt.Sprint(blockMsg.Height)) + }) + + err = f.processUntilSucceeds(ctx, blockMsg) + if err != nil { + logger.Error().Msgf("Error processing block: %v", err) + return err + } + + return nil +} + +func (f *Indexer) close() { + if sqlDB, err := f.dbClient.DB(); err == nil { + sqlDB.Close() + } + f.producer.Flush(30000) + f.producer.Close() + + f.consumer.Close() +} + +func (f *Indexer) StartIndexing(stopCtx context.Context) { + logger.Info().Msgf("Starting indexer...") + + f.producer.ListenToKafkaProduceEvents(logger) + + err := f.consumer.SubscribeTopics([]string{f.config.KafkaBlockTopic}, nil) + if err != nil { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) + logger.Fatal().Msgf("Failed to subscribe to topic: %s\n", err) + } + + logger.Info().Msgf("Subscribed to topic: %s\n", f.config.KafkaBlockTopic) + + for { + select { + case <-stopCtx.Done(): + return + default: + ctx := context.Background() + + message, err := f.consumer.ReadMessage(10 * time.Second) + if err != nil { + if err.(kafka.Error).IsTimeout() { + continue + } + + sentry_integration.CaptureCurrentHubException(err, sentry.LevelWarning) + logger.Error().Msgf("Error reading message: %v", err) + continue + } + + sentry.ConfigureScope(func(scope *sentry.Scope) { + scope.SetTag("id", f.config.ID) + scope.SetTag("partition", fmt.Sprint(message.TopicPartition.Partition)) + scope.SetTag("offset", message.TopicPartition.Offset.String()) + }) + + transaction, ctx := sentry_integration.StartSentryTransaction(ctx, "Index", "Process and index generic block messages") + err = f.processKafkaMessage(ctx, message) + if err != nil { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelError) + logger.Warn().Msgf("Producing message to DLQ: %d, %d, %v", message.TopicPartition.Partition, message.TopicPartition.Offset, err) + f.producer.ProduceToDLQ(f.config.Chain, "generic-indexer-block-results", message, err, logger) + } + + _, err = f.consumer.CommitMessage(message) + if err != nil { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelError) + logger.Error().Msgf("Non-retryable Error committing message: %v", err) + } + transaction.Finish() + } + } +} + +func (f *Indexer) Run() { + // graceful shutdown + ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) + defer stop() + defer sentry.Flush(2 * time.Second) + + f.StartIndexing(ctx) + + logger.Info().Msgf("Shutting down ...") + f.close() +} diff --git a/generic-indexer/indexer/types.go b/generic-indexer/indexer/types.go new file mode 100644 index 00000000..857a1ba6 --- /dev/null +++ b/generic-indexer/indexer/types.go @@ -0,0 +1,7 @@ +package indexer + +type LCDTxResponses struct { + Height int64 `json:"height"` + Hash string `json:"hash"` + Result map[string]any `json:"result"` +} diff --git a/generic-indexer/main.go b/generic-indexer/main.go new file mode 100644 index 00000000..7659b442 --- /dev/null +++ b/generic-indexer/main.go @@ -0,0 +1,7 @@ +package main + +import "github.com/initia-labs/core-indexer/generic-indexer/cmd" + +func main() { + cmd.Execute() +} diff --git a/generic-indexer/run.sh b/generic-indexer/run.sh new file mode 100755 index 00000000..ffa5655f --- /dev/null +++ b/generic-indexer/run.sh @@ -0,0 +1,89 @@ +#!/bin/bash + +set -e + +SCRIPT_DIR=$(cd $(dirname $0) ; pwd -P) + +TASK=$1 +ARGS=${@:2} + + +help__run="run <..args> : run run" +task__run() { + local chain=$1 + local id=$2 + + if [ -z "$chain" ]; then + echo "usage: $0 run " + exit + fi + + if [ -z "$id" ]; then + echo "usage: $0 run " + exit + fi + + go build -o generic-indexer . + + source .env + + ./generic-indexer run --bootstrap-server pkc-ldvr1.asia-southeast1.gcp.confluent.cloud:9092 \ + --block-topic ${chain}-local-generic-indexer-block-results-messages \ + --tx-topic ${chain}-local-lcd-tx-response-messages \ + --kafka-api-key $KAFKA_API_KEY \ + --kafka-api-secret $KAFKA_API_SECRET \ + --block-consumer-group ${chain}-local-generic-indexer-flusher \ + --block-claim-check-bucket ${chain}-local-generic-indexer-large-block-results \ + --claim-check-threshold-mb 1 \ + --db $DB_CONNECTION_STRING \ + --chain $chain \ + --environment local \ + --rebalance-interval $REBALANCE_INTERVAL \ + --id $id +} + +help__cron="cron <..args> : run cron" +task__cron() { + local chain=$1 + local id=$2 + + if [ -z "$chain" ]; then + echo "usage: $0 cron " + exit + fi + + if [ -z "$id" ]; then + echo "usage: $0 cron " + exit + fi + + go build -o generic-indexer . + + source .env + + ./generic-indexer cron --db $DB_CONNECTION_STRING \ + --chain $chain +} + + +list_all_helps() { + compgen -v | egrep "^help__.*" +} + +NEW_LINE=$'\n' +if type -t "task__$TASK" &>/dev/null; then + task__$TASK $ARGS +else + echo "usage: $0 [<..args>]" + echo "task:" + + HELPS="" + for help in $(list_all_helps) + do + + HELPS="$HELPS ${help/help__/} |-- ${!help}$NEW_LINE" + done + + echo "$HELPS" | column -t -s "|" + exit +fi diff --git a/informative-indexer/cmd/indexer/cmd.go b/informative-indexer/cmd/indexer/cmd.go new file mode 100644 index 00000000..4c123ae8 --- /dev/null +++ b/informative-indexer/cmd/indexer/cmd.go @@ -0,0 +1,144 @@ +package indexer_cmd + +import ( + "context" + "os" + "os/signal" + "strconv" + "syscall" + + "github.com/spf13/cobra" + + "github.com/initia-labs/core-indexer/informative-indexer/indexer" +) + +const ( + FlagID = "id" + FlagRPCEndpoints = "rpc-endpoints" + FlagRPCTimeoutInSeconds = "rpc-timeout-in-seconds" + FlagKafkaBootstrapServer = "bootstrap-server" + FlagDBConnectionString = "db" + FlagChain = "chain" + FlagKafkaAPIKey = "kafka-api-key" + FlagKafkaAPISecret = "kafka-api-secret" + FlagBlockResultsClaimCheckBucket = "block-results-claim-check-bucket" + FlagLCDTxResponseClaimCheckBucket = "lcd-tx-response-claim-check-bucket" + FlagClaimCheckThresholdInMB = "claim-check-threshold-mb" + FlagKafkaBlockResultsTopic = "block-results-topic" + FlagKafkaTxResponseTopic = "tx-response-topic" + FlagKafkaBlockResultsConsumerGroup = "block-results-consumer-group" + FlagEnvironment = "environment" + FlagSentryDSN = "sentry-dsn" + FlagCommitSHA = "commit-sha" + FlagSentryProfilesSampleRate = "sentry-profiles-sample-rate" + FlagSentryTracesSampleRate = "sentry-traces-sample-rate" +) + +// RunCmd consumes messages from Kafka and indexes data into the database. +func RunCmd() *cobra.Command { + runCmd := &cobra.Command{ + Use: "run", + Short: "Consumes messages from Kafka and indexes them into the database.", + Args: cobra.ExactArgs(0), + RunE: func(cmd *cobra.Command, args []string) error { + rpcEndpoints, _ := cmd.Flags().GetString(FlagRPCEndpoints) + rpcTimeoutInSeconds, _ := cmd.Flags().GetInt64(FlagRPCTimeoutInSeconds) + kafkaBootstrapServer, _ := cmd.Flags().GetString(FlagKafkaBootstrapServer) + chain, _ := cmd.Flags().GetString(FlagChain) + dbConnectionString, _ := cmd.Flags().GetString(FlagDBConnectionString) + kafkaAPIKey, _ := cmd.Flags().GetString(FlagKafkaAPIKey) + kafkaAPISecret, _ := cmd.Flags().GetString(FlagKafkaAPISecret) + kafkaBlockResultsTopic, _ := cmd.Flags().GetString(FlagKafkaBlockResultsTopic) + kafkaTxResponseTopic, _ := cmd.Flags().GetString(FlagKafkaTxResponseTopic) + kafkaBlockResultsConsumerGroup, _ := cmd.Flags().GetString(FlagKafkaBlockResultsConsumerGroup) + + blockResultsClaimCheckBucket, _ := cmd.Flags().GetString(FlagBlockResultsClaimCheckBucket) + lcdTxResponseClaimCheckBucket, _ := cmd.Flags().GetString(FlagLCDTxResponseClaimCheckBucket) + claimCheckThresholdInMB, _ := cmd.Flags().GetUint64(FlagClaimCheckThresholdInMB) + + workerID, _ := cmd.Flags().GetString(FlagID) + + environment, _ := cmd.Flags().GetString(FlagEnvironment) + sentryDSN, _ := cmd.Flags().GetString(FlagSentryDSN) + commitSHA, _ := cmd.Flags().GetString(FlagCommitSHA) + sentryProfilesSampleRate, _ := cmd.Flags().GetFloat64(FlagSentryProfilesSampleRate) + sentryTracesSampleRate, _ := cmd.Flags().GetFloat64(FlagSentryTracesSampleRate) + + f, err := indexer.NewIndexer(&indexer.Config{ + RPCEndpoints: rpcEndpoints, + RPCTimeoutInSeconds: rpcTimeoutInSeconds, + ID: workerID, + Chain: chain, + DBConnectionString: dbConnectionString, + KafkaBootstrapServer: kafkaBootstrapServer, + KafkaAPIKey: kafkaAPIKey, + KafkaAPISecret: kafkaAPISecret, + KafkaBlockResultsTopic: kafkaBlockResultsTopic, + KafkaTxResponseTopic: kafkaTxResponseTopic, + KafkaBlockResultsConsumerGroup: kafkaBlockResultsConsumerGroup, + BlockResultsClaimCheckBucket: blockResultsClaimCheckBucket, + LCDTxResponseClaimCheckBucket: lcdTxResponseClaimCheckBucket, + ClaimCheckThresholdInMB: int64(claimCheckThresholdInMB), + Environment: environment, + SentryDSN: sentryDSN, + CommitSHA: commitSHA, + SentryProfilesSampleRate: sentryProfilesSampleRate, + SentryTracesSampleRate: sentryTracesSampleRate, + }) + if err != nil { + return err + } + + ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) + defer stop() + // Run patcher to fix any issues with the database before indexing + f.RunPatcher(ctx) + + f.Index(ctx) + + return nil + }, + } + + rpcTimeOutInSeconds, err := strconv.ParseInt(os.Getenv("RPC_TIMEOUT_IN_SECONDS"), 10, 64) + if err != nil { + rpcTimeOutInSeconds = 30 + } + + threshold, err := strconv.ParseInt(os.Getenv("CLAIM_CHECK_THRESHOLD_IN_MB"), 10, 64) + if err != nil { + threshold = 1 + } + + sentryProfilesSampleRate, err := strconv.ParseFloat(os.Getenv("SENTRY_PROFILES_SAMPLE_RATE"), 64) + if err != nil { + sentryProfilesSampleRate = 0.01 + } + + sentryTracesSampleRate, err := strconv.ParseFloat(os.Getenv("SENTRY_TRACES_SAMPLE_RATE"), 64) + if err != nil { + sentryTracesSampleRate = 0.01 + } + + runCmd.Flags().String(FlagRPCEndpoints, os.Getenv("RPC_ENDPOINTS"), "") + runCmd.Flags().String(FlagKafkaBootstrapServer, os.Getenv("BOOTSTRAP_SERVER"), ": to Kafka bootstrap server") + runCmd.Flags().Int64(FlagRPCTimeoutInSeconds, rpcTimeOutInSeconds, "RPC timeout in seconds") + runCmd.Flags().String(FlagKafkaBlockResultsTopic, os.Getenv("BLOCK_RESULTS_TOPIC"), "Kafka topic to consume block_results message") + runCmd.Flags().String(FlagKafkaTxResponseTopic, os.Getenv("TX_RESPONSE_TOPIC"), "Kafka topic about TxResponses to produce") + runCmd.Flags().String(FlagKafkaBlockResultsConsumerGroup, os.Getenv("BLOCK_RESULTS_CONSUMER_GROUP"), "Kafka consumer group for block_results topic") + runCmd.Flags().String(FlagKafkaAPIKey, os.Getenv("KAFKA_API_KEY"), "Kafka API key") + runCmd.Flags().String(FlagKafkaAPISecret, os.Getenv("KAFKA_API_SECRET"), "Kafka API secret") + runCmd.Flags().String(FlagDBConnectionString, os.Getenv("DB_CONNECTION_STRING"), "Database connection string") + runCmd.Flags().String(FlagChain, os.Getenv("CHAIN"), "Chain ID to sweep") + runCmd.Flags().String(FlagBlockResultsClaimCheckBucket, os.Getenv("BLOCK_RESULTS_CLAIM_CHECK_BUCKET"), "Block results claim check bucket") + runCmd.Flags().String(FlagLCDTxResponseClaimCheckBucket, os.Getenv("TX_CLAIM_CHECK_BUCKET"), "LCD TxResponse claim check bucket") + runCmd.Flags().Uint64(FlagClaimCheckThresholdInMB, uint64(threshold), "Claim check threshold in MB") + runCmd.Flags().String(FlagID, os.Getenv("ID"), "Worker ID") + runCmd.Flags().String(FlagEnvironment, os.Getenv("ENVIRONMENT"), "Environment") + runCmd.Flags().String(FlagSentryDSN, os.Getenv("SENTRY_DSN"), "Sentry DSN") + runCmd.Flags().String(FlagCommitSHA, os.Getenv("COMMIT_SHA"), "Commit SHA") + runCmd.Flags().Float64(FlagSentryProfilesSampleRate, sentryProfilesSampleRate, "Sentry profiles sample rate") + runCmd.Flags().Float64(FlagSentryTracesSampleRate, sentryTracesSampleRate, "Sentry traces sample rate") + + return runCmd +} diff --git a/informative-indexer/cmd/migrate/cmd.go b/informative-indexer/cmd/migrate/cmd.go new file mode 100644 index 00000000..244d6a65 --- /dev/null +++ b/informative-indexer/cmd/migrate/cmd.go @@ -0,0 +1,63 @@ +package migrate_cmd + +import ( + "fmt" + "os" + + "github.com/spf13/cobra" + + "github.com/initia-labs/core-indexer/pkg/db" +) + +const ( + FlagDBHost = "db-host" + FlagDBUser = "db-user" + FlagMigrationsDir = "migrations-dir" +) + +// MigrateCmd is the command for managing database migrations +func MigrateCmd() *cobra.Command { + migrateCmd := &cobra.Command{ + Use: "migrate", + Short: "Manage database migrations", + Long: "Manage database migrations using GORM and Atlas", + } + + migrateCmd.AddCommand( + generateCmd(), + ) + + return migrateCmd +} + +// generateCmd generates a new migration file based on GORM models +func generateCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "generate [name]", + Short: "Generate a new migration file", + Long: "Generate a new migration file based on GORM models", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + dbHost, _ := cmd.Flags().GetString(FlagDBHost) + dbUser, _ := cmd.Flags().GetString(FlagDBUser) + migrationsDir, _ := cmd.Flags().GetString(FlagMigrationsDir) + name := args[0] + + if err := os.MkdirAll(migrationsDir, 0755); err != nil { + return fmt.Errorf("failed to create migrations directory: %w", err) + } + + if err := db.GenerateMigrationFilesWithLivePostgres(dbHost, dbUser, name, migrationsDir); err != nil { + return fmt.Errorf("failed to generate migration: %w", err) + } + + return nil + }, + } + + cmd.Flags().String(FlagDBHost, "localhost", "Database host for local migration generation") + cmd.Flags().String(FlagDBUser, "postgres", "Database user for local migration generation") + cmd.Flags().String(FlagMigrationsDir, "db/migrations", "Directory to store migration files") + + return cmd +} diff --git a/informative-indexer/cmd/root.go b/informative-indexer/cmd/root.go index 16746f6e..a95c725a 100644 --- a/informative-indexer/cmd/root.go +++ b/informative-indexer/cmd/root.go @@ -5,22 +5,20 @@ import ( "github.com/spf13/cobra" - flusher "github.com/initia-labs/core-indexer/informative-indexer/cmd/flusher" - prunner "github.com/initia-labs/core-indexer/informative-indexer/cmd/prunner" - sweeper "github.com/initia-labs/core-indexer/informative-indexer/cmd/sweeper" + indexer "github.com/initia-labs/core-indexer/informative-indexer/cmd/indexer" + migrate "github.com/initia-labs/core-indexer/informative-indexer/cmd/migrate" ) func Execute() { var rootCmd = &cobra.Command{ Use: "informative-indexer", Short: "Informative Indexer Runner", - Long: "Informative Indexer Runner - Polls data from RPC and flushes into database", + Long: "Informative Indexer Runner - Polls data from RPC and indexes into database", } rootCmd.AddCommand( - sweeper.SweepCmd(), - flusher.FlushCmd(), - prunner.PruneCmd(), + migrate.MigrateCmd(), + indexer.RunCmd(), ) err := rootCmd.Execute() diff --git a/informative-indexer/common/kafka_msg.go b/informative-indexer/common/kafka_msg.go deleted file mode 100644 index a4303e05..00000000 --- a/informative-indexer/common/kafka_msg.go +++ /dev/null @@ -1,81 +0,0 @@ -package common - -import ( - "encoding/json" - "time" - - abci "github.com/cometbft/cometbft/abci/types" - coretypes "github.com/cometbft/cometbft/rpc/core/types" - "github.com/cometbft/cometbft/types" - "github.com/confluentinc/confluent-kafka-go/v2/kafka" -) - -const ( - NEW_BLOCK_RESULTS_KAFKA_MESSAGE_KEY string = "NEW_BLOCK_RESULTS" - NEW_BLOCK_RESULTS_CLAIM_CHECK_KAFKA_MESSAGE_KEY string = "NEW_BLOCK_RESULTS_CLAIM_CHECK" -) - -type KafkaMsg interface { - Emit() kafka.Message -} - -type BlockMsg struct { - Height int64 `json:"height"` - Hash string `json:"hash"` - Proposer *string `json:"proposer"` - Timestamp time.Time `json:"timestamp"` - Txs types.Txs `json:"txs"` - LastCommit *types.Commit `json:"last_commit"` - BlockProposer *BlockProposer `json:"block_proposer"` -} - -type ClaimCheckMsg struct { - ObjectPath string `json:"object_path"` -} - -type BlockProposer struct { - ValidatorAddress *string `json:"validator_address"` - ConsensusAddress *string `json:"consensus_address"` -} - -func NewBlockMsgBytes(resultBlock *coretypes.ResultBlock, proposerAddress, consensusAddress *string) ([]byte, error) { - msg := &BlockMsg{ - Height: resultBlock.Block.Height, - Hash: resultBlock.Block.Hash().String(), - Proposer: proposerAddress, - Timestamp: resultBlock.Block.Time, - Txs: resultBlock.Block.Txs, - LastCommit: resultBlock.Block.LastCommit, - BlockProposer: &BlockProposer{ - ValidatorAddress: proposerAddress, - ConsensusAddress: consensusAddress, - }, - } - - v, err := json.Marshal(msg) - if err != nil { - return nil, err - } - - return v, nil -} - -type BlockResultMsg struct { - Height int64 `json:"height"` - Txs []TxResult `json:"txs"` - FinalizeBlockEvents []abci.Event `json:"finalize_block_events"` -} - -type TxResult struct { - Hash string `json:"hash"` - ExecTxResults *abci.ExecTxResult `json:"exec_tx_results"` -} - -func NewBlockResultMsgBytes(msg BlockResultMsg) ([]byte, error) { - v, err := json.Marshal(msg) - if err != nil { - return nil, err - } - - return v, nil -} diff --git a/informative-indexer/common/types.go b/informative-indexer/common/types.go deleted file mode 100644 index 77084429..00000000 --- a/informative-indexer/common/types.go +++ /dev/null @@ -1,71 +0,0 @@ -package common - -import ( - abci "github.com/cometbft/cometbft/abci/types" - "time" -) - -// EvMap is a type alias for SDK events mapping from Attr.Key to the list of values. -type EvMap map[string][]string - -// JsDict is a type alias for JSON dictionary. -type JsDict map[string]interface{} - -type Block struct { - Height int64 `json:"height"` - Hash string `json:"hash"` - Proposer string `json:"proposer"` - Timestamp time.Time `json:"timestamp"` -} - -type Transaction struct { - Hash []byte `json:"hash"` - BlockHeight int64 `json:"block_height"` - BlockIndex int `json:"block_index"` - GasUsed int64 `json:"gas_used"` - GasLimit uint64 `json:"gas_limit"` - GasFee string `json:"gas_fee"` - ErrMsg *string `json:"err_msg"` - Success bool `json:"success"` - Sender string `json:"sender"` - Memo string `json:"memo"` - Messages []JsDict `json:"messages"` - IsIBC bool `json:"is_ibc"` - IsSend bool `json:"is_send"` - IsMovePublish bool `json:"is_move_publish"` - IsMoveExecuteEvent bool `json:"is_move_execute_event"` - IsMoveExecute bool `json:"is_move_execute"` - IsMoveUpgrade bool `json:"is_move_upgrade"` - IsMoveScript bool `json:"is_move_script"` - IsNFTTransfer bool `json:"is_nft_transfer"` - IsNFTMint bool `json:"is_nft_mint"` - IsNFTBurn bool `json:"is_nft_burn"` - IsCollectionCreate bool `json:"is_collection_create"` - IsOPInit bool `json:"is_opinit"` - IsInstantiate bool `json:"is_instantiate"` - IsMigrate bool `json:"is_migrate"` - IsUpdateAdmin bool `json:"is_update_admin"` - IsClearAdmin bool `json:"is_clear_admin"` - IsStoreCode bool `json:"is_store_code"` -} - -type LCDTxResponses struct { - Height int64 `json:"height"` - Hash string `json:"hash"` - Result JsDict `json:"result"` -} - -type RPCEndpoints struct { - RPCs []RPC `json:"rpcs"` -} - -type RPC struct { - URL string `json:"url"` - Headers map[string]string `json:"headers,omitempty"` -} - -type BlockResults struct { - Height int64 `json:"height"` - TxsResults []*abci.ExecTxResult `json:"txs_results"` - FinalizeBlockEvents []abci.Event `json:"finalize_block_events"` -} diff --git a/informative-indexer/cosmosrpc/hub.go b/informative-indexer/cosmosrpc/hub.go deleted file mode 100644 index 4238eb2a..00000000 --- a/informative-indexer/cosmosrpc/hub.go +++ /dev/null @@ -1,241 +0,0 @@ -package cosmosrpc - -import ( - "context" - "errors" - "fmt" - "sort" - "sync" - "time" - - coretypes "github.com/cometbft/cometbft/rpc/core/types" - "github.com/initia-labs/initia/x/mstaking/types" - "github.com/rs/zerolog" - - "github.com/initia-labs/core-indexer/informative-indexer/common" -) - -type ClientConfig struct { - URL string - ClientOption *ClientOption -} - -type Hub struct { - mu sync.Mutex - Clients []CosmosJSONRPCClient - activeClients []ActiveClient - logger *zerolog.Logger - timeout time.Duration -} - -type ActiveClient struct { - Client CosmosJSONRPCClient - Height int64 -} - -type CosmosJSONRPCHub interface { - CosmosJSONRPCClient - Rebalance(ctx context.Context) error - GetActiveClients() []ActiveClient -} - -func NewHub(configs []ClientConfig, logger *zerolog.Logger, timeout time.Duration) *Hub { - clients := make([]CosmosJSONRPCClient, 0) - for _, config := range configs { - var client *Client - if config.ClientOption == nil { - client = NewClient(config.URL) - } else { - client = NewClientWithOption(config.URL, *config.ClientOption) - } - clients = append(clients, client) - } - return &Hub{ - Clients: clients, - logger: logger, - timeout: timeout, - } -} - -// createTimeoutContext checks if the provided context already has a deadline or timeout. -// If it does, it returns the existing context and a no-op cancel function. -// If not, it creates a new context with the specified timeout. -func createTimeoutContext(ctx context.Context, timeout time.Duration) (context.Context, context.CancelFunc) { - if _, ok := ctx.Deadline(); ok { - // If context already has a deadline, return the existing context and a no-op cancel function. - return ctx, func() {} - } - // Create a new context with the specified timeout. - return context.WithTimeout(ctx, timeout) -} - -func (h *Hub) handleTimeoutError(err error) error { - if errors.Is(err, context.DeadlineExceeded) { - return fmt.Errorf("RPC: request timed out") - } - return err -} - -func (h *Hub) Rebalance(ctx context.Context) error { - span, ctx := common.StartSentrySpan(ctx, "Rebalance", "Rebalance hub rpcs") - defer span.Finish() - - var result *coretypes.ResultStatus - var err error - clients := make([]ActiveClient, 0) - for _, client := range h.Clients { - ctx, cancel := createTimeoutContext(ctx, h.timeout) - defer cancel() - result, err = client.Status(ctx) - if err != nil { - err = h.handleTimeoutError(err) - h.logger.Error().Err(err).Msgf("Failed to get client from id :%s status: %s", client.GetIdentifier(), err) - continue - } - clients = append(clients, ActiveClient{Client: client, Height: result.SyncInfo.LatestBlockHeight}) - } - - sort.Slice(clients, func(i, j int) bool { - return clients[i].Height >= clients[j].Height - }) - - h.mu.Lock() - defer h.mu.Unlock() - h.activeClients = clients - if len(h.activeClients) == 0 { - return fmt.Errorf("RPC: All RPC Clients failed to get status. Last error: %v", err) - } - - return nil -} - -func (h *Hub) Status(ctx context.Context) (*coretypes.ResultStatus, error) { - span, ctx := common.StartSentrySpan(ctx, "HubStatus", "Calling /status from RPCs") - defer span.Finish() - - var result *coretypes.ResultStatus - var err error - for _, active := range h.activeClients { - ctx, cancel := createTimeoutContext(ctx, h.timeout) - defer cancel() - result, err = active.Client.Status(ctx) - if err != nil { - err = h.handleTimeoutError(err) - h.logger.Error().Err(err).Msgf("Failed to get client status: %v", err) - continue - } - return result, nil - } - return nil, fmt.Errorf("RPC: All RPC Clients failed to get status. Last error: %v", err) -} - -func (h *Hub) Block(ctx context.Context, height *int64) (*coretypes.ResultBlock, error) { - span, ctx := common.StartSentrySpan(ctx, "HubBlock", "Calling /block from RPCs") - defer span.Finish() - - var result *coretypes.ResultBlock - var err error - var hasStaleData bool - for _, active := range h.activeClients { - ctx, cancel := createTimeoutContext(ctx, h.timeout) - defer cancel() - result, err = active.Client.Block(ctx, height) - if err != nil { - err = h.handleTimeoutError(err) - continue - } else if result.Block.Header.Height < *height { - hasStaleData = true - } else { - return result, nil - } - } - if hasStaleData { - return nil, fmt.Errorf("RPC: Stale block data") - } - return nil, fmt.Errorf("RPC: All RPC Clients failed to get block. Last error: %v", err) -} - -func (h *Hub) BlockResults(ctx context.Context, height *int64) (*coretypes.ResultBlockResults, error) { - span, ctx := common.StartSentrySpan(ctx, "HubBlockResults", "Calling /block_results from RPCs") - defer span.Finish() - - var result *coretypes.ResultBlockResults - var err error - var hasStaleData bool - for _, active := range h.activeClients { - ctx, cancel := createTimeoutContext(ctx, h.timeout) - defer cancel() - result, err = active.Client.BlockResults(ctx, height) - if err != nil { - err = h.handleTimeoutError(err) - h.logger.Error().Err(err).Msgf("Failed to get client status: %v", err) - continue - } else if result.Height < *height { - hasStaleData = true - } else { - return result, nil - } - } - - if hasStaleData { - return nil, fmt.Errorf("RPC: Stale block results data") - } - return nil, fmt.Errorf("RPC: All RPC Clients failed to get block results. Last error: %v", err) -} - -func (h *Hub) Validators(ctx context.Context, height *int64, page, perPage *int) (*coretypes.ResultValidators, error) { - span, ctx := common.StartSentrySpan(ctx, "HubValidators", "Calling /validators from RPCs") - defer span.Finish() - - var result *coretypes.ResultValidators - var err error - for _, active := range h.activeClients { - ctx, cancel := createTimeoutContext(ctx, h.timeout) - defer cancel() - result, err = active.Client.Validators(ctx, height, page, perPage) - if err != nil { - err = h.handleTimeoutError(err) - h.logger.Error().Err(err).Msgf("Failed to get client status: %v", err) - continue - } - return result, nil - } - - return nil, fmt.Errorf("RPC: All RPC Clients failed to get validators results. Last error: %v", err) -} - -func (h *Hub) ValidatorInfos(ctx context.Context, status string) (*[]types.Validator, error) { - span, ctx := common.StartSentrySpan(ctx, "HubValidatorInfos", "Calling validator infos from RPCs") - defer span.Finish() - - var result *[]types.Validator - var err error - for _, active := range h.activeClients { - result, err = active.Client.ValidatorInfos(ctx, status) - if err != nil { - err = h.handleTimeoutError(err) - h.logger.Error().Err(err).Msgf("Failed to get client status: %v", err) - continue - } - return result, nil - } - return nil, fmt.Errorf("RPC: All RPC Clients failed to get validators results. Last error: %v", err) -} - -func (h *Hub) GetActiveClients() []ActiveClient { - h.mu.Lock() - defer h.mu.Unlock() - return h.activeClients -} - -func (h *Hub) GetIdentifier() string { - if len(h.Clients) == 0 { - return "" - } - - ids := make([]string, len(h.Clients)) - for i, client := range h.Clients { - ids[i] = client.GetIdentifier() - } - return fmt.Sprintf("%v", ids) -} diff --git a/informative-indexer/cosmosrpc/rpc.go b/informative-indexer/cosmosrpc/rpc.go deleted file mode 100644 index 4bbf4abd..00000000 --- a/informative-indexer/cosmosrpc/rpc.go +++ /dev/null @@ -1,164 +0,0 @@ -package cosmosrpc - -import ( - "context" - "encoding/json" - "net/http" - - cjson "github.com/cometbft/cometbft/libs/json" - coretypes "github.com/cometbft/cometbft/rpc/core/types" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/types/query" - mstakingtypes "github.com/initia-labs/initia/x/mstaking/types" - "github.com/ybbus/jsonrpc/v3" - - "github.com/initia-labs/core-indexer/informative-indexer/common" -) - -type Client struct { - jc jsonrpc.RPCClient - clientCtx client.Context - identifier string -} - -func (c *Client) Call(ctx context.Context, method string, params map[string]interface{}) (*jsonrpc.RPCResponse, error) { - span, ctx := common.StartSentrySpan(ctx, c.identifier+"/"+method, "Calling "+method+" of "+c.identifier) - defer span.Finish() - - paramsMap := make(map[string]json.RawMessage, len(params)) - for name, value := range params { - valueJSON, err := cjson.Marshal(value) - if err != nil { - return nil, err - } - paramsMap[name] = valueJSON - } - - return c.jc.Call(ctx, method, paramsMap) -} - -type CosmosJSONRPCClient interface { - Status(ctx context.Context) (*coretypes.ResultStatus, error) - Block(ctx context.Context, height *int64) (*coretypes.ResultBlock, error) - BlockResults(ctx context.Context, height *int64) (*coretypes.ResultBlockResults, error) - Validators(ctx context.Context, height *int64, page, perPage *int) (*coretypes.ResultValidators, error) - ValidatorInfos(ctx context.Context, status string) (*[]mstakingtypes.Validator, error) - GetIdentifier() string -} - -type ClientOption struct { - HTTPClient *http.Client - CustomHeaders map[string]string - AllowUnknownFields bool - DefaultRequestID int -} - -func NewClient(url string) *Client { - c, err := client.NewClientFromNode(url) - if err != nil { - panic(err) - } - return &Client{jsonrpc.NewClient(url), client.Context{}.WithClient(c), url} -} - -func NewClientWithOption(url string, option ClientOption) *Client { - c, err := client.NewClientFromNode(url) - if err != nil { - panic(err) - } - return &Client{ - jsonrpc.NewClientWithOpts(url, &jsonrpc.RPCClientOpts{ - HTTPClient: option.HTTPClient, - CustomHeaders: option.CustomHeaders, - AllowUnknownFields: option.AllowUnknownFields, - DefaultRequestID: option.DefaultRequestID, - }), - client.Context{}.WithClient(c), - url, - } -} - -func handleResponseAndGetResult[T any](response *jsonrpc.RPCResponse, err error) (*T, error) { - if err != nil { - return nil, err - } - if response.Error != nil { - return nil, response.Error - } - - jsBytes, err := json.Marshal(response.Result) - if err != nil { - return nil, err - } - - result := new(T) - err = cjson.Unmarshal(jsBytes, result) - if err != nil { - return nil, err - } - - return result, nil -} - -func (c *Client) Status(ctx context.Context) (*coretypes.ResultStatus, error) { - jsonResponse, err := c.Call(ctx, "status", map[string]interface{}{}) - return handleResponseAndGetResult[coretypes.ResultStatus](jsonResponse, err) -} - -func (c *Client) Block(ctx context.Context, height *int64) (*coretypes.ResultBlock, error) { - jsonResponse, err := c.Call(ctx, "block", map[string]interface{}{"height": height}) - return handleResponseAndGetResult[coretypes.ResultBlock](jsonResponse, err) -} - -func (c *Client) BlockResults(ctx context.Context, height *int64) (*coretypes.ResultBlockResults, error) { - jsonResponse, err := c.Call(ctx, "block_results", map[string]interface{}{"height": height}) - return handleResponseAndGetResult[coretypes.ResultBlockResults](jsonResponse, err) -} - -func (c *Client) Validators(ctx context.Context, height *int64, page, perPage *int) (*coretypes.ResultValidators, error) { - params := make(map[string]interface{}) - if page != nil { - params["page"] = page - } - if perPage != nil { - params["per_page"] = perPage - } - if height != nil { - params["height"] = height - } - jsonResponse, err := c.Call(ctx, "validators", params) - return handleResponseAndGetResult[coretypes.ResultValidators](jsonResponse, err) -} - -func (c *Client) ValidatorInfos(ctx context.Context, status string) (*[]mstakingtypes.Validator, error) { - span, ctx := common.StartSentrySpan(ctx, c.identifier+"/validator_infos", "Calling validator_infos of "+c.identifier) - defer span.Finish() - - queryClient := mstakingtypes.NewQueryClient(c.clientCtx) - nextKey := make([]byte, 0) - vals := make([]mstakingtypes.Validator, 0) - for { - request := mstakingtypes.QueryValidatorsRequest{ - Pagination: &query.PageRequest{ - Key: nextKey, - }, - } - if status != "" { - request.Status = status - } - result, err := queryClient.Validators(ctx, &request) - if err != nil { - return nil, err - } - nextKey = result.Pagination.NextKey - vals = append(vals, result.Validators...) - if len(nextKey) == 0 { - break - } - } - return &vals, nil -} - -func (c *Client) GetIdentifier() string { - return c.identifier -} diff --git a/informative-indexer/db/db.go b/informative-indexer/db/db.go deleted file mode 100644 index 82a8beca..00000000 --- a/informative-indexer/db/db.go +++ /dev/null @@ -1,162 +0,0 @@ -package db - -import ( - "context" - "errors" - "fmt" - "strings" - "time" - - "github.com/getsentry/sentry-go" - "github.com/jackc/pgx/v5" - "github.com/jackc/pgx/v5/pgconn" - "github.com/jackc/pgx/v5/pgxpool" -) - -var ( - QueryTimeout = 5 * time.Minute - - ErrorNonRetryable = errors.New("non-retryable error") - ErrorLengthMismatch = errors.New("length mismatch") -) - -func NewClient(databaseURL string) (*pgxpool.Pool, error) { - return pgxpool.New(context.Background(), databaseURL) -} - -type Queryable interface { - Exec(ctx context.Context, sql string, arguments ...interface{}) (pgconn.CommandTag, error) - QueryRow(ctx context.Context, sql string, arguments ...interface{}) pgx.Row - Query(ctx context.Context, sql string, arguments ...interface{}) (pgx.Rows, error) -} - -func GetLatestBlockHeight(ctx context.Context, dbClient Queryable) (int64, error) { - var height int64 - err := QueryRowWithTimeout(ctx, dbClient, "SELECT block_height FROM transaction_events ORDER BY block_height DESC LIMIT 1").Scan(&height) - if err != nil { - // Handle no rows found in `transaction_events` - if errors.Is(err, pgx.ErrNoRows) { - // Fallback to the latest indexed height from `blocks` - err = QueryRowWithTimeout(ctx, dbClient, "SELECT height FROM blocks ORDER BY height DESC LIMIT 1").Scan(&height) - if err == nil { - return height, nil - } - } - return 0, fmt.Errorf("failed to get latest block height: %w", err) - } - - return height, nil -} - -func InsertTransactionEventsIgnoreConflict(ctx context.Context, dbTx Queryable, txEvents []*TransactionEvent) error { - span := sentry.StartSpan(ctx, "InsertTransactionEvents") - span.Description = "Bulk insert transaction_events into the database" - defer span.Finish() - - if len(txEvents) == 0 { - return nil - } - - columns := getColumns(txEvents[0]) - var values [][]interface{} - for _, txEvent := range txEvents { - values = append(values, []interface{}{ - txEvent.TransactionHash, - txEvent.BlockHeight, - txEvent.EventKey, - txEvent.EventValue, - txEvent.EventIndex, - }) - } - - return BulkInsert(ctx, dbTx, "transaction_events", columns, values, "ON CONFLICT DO NOTHING") -} - -func InsertMoveEventsIgnoreConflict(ctx context.Context, dbTx Queryable, moveEvents []*MoveEvent) error { - span := sentry.StartSpan(ctx, "InsertMoveEvents") - span.Description = "Bulk insert move_events into the database" - defer span.Finish() - - if len(moveEvents) == 0 { - return nil - } - - columns := getColumns(moveEvents[0]) - var values [][]interface{} - for _, moveEvent := range moveEvents { - values = append(values, []interface{}{ - moveEvent.TypeTag, - moveEvent.Data, - moveEvent.BlockHeight, - moveEvent.TransactionHash, - moveEvent.EventIndex, - }) - } - - return BulkInsert(ctx, dbTx, "move_events", columns, values, "ON CONFLICT DO NOTHING") -} - -func InsertFinalizeBlockEventsIgnoreConflict(ctx context.Context, dbTx Queryable, blockEvents []*FinalizeBlockEvent) error { - span := sentry.StartSpan(ctx, "InsertFinalizeBlockEvents") - span.Description = "Bulk insert finalize_block_events into the database" - defer span.Finish() - - if len(blockEvents) == 0 { - return nil - } - - columns := getColumns(blockEvents[0]) - var values [][]interface{} - for _, blockEvent := range blockEvents { - values = append(values, []interface{}{ - blockEvent.BlockHeight, - blockEvent.EventKey, - blockEvent.EventValue, - blockEvent.EventIndex, - blockEvent.Mode, - }) - } - - return BulkInsert(ctx, dbTx, "finalize_block_events", columns, values, "ON CONFLICT DO NOTHING") -} - -func GetRowCount(ctx context.Context, dbClient Queryable, table string) (int64, error) { - if !isValidTableName(table) { - return 0, fmt.Errorf("invalid table name: %s", table) - } - - var count int64 - query := fmt.Sprintf("SELECT COUNT(*) FROM %s", table) - err := QueryRowWithTimeout(ctx, dbClient, query).Scan(&count) - if err != nil { - return 0, fmt.Errorf("failed to get row count for table %s: %w", table, err) - } - return count, nil -} - -func GetRowsToPruneByBlockHeight(ctx context.Context, dbClient Queryable, table string, threshold int64) (pgx.Rows, error) { - t, ok := ValidTablesMap[table] - if !ok { - return nil, fmt.Errorf("invalid table name: %s", table) - - } - - columns := getColumns(t) - query := fmt.Sprintf("SELECT %s FROM %s WHERE block_height <= $1", strings.Join(columns, ", "), table) - rows, err := QueryRowsWithTimeout(ctx, dbClient, query, threshold) - if err != nil { - return nil, fmt.Errorf("failed to get rows to prune from table %s: %w", table, err) - } - return rows, err -} - -func DeleteRowsToPrune(ctx context.Context, dbClient Queryable, table string, threshold int64) error { - if !isValidTableName(table) { - return fmt.Errorf("invalid table name: %s", table) - } - - query := fmt.Sprintf("DELETE FROM %s WHERE block_height <= $1", table) - - _, err := ExecWithTimeout(ctx, dbClient, query, threshold) - return err -} diff --git a/informative-indexer/db/finalize_block_event.go b/informative-indexer/db/finalize_block_event.go deleted file mode 100644 index 5dc318bc..00000000 --- a/informative-indexer/db/finalize_block_event.go +++ /dev/null @@ -1,68 +0,0 @@ -package db - -import ( - "errors" - "github.com/jackc/pgx/v5" -) - -type Mode int - -const ( - BeginBlock Mode = iota - EndBlock -) - -func (m Mode) String() string { - switch m { - case BeginBlock: - return "BeginBlock" - case EndBlock: - return "EndBlock" - default: - return "Unknown" - } -} - -func ParseMode(s string) (Mode, error) { - switch s { - case "BeginBlock": - return BeginBlock, nil - case "EndBlock": - return EndBlock, nil - default: - return -1, errors.New("invalid mode value") - } -} - -type FinalizeBlockEvent struct { - BlockHeight int64 `json:"block_height"` - EventKey string `json:"event_key"` - EventValue string `json:"event_value"` - EventIndex int `json:"event_index"` - Mode Mode `json:"mode"` -} - -func (f *FinalizeBlockEvent) Unmarshal(rows pgx.Rows) (map[string]interface{}, error) { - var modeStr string - - err := rows.Scan(&f.BlockHeight, &f.EventKey, &f.EventValue, &f.EventIndex, &modeStr) - if err != nil { - return nil, err - } - - mode, parseErr := ParseMode(modeStr) - if parseErr != nil { - return nil, parseErr - } - f.Mode = mode - - row := map[string]interface{}{ - "block_height": f.BlockHeight, - "event_key": f.EventKey, - "event_value": f.EventValue, - "event_index": f.EventIndex, - "mode": f.Mode.String(), - } - - return row, nil -} diff --git a/informative-indexer/db/move_event.go b/informative-indexer/db/move_event.go deleted file mode 100644 index a850446f..00000000 --- a/informative-indexer/db/move_event.go +++ /dev/null @@ -1,30 +0,0 @@ -package db - -import ( - "github.com/jackc/pgx/v5" -) - -type MoveEvent struct { - TypeTag string `json:"type_tag"` - Data string `json:"data"` - BlockHeight int64 `json:"block_height"` - TransactionHash string `json:"transaction_hash"` - EventIndex int `json:"event_index"` -} - -func (m *MoveEvent) Unmarshal(rows pgx.Rows) (map[string]interface{}, error) { - err := rows.Scan(&m.TypeTag, &m.Data, &m.BlockHeight, &m.TransactionHash, &m.EventIndex) - if err != nil { - return nil, err - } - - row := map[string]interface{}{ - "type_tag": m.TypeTag, - "data": m.Data, - "block_height": m.BlockHeight, - "transaction_hash": m.TransactionHash, - "event_index": m.EventIndex, - } - - return row, nil -} diff --git a/informative-indexer/db/transaction_event.go b/informative-indexer/db/transaction_event.go deleted file mode 100644 index 56c75557..00000000 --- a/informative-indexer/db/transaction_event.go +++ /dev/null @@ -1,28 +0,0 @@ -package db - -import "github.com/jackc/pgx/v5" - -type TransactionEvent struct { - TransactionHash string `json:"transaction_hash"` - BlockHeight int64 `json:"block_height"` - EventKey string `json:"event_key"` - EventValue string `json:"event_value"` - EventIndex int `json:"event_index"` -} - -func (t *TransactionEvent) Unmarshal(rows pgx.Rows) (map[string]interface{}, error) { - err := rows.Scan(&t.TransactionHash, &t.BlockHeight, &t.EventKey, &t.EventValue, &t.EventIndex) - if err != nil { - return nil, err - } - - row := map[string]interface{}{ - "transaction_hash": t.TransactionHash, - "block_height": t.BlockHeight, - "event_key": t.EventKey, - "event_value": t.EventValue, - "event_index": t.EventIndex, - } - - return row, nil -} diff --git a/informative-indexer/db/util.go b/informative-indexer/db/util.go deleted file mode 100644 index 88494c59..00000000 --- a/informative-indexer/db/util.go +++ /dev/null @@ -1,97 +0,0 @@ -package db - -import ( - "context" - "fmt" - "reflect" - "strings" - - "github.com/jackc/pgx/v5" - "github.com/jackc/pgx/v5/pgconn" -) - -func getColumns(t interface{}) []string { - var fieldNames []string - tType := reflect.TypeOf(t) - if tType.Kind() == reflect.Ptr { - tType = tType.Elem() - } - if tType.Kind() != reflect.Struct { - panic(fmt.Errorf("provided type is not a struct or pointer to a struct")) - } - for i := 0; i < tType.NumField(); i++ { - field := tType.Field(i) - jsonTag := field.Tag.Get("json") - if jsonTag != "" { - fieldNames = append(fieldNames, jsonTag) - } - } - return fieldNames -} - -func flattenValues(values [][]interface{}) []interface{} { - flatValues := make([]interface{}, 0) - for _, value := range values { - flatValues = append(flatValues, value...) - } - return flatValues -} - -func generatePlaceholders(values [][]interface{}) string { - placeholders := make([]string, 0) - valueIdx := 1 - for i := range values { - placeholder := make([]string, 0) - for range values[i] { - placeholder = append(placeholder, fmt.Sprintf("$%d", valueIdx)) - valueIdx++ - } - placeholders = append(placeholders, fmt.Sprintf("(%s)", strings.Join(placeholder, ", "))) - } - return strings.Join(placeholders, ", ") -} - -func QueryRowWithTimeout(parentCtx context.Context, dbClient Queryable, query string, args ...interface{}) pgx.Row { - ctx, cancel := context.WithTimeout(context.Background(), QueryTimeout) - defer cancel() - result := dbClient.QueryRow(ctx, query, args...) - return result -} - -func ExecWithTimeout(parentCtx context.Context, dbClient Queryable, query string, args ...interface{}) (pgconn.CommandTag, error) { - ctx, cancel := context.WithTimeout(context.Background(), QueryTimeout) - defer cancel() - - result, err := dbClient.Exec(ctx, query, args...) - return result, err -} - -func BulkInsert(parentCtx context.Context, dbTx Queryable, tableName string, columns []string, values [][]interface{}, extraArgs string) error { - if len(values) == 0 || len(columns) == 0 { - return nil - } - - if len(columns) != len(values[0]) { - return ErrorLengthMismatch - } - - query := fmt.Sprintf("INSERT INTO %s (%s) VALUES %s %s", tableName, strings.Join(columns, ", "), generatePlaceholders(values), extraArgs) - _, err := ExecWithTimeout(parentCtx, dbTx, query, flattenValues(values)...) - if err != nil { - return err - } - - return nil -} - -func QueryRowsWithTimeout(parentCtx context.Context, dbClient Queryable, query string, args ...interface{}) (pgx.Rows, error) { - ctx, cancel := context.WithTimeout(context.Background(), QueryTimeout) - defer cancel() - - results, err := dbClient.Query(ctx, query, args...) - if err != nil { - return nil, err - } - - return results, err -} diff --git a/informative-indexer/db/util_test.go b/informative-indexer/db/util_test.go deleted file mode 100644 index e26b12d5..00000000 --- a/informative-indexer/db/util_test.go +++ /dev/null @@ -1,19 +0,0 @@ -package db - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestGetColumns(t *testing.T) { - txEvents := &TransactionEvent{} - columns := getColumns(txEvents) - assert.Equal(t, []string{ - "transaction_hash", - "block_height", - "event_key", - "event_value", - "event_index", - }, columns) -} diff --git a/informative-indexer/flusher/block_results.go b/informative-indexer/flusher/block_results.go deleted file mode 100644 index 6a874fe7..00000000 --- a/informative-indexer/flusher/block_results.go +++ /dev/null @@ -1,175 +0,0 @@ -package flusher - -import ( - "context" - "fmt" - - movetypes "github.com/initia-labs/initia/x/move/types" - "github.com/jackc/pgx/v5" - - "github.com/initia-labs/core-indexer/informative-indexer/common" - "github.com/initia-labs/core-indexer/informative-indexer/db" -) - -func (f *Flusher) parseAndInsertTransactionEvents(parentCtx context.Context, dbTx pgx.Tx, blockResults *common.BlockResultMsg) error { - span, ctx := common.StartSentrySpan(parentCtx, "parseAndInsertTransactionEvents", "Parse block_results message and insert transaction_events into the database") - defer span.Finish() - - txEvents := make([]*db.TransactionEvent, 0) - for _, tx := range blockResults.Txs { - if tx.ExecTxResults.Log == "tx parse error" { - continue - } - - // idx ensures EventIndex is unique within each transaction. - idx := 0 - for _, event := range tx.ExecTxResults.Events { - for _, attr := range event.Attributes { - txEvents = append(txEvents, &db.TransactionEvent{ - TransactionHash: tx.Hash, - BlockHeight: blockResults.Height, - EventKey: fmt.Sprintf("%s.%s", event.Type, attr.Key), - EventValue: attr.Value, - EventIndex: idx, - }) - idx++ - } - } - } - - if err := db.InsertTransactionEventsIgnoreConflict(ctx, dbTx, txEvents); err != nil { - logger.Error().Msgf("Error inserting transaction_events: %v", err) - return err - } - - return nil -} - -func (f *Flusher) parseAndInsertMoveEvents(parentCtx context.Context, dbTx pgx.Tx, blockResults *common.BlockResultMsg) error { - span, ctx := common.StartSentrySpan(parentCtx, "parseAndInsertMoveEvents", "Parse block_results message and insert move_events into the database") - defer span.Finish() - - moveEvents := make([]*db.MoveEvent, 0) - for _, tx := range blockResults.Txs { - if tx.ExecTxResults.Log == "tx parse error" { - continue - } - - // idx ensures EventIndex is unique within each transaction. - idx := 0 - for _, event := range tx.ExecTxResults.Events { - if event.Type == movetypes.EventTypeMove { - moveEvent := &db.MoveEvent{ - BlockHeight: blockResults.Height, - TransactionHash: tx.Hash, - EventIndex: idx, - } - for _, attr := range event.Attributes { - switch attr.Key { - case movetypes.AttributeKeyTypeTag: - moveEvent.TypeTag = attr.Value - case movetypes.AttributeKeyData: - moveEvent.Data = attr.Value - } - } - moveEvents = append(moveEvents, moveEvent) - idx++ - } - } - } - - if err := db.InsertMoveEventsIgnoreConflict(ctx, dbTx, moveEvents); err != nil { - logger.Error().Msgf("Error inserting move_events: %v", err) - return err - } - - return nil -} - -func (f *Flusher) parseAndInsertFinalizeBlockEvents(parentCtx context.Context, dbTx pgx.Tx, blockResults *common.BlockResultMsg) error { - span, ctx := common.StartSentrySpan(parentCtx, "parseAndInsertFinalizeBlockEvents", "Parse block_results message and insert finalize_block_events into the database") - defer span.Finish() - - finalizeBlockEvents := make([]*db.FinalizeBlockEvent, 0) - // id ensures EventIndex is unique within each block. - idx := 0 - for _, event := range blockResults.FinalizeBlockEvents { - attrs := event.Attributes - if len(attrs) > 0 { - // Check if the last attribute key is "mode" - // We set mode to the value of the last attribute key "mode" here, since in CometBFT the "mode" will get - // append at the end - if attrs[len(attrs)-1].Key == "mode" { - mode, err := db.ParseMode(attrs[len(attrs)-1].Value) - if err != nil { - logger.Error().Msgf("Error parsing `mode` into db.Mode: %v", err) - return err - } - // Process all attributes except the last one (which should be the mode) - for _, attr := range attrs[:len(attrs)-1] { - finalizeBlockEvents = append(finalizeBlockEvents, &db.FinalizeBlockEvent{ - BlockHeight: blockResults.Height, - EventKey: fmt.Sprintf("%s.%s", event.Type, attr.Key), - EventValue: attr.Value, - EventIndex: idx, - Mode: mode, - }) - idx++ - } - } else { - err := fmt.Errorf("expected 'mode' as the last attribute in event, but found '%s'", attrs[len(attrs)-1].Key) - logger.Error().Msgf("%v", err) - return err - } - } - } - - if err := db.InsertFinalizeBlockEventsIgnoreConflict(ctx, dbTx, finalizeBlockEvents); err != nil { - logger.Error().Msgf("Error inserting finalize_block_events: %v", err) - return err - } - - return nil -} - -func (f *Flusher) processBlockResults(parentCtx context.Context, blockResults *common.BlockResultMsg) error { - span, ctx := common.StartSentrySpan(parentCtx, "processBlockResults", "Parse block_results message and insert tx events into the database") - defer span.Finish() - - logger.Info().Msgf("Processing block_results at height: %d", blockResults.Height) - - dbTx, err := f.dbClient.BeginTx(ctx, pgx.TxOptions{}) - if err != nil { - logger.Error().Int64("height", blockResults.Height).Msgf("Error beginning transaction: %v", err) - return err - } - defer dbTx.Rollback(ctx) - - err = f.parseAndInsertTransactionEvents(ctx, dbTx, blockResults) - if err != nil { - logger.Error().Int64("height", blockResults.Height).Msgf("Error inserting transaction_events: %v", err) - return err - } - - err = f.parseAndInsertMoveEvents(ctx, dbTx, blockResults) - if err != nil { - logger.Error().Int64("height", blockResults.Height).Msgf("Error inserting move_events: %v", err) - return err - } - - err = f.parseAndInsertFinalizeBlockEvents(ctx, dbTx, blockResults) - if err != nil { - logger.Error().Int64("height", blockResults.Height).Msgf("Error inserting finalize_block_events: %v", err) - return err - } - - err = dbTx.Commit(ctx) - if err != nil { - logger.Error().Int64("height", blockResults.Height).Msgf("Error committing transaction: %v", err) - return err - } - - logger.Info().Int64("height", blockResults.Height).Msgf("Successfully flushed block: %d", blockResults.Height) - - return nil -} diff --git a/informative-indexer/flusher/block_results_test.go b/informative-indexer/flusher/block_results_test.go deleted file mode 100644 index da0e0eed..00000000 --- a/informative-indexer/flusher/block_results_test.go +++ /dev/null @@ -1,80 +0,0 @@ -package flusher - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "strconv" - "testing" - - abci "github.com/cometbft/cometbft/abci/types" - - "github.com/initia-labs/core-indexer/informative-indexer/common" -) - -type MockResponse struct { - Result MockResult `json:"result"` -} - -type MockResult struct { - TxsResults []*abci.ExecTxResult `json:"txs_results"` - FinalizeBlockEvents []abci.Event `json:"finalize_block_events"` -} - -func getBlockResultsByHeight(rpcEndpoint, height string) *common.BlockResultMsg { - url := fmt.Sprintf("%s/block_results?height=%s", rpcEndpoint, height) - - resp, err := http.Get(url) - if err != nil { - panic(fmt.Errorf("failed to send request to rpc endpoint: %w", err)) - } - defer resp.Body.Close() - - body, err := io.ReadAll(resp.Body) - if err != nil { - panic(fmt.Errorf("failed to read response body: %w", err)) - } - - // Unmarshal the JSON response - var result MockResponse - if err = json.Unmarshal(body, &result); err != nil { - panic(fmt.Errorf("failed to unmarshal block results: %w", err)) - } - - txs := make([]common.TxResult, 0) - for idx, tx := range result.Result.TxsResults { - txs = append(txs, common.TxResult{ - Hash: fmt.Sprintf("mockHash{%d}", idx), - ExecTxResults: tx, - }) - } - - lh, err := strconv.Atoi(height) - if err != nil { - panic(err) - } - - mockResult := &common.BlockResultMsg{ - Height: int64(lh), - Txs: txs, - FinalizeBlockEvents: result.Result.FinalizeBlockEvents, - } - - return mockResult -} - -func TestProcessBlockResults(t *testing.T) { - //blockResultsMsg := getBlockResultsByHeight("https://rpc.initiation-2.initia.xyz", "2542435") - //fmt.Println(blockResultsMsg.Height) - // - //flusher, err := NewFlusher(&Config{}) - //if err != nil { - // panic(fmt.Errorf("failed to new flusher: %w", err)) - //} - // - //err = flusher.processBlockResults(context.Background(), blockResultsMsg) - //if err != nil { - // panic(fmt.Errorf("failed to process block_results: %w", err)) - //} -} diff --git a/informative-indexer/flusher/errors.go b/informative-indexer/flusher/errors.go deleted file mode 100644 index 51851e59..00000000 --- a/informative-indexer/flusher/errors.go +++ /dev/null @@ -1,7 +0,0 @@ -package flusher - -import "errors" - -var ( - ErrorNonRetryable = errors.New("error decoding") -) diff --git a/informative-indexer/go.mod b/informative-indexer/go.mod index feb76968..86f33e90 100644 --- a/informative-indexer/go.mod +++ b/informative-indexer/go.mod @@ -1,136 +1,207 @@ module github.com/initia-labs/core-indexer/informative-indexer -go 1.22.7 +go 1.25.8 require ( - cloud.google.com/go/storage v1.47.0 - github.com/aws/aws-sdk-go v1.55.5 - github.com/aws/aws-sdk-go-v2/config v1.28.5 - github.com/aws/aws-sdk-go-v2/credentials v1.17.46 - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.41 - github.com/aws/aws-sdk-go-v2/service/s3 v1.69.0 github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d - github.com/cometbft/cometbft v0.38.15 + github.com/cometbft/cometbft v0.38.20 github.com/confluentinc/confluent-kafka-go/v2 v2.6.1 - github.com/cosmos/cosmos-sdk v0.50.10 + github.com/cosmos/ibc-go/v8 v8.7.0 github.com/getsentry/sentry-go v0.29.1 - github.com/initia-labs/initia v0.6.3 - github.com/jackc/pgx/v5 v5.7.1 + github.com/initia-labs/core-indexer/pkg v0.0.0-00010101000000-000000000000 github.com/rs/zerolog v1.33.0 - github.com/spf13/cobra v1.8.1 - github.com/stretchr/testify v1.9.0 - github.com/ybbus/jsonrpc/v3 v3.1.5 - google.golang.org/api v0.209.0 + github.com/spf13/cobra v1.9.1 + gorm.io/gorm v1.30.0 ) require ( - cel.dev/expr v0.16.1 // indirect - cloud.google.com/go v0.116.0 // indirect - cloud.google.com/go/auth v0.10.2 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.5 // indirect - cloud.google.com/go/compute/metadata v0.5.2 // indirect - cloud.google.com/go/iam v1.2.2 // indirect - cloud.google.com/go/monitoring v1.21.2 // indirect - cosmossdk.io/api v0.7.5 // indirect + ariga.io/atlas v0.33.1 // indirect + ariga.io/atlas-go-sdk v0.6.8 // indirect + ariga.io/atlas-provider-gorm v0.5.2 // indirect + cosmossdk.io/client/v2 v2.0.0-beta.4 // indirect + cosmossdk.io/x/evidence v0.1.1 // indirect + cosmossdk.io/x/feegrant v0.1.1 // indirect + cosmossdk.io/x/upgrade v0.1.4 // indirect + github.com/agext/levenshtein v1.2.3 // indirect + github.com/alitto/pond v1.8.3 // indirect + github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.41.4 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.12 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 // indirect + github.com/aws/smithy-go v1.24.2 // indirect + github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect + github.com/bits-and-blooms/bitset v1.20.0 // indirect + github.com/bmatcuk/doublestar v1.3.4 // indirect + github.com/chzyer/readline v1.5.1 // indirect + github.com/cockroachdb/apd/v2 v2.0.2 // indirect + github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.2.0 // indirect + github.com/cosmos/ibc-apps/modules/rate-limiting/v8 v8.0.0 // indirect + github.com/cosmos/ibc-go/modules/capability v1.0.1 // indirect + github.com/cosmos/interchain-security/v6 v6.3.0 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.36.0 // indirect + github.com/ethereum/go-ethereum v1.16.9 // indirect + github.com/go-jose/go-jose/v4 v4.1.3 // indirect + github.com/go-openapi/inflect v0.19.0 // indirect + github.com/go-sql-driver/mysql v1.8.1 // indirect + github.com/golang-migrate/migrate/v4 v4.18.3 // indirect + github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect + github.com/golang-sql/sqlexp v0.1.0 // indirect + github.com/golang/mock v1.6.0 // indirect + github.com/google/orderedcode v0.0.1 // indirect + github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-getter v1.8.6 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-version v1.8.0 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/hashicorp/hcl/v2 v2.18.1 // indirect + github.com/holiman/uint256 v1.3.2 // indirect + github.com/iancoleman/orderedmap v0.3.0 // indirect + github.com/initia-labs/OPinit v1.3.0 // indirect + github.com/initia-labs/OPinit/api v1.3.0 // indirect + github.com/initia-labs/initia/api v1.4.0 // indirect + github.com/initia-labs/store v0.1.1 // indirect + github.com/initia-labs/store/memiavl v0.1.1 // indirect + github.com/initia-labs/store/versiondb v0.1.0 // indirect + github.com/jackc/pgx/v5 v5.9.2 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/ledgerwatch/erigon-lib v0.0.0-20230210071639-db0e7ed11263 // indirect + github.com/lib/pq v1.10.9 // indirect + github.com/manifoldco/promptui v0.9.0 // indirect + github.com/mattn/go-sqlite3 v1.14.22 // indirect + github.com/microsoft/go-mssqldb v1.7.2 // indirect + github.com/minio/highwayhash v1.0.3 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/go-wordwrap v1.0.1 // indirect + github.com/noble-assets/forwarding/v2 v2.0.3 // indirect + github.com/rakyll/statik v0.1.7 // indirect + github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect + github.com/tidwall/gjson v1.18.0 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.0 // indirect + github.com/tidwall/tinylru v1.1.0 // indirect + github.com/tidwall/wal v1.1.7 // indirect + github.com/ulikunitz/xz v0.5.15 // indirect + github.com/zbiljic/go-filelock v0.0.0-20170914061330-1dbf7103ab7d // indirect + github.com/zclconf/go-cty v1.14.4 // indirect + github.com/zclconf/go-cty-yaml v1.1.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.uber.org/atomic v1.10.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gorm.io/driver/mysql v1.5.7 // indirect + gorm.io/driver/postgres v1.6.0 // indirect + gorm.io/driver/sqlite v1.5.7 // indirect + gorm.io/driver/sqlserver v1.5.4 // indirect +) + +require ( + cel.dev/expr v0.25.1 // indirect + cloud.google.com/go v0.123.0 // indirect + cloud.google.com/go/auth v0.18.2 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect + cloud.google.com/go/compute/metadata v0.9.0 // indirect + cloud.google.com/go/iam v1.5.3 // indirect + cloud.google.com/go/monitoring v1.24.3 // indirect + cloud.google.com/go/storage v1.61.3 // indirect + cosmossdk.io/api v0.7.6 // indirect cosmossdk.io/collections v0.4.0 // indirect cosmossdk.io/core v0.11.1 // indirect - cosmossdk.io/depinject v1.0.0 // indirect + cosmossdk.io/depinject v1.1.0 // indirect cosmossdk.io/errors v1.0.1 // indirect cosmossdk.io/log v1.4.1 // indirect cosmossdk.io/math v1.4.0 // indirect cosmossdk.io/store v1.1.1 // indirect - cosmossdk.io/x/tx v0.13.5 // indirect - filippo.io/edwards25519 v1.1.0 // indirect + cosmossdk.io/x/tx v0.13.7 // indirect + filippo.io/edwards25519 v1.1.1 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.2 // indirect github.com/DataDog/datadog-go v3.2.0+incompatible // indirect github.com/DataDog/zstd v1.5.5 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.1 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 // indirect github.com/IGLOU-EU/go-wildcard v1.0.3 // indirect github.com/aptos-labs/serde-reflection/serde-generate/runtime/golang v0.0.0-20231213012317-73b6bbf74833 // indirect - github.com/aws/aws-sdk-go-v2 v1.32.5 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.20 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.24 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.24 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.24 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.5 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.5 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.5 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.24.6 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.5 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.33.1 // indirect - github.com/aws/smithy-go v1.22.1 // indirect + github.com/aws/aws-sdk-go-v2/config v1.32.12 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect + github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 // indirect github.com/cockroachdb/errors v1.11.3 // indirect github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v1.1.2 // indirect + github.com/cockroachdb/pebble v1.1.5 // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect - github.com/cometbft/cometbft-db v0.14.1 // indirect + github.com/cometbft/cometbft-db v0.15.0 // indirect github.com/cosmos/btcutil v1.0.5 // indirect - github.com/cosmos/cosmos-db v1.0.2 // indirect + github.com/cosmos/cosmos-db v1.1.1 // indirect github.com/cosmos/cosmos-proto v1.0.0-beta.5 // indirect + github.com/cosmos/cosmos-sdk v0.50.14 github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogogateway v1.2.0 // indirect github.com/cosmos/gogoproto v1.7.0 // indirect - github.com/cosmos/iavl v1.2.0 // indirect + github.com/cosmos/iavl v1.2.6 // indirect github.com/cosmos/ics23/go v0.11.0 // indirect - github.com/cosmos/ledger-cosmos-go v0.13.3 // indirect + github.com/cosmos/ledger-cosmos-go v0.14.0 // indirect github.com/danieljoos/wincred v1.1.2 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect - github.com/dgraph-io/badger/v4 v4.2.0 // indirect - github.com/dgraph-io/ristretto v0.1.1 // indirect + github.com/dgraph-io/badger/v4 v4.3.0 // indirect + github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/dvsekhvalnov/jose2go v1.6.0 // indirect - github.com/emicklei/dot v1.6.1 // indirect - github.com/envoyproxy/go-control-plane v0.13.0 // indirect - github.com/envoyproxy/protoc-gen-validate v1.1.0 // indirect - github.com/fatih/color v1.17.0 // indirect + github.com/dvsekhvalnov/jose2go v1.7.0 // indirect + github.com/emicklei/dot v1.6.2 // indirect + github.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect + github.com/fatih/color v1.18.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-kit/kit v0.13.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/glog v1.2.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/golang/snappy v1.0.0 // indirect github.com/google/btree v1.1.3 // indirect - github.com/google/flatbuffers v1.12.1 // indirect - github.com/google/go-cmp v0.6.0 // indirect - github.com/google/s2a-go v0.1.8 // indirect + github.com/google/flatbuffers v23.5.26+incompatible // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect - github.com/googleapis/gax-go/v2 v2.14.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect + github.com/googleapis/gax-go/v2 v2.17.0 // indirect github.com/gorilla/handlers v1.5.2 // indirect github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect - github.com/hashicorp/go-hclog v1.5.0 // indirect + github.com/hashicorp/go-hclog v1.6.3 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-metrics v0.5.3 // indirect github.com/hashicorp/go-plugin v1.5.2 // indirect - github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/yamux v0.1.1 // indirect @@ -139,17 +210,18 @@ require ( github.com/iancoleman/strcase v0.3.0 // indirect github.com/improbable-eng/grpc-web v0.15.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/initia-labs/movevm v0.7.0 // indirect + github.com/initia-labs/initia v1.4.3 + github.com/initia-labs/movevm v1.2.0 github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/jmhodges/levigo v1.0.0 // indirect - github.com/klauspost/compress v1.17.9 // indirect + github.com/klauspost/compress v1.18.5 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect - github.com/linxGnu/grocksdb v1.8.14 // indirect + github.com/linxGnu/grocksdb v1.10.3 // indirect github.com/magiconair/properties v1.8.7 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -162,54 +234,56 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.20.5 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.60.1 // indirect + github.com/prometheus/client_golang v1.21.0 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.62.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect github.com/rs/cors v1.11.1 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sasha-s/go-deadlock v0.3.5 // indirect - github.com/skip-mev/connect/v2 v2.0.1 // indirect + github.com/skip-mev/connect/v2 v2.3.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect - github.com/spf13/cast v1.7.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/cast v1.7.1 // indirect + github.com/spf13/pflag v1.0.6 // indirect github.com/spf13/viper v1.19.0 // indirect + github.com/stretchr/testify v1.11.1 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/tendermint/go-amino v0.16.0 // indirect github.com/tidwall/btree v1.7.0 // indirect + github.com/ybbus/jsonrpc/v3 v3.1.5 // indirect github.com/zondax/hid v0.9.2 // indirect github.com/zondax/ledger-go v0.14.3 // indirect go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.29.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect - go.opentelemetry.io/otel v1.29.0 // indirect - go.opentelemetry.io/otel/metric v1.29.0 // indirect - go.opentelemetry.io/otel/sdk v1.29.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.29.0 // indirect - go.opentelemetry.io/otel/trace v1.29.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.39.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect + go.opentelemetry.io/otel v1.43.0 // indirect + go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/otel/sdk v1.43.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect + go.opentelemetry.io/otel/trace v1.43.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.29.0 // indirect + golang.org/x/crypto v0.49.0 // indirect golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect - golang.org/x/net v0.31.0 // indirect - golang.org/x/oauth2 v0.24.0 // indirect - golang.org/x/sync v0.9.0 // indirect - golang.org/x/sys v0.27.0 // indirect - golang.org/x/term v0.26.0 // indirect - golang.org/x/text v0.20.0 // indirect - golang.org/x/time v0.8.0 // indirect - google.golang.org/genproto v0.0.0-20241113202542-65e8d215514f // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241113202542-65e8d215514f // indirect - google.golang.org/grpc v1.67.1 // indirect - google.golang.org/grpc/stats/opentelemetry v0.0.0-20240907200651-3ffb98b2c93a // indirect - google.golang.org/protobuf v1.35.2 // indirect + golang.org/x/net v0.52.0 // indirect + golang.org/x/oauth2 v0.36.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.42.0 // indirect + golang.org/x/term v0.41.0 // indirect + golang.org/x/text v0.35.0 // indirect + golang.org/x/time v0.15.0 // indirect + google.golang.org/api v0.271.0 // indirect + google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 // indirect + google.golang.org/grpc v1.79.3 // indirect + google.golang.org/protobuf v1.36.11 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.5.1 // indirect @@ -219,6 +293,15 @@ require ( ) // initia custom -// use custom version for -// - https://github.com/initia-labs/cometbft/commit/cb3ed4ca9be4d6c55df7df2d927e9b92153bc3e2 -replace github.com/cometbft/cometbft => github.com/initia-labs/cometbft v0.0.0-20241106155049-4698d4a37fe1 +replace ( + github.com/99designs/keyring => github.com/cosmos/keyring v1.2.0 + github.com/cometbft/cometbft => github.com/initia-labs/cometbft v0.38.21-initia.2 + github.com/cosmos/cosmos-sdk => github.com/initia-labs/cosmos-sdk v0.50.15-initia.0 + github.com/cosmos/iavl => github.com/initia-labs/iavl v1.2.6-initia.1 + github.com/noble-assets/forwarding/simapp => github.com/initia-labs/forwarding/simapp v1.0.0 + github.com/noble-assets/forwarding/v2 => github.com/initia-labs/forwarding/v2 v2.0.3-initia.3 + github.com/skip-mev/connect/v2 => github.com/initia-labs/connect/v2 v2.3.1 + github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 +) + +replace github.com/initia-labs/core-indexer/pkg => ../pkg diff --git a/informative-indexer/go.sum b/informative-indexer/go.sum index 8de01947..b54e4eb9 100644 --- a/informative-indexer/go.sum +++ b/informative-indexer/go.sum @@ -1,37 +1,43 @@ -cel.dev/expr v0.16.1 h1:NR0+oFYzR1CqLFhTAqg3ql59G9VfN8fKq1TCHJ6gq1g= -cel.dev/expr v0.16.1/go.mod h1:AsGA5zb3WruAEQeQng1RZdGEXmBj0jvMWh6l5SnNuC8= +ariga.io/atlas v0.33.1 h1:m3rn+m2jkfOZDqdZrgTDvDWh9G3Ldr77IElFDGEwDPk= +ariga.io/atlas v0.33.1/go.mod h1:WJesu2UCpGQvgUh3oVP94EiRT61nNy1W/VN5g+vqP1I= +ariga.io/atlas-go-sdk v0.6.8 h1:wonvcyOiXdrQnMrSNigLbMSaFV8yIxgA4Tb8EY2UGGE= +ariga.io/atlas-go-sdk v0.6.8/go.mod h1:9Q+/04PVyJHUse1lEE9Kp6E18xj/6mIzaUTcWYSjSnQ= +ariga.io/atlas-provider-gorm v0.5.2 h1:KuBY1PUmo6tzx3tpNjBypKJia3XrCXimjHDsxbYr9NE= +ariga.io/atlas-provider-gorm v0.5.2/go.mod h1:3a7Y0ZrenuGgoVXmGfn8q8U9qB7fJ5CprrXHMriMb0s= +cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= +cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= -cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= -cloud.google.com/go/auth v0.10.2 h1:oKF7rgBfSHdp/kuhXtqU/tNDr0mZqhYbEh+6SiqzkKo= -cloud.google.com/go/auth v0.10.2/go.mod h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI= -cloud.google.com/go/auth/oauth2adapt v0.2.5 h1:2p29+dePqsCHPP1bqDJcKj4qxRyYCcbzKpFyKGt3MTk= -cloud.google.com/go/auth/oauth2adapt v0.2.5/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8= -cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo= -cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= -cloud.google.com/go/iam v1.2.2 h1:ozUSofHUGf/F4tCNy/mu9tHLTaxZFLOUiKzjcgWHGIA= -cloud.google.com/go/iam v1.2.2/go.mod h1:0Ys8ccaZHdI1dEUilwzqng/6ps2YB6vRsjIe00/+6JY= -cloud.google.com/go/logging v1.12.0 h1:ex1igYcGFd4S/RZWOCU51StlIEuey5bjqwH9ZYjHibk= -cloud.google.com/go/logging v1.12.0/go.mod h1:wwYBt5HlYP1InnrtYI0wtwttpVU1rifnMT7RejksUAM= -cloud.google.com/go/longrunning v0.6.2 h1:xjDfh1pQcWPEvnfjZmwjKQEcHnpz6lHjfy7Fo0MK+hc= -cloud.google.com/go/longrunning v0.6.2/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI= -cloud.google.com/go/monitoring v1.21.2 h1:FChwVtClH19E7pJ+e0xUhJPGksctZNVOk2UhMmblmdU= -cloud.google.com/go/monitoring v1.21.2/go.mod h1:hS3pXvaG8KgWTSz+dAdyzPrGUYmi2Q+WFX8g2hqVEZU= -cloud.google.com/go/storage v1.47.0 h1:ajqgt30fnOMmLfWfu1PWcb+V9Dxz6n+9WKjdNg5R4HM= -cloud.google.com/go/storage v1.47.0/go.mod h1:Ks0vP374w0PW6jOUameJbapbQKXqkjGd/OJRp2fb9IQ= -cloud.google.com/go/trace v1.11.2 h1:4ZmaBdL8Ng/ajrgKqY5jfvzqMXbrDcBsUGXOT9aqTtI= -cloud.google.com/go/trace v1.11.2/go.mod h1:bn7OwXd4pd5rFuAnTrzBuoZ4ax2XQeG3qNgYmfCy0Io= -cosmossdk.io/api v0.7.5 h1:eMPTReoNmGUm8DeiQL9DyM8sYDjEhWzL1+nLbI9DqtQ= -cosmossdk.io/api v0.7.5/go.mod h1:IcxpYS5fMemZGqyYtErK7OqvdM0C8kdW3dq8Q/XIG38= +cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= +cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= +cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM= +cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M= +cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= +cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= +cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= +cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= +cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= +cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= +cloud.google.com/go/logging v1.13.1 h1:O7LvmO0kGLaHY/gq8cV7T0dyp6zJhYAOtZPX4TF3QtY= +cloud.google.com/go/logging v1.13.1/go.mod h1:XAQkfkMBxQRjQek96WLPNze7vsOmay9H5PqfsNYDqvw= +cloud.google.com/go/longrunning v0.8.0 h1:LiKK77J3bx5gDLi4SMViHixjD2ohlkwBi+mKA7EhfW8= +cloud.google.com/go/longrunning v0.8.0/go.mod h1:UmErU2Onzi+fKDg2gR7dusz11Pe26aknR4kHmJJqIfk= +cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= +cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= +cloud.google.com/go/storage v1.61.3 h1:VS//ZfBuPGDvakfD9xyPW1RGF1Vy3BWUoVZXgW1KMOg= +cloud.google.com/go/storage v1.61.3/go.mod h1:JtqK8BBB7TWv0HVGHubtUdzYYrakOQIsMLffZ2Z/HWk= +cloud.google.com/go/trace v1.11.7 h1:kDNDX8JkaAG3R2nq1lIdkb7FCSi1rCmsEtKVsty7p+U= +cloud.google.com/go/trace v1.11.7/go.mod h1:TNn9d5V3fQVf6s4SCveVMIBS2LJUqo73GACmq/Tky0s= +cosmossdk.io/api v0.7.6 h1:PC20PcXy1xYKH2KU4RMurVoFjjKkCgYRbVAD4PdqUuY= +cosmossdk.io/api v0.7.6/go.mod h1:IcxpYS5fMemZGqyYtErK7OqvdM0C8kdW3dq8Q/XIG38= cosmossdk.io/client/v2 v2.0.0-beta.4 h1:LGIzWbVTOof/IHQZeoWwxPX0fq607ONXhsfA7eUrQIg= cosmossdk.io/client/v2 v2.0.0-beta.4/go.mod h1:c753d0sBv3AQRx6X+BOKL1aGpKjZMTZAHGiLPbVi5TE= cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= cosmossdk.io/collections v0.4.0/go.mod h1:oa5lUING2dP+gdDquow+QjlF45eL1t4TJDypgGd+tv0= cosmossdk.io/core v0.11.1 h1:h9WfBey7NAiFfIcUhDVNS503I2P2HdZLebJlUIs8LPA= cosmossdk.io/core v0.11.1/go.mod h1:OJzxcdC+RPrgGF8NJZR2uoQr56tc7gfBKhiKeDO7hH0= -cosmossdk.io/depinject v1.0.0 h1:dQaTu6+O6askNXO06+jyeUAnF2/ssKwrrszP9t5q050= -cosmossdk.io/depinject v1.0.0/go.mod h1:zxK/h3HgHoA/eJVtiSsoaRaRA2D5U4cJ5thIG4ssbB8= +cosmossdk.io/depinject v1.1.0 h1:wLan7LG35VM7Yo6ov0jId3RHWCGRhe8E8bsuARorl5E= +cosmossdk.io/depinject v1.1.0/go.mod h1:kkI5H9jCGHeKeYWXTqYdruogYrEeWvBQCw1Pj4/eCFI= cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= cosmossdk.io/log v1.4.1 h1:wKdjfDRbDyZRuWa8M+9nuvpVYxrEOwbD/CA8hvhU8QM= @@ -40,48 +46,72 @@ cosmossdk.io/math v1.4.0 h1:XbgExXFnXmF/CccPPEto40gOO7FpWu9yWNAZPN3nkNQ= cosmossdk.io/math v1.4.0/go.mod h1:O5PkD4apz2jZs4zqFdTr16e1dcaQCc5z6lkEnrrppuk= cosmossdk.io/store v1.1.1 h1:NA3PioJtWDVU7cHHeyvdva5J/ggyLDkyH0hGHl2804Y= cosmossdk.io/store v1.1.1/go.mod h1:8DwVTz83/2PSI366FERGbWSH7hL6sB7HbYp8bqksNwM= +cosmossdk.io/x/circuit v0.1.1 h1:KPJCnLChWrxD4jLwUiuQaf5mFD/1m7Omyo7oooefBVQ= +cosmossdk.io/x/circuit v0.1.1/go.mod h1:B6f/urRuQH8gjt4eLIXfZJucrbreuYrKh5CSjaOxr+Q= cosmossdk.io/x/evidence v0.1.1 h1:Ks+BLTa3uftFpElLTDp9L76t2b58htjVbSZ86aoK/E4= cosmossdk.io/x/evidence v0.1.1/go.mod h1:OoDsWlbtuyqS70LY51aX8FBTvguQqvFrt78qL7UzeNc= cosmossdk.io/x/feegrant v0.1.1 h1:EKFWOeo/pup0yF0svDisWWKAA9Zags6Zd0P3nRvVvw8= cosmossdk.io/x/feegrant v0.1.1/go.mod h1:2GjVVxX6G2fta8LWj7pC/ytHjryA6MHAJroBWHFNiEQ= -cosmossdk.io/x/tx v0.13.5 h1:FdnU+MdmFWn1pTsbfU0OCf2u6mJ8cqc1H4OMG418MLw= -cosmossdk.io/x/tx v0.13.5/go.mod h1:V6DImnwJMTq5qFjeGWpXNiT/fjgE4HtmclRmTqRVM3w= +cosmossdk.io/x/tx v0.13.7 h1:8WSk6B/OHJLYjiZeMKhq7DK7lHDMyK0UfDbBMxVmeOI= +cosmossdk.io/x/tx v0.13.7/go.mod h1:V6DImnwJMTq5qFjeGWpXNiT/fjgE4HtmclRmTqRVM3w= cosmossdk.io/x/upgrade v0.1.4 h1:/BWJim24QHoXde8Bc64/2BSEB6W4eTydq0X/2f8+g38= cosmossdk.io/x/upgrade v0.1.4/go.mod h1:9v0Aj+fs97O+Ztw+tG3/tp5JSlrmT7IcFhAebQHmOPo= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= -filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +filippo.io/edwards25519 v1.1.1 h1:YpjwWWlNmGIDyXOn8zLzqiD+9TyIlPhGFG96P39uBpw= +filippo.io/edwards25519 v1.1.1/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= -github.com/99designs/keyring v1.2.2 h1:pZd3neh/EmUzWONb35LxQfvuY7kiSXAq3HQd97+XBn0= -github.com/99designs/keyring v1.2.2/go.mod h1:wes/FrByc8j7lFOAGLGSNEg8f/PaI3cgTBqhFkHUrPk= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1/go.mod h1:RKUqNu35KJYcVG/fqTRqmuXJZYNhYkBrnC/hX7yGbTA= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1/go.mod h1:uE9zaUfEQT/nbQjVi2IblCG9iaLtZsuYZ8ne+PuQ02M= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1/go.mod h1:h8hyGFDsU5HMivxiS2iYFZsgDbU9OnnJ163x5UGVKYo= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0 h1:U2rTu3Ef+7w9FHKIAXM6ZyqF3UOWJZ12zIm8zECAFfg= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 h1:jBQA3cKT4L2rWMpgE7Yt3Hwh2aUj8KXjIGLxjHeYNNo= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0/go.mod h1:4OG6tQ9EOP/MT0NMjDlRzWoVFxfu9rN9B2X+tlSVktg= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1/go.mod h1:GpPjLhVR9dnUoJMyHWSPy71xY9/lcmpzIPZXmF0FCVY= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.1.0 h1:DRiANoJTiW6obBQe3SqZizkuV1PEgfiiGivmVocDy64= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.1.0/go.mod h1:qLIye2hwb/ZouqhpSD9Zn3SJipvpEnz1Ywl3VUk9Y0s= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 h1:D3occbWoio4EBLkbkevetNMAVX197GkzbUMtqjGWn80= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= +github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.1 h1:pB2F2JKCj1Znmp2rwxxt1J0Fg0wezTMgWYk5Mpbi1kg= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.1/go.mod h1:itPGVDKf9cC/ov4MdvJ2QZ0khw4bfoo9jzwTJlaxy2k= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 h1:UQ0AhxogsIRZDkElkblfnwjc3IaltCm2HUMvezQaL7s= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1/go.mod h1:jyqM3eLpJ3IbIFDTKVz2rF9T/xWGW0rIriGwnz8l9Tk= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.1 h1:oTX4vsorBZo/Zdum6OKPA4o7544hm6smoRv1QjpTwGo= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.1/go.mod h1:0wEl7vrAD8mehJyohS9HZy+WyEOaQO2mJx86Cvh93kM= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 h1:8nn+rsCvTq9axyEh382S0PFLBeaFwNsT43IrPWzctRU= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1/go.mod h1:viRWSEhtMZqz1rhwmOVKkWl6SwmVowfL9O2YR5gI2PE= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 h1:sBEjpZlNHzK1voKq9695PJSX2o5NEXl7/OL3coiIY0c= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 h1:UnDZ/zFfG1JhH/DqxIZYU/1CUAlTUScoXD/LcM2Ykk8= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0/go.mod h1:IA1C1U7jO/ENqm/vhi7V9YYpBsp+IMyqNrEN94N7tVc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0 h1:7t/qx5Ost0s0wbA/VDrByOooURhp+ikYwv20i9Y07TQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0/go.mod h1:vB2GH9GAYYJTO3mEn8oYwzEdhlayZIdQz6zdzgUIRvA= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 h1:0s6TxfCu2KHkkZPnBfsQ2y5qia0jl3MMrmBhu3nCOYk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= github.com/IGLOU-EU/go-wildcard v1.0.3 h1:r8T46+8/9V1STciXJomTWRpPEv4nGJATDbJkdU0Nou0= github.com/IGLOU-EU/go-wildcard v1.0.3/go.mod h1:/qeV4QLmydCbwH0UMQJmXDryrFKJknWi/jjO8IiuQfY= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0= -github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/Microsoft/hcsshim v0.11.5 h1:haEcLNpj9Ka1gd3B3tAEs9CpE0c+1IhoL59w/exYU38= @@ -93,14 +123,20 @@ github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/ github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= +github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alitto/pond v1.8.3 h1:ydIqygCLVPqIX/USe5EaV/aSRXTRXDEI9JwuDdu+/xs= +github.com/alitto/pond v1.8.3/go.mod h1:CmvIIGd5jKLasGI3D87qDkQxjzChdKMmnXMg3fG6M6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= +github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= github.com/aptos-labs/serde-reflection/serde-generate/runtime/golang v0.0.0-20231213012317-73b6bbf74833 h1:/OtHsUoaVegyyGQ9/Ycm5vrC3xTTyj4+N/HsJ0wwAGA= github.com/aptos-labs/serde-reflection/serde-generate/runtime/golang v0.0.0-20231213012317-73b6bbf74833/go.mod h1:zUz5maIUAS+tl1lC+lJR7HUf0vVnHk6W7bCvN+DzjME= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= @@ -109,47 +145,45 @@ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= -github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/aws/aws-sdk-go-v2 v1.32.5 h1:U8vdWJuY7ruAkzaOdD7guwJjD06YSKmnKCJs7s3IkIo= -github.com/aws/aws-sdk-go-v2 v1.32.5/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 h1:lL7IfaFzngfx0ZwUGOZdsFFnQ5uLvR0hWqqhyE7Q9M8= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7/go.mod h1:QraP0UcVlQJsmHfioCrveWOC1nbiWUl3ej08h4mXWoc= -github.com/aws/aws-sdk-go-v2/config v1.28.5 h1:Za41twdCXbuyyWv9LndXxZZv3QhTG1DinqlFsSuvtI0= -github.com/aws/aws-sdk-go-v2/config v1.28.5/go.mod h1:4VsPbHP8JdcdUDmbTVgNL/8w9SqOkM5jyY8ljIxLO3o= -github.com/aws/aws-sdk-go-v2/credentials v1.17.46 h1:AU7RcriIo2lXjUfHFnFKYsLCwgbz1E7Mm95ieIRDNUg= -github.com/aws/aws-sdk-go-v2/credentials v1.17.46/go.mod h1:1FmYyLGL08KQXQ6mcTlifyFXfJVCNJTVGuQP4m0d/UA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.20 h1:sDSXIrlsFSFJtWKLQS4PUWRvrT580rrnuLydJrCQ/yA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.20/go.mod h1:WZ/c+w0ofps+/OUqMwWgnfrgzZH1DZO1RIkktICsqnY= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.41 h1:hqcxMc2g/MwwnRMod9n6Bd+t+9Nf7d5qRg7RaXKPd6o= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.41/go.mod h1:d1eH0VrttvPmrCraU68LOyNdu26zFxQFjrVSb5vdhog= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.24 h1:4usbeaes3yJnCFC7kfeyhkdkPtoRYPa/hTmCqMpKpLI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.24/go.mod h1:5CI1JemjVwde8m2WG3cz23qHKPOxbpkq0HaoreEgLIY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.24 h1:N1zsICrQglfzaBnrfM0Ys00860C+QFwu6u/5+LomP+o= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.24/go.mod h1:dCn9HbJ8+K31i8IQ8EWmWj0EiIk0+vKiHNMxTTYveAg= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.24 h1:JX70yGKLj25+lMC5Yyh8wBtvB01GDilyRuJvXJ4piD0= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.24/go.mod h1:+Ln60j9SUTD0LEwnhEB0Xhg61DHqplBrbZpLgyjoEHg= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.5 h1:gvZOjQKPxFXy1ft3QnEyXmT+IqneM9QAUWlM3r0mfqw= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.5/go.mod h1:DLWnfvIcm9IET/mmjdxeXbBKmTCm0ZB8p1za9BVteM8= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.5 h1:wtpJ4zcwrSbwhECWQoI/g6WM9zqCcSpHDJIWSbMLOu4= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.5/go.mod h1:qu/W9HXQbbQ4+1+JcZp0ZNPV31ym537ZJN+fiS7Ti8E= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.5 h1:P1doBzv5VEg1ONxnJss1Kh5ZG/ewoIE4MQtKKc6Crgg= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.5/go.mod h1:NOP+euMW7W3Ukt28tAxPuoWao4rhhqJD3QEBk7oCg7w= -github.com/aws/aws-sdk-go-v2/service/s3 v1.69.0 h1:Q2ax8S21clKOnHhhr933xm3JxdJebql+R7aNo7p7GBQ= -github.com/aws/aws-sdk-go-v2/service/s3 v1.69.0/go.mod h1:ralv4XawHjEMaHOWnTFushl0WRqim/gQWesAMF6hTow= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.6 h1:3zu537oLmsPfDMyjnUS2g+F2vITgy5pB74tHI+JBNoM= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.6/go.mod h1:WJSZH2ZvepM6t6jwu4w/Z45Eoi75lPN7DcydSRtJg6Y= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.5 h1:K0OQAsDywb0ltlFrZm0JHPY3yZp/S9OaoLU33S7vPS8= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.5/go.mod h1:ORITg+fyuMoeiQFiVGoqB3OydVTLkClw/ljbblMq6Cc= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.1 h1:6SZUVRQNvExYlMLbHdlKB48x0fLbc2iVROyaNEwBHbU= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.1/go.mod h1:GqWyYCwLXnlUB1lOAXQyNSPqPLQJvmo8J0DWBzp9mtg= -github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro= -github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/aws/aws-sdk-go-v2 v1.41.4 h1:10f50G7WyU02T56ox1wWXq+zTX9I1zxG46HYuG1hH/k= +github.com/aws/aws-sdk-go-v2 v1.41.4/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 h1:3kGOqnh1pPeddVa/E37XNTaWJ8W6vrbYV9lJEkCnhuY= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI= +github.com/aws/aws-sdk-go-v2/config v1.32.12 h1:O3csC7HUGn2895eNrLytOJQdoL2xyJy0iYXhoZ1OmP0= +github.com/aws/aws-sdk-go-v2/config v1.32.12/go.mod h1:96zTvoOFR4FURjI+/5wY1vc1ABceROO4lWgWJuxgy0g= +github.com/aws/aws-sdk-go-v2/credentials v1.19.12 h1:oqtA6v+y5fZg//tcTWahyN9PEn5eDU/Wpvc2+kJ4aY8= +github.com/aws/aws-sdk-go-v2/credentials v1.19.12/go.mod h1:U3R1RtSHx6NB0DvEQFGyf/0sbrpJrluENHdPy1j/3TE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 h1:zOgq3uezl5nznfoK3ODuqbhVg1JzAGDUhXOsU0IDCAo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20/go.mod h1:z/MVwUARehy6GAg/yQ1GO2IMl0k++cu1ohP9zo887wE= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 h1:CNXO7mvgThFGqOFgbNAP2nol2qAWBOGfqR/7tQlvLmc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20/go.mod h1:oydPDJKcfMhgfcgBUZaG+toBbwy8yPWubJXBVERtI4o= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 h1:tN6W/hg+pkM+tf9XDkWUbDEjGLb+raoBMFsTodcoYKw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20/go.mod h1:YJ898MhD067hSHA6xYCx5ts/jEd8BSOLtQDL3iZsvbc= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21 h1:SwGMTMLIlvDNyhMteQ6r8IJSBPlRdXX5d4idhIGbkXA= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21/go.mod h1:UUxgWxofmOdAMuqEsSppbDtGKLfR04HGsD0HXzvhI1k= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 h1:qtJZ70afD3ISKWnoX3xB0J2otEqu3LqicRcDBqsj0hQ= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12/go.mod h1:v2pNpJbRNl4vEUWEh5ytQok0zACAKfdmKS51Hotc3pQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 h1:2HvVAIq+YqgGotK6EkMf+KIEqTISmTYh5zLpYyeTo1Y= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20/go.mod h1:V4X406Y666khGa8ghKmphma/7C0DAtEQYhkq9z4vpbk= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 h1:siU1A6xjUZ2N8zjTHSXFhB9L/2OY8Dqs0xXiLjF30jA= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20/go.mod h1:4TLZCmVJDM3FOu5P5TJP0zOlu9zWgDWU7aUxWbr+rcw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1 h1:csi9NLpFZXb9fxY7rS1xVzgPRGMt7MSNWeQ6eo247kE= +github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1/go.mod h1:qXVal5H0ChqXP63t6jze5LmFalc7+ZE7wOdLtZ0LCP0= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 h1:0GFOLzEbOyZABS3PhYfBIx2rNBACYcKty+XGkTgw1ow= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.8/go.mod h1:LXypKvk85AROkKhOG6/YEcHFPoX+prKTowKnVdcaIxE= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 h1:kiIDLZ005EcKomYYITtfsjn7dtOwHDOFy7IbPXKek2o= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.13/go.mod h1:2h/xGEowcW/g38g06g3KpRWDlT+OTfxxI0o1KqayAB8= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 h1:jzKAXIlhZhJbnYwHbvUQZEB8KfgAEuG0dc08Bkda7NU= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17/go.mod h1:Al9fFsXjv4KfbzQHGe6V4NZSZQXecFcvaIF4e70FoRA= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 h1:Cng+OOwCHmFljXIxpEVXAGMnBia8MSU6Ch5i9PgBkcU= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.9/go.mod h1:LrlIndBDdjA/EeXeyNBle+gyCwTlizzW5ycgWnvIxkk= +github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng= +github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= @@ -160,8 +194,10 @@ github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bits-and-blooms/bitset v1.14.2 h1:YXVoyPndbdvcEVcseEovVfp0qjJp7S+i5+xgp/Nfbdc= -github.com/bits-and-blooms/bitset v1.14.2/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bits-and-blooms/bitset v1.20.0 h1:2F+rfL86jE2d/bmw7OhqUg2Sj/1rURkBn3MdfoPyRVU= +github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bmatcuk/doublestar v1.3.4 h1:gPypJ5xD31uhX6Tf54sDPUOBXTqKH4c9aPY66CyQrS0= +github.com/bmatcuk/doublestar v1.3.4/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE= github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/btcutil v1.1.6 h1:zFL2+c3Lb9gEgqKNzowKUPQNb8jV7v5Oaodi/AYFd6c= @@ -176,18 +212,20 @@ github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInq github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= -github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d h1:S2NE3iHSwP0XV47EEXL8mWmRdEfGscSJ+7EgePNgt0s= github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= +github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= +github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= @@ -199,8 +237,8 @@ github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI= -github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 h1:6xNmx7iTtyBRev0+D/Tv1FZd4SCg8axKApyNyRsAt/w= +github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/BuvyMxRnYBlmVaq4OLiKW6iRQfvC62cvdkI= github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= @@ -212,15 +250,15 @@ github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/e github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v1.1.2 h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA= -github.com/cockroachdb/pebble v1.1.2/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= +github.com/cockroachdb/pebble v1.1.5 h1:5AAWCBWbat0uE0blr8qzufZP5tBjkRyy/jWe1QWLnvw= +github.com/cockroachdb/pebble v1.1.5/go.mod h1:17wO9el1YEigxkP/YtV8NtCivQDgoCyBg5c4VR/eOWo= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/cometbft/cometbft-db v0.14.1 h1:SxoamPghqICBAIcGpleHbmoPqy+crij/++eZz3DlerQ= -github.com/cometbft/cometbft-db v0.14.1/go.mod h1:KHP1YghilyGV/xjD5DP3+2hyigWx0WTp9X+0Gnx0RxQ= +github.com/cometbft/cometbft-db v0.15.0 h1:VLtsRt8udD4jHCyjvrsTBpgz83qne5hnL245AcPJVRk= +github.com/cometbft/cometbft-db v0.15.0/go.mod h1:EBrFs1GDRiTqrWXYi4v90Awf/gcdD5ExzdPbg4X8+mk= github.com/compose-spec/compose-go/v2 v2.1.3 h1:bD67uqLuL/XgkAK6ir3xZvNLFPxPScEi1KW7R5esrLE= github.com/compose-spec/compose-go/v2 v2.1.3/go.mod h1:lFN0DrMxIncJGYAXTfWuajfwj5haBJqrBkarHcnjJKc= github.com/confluentinc/confluent-kafka-go/v2 v2.6.1 h1:XFkytnGvk/ZcY2qU0ql4E4h+ftBaGqkLO7tlZ4kRbr4= @@ -247,12 +285,10 @@ github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= -github.com/cosmos/cosmos-db v1.0.2 h1:hwMjozuY1OlJs/uh6vddqnk9j7VamLv+0DBlbEXbAKs= -github.com/cosmos/cosmos-db v1.0.2/go.mod h1:Z8IXcFJ9PqKK6BIsVOB3QXtkKoqUOp1vRvPT39kOXEA= +github.com/cosmos/cosmos-db v1.1.1 h1:FezFSU37AlBC8S98NlSagL76oqBRWq/prTPvFcEJNCM= +github.com/cosmos/cosmos-db v1.1.1/go.mod h1:AghjcIPqdhSLP/2Z0yha5xPH3nLnskz81pBx3tcVSAw= github.com/cosmos/cosmos-proto v1.0.0-beta.5 h1:eNcayDLpip+zVLRLYafhzLvQlSmyab+RC5W7ZfmxJLA= github.com/cosmos/cosmos-proto v1.0.0-beta.5/go.mod h1:hQGLpiIUloJBMdQMMWb/4wRApmI9hjHH05nefC0Ojec= -github.com/cosmos/cosmos-sdk v0.50.10 h1:zXfeu/z653tWZARr/jESzAEiCUYjgJwwG4ytnYWMoDM= -github.com/cosmos/cosmos-sdk v0.50.10/go.mod h1:6Eesrx3ZE7vxBZWpK++30H+Uc7Q4ahQWCL7JKU/LEdU= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= @@ -260,26 +296,26 @@ github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= github.com/cosmos/gogoproto v1.7.0 h1:79USr0oyXAbxg3rspGh/m4SWNyoz/GLaAh0QlCe2fro= github.com/cosmos/gogoproto v1.7.0/go.mod h1:yWChEv5IUEYURQasfyBW5ffkMHR/90hiHgbNgrtp4j0= -github.com/cosmos/iavl v1.2.0 h1:kVxTmjTh4k0Dh1VNL046v6BXqKziqMDzxo93oh3kOfM= -github.com/cosmos/iavl v1.2.0/go.mod h1:HidWWLVAtODJqFD6Hbne2Y0q3SdxByJepHUOeoH4LiI= -github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.0.2 h1:dyLNlDElY6+5zW/BT/dO/3Ad9FpQblfh+9dQpYQodbA= -github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.0.2/go.mod h1:82hPO/tRawbuFad2gPwChvpZ0JEIoNi91LwVneAYCeM= +github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.2.0 h1:rM+S14DFiqmu6Rc3PuhvWqwywPsnt/CbIslSnBftPFs= +github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.2.0/go.mod h1:O5H9Ic3Pe6cmJn1eqlj5N48sLb8WQ1VWmDP4/11g/4E= github.com/cosmos/ibc-apps/modules/rate-limiting/v8 v8.0.0 h1:AQO9NIAP3RFqvBCj7IqM/V1LCxmuvcvGUdu0RIEz/c0= github.com/cosmos/ibc-apps/modules/rate-limiting/v8 v8.0.0/go.mod h1:/ZpKJSW/SKPkFS7jTqkPVn7kOHUUfRNzu+8aS7YOL8o= github.com/cosmos/ibc-go/modules/capability v1.0.1 h1:ibwhrpJ3SftEEZRxCRkH0fQZ9svjthrX2+oXdZvzgGI= github.com/cosmos/ibc-go/modules/capability v1.0.1/go.mod h1:rquyOV262nGJplkumH+/LeYs04P3eV8oB7ZM4Ygqk4E= -github.com/cosmos/ibc-go/v8 v8.5.0 h1:OjaSXz480JT8ZuMrASxGgS7XzloZ2NuuJPwZB/fKDgE= -github.com/cosmos/ibc-go/v8 v8.5.0/go.mod h1:P5hkAvq0Qbg0h18uLxDVA9q1kOJ0l36htMsskiNwXbo= +github.com/cosmos/ibc-go/v8 v8.7.0 h1:HqhVOkO8bDpClXE81DFQgFjroQcTvtpm0tCS7SQVKVY= +github.com/cosmos/ibc-go/v8 v8.7.0/go.mod h1:G2z+Q6ZQSMcyHI2+BVcJdvfOupb09M2h/tgpXOEdY6k= github.com/cosmos/ics23/go v0.11.0 h1:jk5skjT0TqX5e5QJbEnwXIS2yI2vnmLOgpQPeM5RtnU= github.com/cosmos/ics23/go v0.11.0/go.mod h1:A8OjxPE67hHST4Icw94hOxxFEJMBG031xIGF/JHNIY0= -github.com/cosmos/interchain-security/v6 v6.0.0 h1:BieZEefykqrD2Vvt3onsYjEAa5O+aWoRWSF8nN5aidE= -github.com/cosmos/interchain-security/v6 v6.0.0/go.mod h1:+5zIZEzkL4yNHB/UWXCu75t6GeEgEmWHbz5OnBWiL0o= -github.com/cosmos/ledger-cosmos-go v0.13.3 h1:7ehuBGuyIytsXbd4MP43mLeoN2LTOEnk5nvue4rK+yM= -github.com/cosmos/ledger-cosmos-go v0.13.3/go.mod h1:HENcEP+VtahZFw38HZ3+LS3Iv5XV6svsnkk9vdJtLr8= +github.com/cosmos/interchain-security/v6 v6.3.0 h1:AIsfxLUDtUGVfaqJ1WPwnYIOT5AxoSO58469iw9vNH4= +github.com/cosmos/interchain-security/v6 v6.3.0/go.mod h1:6DSiV2w+DuPkxP1KGFtaxpiwf8Xt2iusj8O53KCx96Q= +github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo= +github.com/cosmos/keyring v1.2.0/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= +github.com/cosmos/ledger-cosmos-go v0.14.0 h1:WfCHricT3rPbkPSVKRH+L4fQGKYHuGOK9Edpel8TYpE= +github.com/cosmos/ledger-cosmos-go v0.14.0/go.mod h1:E07xCWSBl3mTGofZ2QnL4cIUzMbbGVyik84QYKbX3RA= github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= @@ -288,22 +324,25 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= -github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/decred/dcrd/crypto/blake256 v1.1.0 h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U0x++OzVrdms8= +github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= -github.com/dgraph-io/badger/v4 v4.2.0 h1:kJrlajbXXL9DFTNuhhu9yCx7JJa4qpYWxtE8BzuWsEs= -github.com/dgraph-io/badger/v4 v4.2.0/go.mod h1:qfCqhPoWDFJRx1gp5QwwyGo8xk1lbHUxvK9nK0OGAak= -github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= -github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= +github.com/dgraph-io/badger/v4 v4.3.0 h1:lcsCE1/1qrRhqP+zYx6xDZb8n7U+QlwNicpc676Ub40= +github.com/dgraph-io/badger/v4 v4.3.0/go.mod h1:Sc0T595g8zqAQRDf44n+z3wG4BOqLwceaFntt8KPxUM= +github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91 h1:Pux6+xANi0I7RRo5E1gflI4EZ2yx3BGZ75JkAIvGEOA= +github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91/go.mod h1:swkazRqnUf1N62d0Nutz7KIj2UKqsm/H8tD0nBJAXqM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dhui/dktest v0.4.5 h1:uUfYBIVREmj/Rw6MvgmqNAYzTiKOHJak+enB5Di73MM= +github.com/dhui/dktest v0.4.5/go.mod h1:tmcyeHDKagvlDrz7gDKq4UAJOLIfVZYkfD5OnHDwcCo= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/docker/buildx v0.15.1 h1:1cO6JIc0rOoC8tlxfXoh1HH1uxaNvYH1q7J7kv5enhw= github.com/docker/buildx v0.15.1/go.mod h1:16DQgJqoggmadc1UhLaUTPqKtR+PlByN/kyXFdkhFCo= github.com/docker/cli v27.0.3+incompatible h1:usGs0/BoBW8MWxGeEtqPMkzOY56jZ6kYlSN5BLDioCQ= @@ -312,8 +351,8 @@ github.com/docker/compose/v2 v2.28.1 h1:ORPfiVHrpnRQBDoC3F8JJyWAY8N5gWuo3Fgwyivx github.com/docker/compose/v2 v2.28.1/go.mod h1:wDtGQFHe99sPLCHXeVbCkc+Wsl4Y/2ZxiAJa/nga6rA= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v27.1.1+incompatible h1:hO/M4MtV36kzKldqnA37IWhebRA+LnqqcqDja6kVaKY= -github.com/docker/docker v27.1.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v27.2.0+incompatible h1:Rk9nIVdfH3+Vz4cyI/uhbINhEZ/oLmc+CBXmH6fbNk4= +github.com/docker/docker v27.2.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8= github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40= github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= @@ -325,19 +364,18 @@ github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHz github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/dvsekhvalnov/jose2go v1.6.0 h1:Y9gnSnP4qEI0+/uQkHvFXeD2PLPJeXEL+ySMEA2EjTY= -github.com/dvsekhvalnov/jose2go v1.6.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= +github.com/dvsekhvalnov/jose2go v1.7.0 h1:bnQc8+GMnidJZA8zc6lLEAb4xNrIqHwO+9TzqvtQZPo= +github.com/dvsekhvalnov/jose2go v1.7.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203 h1:XBBHcIb256gUJtLmY22n99HaZTz+r2Z51xUPi01m3wg= github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203/go.mod h1:E1jcSv8FaEny+OP/5k9UxZVw9YFWGj7eI4KR/iOBqCg= -github.com/emicklei/dot v1.6.1 h1:ujpDlBkkwgWUY+qPId5IwapRW/xEoligRSYjioR6DFI= -github.com/emicklei/dot v1.6.1/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= +github.com/emicklei/dot v1.6.2 h1:08GN+DD79cy/tzN6uLCT84+2Wk9u+wvqP+Hkx/dIR8A= +github.com/emicklei/dot v1.6.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= @@ -347,15 +385,21 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/go-control-plane v0.13.0 h1:HzkeUz1Knt+3bK+8LG1bxOO/jzWZmdxpwC51i202les= -github.com/envoyproxy/go-control-plane v0.13.0/go.mod h1:GRaKG3dwvFoTg4nj7aXdZnvMg4d7nvT/wl9WgVXn3Q8= +github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= +github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= +github.com/envoyproxy/go-control-plane/envoy v1.36.0 h1:yg/JjO5E7ubRyKX3m07GF3reDNEnfOboJ0QySbH736g= +github.com/envoyproxy/go-control-plane/envoy v1.36.0/go.mod h1:ty89S1YCCVruQAm9OtKeEkQLTb+Lkz0k8v9W0Oxsv98= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= -github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= +github.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4= +github.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA= +github.com/ethereum/go-ethereum v1.16.9 h1:UTJ93yoXD7BEMWg+9lSZ8/Zvf0oZfy2ZUmv0Gn0ZclE= +github.com/ethereum/go-ethereum v1.16.9/go.mod h1:Fs6QebQbavneQTYcA39PEKv2+zIjX7rPUZ14DER46wk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= -github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= @@ -368,11 +412,12 @@ github.com/fsnotify/fsevents v0.2.0 h1:BRlvlqjvNTfogHfeBOFvSC9N0Ddy+wzQCQukyoD7o github.com/fsnotify/fsevents v0.2.0/go.mod h1:B3eEk39i4hz8y1zaWS/wPrAP4O6wkIl7HQwKBr1qH/w= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/fvbommel/sortorder v1.0.2 h1:mV4o8B2hKboCdkJm+a7uX/SIpZob4JzUpc5GGnM45eo= github.com/fvbommel/sortorder v1.0.2/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/getsentry/sentry-go v0.29.1 h1:DyZuChN8Hz3ARxGVV8ePaNXh1dQ7d76AiB117xcREwA= github.com/getsentry/sentry-go v0.29.1/go.mod h1:x3AtIzN01d6SiWkderzaH28Tm0lgkafpJ5Bm3li39O0= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -384,6 +429,8 @@ github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= +github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= @@ -398,12 +445,14 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= -github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= +github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= @@ -418,21 +467,28 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+ github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= -github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= +github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= +github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-viper/mapstructure/v2 v2.1.0 h1:gHnMa2Y/pIxElCH2GlZZ1lZSsn6XMtufpGyP1XxdC/w= -github.com/go-viper/mapstructure/v2 v2.1.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= +github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= +github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= +github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= +github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/gobwas/ws v1.1.0 h1:7RFti/xnNkMJnrK7D1yQ/iCIB5OrrY/54/H930kIbHA= +github.com/gobwas/ws v1.1.0/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -448,9 +504,17 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-migrate/migrate/v4 v4.18.3 h1:EYGkoOsvgHHfm5U/naS1RP/6PL/Xv3S4B/swMiAmDLs= +github.com/golang-migrate/migrate/v4 v4.18.3/go.mod h1:99BKpIi6ruaaXRM1A77eqZ+FWPQ3cfRa+ZVy5bmWMaY= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= -github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -479,14 +543,14 @@ github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/flatbuffers v1.12.1 h1:MVlul7pQNoDzWRLTw5imwYsl+usrS1TXG2H4jg6ImGw= -github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg= +github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -498,8 +562,8 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= @@ -508,20 +572,21 @@ github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9 github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= -github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= +github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= +github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= -github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= -github.com/googleapis/gax-go/v2 v2.14.0 h1:f+jMrjBPl+DL9nI4IQzLUxMq7XrAqFYB7hBPqMNIe8o= -github.com/googleapis/gax-go/v2 v2.14.0/go.mod h1:lhBCnjdLrWRaPvLWhmc8IS24m9mr07qSYnHncrgo+zk= +github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8= +github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= +github.com/googleapis/gax-go/v2 v2.17.0 h1:RksgfBpxqff0EZkDWYuz9q/uWsTVz+kf43LsZ1J6SMc= +github.com/googleapis/gax-go/v2 v2.17.0/go.mod h1:mzaqghpQp4JDh3HvADwrat+6M3MOIDp5YKHhb9PAgDY= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= @@ -530,6 +595,8 @@ github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= @@ -546,6 +613,8 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rH github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 h1:vTCWu1wbdYo7PEZFem/rlr01+Un+wwVmI7wiegFdRLk= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72/go.mod h1:Vn+BBgKQHVQYdVQ4NZDICE1Brb+JfaONyDHr3q07oQc= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -555,10 +624,10 @@ github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.7.5 h1:dT58k9hQ/vbxNMwoI5+xFYAJuv6152UNvdHokfI5wE4= -github.com/hashicorp/go-getter v1.7.5/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= -github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= -github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk131ebY= +github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -572,17 +641,16 @@ github.com/hashicorp/go-plugin v1.5.2 h1:aWv8eimFqWlsEiMrYZdPYl+FdHaBJSN4AWwGWfT github.com/hashicorp/go-plugin v1.5.2/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= -github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= -github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.8.0 h1:KAkNb1HAiZd1ukkxDFGmokVZe1Xy9HG6NUp+bPle2i4= +github.com/hashicorp/go-version v1.8.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -592,6 +660,8 @@ github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/hcl/v2 v2.18.1 h1:6nxnOJFku1EuSawSD81fuviYUV8DxFr3fp2dUi3ZYSo= +github.com/hashicorp/hcl/v2 v2.18.1/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+JtMeeGErHE= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= @@ -600,6 +670,8 @@ github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= +github.com/holiman/uint256 v1.3.2 h1:a9EgMPSC1AAaj1SZL5zIQD3WbwTuHrMGOerLjGmM/TA= +github.com/holiman/uint256 v1.3.2/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= @@ -610,7 +682,6 @@ github.com/iancoleman/orderedmap v0.3.0 h1:5cbR2grmZR/DiVt+VJopEhtVs9YGInGIxAoMJ github.com/iancoleman/orderedmap v0.3.0/go.mod h1:XuLcCUkdL5owUCQeF2Ue9uuw1EptkJDkXXS7VoV7XGE= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= @@ -621,29 +692,55 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/initia-labs/OPinit v0.6.0 h1:V9jQf8+PjNctLX31FHMGUsk6fpnygVJO1WYzCmBMzkU= -github.com/initia-labs/OPinit v0.6.0/go.mod h1:gDpCh4Zx94mihwgzP/PLav8eVHLroZBu3dFyzCy8iIs= -github.com/initia-labs/OPinit/api v0.6.0 h1:Q3hDHpTd9EqlDfY/OryCKIwuXYWJxGJdGfJicV1RjL4= -github.com/initia-labs/OPinit/api v0.6.0/go.mod h1:gHK6DEWb3/DqQD5LjKirUx9jilAh2UioXanoQdgqVfU= -github.com/initia-labs/cometbft v0.0.0-20241106155049-4698d4a37fe1 h1:Hqxf4a6PfCatz5vCBCovjhn4FwYaooCXIvyv4MM4Wjs= -github.com/initia-labs/cometbft v0.0.0-20241106155049-4698d4a37fe1/go.mod h1:+wh6ap6xctVG+JOHwbl8pPKZ0GeqdPYqISu7F4b43cQ= -github.com/initia-labs/initia v0.6.3 h1:1UuIE8hlavmnfyE4lQ6bTvgUTZFLUMIoccrErxhvFuA= -github.com/initia-labs/initia v0.6.3/go.mod h1:Uj1GRFU+9VHiKa4nJ4LYz/zVlwd8iETryqfu8bdATrU= -github.com/initia-labs/movevm v0.7.0 h1:wi7LT12afxTTa2Tqwcndc4LRtS0mzossGrVNiUvs/aw= -github.com/initia-labs/movevm v0.7.0/go.mod h1:sj/kXD7mUQASqogPTjqltIr4Uid3xxnlcbfiFvvqeXA= +github.com/initia-labs/OPinit v1.3.0 h1:cGxJpzVOfxGO8Ql/Z6SVJCSpokkqB4jFBjo6kx9Uax8= +github.com/initia-labs/OPinit v1.3.0/go.mod h1:VZG+/Wd/9cVDbzCwZld/tve6kcJC1zemeeQvp5FKKCI= +github.com/initia-labs/OPinit/api v1.3.0 h1:MAu4XEJ2uibDVKBo0jB6b6/BGaoXjDUJC+dwhU530ag= +github.com/initia-labs/OPinit/api v1.3.0/go.mod h1:sWDfvmcxd7KD59ukB/Wz0BSpyimyptDEzz1Epe/ET+Y= +github.com/initia-labs/cometbft v0.38.21-initia.2 h1:sFFc6JnbPKFd4XdH3EXZ7TBfi3uVv34HdyHVX5gvvlQ= +github.com/initia-labs/cometbft v0.38.21-initia.2/go.mod h1:CQ/VkJXRdaWxDLyKT+JYAWV0m215oRFtymtIr7skA6o= +github.com/initia-labs/connect/v2 v2.3.1 h1:Y32LCwUHDBgUzzQHqPBJeWeItYoNu2oYD57JKbZCtjw= +github.com/initia-labs/connect/v2 v2.3.1/go.mod h1:35hM7xSgI0h3GMUTgspzKY8Ff2yCXNGNwmAdjqo3z8s= +github.com/initia-labs/cosmos-sdk v0.50.15-initia.0 h1:cgKCqzXBm8md5Q5C9VAyIGCheHhNcOGK/BwpFbett2g= +github.com/initia-labs/cosmos-sdk v0.50.15-initia.0/go.mod h1:/dinzXHi7qK0dEPZjS3LI5gMHueKQdqyjbB9chwswo0= +github.com/initia-labs/forwarding/simapp v1.0.0 h1:MNHLACO0053BAMO3+Ra2ZTlTTB5WieFElguDQH5d8fc= +github.com/initia-labs/forwarding/simapp v1.0.0/go.mod h1:MOIDS73NjoIvTZ3OxUmJXY+Ry7xxXumrXPVZrAeJOhY= +github.com/initia-labs/forwarding/v2 v2.0.3-initia.3 h1:Uu1VqRsSwX7rgS2A4M3Snzyzk9mJRq2v/ZD4xKHTJkM= +github.com/initia-labs/forwarding/v2 v2.0.3-initia.3/go.mod h1:N3OzYf14ton71zCxomBmpR7tOxZ2dKwhsMxUmtuJuVQ= +github.com/initia-labs/iavl v1.2.6-initia.1 h1:4vf9eiccLkob2eiM8YAM8Gf/UBniEFUKpvncM/hVoO8= +github.com/initia-labs/iavl v1.2.6-initia.1/go.mod h1:GiM43q0pB+uG53mLxLDzimxM9l/5N9UuSY3/D0huuVw= +github.com/initia-labs/initia v1.4.3 h1:cEnENL26T7hsa0oDm4hf953tUQYc1cQ3fll84jBfoa0= +github.com/initia-labs/initia v1.4.3/go.mod h1:Y7ir28A0RmL3AQpvTK/mXzyvF6RtijgH/v520xvrk3s= +github.com/initia-labs/initia/api v1.4.0 h1:1DOUBxugC9ZdtMnmmN3qFWnNjlW7I6sssvvu4/ohVtU= +github.com/initia-labs/initia/api v1.4.0/go.mod h1:YQAtPknqt4tZSj+AK0OfZ83XXah2MCna/Ko74/VQe6Q= +github.com/initia-labs/movevm v1.2.0 h1:IbpipjRIZe851FJZZzP3RGIqrOCcNsI6bDF9VC0K0do= +github.com/initia-labs/movevm v1.2.0/go.mod h1:sj/kXD7mUQASqogPTjqltIr4Uid3xxnlcbfiFvvqeXA= +github.com/initia-labs/store v0.1.1 h1:sc4PTv30oS99t0EWgFPy0pCFPYJsHngB2QfZS5XY/Xo= +github.com/initia-labs/store v0.1.1/go.mod h1:8Hgv+JpqjFYy2335pHLnMq6LmVdXyF1G17yi6uWl76M= +github.com/initia-labs/store/memiavl v0.1.1 h1:aymS3es9pPY7ysizK2K+r4TImR0W5N1C5Ld75HRMvXc= +github.com/initia-labs/store/memiavl v0.1.1/go.mod h1:510W4Nf6QAWmFLYPhqhOhO1tagdeocM0b89a/M0zMRk= +github.com/initia-labs/store/versiondb v0.1.0 h1:8lQK7Q6GUwwAc8R3IIBbj9MOlIkKCq0nwnRpjT20Ahc= +github.com/initia-labs/store/versiondb v0.1.0/go.mod h1:fP27G3qPUluu7yM8j2xcW05Brmj0QBT7nlTTFvEszNc= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.7.1 h1:x7SYsPBYDkHDksogeSmZZ5xzThcTgRz++I5E+ePFUcs= -github.com/jackc/pgx/v5 v5.7.1/go.mod h1:e7O26IywZZ+naJtWWos6i6fvWK+29etgITqrqHLfoZA= +github.com/jackc/pgx/v5 v5.9.2 h1:3ZhOzMWnR4yJ+RW1XImIPsD1aNSz4T4fyP7zlQb56hw= +github.com/jackc/pgx/v5 v5.9.2/go.mod h1:mal1tBGAFfLHvZzaYh77YS/eC6IX9OWbRV1QIIM0Jn4= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jhump/protoreflect v1.15.6 h1:WMYJbw2Wo+KOWwZFvgY0jMoVHM6i4XIvRs2RcBj5VmI= github.com/jhump/protoreflect v1.15.6/go.mod h1:jCHoyYQIJnaabEYnbGwyo9hUqfyUMTbJw/tAut5t97E= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= @@ -670,8 +767,8 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= -github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE= +github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -682,6 +779,10 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/ledgerwatch/erigon-lib v0.0.0-20230210071639-db0e7ed11263 h1:LGEzZvf33Y1NhuP5+jI/ni9l1TFS6oYPDilgy74NusM= +github.com/ledgerwatch/erigon-lib v0.0.0-20230210071639-db0e7ed11263/go.mod h1:OXgMDuUo2lZ3NpH29ZvMYbk+LxFd5ffDl2Z2mGMuY/I= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= @@ -689,8 +790,8 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/linxGnu/grocksdb v1.8.14 h1:HTgyYalNwBSG/1qCQUIott44wU5b2Y9Kr3z7SK5OfGQ= -github.com/linxGnu/grocksdb v1.8.14/go.mod h1:QYiYypR2d4v63Wj1adOOfzglnoII0gLj3PNh4fZkcFA= +github.com/linxGnu/grocksdb v1.10.3 h1:0laII9AQ6kFxo5SjhdTfSh9EgF20piD6TMHK6YuDm+4= +github.com/linxGnu/grocksdb v1.10.3/go.mod h1:OLQKZwiKwaJiAVCsOzWKvwiLwfZ5Vz8Md5TYR7t7pM8= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= @@ -703,8 +804,9 @@ github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GW github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -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-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= @@ -714,13 +816,17 @@ github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D 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.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -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/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/microsoft/go-mssqldb v1.7.2 h1:CHkFJiObW7ItKTJfHo1QX7QBBD1iV+mn1eOyRP3b/PA= +github.com/microsoft/go-mssqldb v1.7.2/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= @@ -733,6 +839,8 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= @@ -759,6 +867,8 @@ github.com/moby/sys/symlink v0.2.0 h1:tk1rOM+Ljp0nFmfOIBtlV3rTDlWOwFRhjEeAhZB0nZ github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -768,6 +878,8 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= @@ -788,10 +900,7 @@ github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/noble-assets/forwarding/v2 v2.0.0-20240521090705-86712c4c9e43 h1:aeRnbFtpTc315GSRpM4Qc0PIAJedO9JsvjUVE1C7Fzo= -github.com/noble-assets/forwarding/v2 v2.0.0-20240521090705-86712c4c9e43/go.mod h1:OGbKgjHf/4HHthbilK9RCPsBXUS40LFxRl4cAcNhqwk= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a h1:dlRvE5fWabOchtH7znfiFCcOvmIYgOeAS5ifBXBlh9Q= @@ -804,17 +913,14 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:v github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/onsi/gomega v1.26.0 h1:03cDLK28U6hWvCAns6NeydX3zIm4SF3ci69ulidS32Q= -github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= +github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= +github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= @@ -844,6 +950,9 @@ github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0 github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -864,24 +973,24 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= -github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA= +github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.60.1 h1:FUas6GcOw66yB/73KC+BOZoFJmbo/1pojoILArPAaSc= -github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= +github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= +github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -897,14 +1006,14 @@ github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Ung github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= @@ -924,6 +1033,8 @@ github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6v github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/secure-systems-lab/go-securesystemslib v0.4.0 h1:b23VGrQhTA8cN2CbBw7/FulN9fTtqYUdS5+Oxzt+DUE= github.com/secure-systems-lab/go-securesystemslib v0.4.0/go.mod h1:FGBZgq2tXWICsxWQW1msNf49F0Pf2Op5Htayx335Qbs= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b h1:h+3JX2VoWTFuyQEo87pStk/a99dzIO1mM9KxIyLPGTU= github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= github.com/shibumi/go-pathspec v1.3.0 h1:QUyMZhFo0Md5B8zV8x2tesohbb5kfbpTi9rBnKh5dkI= @@ -940,12 +1051,8 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/skip-mev/block-sdk/v2 v2.1.2 h1:fNKbrb+PVVzuU0JiSuWgBV4Afj5zZ1VeHQJp88wSl1g= -github.com/skip-mev/block-sdk/v2 v2.1.2/go.mod h1:kIq7SMva0/eHKTCiG/oI5XGxD4HNVK0t71TrUZqHcvA= github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610 h1:4JlsiRVt/YZOvrKH525T7sZXgEWUEjqSDMwE6fXNbdo= github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610/go.mod h1:kB8gFZX07CyJnw8q9iEZijI3qJTIe1K/Y++P5VGkrcg= -github.com/skip-mev/connect/v2 v2.0.1 h1:HEPdUio+uDtoSCKfCzKgQqs2jSQWgFQRYF+zyuhnGqs= -github.com/skip-mev/connect/v2 v2.0.1/go.mod h1:EaPc1lnDHt0WzEisfctMIeJ3EXkpCO/4wUZrzdROr7s= github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= @@ -956,16 +1063,19 @@ github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9yS github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= -github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w= -github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= +github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= -github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= +github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= @@ -985,12 +1095,13 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= -github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= github.com/testcontainers/testcontainers-go v0.33.0 h1:zJS9PfXYT5O0ZFXM2xxXfk4J5UMw/kRiISng037Gxdw= @@ -1001,6 +1112,17 @@ github.com/theupdateframework/notary v0.7.0 h1:QyagRZ7wlSpjT5N2qQAh/pN+DVqgekv4D github.com/theupdateframework/notary v0.7.0/go.mod h1:c9DRxcmhHmVLDay4/2fUYdISnHqbFDGRSlXPO0AhYWw= github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= +github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/tinylru v1.1.0 h1:XY6IUfzVTU9rpwdhKUF6nQdChgCdGjkMfLzbWyiau6I= +github.com/tidwall/tinylru v1.1.0/go.mod h1:3+bX+TJ2baOLMWTnlyNWHh4QMnFyARg2TLTQ6OFbzw8= +github.com/tidwall/wal v1.1.7 h1:emc1TRjIVsdKKSnpwGBAcsAGg0767SvUk8+ygx7Bb+4= +github.com/tidwall/wal v1.1.7/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E= github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375 h1:QB54BJwA6x8QU9nHY3xJSZR2kX9bgpZekRKGkLTmEXA= github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375/go.mod h1:xRroudyp5iVtxKqZCrA6n2TLFRBf8bmnjr1UD4x+z7g= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -1018,10 +1140,10 @@ github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqri github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= -github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= -github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= +github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= @@ -1035,8 +1157,16 @@ github.com/ybbus/jsonrpc/v3 v3.1.5 h1:0cC/QzS8OCuXYqqDbYnKKhsEe+IZLrNlDx8KPCieeW github.com/ybbus/jsonrpc/v3 v3.1.5/go.mod h1:U1QbyNfL5Pvi2roT0OpRbJeyvGxfWYSgKJHjxWdAEeE= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/zbiljic/go-filelock v0.0.0-20170914061330-1dbf7103ab7d h1:XQyeLr7N9iY9mi+TGgsBFkj54+j3fdoo8e2u6zrGP5A= +github.com/zbiljic/go-filelock v0.0.0-20170914061330-1dbf7103ab7d/go.mod h1:hoMeDjlNXTNqVwrCk8YDyaBS2g5vFfEX2ezMi4vb6CY= +github.com/zclconf/go-cty v1.14.4 h1:uXXczd9QDGsgu0i/QFR/hzI5NYCHLf6NQw/atrbnhq8= +github.com/zclconf/go-cty v1.14.4/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +github.com/zclconf/go-cty-yaml v1.1.0 h1:nP+jp0qPHv2IhUVqmQSzjvqAWcObN0KBkUl2rWBdig0= +github.com/zclconf/go-cty-yaml v1.1.0/go.mod h1:9YLUH4g7lOhVWqUbctnVlZ5KLpg7JAprQNgxSZ1Gyxs= github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= @@ -1050,45 +1180,49 @@ go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/detectors/gcp v1.29.0 h1:TiaiXB4DpGD3sdzNlYQxruQngn5Apwzi1X0DRhuGvDQ= -go.opentelemetry.io/contrib/detectors/gcp v1.29.0/go.mod h1:GW2aWZNwR2ZxDLdv8OyC2G8zkRoQBuURgV7RPQgcPoU= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/contrib/detectors/gcp v1.39.0 h1:kWRNZMsfBHZ+uHjiH4y7Etn2FK26LAGkNFw7RHv1DhE= +go.opentelemetry.io/contrib/detectors/gcp v1.39.0/go.mod h1:t/OGqzHBa5v6RHZwrDBJ2OirWc+4q/w2fTbLZwAKjTk= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 h1:YH4g8lQroajqUwWbq/tr2QX1JFmEXaDLgG+ew9bLMWo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0/go.mod h1:fvPi2qXDqFs8M4B4fmJhE92TyQs9Ydjlg3RvfUp+NbQ= go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.46.1 h1:gbhw/u49SS3gkPWiYweQNJGm/uJN5GkI/FrosxSHT7A= go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.46.1/go.mod h1:GnOaBaFQ2we3b9AGWJpsBa7v1S5RlQzlC3O7dRMxZhM= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= -go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= -go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU= go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0 h1:wNMDy/LVGLj2h3p6zg4d0gypKfWKSWI14E1C4smOgl8= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0/go.mod h1:YfbDdXAAkemWJK3H/DshvlrxqFB2rtW4rY6ky/3x/H0= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 h1:digkEZCJWobwBqMwC0cwCq8/wkkRy/OowZg5OArWZrM= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0/go.mod h1:/OpE/y70qVkndM0TrxT4KBoN3RsFZP0QaofcfYrj76I= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I= -go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= -go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= -go.opentelemetry.io/otel/sdk v1.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo= -go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok= -go.opentelemetry.io/otel/sdk/metric v1.29.0 h1:K2CfmJohnRgvZ9UAj2/FhIf/okdWcNdBwe1m8xFXiSY= -go.opentelemetry.io/otel/sdk/metric v1.29.0/go.mod h1:6zZLdCl2fkauYoZIOn/soQIDSWFmNSRcICarHfuhNJQ= -go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= -go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0 h1:ZrPRak/kS4xI3AVXy8F7pipuDXmDsrO8Lg+yQjBLjw0= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0/go.mod h1:3y6kQCWztq6hyW8Z9YxQDDm0Je9AJoFar2G0yDcmhRk= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= +go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= -go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4= +go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= @@ -1111,8 +1245,16 @@ golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8U 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-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= -golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= +golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= @@ -1131,6 +1273,9 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/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.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1147,25 +1292,36 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/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-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= -golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= +golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= -golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= +golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1173,8 +1329,11 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/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.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= -golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/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/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1195,7 +1354,6 @@ golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1203,48 +1361,74 @@ golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/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-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/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.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= -golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= 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.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU= -golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.41.0 h1:QCgPso/Q3RTJx2Th4bDLqML4W6iJiaXFq2/ftQF13YU= +golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= -golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= +golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= -golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= +golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1263,16 +1447,19 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= 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-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= -google.golang.org/api v0.209.0 h1:Ja2OXNlyRlWCWu8o+GgI4yUn/wz9h/5ZfFbKz+dQX+w= -google.golang.org/api v0.209.0/go.mod h1:I53S168Yr/PNDNMi5yPnDc0/LGRZO6o7PoEbl/HY3CM= +google.golang.org/api v0.271.0 h1:cIPN4qcUc61jlh7oXu6pwOQqbJW2GqYh5PS6rB2C/JY= +google.golang.org/api v0.271.0/go.mod h1:CGT29bhwkbF+i11qkRUJb2KMKqcJ1hdFceEIRd9u64Q= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1287,12 +1474,12 @@ google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20241113202542-65e8d215514f h1:zDoHYmMzMacIdjNe+P2XiTmPsLawi/pCbSPfxt6lTfw= -google.golang.org/genproto v0.0.0-20241113202542-65e8d215514f/go.mod h1:Q5m6g8b5KaFFzsQFIGdJkSJDGeJiybVenoYFMMa3ohI= -google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= -google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241113202542-65e8d215514f h1:C1QccEa9kUwvMgEUORqQD9S17QesQijxjZ84sO82mfo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241113202542-65e8d215514f/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 h1:VQZ/yAbAtjkHgH80teYd2em3xtIkkHd7ZhqfH2N9CsM= +google.golang.org/genproto v0.0.0-20260128011058-8636f8732409/go.mod h1:rxKD3IEILWEu3P44seeNOAwZN4SaoKaQ/2eTg4mM6EM= +google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20 h1:7ei4lp52gK1uSejlA8AZl5AJjeLUOHBQscRQZUgAcu0= +google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20/go.mod h1:ZdbssH/1SOVnjnDlXzxDHK2MCidiqXtbYccJNzNYPEE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 h1:ggcbiqK8WWh6l1dnltU4BgWGIGo+EVYxCaAPih/zQXQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1311,10 +1498,8 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= -google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= -google.golang.org/grpc/stats/opentelemetry v0.0.0-20240907200651-3ffb98b2c93a h1:UIpYSuWdWHSzjwcAFRLjKcPXFZVVLXGEM23W+NWqipw= -google.golang.org/grpc/stats/opentelemetry v0.0.0-20240907200651-3ffb98b2c93a/go.mod h1:9i1T9n4ZinTUZGgzENMi8MDDgbGC5mqTS75JAv6xN3A= +google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= +google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1329,8 +1514,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= -google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/cenkalti/backoff.v1 v1.1.0 h1:Arh75ttbsvlpVA7WtVpH4u9h6Zl46xuptxqLxPiSo4Y= gopkg.in/cenkalti/backoff.v1 v1.1.0/go.mod h1:J6Vskwqd+OMVJl8C33mmtxTBs2gyzfv7UDAkHu8BrjI= @@ -1366,6 +1551,18 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo= +gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= +gorm.io/driver/postgres v1.6.0 h1:2dxzU8xJ+ivvqTRph34QX+WrRaJlmfyPqXmoGVjMBa4= +gorm.io/driver/postgres v1.6.0/go.mod h1:vUw0mrGgrTK+uPHEhAdV4sfFELrByKVGnaVRkXDhtWo= +gorm.io/driver/sqlite v1.5.7 h1:8NvsrhP0ifM7LX9G4zPB97NwovUakUxc+2V2uuf3Z1I= +gorm.io/driver/sqlite v1.5.7/go.mod h1:U+J8craQU6Fzkcvu8oLeAQmi50TkwPEhHDEjQZXDah4= +gorm.io/driver/sqlserver v1.5.4 h1:xA+Y1KDNspv79q43bPyjDMUgHoYHLhXYmdFcYPobg8g= +gorm.io/driver/sqlserver v1.5.4/go.mod h1:+frZ/qYmuna11zHPlh5oc2O6ZA/lS88Keb0XSH1Zh/g= +gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.30.0 h1:qbT5aPv1UH8gI99OsRlvDToLxW5zR7FzS9acZDOZcgs= +gorm.io/gorm v1.30.0/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/informative-indexer/indexer/block_results.go b/informative-indexer/indexer/block_results.go new file mode 100644 index 00000000..3cc0d780 --- /dev/null +++ b/informative-indexer/indexer/block_results.go @@ -0,0 +1,170 @@ +package indexer + +import ( + "context" + "encoding/hex" + "errors" + "fmt" + "strings" + + "github.com/confluentinc/confluent-kafka-go/v2/kafka" + "github.com/rs/zerolog" + "gorm.io/gorm" + + statetracker "github.com/initia-labs/core-indexer/informative-indexer/indexer/state-tracker" + "github.com/initia-labs/core-indexer/pkg/db" + indexererrors "github.com/initia-labs/core-indexer/pkg/errors" + "github.com/initia-labs/core-indexer/pkg/mq" + "github.com/initia-labs/core-indexer/pkg/sentry_integration" + "github.com/initia-labs/core-indexer/pkg/txparser" +) + +func (f *Indexer) parseAndInsertBlock(parentCtx context.Context, dbTx *gorm.DB, blockResults *mq.BlockResultMsg, proposer *db.ValidatorAddress) error { + span, ctx := sentry_integration.StartSentrySpan(parentCtx, "parseAndInsertBlock", "Parse block_results message and insert block into the database") + defer span.Finish() + + hashBytes, err := hex.DecodeString(blockResults.Hash) + if err != nil { + return indexererrors.ErrorNonRetryable + } + + err = db.UpsertBlock(ctx, dbTx, db.Block{ + Height: blockResults.Height, + Hash: hashBytes, + Proposer: &proposer.OperatorAddress, + Timestamp: blockResults.Timestamp, + }) + if err != nil { + return err + } + + return err +} + +func (f *Indexer) produceTxResponseMessage(txHash string, height int64, txResultJsonBytes []byte, logger *zerolog.Logger) { + messageKey := mq.NEW_LCD_TX_RESPONSE_KAFKA_MESSAGE_KEY + fmt.Sprintf("_%s", txHash) + kafkaMessage := kafka.Message{ + TopicPartition: kafka.TopicPartition{Topic: &f.config.KafkaTxResponseTopic, Partition: int32(kafka.PartitionAny)}, + Headers: []kafka.Header{ + {Key: "height", Value: fmt.Append(nil, height)}, + {Key: "tx_hash", Value: fmt.Append(nil, txHash)}, + {Key: "service", Value: fmt.Append(nil, "informative-indexer")}, + }, + Key: []byte(messageKey), + Value: txResultJsonBytes, + } + + f.producer.ProduceWithClaimCheck(&mq.ProduceWithClaimCheckInput{ + Topic: f.config.KafkaTxResponseTopic, + Key: kafkaMessage.Key, + MessageInBytes: kafkaMessage.Value, + + ClaimCheckKey: []byte(mq.NEW_LCD_TX_RESPONSE_CLAIM_CHECK_KAFKA_MESSAGE_KEY + fmt.Sprintf("_%s", txHash)), + ClaimCheckThresholdInMB: f.config.ClaimCheckThresholdInMB, + ClaimCheckBucket: f.config.LCDTxResponseClaimCheckBucket, + ClaimCheckObjectPath: db.GetTxID(txHash, height), + + StorageClient: f.storageClient, + + Headers: kafkaMessage.Headers, + }, logger) +} + +func (f *Indexer) processTransactions(parentCtx context.Context, blockResults *mq.BlockResultMsg) error { + span, _ := sentry_integration.StartSentrySpan(parentCtx, "processTransactions", "Parse block_results message and insert transaction_events into the database") + defer span.Finish() + + for i, txResult := range blockResults.Txs { + if strings.Contains(txResult.ExecTxResults.Log, indexererrors.TxPareserError) || strings.Contains(txResult.ExecTxResults.Log, indexererrors.TxPareserErrorV2) { + continue + } + + txResultJsonDict, txResultJsonByte, err := txparser.GetTxResponse(f.encodingConfig, i, &txResult, blockResults) + if err != nil { + return fmt.Errorf("failed to get tx response: %w", err) + } + txData, err := txparser.ParseTransaction(f.encodingConfig, i, &txResult, txResultJsonDict, blockResults) + if err != nil { + return fmt.Errorf("failed to parse DB transaction: %v", err) + } + + for _, processor := range f.processors { + processor.NewTxProcessor(txData) + if err := processor.ProcessSDKMessages(&txResult, f.encodingConfig); err != nil { + return fmt.Errorf("failed to process %s sdk messages: %w", processor.Name(), err) + } + if err := processor.ProcessTransactionEvents(&txResult); err != nil { + return fmt.Errorf("failed to process %s tx events: %w", processor.Name(), err) + } + if err := processor.ResolveTxProcessor(); err != nil { + return fmt.Errorf("failed to resolve %s tx: %w", processor.Name(), err) + } + } + f.dbBatchInsert.AddTransaction(*txData) + + f.produceTxResponseMessage(txResult.Hash, blockResults.Height, txResultJsonByte, logger) + } + + return nil +} + +func (f *Indexer) processBlockResults(parentCtx context.Context, blockResults *mq.BlockResultMsg, proposer *db.ValidatorAddress) error { + span, ctx := sentry_integration.StartSentrySpan(parentCtx, "processBlockResults", "Parse block_results message and insert tx events into the database") + defer span.Finish() + + logger.Info().Msgf("Processing block_results at height: %d", blockResults.Height) + + if err := f.dbClient.WithContext(ctx).Transaction(func(dbTx *gorm.DB) error { + if err := f.parseAndInsertBlock(ctx, dbTx, blockResults, proposer); err != nil { + logger.Error().Int64("height", blockResults.Height).Msgf("Error inserting block: %v", err) + return err + } + + f.dbBatchInsert = statetracker.NewDBBatchInsert(f.cacher, logger) + f.stateUpdateManager = statetracker.NewStateUpdateManager(f.dbBatchInsert, f.encodingConfig, &blockResults.Height) + + for _, processor := range f.processors { + processor.InitProcessor(blockResults.Height, f.cacher) + + if err := processor.ProcessBeginBlockEvents(&blockResults.FinalizeBlockEvents); err != nil { + logger.Error().Msgf("Error processing %s messages: %v", processor.Name(), err) + return err + } + } + + if err := f.processTransactions(ctx, blockResults); err != nil { + logger.Error().Int64("height", blockResults.Height).Msgf("Error processing transactions: %v", err) + return err + } + + for _, processor := range f.processors { + if err := processor.ProcessEndBlockEvents(&blockResults.FinalizeBlockEvents); err != nil { + logger.Error().Msgf("Error processing %s messages: %v", processor.Name(), err) + return err + } + + if err := processor.TrackState(f.stateUpdateManager, f.dbBatchInsert); err != nil { + logger.Error().Msgf("Error tracking state %s: %v", processor.Name(), err) + return err + } + } + + if err := f.stateUpdateManager.UpdateState(ctx, f.rpcClient); err != nil { + logger.Error().Msgf("Error updating state: %v", err) + return err + } + // After sync data, flush the batch insert + if err := f.dbBatchInsert.Flush(ctx, dbTx, blockResults.Height); err != nil { + logger.Error().Msgf("Error flushing batch insert: %v", err) + return err + } + return nil + }); err != nil { + logger.Error().Int64("height", blockResults.Height).Msgf("Error processing block: %v", err) + return errors.Join(indexererrors.ErrorNonRetryable, err) + } + + logger.Info().Int64("height", blockResults.Height).Msgf("Successfully indexed block: %d", blockResults.Height) + + return nil +} diff --git a/informative-indexer/indexer/block_results_test.go b/informative-indexer/indexer/block_results_test.go new file mode 100644 index 00000000..78934e9c --- /dev/null +++ b/informative-indexer/indexer/block_results_test.go @@ -0,0 +1,79 @@ +package indexer_test + +import ( + // "encoding/json" + // "fmt" + // "io" + // "net/http" + // "strconv" + "testing" + + abci "github.com/cometbft/cometbft/abci/types" + // "github.com/initia-labs/core-indexer/pkg/mq" +) + +type MockResponse struct { + Result MockResult `json:"result"` +} + +type MockResult struct { + TxsResults []*abci.ExecTxResult `json:"txs_results"` + FinalizeBlockEvents []abci.Event `json:"finalize_block_events"` +} + +// func getBlockResultsByHeight(rpcEndpoint, height string) *mq.BlockResultMsg { +// url := fmt.Sprintf("%s/block_results?height=%s", rpcEndpoint, height) + +// resp, err := http.Get(url) +// if err != nil { +// panic(fmt.Errorf("failed to send request to rpc endpoint: %w", err)) +// } +// defer resp.Body.Close() + +// body, err := io.ReadAll(resp.Body) +// if err != nil { +// panic(fmt.Errorf("failed to read response body: %w", err)) +// } + +// // Unmarshal the JSON response +// var result MockResponse +// if err = json.Unmarshal(body, &result); err != nil { +// panic(fmt.Errorf("failed to unmarshal block results: %w", err)) +// } + +// txs := make([]mq.TxResult, 0) +// for idx, tx := range result.Result.TxsResults { +// txs = append(txs, mq.TxResult{ +// Hash: fmt.Sprintf("mockHash{%d}", idx), +// ExecTxResults: tx, +// }) +// } + +// lh, err := strconv.Atoi(height) +// if err != nil { +// panic(err) +// } + +// mockResult := &mq.BlockResultMsg{ +// Height: int64(lh), +// Txs: txs, +// FinalizeBlockEvents: result.Result.FinalizeBlockEvents, +// } + +// return mockResult +// } + +func TestProcessBlockResults(t *testing.T) { + //blockResultsMsg := getBlockResultsByHeight("https://rpc.initiation-2.initia.xyz", "2542435") + //fmt.Println(blockResultsMsg.Height) + // + //indexer, err := NewFlusher(&Config{}) + //if err != nil { + // panic(fmt.Errorf("failed to new indexer: %w", err)) + //} + // + //err = indexer.processBlockResults(context.Background(), blockResultsMsg) + //if err != nil { + // panic(fmt.Errorf("failed to process block_results: %w", err)) + //} +} diff --git a/informative-indexer/indexer/cacher/cacher.go b/informative-indexer/indexer/cacher/cacher.go new file mode 100644 index 00000000..15014116 --- /dev/null +++ b/informative-indexer/indexer/cacher/cacher.go @@ -0,0 +1,39 @@ +package cacher + +import ( + "github.com/initia-labs/core-indexer/pkg/db" +) + +type Cacher struct { + valAccAddrToOperator map[string]db.ValidatorAddress + valConsAddrToOperator map[string]db.ValidatorAddress +} + +func NewCacher() *Cacher { + return &Cacher{ + valAccAddrToOperator: make(map[string]db.ValidatorAddress), + valConsAddrToOperator: make(map[string]db.ValidatorAddress), + } +} + +func (c *Cacher) SetValidatorAddresses(validatorAddresses []db.ValidatorAddress) { + for _, validatorAddress := range validatorAddresses { + c.valAccAddrToOperator[validatorAddress.AccountID] = validatorAddress + c.valConsAddrToOperator[validatorAddress.ConsensusAddress] = validatorAddress + } +} + +func (c *Cacher) SetValidator(validatorAddress db.ValidatorAddress) { + c.valAccAddrToOperator[validatorAddress.AccountID] = validatorAddress + c.valConsAddrToOperator[validatorAddress.ConsensusAddress] = validatorAddress +} + +func (c *Cacher) GetValidatorByAccAddr(accAddress string) (db.ValidatorAddress, bool) { + validator, ok := c.valAccAddrToOperator[accAddress] + return validator, ok +} + +func (c *Cacher) GetValidatorByConsAddr(consAddress string) (db.ValidatorAddress, bool) { + validator, ok := c.valConsAddrToOperator[consAddress] + return validator, ok +} diff --git a/informative-indexer/indexer/genesis.go b/informative-indexer/indexer/genesis.go new file mode 100644 index 00000000..9d963a61 --- /dev/null +++ b/informative-indexer/indexer/genesis.go @@ -0,0 +1,185 @@ +package indexer + +import ( + "context" + "encoding/json" + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" + movetypes "github.com/initia-labs/initia/x/move/types" + mstakingtypes "github.com/initia-labs/initia/x/mstaking/types" + vmapi "github.com/initia-labs/movevm/api" + vmtypes "github.com/initia-labs/movevm/types" + "github.com/rs/zerolog" + "gorm.io/gorm" + + statetracker "github.com/initia-labs/core-indexer/informative-indexer/indexer/state-tracker" + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/parser" +) + +// decodeModule decodes the module using the byte code and returns the ABI as a Base64-encoded string. +func decodeModule(moduleBytes []byte) (string, error) { + abi, err := vmapi.DecodeModuleBytes(moduleBytes) + if err != nil { + return "", err + } + + return string(abi), nil +} + +func (f *Indexer) StartFromGenesis(ctx context.Context, logger *zerolog.Logger) error { + genesis, err := f.rpcClient.Genesis(ctx) + if err != nil { + logger.Error().Msgf("Error getting genesis: %v", err) + return err + } + + appState, err := genesis.Genesis.AppState.MarshalJSON() + if err != nil { + return err + } + + var genesisState map[string]json.RawMessage + if err := json.Unmarshal(appState, &genesisState); err != nil { + return err + } + + var authGenesis authtypes.GenesisState + if genesisState[authtypes.ModuleName] != nil { + f.encodingConfig.Codec.MustUnmarshalJSON(genesisState[authtypes.ModuleName], &authGenesis) + } + + dbBatchInsert := statetracker.NewDBBatchInsert(f.cacher, logger) + for _, account := range authGenesis.Accounts { + a, ok := account.GetCachedValue().(sdk.AccountI) + if !ok { + return fmt.Errorf("expected account") + } + + accAddr := a.GetAddress() + vmAddr, _ := vmtypes.NewAccountAddressFromBytes(accAddr) + dbBatchInsert.AddAccounts(db.Account{ + Address: sdk.AccAddress(accAddr).String(), + VMAddress: db.VMAddress{VMAddress: vmAddr.String()}, + Type: string(db.BaseAccount), + }) + } + + dbBatchInsert.AddAccounts(db.Account{ + Address: movetypes.StdAddr.String(), + VMAddress: db.VMAddress{VMAddress: vmtypes.StdAddress.String()}, + Type: string(db.BaseAccount), + }) + dbBatchInsert.AddAccounts(db.Account{ + Address: "init1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpqr5e3d", + VMAddress: db.VMAddress{VMAddress: vmtypes.StdAddress.String()}, + Type: string(db.BaseAccount), + }) + + var genutilState genutiltypes.GenesisState + f.encodingConfig.Codec.MustUnmarshalJSON(genesisState[genutiltypes.ModuleName], &genutilState) + for _, genTx := range genutilState.GenTxs { + tx, err := f.encodingConfig.TxConfig.TxJSONDecoder()(genTx) + if err != nil { + return err + } + + for _, msg := range tx.GetMsgs() { + if msg, ok := msg.(*mstakingtypes.MsgCreateValidator); ok { + valAddr, err := sdk.ValAddressFromBech32(msg.ValidatorAddress) + if err != nil { + return err + } + accAddr := sdk.AccAddress(valAddr) + + vmAddr, err := vmtypes.NewAccountAddressFromBytes(accAddr) + if err != nil { + return err + } + dbBatchInsert.AddAccounts(db.Account{ + Address: accAddr.String(), + VMAddress: db.VMAddress{VMAddress: vmAddr.String()}, + Type: string(db.BaseAccount), + }) + + validator, err := db.NewGenesisValidator(accAddr.String(), msg) + if err != nil { + return err + } + dbBatchInsert.AddValidators(validator) + } + } + + } + + var moveGenesis movetypes.GenesisState + f.encodingConfig.Codec.MustUnmarshalJSON(genesisState[movetypes.ModuleName], &moveGenesis) + + for _, stdlib := range moveGenesis.GetStdlibs() { + abi, err := decodeModule(stdlib) + if err != nil { + return err + } + + var abiJson map[string]any + if err := json.Unmarshal([]byte(abi), &abiJson); err != nil { + return err + } + + name, ok := abiJson["name"].(string) + if !ok { + return fmt.Errorf("name is not a string") + } + address, ok := abiJson["address"].(string) + if !ok { + return fmt.Errorf("address is not a string") + } + + dbBatchInsert.AddModule(db.Module{ + Name: name, + ModuleEntryExecuted: 0, + IsVerify: false, + PublishTxID: nil, + PublisherID: address, + ID: fmt.Sprintf("%s::%s", address, name), + Digest: parser.GetModuleDigest(stdlib), + UpgradePolicy: db.GetUpgradePolicy(movetypes.UpgradePolicy_COMPATIBLE), + }) + + dbBatchInsert.ModulePublishedEvents = append(dbBatchInsert.ModulePublishedEvents, db.ModuleHistory{ + UpgradePolicy: db.GetUpgradePolicy(movetypes.UpgradePolicy_COMPATIBLE), + TxID: nil, + BlockHeight: 0, + ModuleID: fmt.Sprintf("%s::%s", address, name), + Remark: db.JSON("{}"), + }) + } + + if err := f.dbClient.WithContext(ctx).Transaction(func(dbTx *gorm.DB) error { + err := db.InitTracking(ctx, dbTx) + if err != nil { + logger.Error().Msgf("Error initializing tracking: %v", err) + return err + } + err = db.InsertGenesisBlock(ctx, dbTx, genesis.Genesis.GenesisTime) + if err != nil { + logger.Error().Msgf("Error inserting genesis block: %v", err) + return err + } + + err = dbBatchInsert.Flush(ctx, dbTx, 0) + if err != nil { + logger.Error().Msgf("Error getting genesis flushing batch insert: %v", err) + return err + } + + return nil + }); err != nil { + logger.Error().Msgf("Error flushing batch insert: %v", err) + return err + } + return nil +} diff --git a/informative-indexer/indexer/indexer.go b/informative-indexer/indexer/indexer.go new file mode 100644 index 00000000..b9a7a461 --- /dev/null +++ b/informative-indexer/indexer/indexer.go @@ -0,0 +1,480 @@ +package indexer + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "strings" + "time" + + "github.com/certifi/gocertifi" + "github.com/confluentinc/confluent-kafka-go/v2/kafka" + "github.com/getsentry/sentry-go" + initiaapp "github.com/initia-labs/initia/app" + "github.com/initia-labs/initia/app/params" + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" + "gorm.io/gorm" + + "github.com/initia-labs/core-indexer/informative-indexer/indexer/cacher" + "github.com/initia-labs/core-indexer/informative-indexer/indexer/processors" + accountprocessor "github.com/initia-labs/core-indexer/informative-indexer/indexer/processors/account" + bankprocessor "github.com/initia-labs/core-indexer/informative-indexer/indexer/processors/bank" + ibcprocessor "github.com/initia-labs/core-indexer/informative-indexer/indexer/processors/ibc" + moveprocessor "github.com/initia-labs/core-indexer/informative-indexer/indexer/processors/move" + proposalprocessor "github.com/initia-labs/core-indexer/informative-indexer/indexer/processors/proposal" + validatorprocessor "github.com/initia-labs/core-indexer/informative-indexer/indexer/processors/validator" + statetracker "github.com/initia-labs/core-indexer/informative-indexer/indexer/state-tracker" + "github.com/initia-labs/core-indexer/pkg/cosmosrpc" + "github.com/initia-labs/core-indexer/pkg/db" + indexererrors "github.com/initia-labs/core-indexer/pkg/errors" + "github.com/initia-labs/core-indexer/pkg/mq" + "github.com/initia-labs/core-indexer/pkg/sdkconfig" + "github.com/initia-labs/core-indexer/pkg/sentry_integration" + "github.com/initia-labs/core-indexer/pkg/storage" +) + +var logger *zerolog.Logger + +type Indexer struct { + consumer *mq.Consumer + producer *mq.Producer + dbClient *gorm.DB + storageClient storage.Client + config *Config + + encodingConfig *params.EncodingConfig + rpcClient cosmosrpc.CosmosJSONRPCHub + + stateUpdateManager *statetracker.StateUpdateManager + dbBatchInsert *statetracker.DBBatchInsert + cacher *cacher.Cacher + + processors []processors.Processor +} + +type Config struct { + // ID for the current indexer + ID string + + // Chain id + Chain string + + DBConnectionString string + + RPCEndpoints string + RPCTimeoutInSeconds int64 + + // Kafka config + KafkaBootstrapServer string + KafkaBlockResultsTopic string + KafkaTxResponseTopic string + KafkaAPIKey string + KafkaAPISecret string + KafkaBlockResultsConsumerGroup string + + // Claim check config + ClaimCheckThresholdInMB int64 + BlockResultsClaimCheckBucket string + LCDTxResponseClaimCheckBucket string + + Environment string + SentryDSN string + CommitSHA string + SentryProfilesSampleRate float64 + SentryTracesSampleRate float64 +} + +func NewIndexer(config *Config) (*Indexer, error) { + logger = zerolog.Ctx(log.With().Str("component", "informative-indexer-indexer"). + Str("chain", config.Chain). + Str("id", config.ID). + Str("environment", config.Environment). + Str("commit_sha", config.CommitSHA). + Logger().WithContext(context.Background()), + ) + + sentryClientOptions := sentry.ClientOptions{ + Dsn: config.SentryDSN, + ServerName: config.Chain + "-informative-indexer-indexer", + EnableTracing: true, + ProfilesSampleRate: config.SentryProfilesSampleRate, + TracesSampleRate: config.SentryTracesSampleRate, + Environment: config.Environment, + Release: config.CommitSHA, + Tags: map[string]string{ + "chain": config.Chain, + "environment": config.Environment, + "component": "informative-indexer-indexer", + "commit_sha": config.CommitSHA, + }, + } + + rootCAs, err := gocertifi.CACerts() + if err != nil { + logger.Fatal().Msgf("Sentry: Error getting root CAs: %v\n", err) + } else { + sentryClientOptions.CaCerts = rootCAs + } + + err = sentry.Init(sentryClientOptions) + if err != nil { + logger.Fatal().Msgf("Sentry: Error initializing sentry: %v\n", err) + return nil, err + } + + var consumer *mq.Consumer + + if config.Environment == "local" { + consumer, err = mq.NewConsumer(&kafka.ConfigMap{ + "bootstrap.servers": config.KafkaBootstrapServer, + "group.id": config.KafkaBlockResultsConsumerGroup, + "client.id": config.KafkaBlockResultsConsumerGroup + "-" + config.ID, + "enable.auto.commit": false, + "auto.offset.reset": "earliest", + "security.protocol": "PLAINTEXT", + "max.poll.interval.ms": 600000, + }) + } else { + consumer, err = mq.NewConsumer(&kafka.ConfigMap{ + "bootstrap.servers": config.KafkaBootstrapServer, + "group.id": config.KafkaBlockResultsConsumerGroup, + "client.id": config.KafkaBlockResultsConsumerGroup + "-" + config.ID, + "enable.auto.commit": false, + "auto.offset.reset": "earliest", + "security.protocol": "SASL_SSL", + "sasl.mechanisms": "PLAIN", + "sasl.username": config.KafkaAPIKey, + "sasl.password": config.KafkaAPISecret, + "max.poll.interval.ms": 600000, + }) + } + + if err != nil { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) + logger.Fatal().Msgf("Kafka: Error creating consumer: %v\n", err) + return nil, err + } + + var producer *mq.Producer + + if config.Environment == "local" { + producer, err = mq.NewProducer(&kafka.ConfigMap{ + "bootstrap.servers": config.KafkaBootstrapServer, + "client.id": config.KafkaBlockResultsConsumerGroup + "-" + config.ID, + "acks": "all", + "linger.ms": 200, + "security.protocol": "PLAINTEXT", + "message.max.bytes": 7340032, + "compression.codec": "lz4", + }) + } else { + producer, err = mq.NewProducer(&kafka.ConfigMap{ + "bootstrap.servers": config.KafkaBootstrapServer, + "client.id": config.KafkaBlockResultsConsumerGroup + "-" + config.ID, + "acks": "all", + "linger.ms": 200, + "security.protocol": "SASL_SSL", + "sasl.mechanisms": "PLAIN", + "sasl.username": config.KafkaAPIKey, + "sasl.password": config.KafkaAPISecret, + "message.max.bytes": 7340032, + "compression.codec": "lz4", + }) + } + + if err != nil { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) + logger.Fatal().Msgf("Kafka: Error creating producer: %v\n", err) + return nil, err + } + + dbClient, err := db.NewClient(config.DBConnectionString) + if err != nil { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) + logger.Fatal().Msgf("DB: Error creating DB client: %v\n", err) + return nil, err + } + + var storageClient storage.Client + + if config.Environment == "local" { + storageClient, err = storage.NewGCSFakeClient() + if err != nil { + logger.Info().Msgf("Local: Error creating storage client: %v\n", err) + return nil, err + } + } else { + storageClient, err = storage.NewGCSClient() + if err != nil { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) + logger.Fatal().Msgf("Storage: Error creating storage client: %v\n", err) + return nil, err + } + } + + if config.RPCEndpoints == "" { + sentry_integration.CaptureCurrentHubException(errors.New("RPC: No RPC endpoints provided"), sentry.LevelFatal) + logger.Fatal().Msgf("RPC: No RPC endpoints provided\n") + return nil, fmt.Errorf("RPC: No RPC endpoints provided") + } + + var rpcEndpoints mq.RPCEndpoints + err = json.Unmarshal([]byte(config.RPCEndpoints), &rpcEndpoints) + if err != nil { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) + logger.Fatal().Msgf("RPC: Error unmarshalling RPC endpoints: %v\n", err) + return nil, err + } + + clientConfigs := make([]cosmosrpc.ClientConfig, 0) + for _, rpc := range rpcEndpoints.RPCs { + clientConfigs = append(clientConfigs, cosmosrpc.ClientConfig{ + URL: rpc.URL, + ClientOption: &cosmosrpc.ClientOption{CustomHeaders: rpc.Headers}, + }) + } + + rpcClient := cosmosrpc.NewHub(clientConfigs, logger, time.Duration(config.RPCTimeoutInSeconds)*time.Second) + err = rpcClient.Rebalance(context.Background()) + if err != nil { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) + logger.Fatal().Msgf("RPC: Error Rebalancing RPC endpoints: %v\n", err) + return nil, err + } + + sdkconfig.ConfigureSDK() + encodingConfig := initiaapp.MakeEncodingConfig() + return &Indexer{ + consumer: consumer, + producer: producer, + dbClient: dbClient, + storageClient: storageClient, + config: config, + encodingConfig: &encodingConfig, + rpcClient: rpcClient, + cacher: cacher.NewCacher(), + processors: []processors.Processor{ + &accountprocessor.Processor{}, + &bankprocessor.Processor{}, + &ibcprocessor.Processor{}, + &moveprocessor.Processor{}, + &proposalprocessor.Processor{}, + &validatorprocessor.Processor{}, + }, + }, nil +} + +func (f *Indexer) RunPatcher(ctx context.Context) { + err := runPatcher(ctx, f.dbClient, f.config.Chain) + if err != nil { + logger.Error().Msgf("Error running patcher: %v", err) + } +} + +func (f *Indexer) parseBlockResults(parentCtx context.Context, blockResultsBytes []byte) (mq.BlockResultMsg, error) { + span, _ := sentry_integration.StartSentrySpan(parentCtx, "parseBlockResults", "Parsing block_results") + defer span.Finish() + + var blockResultsMsg mq.BlockResultMsg + err := json.Unmarshal(blockResultsBytes, &blockResultsMsg) + if err != nil { + logger.Error().Msgf("Error unmarshalling message: %v", err) + return blockResultsMsg, err + } + + return blockResultsMsg, err +} + +func (f *Indexer) processUntilSucceeds(ctx context.Context, blockResults mq.BlockResultMsg) error { + proposer, ok := f.cacher.GetValidatorByConsAddr(blockResults.ProposerConsensusAddress) + if !ok { + logger.Error().Msgf("Failed to get proposer operator address") + } + + // Process the block_results until success + for { + err := f.processBlockResults(ctx, &blockResults, &proposer) + if err != nil { + if errors.Is(err, indexererrors.ErrorNonRetryable) { + return err + } + + sentry_integration.CaptureCurrentHubException(err, sentry.LevelWarning) + logger.Error().Msgf("Error processing block_results: %v, retrying...", err) + continue + } + break + } + + for { + err := f.processValidator(ctx, &blockResults, &proposer) + if err != nil { + if errors.Is(err, indexererrors.ErrorNonRetryable) { + return err + } + + sentry_integration.CaptureCurrentHubException(err, sentry.LevelWarning) + logger.Error().Msgf("Error validating block validators: %v, retrying...", err) + time.Sleep(10 * time.Second) + + continue + } + break + } + + return nil +} + +func (f *Indexer) processClaimCheckMessage(key []byte, messageValue []byte) ([]byte, error) { + if strings.HasPrefix(string(key), mq.NEW_BLOCK_RESULTS_CLAIM_CHECK_KAFKA_MESSAGE_KEY) { + var claimCheckBlockResultsMsg mq.ClaimCheckMsg + err := json.Unmarshal(messageValue, &claimCheckBlockResultsMsg) + if err != nil { + logger.Fatal().Msgf("Error unmarshalling message: %v", err) + return nil, err + } + + var claimCheckBlockResultsMsgBytes []byte + for { + claimCheckBlockResultsMsgBytes, err = f.storageClient.ReadFile(f.config.BlockResultsClaimCheckBucket, claimCheckBlockResultsMsg.ObjectPath) + if err == nil { + break + } + + logger.Error().Msgf("Error reading block_results from storage: %v", err) + } + + messageValue = claimCheckBlockResultsMsgBytes + } + return messageValue, nil +} + +func (f *Indexer) processKafkaMessage(ctx context.Context, message *kafka.Message) error { + messageValue, err := f.processClaimCheckMessage(message.Key, message.Value) + if err != nil { + logger.Error().Msgf("Error processing claim check message: %v", err) + return err + } + blockResultsMsg, err := f.parseBlockResults(ctx, messageValue) + if err != nil { + logger.Error().Msgf("Error processing block_results message: %v", err) + return err + } + + latestInformativeBlockHeight, err := db.GetLatestInformativeBlockHeight(ctx, f.dbClient) + if blockResultsMsg.Height <= latestInformativeBlockHeight { + logger.Info().Msgf("Skipping block_results message at height %d because it's already processed", blockResultsMsg.Height) + return nil + } + + sentry.ConfigureScope(func(scope *sentry.Scope) { + scope.SetTag("height", fmt.Sprint(blockResultsMsg.Height)) + }) + + err = f.processUntilSucceeds(ctx, blockResultsMsg) + if err != nil { + logger.Error().Msgf("Error processing block_results: %v", err) + return err + } + + return nil +} + +func (f *Indexer) close() { + sqlDB, err := f.dbClient.DB() + if err == nil { + sqlDB.Close() + } + + f.producer.Flush(30000) + f.producer.Close() + + f.consumer.Close() +} + +func (f *Indexer) StartIndexing(stopCtx context.Context) { + logger.Info().Msgf("Starting indexer...") + + trackingInit, err := db.IsTrackingInit(context.Background(), f.dbClient) + if err != nil { + logger.Fatal().Msgf("Error checking if tracking is initialized: %v", err) + panic(err) + } + + if !trackingInit { + logger.Info().Msgf("Initializing tracking...") + err := f.StartFromGenesis(stopCtx, logger) + if err != nil { + logger.Fatal().Msgf("Error starting from genesis: %v", err) + panic(err) + } + } + f.producer.ListenToKafkaProduceEvents(logger) + + err = f.consumer.SubscribeTopics([]string{f.config.KafkaBlockResultsTopic}, nil) + if err != nil { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) + logger.Fatal().Msgf("Failed to subscribe to topic: %s\n", err) + } + + logger.Info().Msgf("Subscribed to topic: %s\n", f.config.KafkaBlockResultsTopic) + + validatorAddresses, err := db.QueryValidatorAddresses(f.dbClient) + if err != nil { + logger.Fatal().Msgf("Error getting validators from db: %v", err) + return + } + f.cacher.SetValidatorAddresses(validatorAddresses) + + for { + select { + case <-stopCtx.Done(): + return + default: + ctx := context.Background() + + message, err := f.consumer.ReadMessage(10 * time.Second) + if err != nil { + if err.(kafka.Error).IsTimeout() { + continue + } + + sentry_integration.CaptureCurrentHubException(err, sentry.LevelWarning) + logger.Error().Msgf("Error reading message: %v", err) + continue + } + + sentry.ConfigureScope(func(scope *sentry.Scope) { + scope.SetTag("id", f.config.ID) + scope.SetTag("partition", fmt.Sprint(message.TopicPartition.Partition)) + scope.SetTag("offset", message.TopicPartition.Offset.String()) + }) + + transaction, ctx := sentry_integration.StartSentryTransaction(ctx, "Index", "Process and index informative block_results messages") + err = f.processKafkaMessage(ctx, message) + if err != nil { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelError) + logger.Fatal().Msgf("Error process kafka message: %v", err) + } + + _, err = f.consumer.CommitMessage(message) + if err != nil { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelError) + logger.Error().Msgf("Non-retryable Error committing message: %v", err) + } + transaction.Finish() + } + } +} + +func (f *Indexer) Index(ctx context.Context) { + // graceful shutdown + defer sentry.Flush(2 * time.Second) + + f.StartIndexing(ctx) + + logger.Info().Msgf("Shutting down ...") + f.close() +} diff --git a/informative-indexer/indexer/patcher.go b/informative-indexer/indexer/patcher.go new file mode 100644 index 00000000..bcc4bd0c --- /dev/null +++ b/informative-indexer/indexer/patcher.go @@ -0,0 +1,25 @@ +package indexer + +import ( + "context" + + "github.com/initia-labs/core-indexer/pkg/db" + "gorm.io/gorm" +) + +func runPatcher(ctx context.Context, dbClient *gorm.DB, chainID string) error { + logger.Info().Msgf("Starting patcher for chain %s", chainID) + + if chainID == "interwoven-1" { + logger.Info().Msgf("Applying interwoven-1 specific patches") + err := db.UpdateOnlyExpeditedProposalStatus(ctx, dbClient, []db.Proposal{{ID: 62, IsExpedited: true}}) + if err != nil { + logger.Error().Msgf("Error updating only expedited proposal status: %v", err) + return err + } + logger.Info().Msgf("Successfully updated expedited proposal status") + } + + logger.Info().Msgf("Done running patcher for chain %s", chainID) + return nil +} diff --git a/informative-indexer/indexer/processors/account/processor.go b/informative-indexer/indexer/processors/account/processor.go new file mode 100644 index 00000000..2011ec7c --- /dev/null +++ b/informative-indexer/indexer/processors/account/processor.go @@ -0,0 +1,61 @@ +package account + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/initia-labs/core-indexer/informative-indexer/indexer/cacher" + statetracker "github.com/initia-labs/core-indexer/informative-indexer/indexer/state-tracker" + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/mq" + "github.com/initia-labs/core-indexer/pkg/parser" +) + +func (p *Processor) InitProcessor(height int64, cacher *cacher.Cacher) { + p.Height = height + p.Cacher = cacher + p.accounts = make(map[string]db.Account) + p.accountsInTx = make(map[statetracker.AccountTxKey]db.AccountTransaction) +} + +func (p *Processor) Name() string { + return "account" +} + +func (p *Processor) NewTxProcessor(txData *db.Transaction) { + p.txProcessor = &TxProcessor{ + txData: txData, + relatedAccs: make([]sdk.AccAddress, 0), + } +} + +func (p *Processor) ProcessTransactionEvents(tx *mq.TxResult) error { + relatedAccs, err := parser.GrepAddressesFromEvents(tx.ExecTxResults.Events) + if err != nil { + return err + } + p.txProcessor.relatedAccs = relatedAccs + + return nil +} + +func (p *Processor) ResolveTxProcessor() error { + for _, acc := range p.txProcessor.relatedAccs { + account := db.NewAccountFromSDKAddress(acc) + p.accounts[account.Address] = account + + accountTx := db.NewAccountTx( + p.txProcessor.txData.ID, + p.Height, + account.Address, + p.txProcessor.txData.Sender, + ) + key := statetracker.MakeAccountTxKey(accountTx.TransactionID, accountTx.AccountID) + p.accountsInTx[key] = accountTx + } + return nil +} + +func (p *Processor) TrackState(stateUpdateManager *statetracker.StateUpdateManager, dbBatchInsert *statetracker.DBBatchInsert) error { + dbBatchInsert.AddAccountsInTx(p.accounts, p.accountsInTx) + return nil +} diff --git a/informative-indexer/indexer/processors/account/types.go b/informative-indexer/indexer/processors/account/types.go new file mode 100644 index 00000000..1d5574e4 --- /dev/null +++ b/informative-indexer/indexer/processors/account/types.go @@ -0,0 +1,24 @@ +package account + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/initia-labs/core-indexer/informative-indexer/indexer/processors" + statetracker "github.com/initia-labs/core-indexer/informative-indexer/indexer/state-tracker" + "github.com/initia-labs/core-indexer/pkg/db" +) + +var _ processors.Processor = &Processor{} + +type TxProcessor struct { + txData *db.Transaction + relatedAccs []sdk.AccAddress +} + +type Processor struct { + processors.BaseProcessor + accounts map[string]db.Account + accountsInTx map[statetracker.AccountTxKey]db.AccountTransaction + + txProcessor *TxProcessor +} diff --git a/informative-indexer/indexer/processors/bank/processor.go b/informative-indexer/indexer/processors/bank/processor.go new file mode 100644 index 00000000..e8a0dd8a --- /dev/null +++ b/informative-indexer/indexer/processors/bank/processor.go @@ -0,0 +1,44 @@ +package bank + +import ( + "fmt" + + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/initia-labs/initia/app/params" + + "github.com/initia-labs/core-indexer/informative-indexer/indexer/cacher" + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/mq" +) + +func (p *Processor) InitProcessor(height int64, cacher *cacher.Cacher) { + p.Height = height + p.Cacher = cacher + p.txProcessor = nil +} + +func (p *Processor) Name() string { + return "bank" +} + +func (p *Processor) NewTxProcessor(txData *db.Transaction) { + p.txProcessor = &TxProcessor{ + txData: txData, + } +} + +func (p *Processor) ProcessSDKMessages(tx *mq.TxResult, encodingConfig *params.EncodingConfig) error { + sdkTx, err := encodingConfig.TxConfig.TxDecoder()(tx.Tx) + if err != nil { + return fmt.Errorf("failed to decode SDK transaction: %w", err) + } + + for _, msg := range sdkTx.GetMsgs() { + switch msg.(type) { + case *banktypes.MsgSend, *banktypes.MsgMultiSend: + p.txProcessor.txData.IsSend = true + } + } + + return nil +} diff --git a/informative-indexer/indexer/processors/bank/types.go b/informative-indexer/indexer/processors/bank/types.go new file mode 100644 index 00000000..4f01a554 --- /dev/null +++ b/informative-indexer/indexer/processors/bank/types.go @@ -0,0 +1,18 @@ +package bank + +import ( + "github.com/initia-labs/core-indexer/informative-indexer/indexer/processors" + "github.com/initia-labs/core-indexer/pkg/db" +) + +var _ processors.Processor = &Processor{} + +type TxProcessor struct { + txData *db.Transaction +} + +type Processor struct { + processors.BaseProcessor + + txProcessor *TxProcessor +} diff --git a/informative-indexer/indexer/processors/ibc/processor.go b/informative-indexer/indexer/processors/ibc/processor.go new file mode 100644 index 00000000..a06584b4 --- /dev/null +++ b/informative-indexer/indexer/processors/ibc/processor.go @@ -0,0 +1,49 @@ +package ibc + +import ( + "fmt" + + "github.com/initia-labs/initia/app/params" + + "github.com/initia-labs/core-indexer/informative-indexer/indexer/cacher" + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/mq" +) + +func (p *Processor) InitProcessor(height int64, cacher *cacher.Cacher) { + p.Height = height + p.Cacher = cacher + p.txProcessor = nil +} + +func (p *Processor) Name() string { + return "ibc" +} + +func (p *Processor) NewTxProcessor(txData *db.Transaction) { + p.txProcessor = &TxProcessor{ + txData: txData, + } +} + +func (p *Processor) ProcessSDKMessages(tx *mq.TxResult, encodingConfig *params.EncodingConfig) error { + sdkTx, err := encodingConfig.TxConfig.TxDecoder()(tx.Tx) + if err != nil { + return fmt.Errorf("failed to decode SDK transaction: %w", err) + } + + for _, msg := range sdkTx.GetMsgs() { + p.handleMsg(msg) + } + + return nil +} + +func (p *Processor) ProcessTransactionEvents(tx *mq.TxResult) error { + for _, event := range tx.ExecTxResults.Events { + if err := p.handleEvent(event); err != nil { + return fmt.Errorf("failed to handle tx event %s: %w", event.Type, err) + } + } + return nil +} diff --git a/informative-indexer/indexer/processors/ibc/tx_event.go b/informative-indexer/indexer/processors/ibc/tx_event.go new file mode 100644 index 00000000..0eb3c1f3 --- /dev/null +++ b/informative-indexer/indexer/processors/ibc/tx_event.go @@ -0,0 +1,32 @@ +package ibc + +import ( + "strings" + + abci "github.com/cometbft/cometbft/abci/types" + sdk "github.com/cosmos/cosmos-sdk/types" + ibcchanneltypes "github.com/cosmos/ibc-go/v8/modules/core/04-channel/types" +) + +func (p *Processor) handleEvent(event abci.Event) error { + switch event.Type { + case sdk.EventTypeMessage: + return p.handleMessageEvents(event) + case ibcchanneltypes.EventTypeSendPacket: + p.txProcessor.txData.IsIbc = true + return nil + default: + return nil + } +} + +func (p *Processor) handleMessageEvents(event abci.Event) error { + for _, attribute := range event.Attributes { + if attribute.Key == sdk.AttributeKeyAction { + if strings.HasPrefix(attribute.Value, "/ibc") { + p.txProcessor.txData.IsIbc = true + } + } + } + return nil +} diff --git a/informative-indexer/indexer/processors/ibc/tx_msg.go b/informative-indexer/indexer/processors/ibc/tx_msg.go new file mode 100644 index 00000000..e5780a28 --- /dev/null +++ b/informative-indexer/indexer/processors/ibc/tx_msg.go @@ -0,0 +1,13 @@ +package ibc + +import ( + "strings" + + sdk "github.com/cosmos/cosmos-sdk/types" +) + +func (p *Processor) handleMsg(msg sdk.Msg) { + if strings.HasPrefix(sdk.MsgTypeURL(msg), "/ibc") { + p.txProcessor.txData.IsIbc = true + } +} diff --git a/informative-indexer/indexer/processors/ibc/types.go b/informative-indexer/indexer/processors/ibc/types.go new file mode 100644 index 00000000..062cd6f9 --- /dev/null +++ b/informative-indexer/indexer/processors/ibc/types.go @@ -0,0 +1,18 @@ +package ibc + +import ( + "github.com/initia-labs/core-indexer/informative-indexer/indexer/processors" + "github.com/initia-labs/core-indexer/pkg/db" +) + +var _ processors.Processor = &Processor{} + +type TxProcessor struct { + txData *db.Transaction +} + +type Processor struct { + processors.BaseProcessor + + txProcessor *TxProcessor +} diff --git a/informative-indexer/indexer/processors/move/processor.go b/informative-indexer/indexer/processors/move/processor.go new file mode 100644 index 00000000..10c36f23 --- /dev/null +++ b/informative-indexer/indexer/processors/move/processor.go @@ -0,0 +1,126 @@ +package move + +import ( + "fmt" + + "github.com/initia-labs/initia/app/params" + vmapi "github.com/initia-labs/movevm/api" + + "github.com/initia-labs/core-indexer/informative-indexer/indexer/cacher" + statetracker "github.com/initia-labs/core-indexer/informative-indexer/indexer/state-tracker" + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/mq" +) + +func (p *Processor) InitProcessor(height int64, cacher *cacher.Cacher) { + p.Height = height + p.Cacher = cacher + p.newModules = make(map[vmapi.ModuleInfoResponse]string) + p.moduleTransactions = make([]db.ModuleTransaction, 0) + p.newCollections = make(map[string]db.Collection) + p.collectionTransactions = make([]db.CollectionTransaction, 0) + p.newNfts = make(map[string]db.Nft) + p.mintedNftTransactions = make([]db.NftTransaction, 0) + p.burnedNftTransactions = make([]db.NftTransaction, 0) + p.objectOwners = make(map[string]string) + + p.modulePublishedEvents = make([]db.ModuleHistory, 0) + p.collectionMutationEvents = make([]db.CollectionMutationEvent, 0) + p.nftMutationEvents = make([]db.NftMutationEvent, 0) +} + +func (p *Processor) Name() string { + return "account" +} + +func (p *Processor) NewTxProcessor(txData *db.Transaction) { + p.txProcessor = &TxProcessor{ + txData: txData, + modulesInTx: make(map[vmapi.ModuleInfoResponse]bool), + nftsMap: make(map[string]string), + } +} + +// ProcessSDKMessages processes SDK transaction messages to identify entry points +func (p *Processor) ProcessSDKMessages(tx *mq.TxResult, encodingConfig *params.EncodingConfig) error { + if !tx.ExecTxResults.IsOK() { + return nil + } + + sdkTx, err := encodingConfig.TxConfig.TxDecoder()(tx.Tx) + if err != nil { + return fmt.Errorf("failed to decode SDK transaction: %w", err) + } + + for _, msg := range sdkTx.GetMsgs() { + p.handleMsg(msg, tx.ExecTxResults.IsOK()) + } + + return nil +} + +func (p *Processor) ProcessTransactionEvents(tx *mq.TxResult) error { + for _, event := range tx.ExecTxResults.Events { + if err := p.handleEvent(event); err != nil { + return fmt.Errorf("failed to handle tx event %s: %w", event.Type, err) + } + } + return nil +} + +func (p *Processor) ResolveTxProcessor() error { + // Update module transactions + for module, isEntry := range p.txProcessor.modulesInTx { + p.moduleTransactions = append(p.moduleTransactions, db.ModuleTransaction{ + IsEntry: isEntry, + BlockHeight: p.Height, + TxID: p.txProcessor.txData.ID, + ModuleID: db.GetModuleID(module), + }) + } + + return nil +} + +func (p *Processor) TrackState(stateUpdateManager *statetracker.StateUpdateManager, dbBatchInsert *statetracker.DBBatchInsert) error { + // Update modules state + for module, txID := range p.newModules { + stateUpdateManager.Modules[module] = &txID + } + + dbBatchInsert.ModuleTransactions = append(dbBatchInsert.ModuleTransactions, p.moduleTransactions...) + + // Update collections + for _, collection := range p.newCollections { + stateUpdateManager.CollectionsToUpdate[collection.ID] = true + dbBatchInsert.Collections[collection.ID] = collection + } + dbBatchInsert.CollectionTransactions = append(dbBatchInsert.CollectionTransactions, p.collectionTransactions...) + + // Update NFTs + for _, nft := range p.newNfts { + stateUpdateManager.NftsToUpdate[nft.ID] = true + dbBatchInsert.Nfts[nft.ID] = nft + } + dbBatchInsert.MintedNftTransactions = append(dbBatchInsert.MintedNftTransactions, p.mintedNftTransactions...) + + for _, nft := range p.burnedNftTransactions { + dbBatchInsert.BurnedNft[nft.NftID] = true + } + dbBatchInsert.BurnedNftTransactions = append(dbBatchInsert.BurnedNftTransactions, p.burnedNftTransactions...) + + // Update object transfers + for object, owner := range p.objectOwners { + dbBatchInsert.ObjectNewOwners[object] = owner + dbBatchInsert.TransferredNftTransactions = append( + dbBatchInsert.TransferredNftTransactions, + db.NewNftTransferTransaction(object, p.txProcessor.txData.ID, p.Height), + ) + } + + dbBatchInsert.ModulePublishedEvents = append(dbBatchInsert.ModulePublishedEvents, p.modulePublishedEvents...) + dbBatchInsert.CollectionMutationEvents = append(dbBatchInsert.CollectionMutationEvents, p.collectionMutationEvents...) + dbBatchInsert.NftMutationEvents = append(dbBatchInsert.NftMutationEvents, p.nftMutationEvents...) + + return nil +} diff --git a/informative-indexer/indexer/processors/move/tx_event.go b/informative-indexer/indexer/processors/move/tx_event.go new file mode 100644 index 00000000..0c89d2ce --- /dev/null +++ b/informative-indexer/indexer/processors/move/tx_event.go @@ -0,0 +1,232 @@ +package move + +import ( + "fmt" + + abci "github.com/cometbft/cometbft/abci/types" + movetypes "github.com/initia-labs/initia/x/move/types" + vmapi "github.com/initia-labs/movevm/api" + vmtypes "github.com/initia-labs/movevm/types" + + "github.com/initia-labs/core-indexer/informative-indexer/indexer/types" + "github.com/initia-labs/core-indexer/informative-indexer/indexer/utils" + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/parser" +) + +func (p *Processor) handleEvent(event abci.Event) error { + switch event.Type { + case movetypes.EventTypeExecute: + return p.handleMoveExecuteEvent(event) + case movetypes.EventTypeMove: + return p.handleMoveEvent(event) + default: + return nil + } +} + +// handleMoveExecuteEvent processes Move execution events, recording module executions +func (p *Processor) handleMoveExecuteEvent(event abci.Event) error { + moduleAddrs := make([]string, 0) + moduleNames := make([]string, 0) + + for _, attr := range event.Attributes { + switch attr.Key { + case movetypes.AttributeKeyModuleAddr: + moduleAddrs = append(moduleAddrs, attr.Value) + case movetypes.AttributeKeyModuleName: + moduleNames = append(moduleNames, attr.Value) + } + } + + for idx, moduleAddr := range moduleAddrs { + addr, err := vmtypes.NewAccountAddress(moduleAddr) + if err != nil { + return fmt.Errorf("invalid module address: %w", err) + } + p.txProcessor.modulesInTx[vmapi.ModuleInfoResponse{Address: addr, Name: moduleNames[idx]}] = false + } + return nil +} + +// handleMoveEvent processes Move-specific events, routing them to appropriate handlers +func (p *Processor) handleMoveEvent(event abci.Event) error { + if value, found := utils.FindAttribute(event.Attributes, movetypes.AttributeKeyTypeTag); found { + switch value { + case types.ModulePublishedEventKey: + return p.handlePublishEvent(event) + case types.CollectionCreateEventKey: + return p.handleCollectionCreateEvent(event) + case types.CollectionMutationEventKey: + return p.handleCollectionMutationEvent(event) + case types.CollectionMintEventKey: + return p.handleCollectionMintEvent(event) + case types.CollectionBurnEventKey: + return p.handleCollectionBurnEvent(event) + case types.NftCreateEventKey: + return p.handleNftCreateEvent(event) + case types.NftMutationEventKey: + return p.handleNftMutationEvent(event) + case types.ObjectCreateEventKey: + return p.handleObjectCreateEvent(event) + case types.ObjectTransferEventKey: + return p.handleObjectTransferEvent(event) + } + } + return nil +} + +// handlePublishEvent processes module publish events, recording new modules +func (p *Processor) handlePublishEvent(event abci.Event) error { + p.txProcessor.txData.IsMovePublish = true + if value, found := utils.FindAttribute(event.Attributes, movetypes.AttributeKeyData); found { + module, upgradePolicy, err := parser.DecodePublishModuleData(value) + if err != nil { + return fmt.Errorf("failed to decode publish module data: %w", err) + } + p.newModules[module] = p.txProcessor.txData.ID + p.modulePublishedEvents = append(p.modulePublishedEvents, db.ModuleHistory{ + ModuleID: db.GetModuleID(module), + BlockHeight: p.txProcessor.txData.BlockHeight, + Remark: db.JSON("{}"), + ProposalID: nil, + TxID: &p.txProcessor.txData.ID, + UpgradePolicy: db.GetUpgradePolicy(upgradePolicy), + }) + } + return nil +} + +// handleCollectionCreateEvent processes collection creation events +func (p *Processor) handleCollectionCreateEvent(event abci.Event) error { + return utils.HandleEventWithKey(event, movetypes.AttributeKeyData, &p.txProcessor.txData.IsCollectionCreate, func(e types.CollectCreateEvent) error { + p.newCollections[e.Collection] = db.Collection{ + ID: e.Collection, + Creator: e.Creator, + Name: e.Name, + BlockHeight: p.Height, + URI: e.URI, + Description: e.Description, + } + + p.collectionTransactions = append(p.collectionTransactions, db.CollectionTransaction{ + CollectionID: e.Collection, + IsCollectionCreate: true, + BlockHeight: p.Height, + TxID: p.txProcessor.txData.ID, + NftID: nil, + }) + return nil + }) +} + +// handleCollectionMintEvent processes NFT minting events +func (p *Processor) handleCollectionMintEvent(event abci.Event) error { + return utils.HandleEventWithKey(event, movetypes.AttributeKeyData, &p.txProcessor.txData.IsNftMint, func(e types.CollectionMintEvent) error { + p.newNfts[e.Nft] = db.Nft{ + TokenID: e.TokenID, + Remark: db.JSON("{}"), + ProposalID: nil, + TxID: &p.txProcessor.txData.ID, + ID: e.Nft, + Collection: e.Collection, + IsBurned: false, + Owner: p.objectOwners[e.Nft], + + // temporary fields + Description: "", + URI: "", + } + p.txProcessor.nftsMap[makeNftsMapKey(e.Collection, e.TokenID)] = e.Nft + + p.mintedNftTransactions = append(p.mintedNftTransactions, db.NewNftMintTransaction(e.Nft, p.txProcessor.txData.ID, p.Height)) + p.collectionTransactions = append(p.collectionTransactions, db.CollectionTransaction{ + CollectionID: e.Collection, + IsNftMint: true, + BlockHeight: p.Height, + TxID: p.txProcessor.txData.ID, + NftID: &e.Nft, + }) + return nil + }) +} + +func (p *Processor) handleCollectionBurnEvent(event abci.Event) error { + return utils.HandleEventWithKey(event, movetypes.AttributeKeyData, &p.txProcessor.txData.IsNftBurn, func(e types.CollectionBurnEvent) error { + p.burnedNftTransactions = append(p.burnedNftTransactions, db.NewNftBurnTransaction(e.Nft, p.txProcessor.txData.ID, p.Height)) + p.collectionTransactions = append(p.collectionTransactions, db.CollectionTransaction{ + CollectionID: e.Collection, + IsNftBurn: true, + BlockHeight: p.Height, + TxID: p.txProcessor.txData.ID, + NftID: &e.Nft, + }) + return nil + }) +} + +// handleCollectionMutationEvent processes collection mutation events +func (p *Processor) handleCollectionMutationEvent(event abci.Event) error { + return utils.HandleEventWithKey(event, movetypes.AttributeKeyData, nil, func(e types.CollectionMutationEvent) error { + p.collectionMutationEvents = append(p.collectionMutationEvents, db.CollectionMutationEvent{ + CollectionID: e.Collection, + MutatedFieldName: e.MutatedFieldName, + OldValue: e.OldValue, + NewValue: e.NewValue, + Remark: db.JSON("{}"), + TxID: p.txProcessor.txData.ID, + BlockHeight: p.Height, + }) + return nil + }) +} + +func (p *Processor) handleNftCreateEvent(event abci.Event) error { + return utils.HandleEventWithKey(event, movetypes.AttributeKeyData, nil, func(e types.NftCreateEvent) error { + key := makeNftsMapKey(e.Collection, e.TokenID) + nftAddress, ok := p.txProcessor.nftsMap[key] + if !ok { + return fmt.Errorf("cannot find nft in tx processor for key: %s", key) + } + + nft, ok := p.newNfts[nftAddress] + if !ok { + return fmt.Errorf("cannot find the nft mint event") + } + nft.Description = e.Description + nft.URI = e.URI + + p.newNfts[nftAddress] = nft + return nil + }) +} + +func (p *Processor) handleNftMutationEvent(event abci.Event) error { + return utils.HandleEventWithKey(event, movetypes.AttributeKeyData, nil, func(e types.NftMutationEvent) error { + p.nftMutationEvents = append(p.nftMutationEvents, db.NftMutationEvent{ + NftID: e.Nft, + MutatedFieldName: e.MutatedFieldName, + OldValue: e.OldValue, + NewValue: e.NewValue, + Remark: db.JSON("{}"), + TxID: p.txProcessor.txData.ID, + BlockHeight: p.Height, + }) + return nil + }) +} + +func (p *Processor) handleObjectCreateEvent(event abci.Event) error { + return utils.HandleEventWithKey(event, movetypes.AttributeKeyData, nil, func(e types.ObjectCreateEvent) error { + p.objectOwners[e.Object] = e.Owner + return nil + }) +} + +// handleObjectTransferEvent processes object transfer events +func (p *Processor) handleObjectTransferEvent(event abci.Event) error { + return utils.HandleEventWithKey(event, movetypes.AttributeKeyData, &p.txProcessor.txData.IsNftTransfer, func(e types.ObjectTransferEvent) error { + p.objectOwners[e.Object] = e.To + return nil + }) +} diff --git a/informative-indexer/indexer/processors/move/tx_msg.go b/informative-indexer/indexer/processors/move/tx_msg.go new file mode 100644 index 00000000..97efdd8f --- /dev/null +++ b/informative-indexer/indexer/processors/move/tx_msg.go @@ -0,0 +1,43 @@ +package move + +import ( + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" + movetypes "github.com/initia-labs/initia/x/move/types" + vmapi "github.com/initia-labs/movevm/api" + vmtypes "github.com/initia-labs/movevm/types" +) + +func (p *Processor) handleMsg(msg sdk.Msg, isTxOk bool) error { + switch msg := msg.(type) { + case *movetypes.MsgExecute: + p.txProcessor.txData.IsMoveExecute = true + if err := p.handleMoveExecuteEventIsEntry(msg.ModuleAddress, msg.ModuleName); err != nil && isTxOk { + return fmt.Errorf("failed to process MsgExecute: %w", err) + } + return nil + case *movetypes.MsgExecuteJSON: + p.txProcessor.txData.IsMoveExecute = true + if err := p.handleMoveExecuteEventIsEntry(msg.ModuleAddress, msg.ModuleName); err != nil && isTxOk { + return fmt.Errorf("failed to process MsgExecuteJSON: %w", err) + } + return nil + case *movetypes.MsgScript: + p.txProcessor.txData.IsMoveScript = true + return nil + default: + return nil + } +} + +// handleMoveExecuteEventIsEntry processes entry point execution events, +// marking modules as entry points when they are executed directly +func (p *Processor) handleMoveExecuteEventIsEntry(moduleAddress, moduleName string) error { + vmAddr, err := vmtypes.NewAccountAddress(moduleAddress) + if err != nil { + return fmt.Errorf("invalid module address: %w", err) + } + p.txProcessor.modulesInTx[vmapi.ModuleInfoResponse{Address: vmAddr, Name: moduleName}] = true + return nil +} diff --git a/informative-indexer/indexer/processors/move/types.go b/informative-indexer/indexer/processors/move/types.go new file mode 100644 index 00000000..9d6fd601 --- /dev/null +++ b/informative-indexer/indexer/processors/move/types.go @@ -0,0 +1,37 @@ +package move + +import ( + vmapi "github.com/initia-labs/movevm/api" + + "github.com/initia-labs/core-indexer/informative-indexer/indexer/processors" + "github.com/initia-labs/core-indexer/pkg/db" +) + +var _ processors.Processor = &Processor{} + +type TxProcessor struct { + txData *db.Transaction + // Event type flags - a transaction can have multiple event types + modulesInTx map[vmapi.ModuleInfoResponse]bool + // Mapping for collection_addr::token_id to object address + nftsMap map[string]string +} + +type Processor struct { + processors.BaseProcessor + // Event data collections + newModules map[vmapi.ModuleInfoResponse]string + moduleTransactions []db.ModuleTransaction + newCollections map[string]db.Collection + collectionTransactions []db.CollectionTransaction + newNfts map[string]db.Nft + mintedNftTransactions []db.NftTransaction + burnedNftTransactions []db.NftTransaction + objectOwners map[string]string + + modulePublishedEvents []db.ModuleHistory + collectionMutationEvents []db.CollectionMutationEvent + nftMutationEvents []db.NftMutationEvent + + txProcessor *TxProcessor +} diff --git a/informative-indexer/indexer/processors/move/utils.go b/informative-indexer/indexer/processors/move/utils.go new file mode 100644 index 00000000..c99549d6 --- /dev/null +++ b/informative-indexer/indexer/processors/move/utils.go @@ -0,0 +1,7 @@ +package move + +import "fmt" + +func makeNftsMapKey(collectionAddr, tokenId string) string { + return fmt.Sprintf("%s:%s", collectionAddr, tokenId) +} diff --git a/informative-indexer/indexer/processors/proposal/end_block_event.go b/informative-indexer/indexer/processors/proposal/end_block_event.go new file mode 100644 index 00000000..2f18c29c --- /dev/null +++ b/informative-indexer/indexer/processors/proposal/end_block_event.go @@ -0,0 +1,113 @@ +package proposal + +import ( + "fmt" + "time" + + abci "github.com/cometbft/cometbft/abci/types" + cosmosgovtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + movetypes "github.com/initia-labs/initia/x/move/types" + + "github.com/initia-labs/core-indexer/informative-indexer/indexer/types" + "github.com/initia-labs/core-indexer/informative-indexer/indexer/utils" + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/parser" + govtypes "github.com/initia-labs/initia/x/gov/types" +) + +// handleEvent routes events to appropriate handlers based on event type +func (p *Processor) handleEndBlockEvent(event abci.Event) error { + switch event.Type { + case cosmosgovtypes.EventTypeInactiveProposal: + return p.handleProposalEndblockEvent(event) + case cosmosgovtypes.EventTypeActiveProposal: + return p.handleProposalEndblockEvent(event) + case govtypes.EventTypeEmergencyProposal: + return p.handleEmergencyProposalEvent(event) + case movetypes.EventTypeMove: + return p.handleMoveEvent(event) + default: + return nil + } +} + +func (p *Processor) handleProposalEndblockEvent(event abci.Event) error { + if value, found := utils.FindAttribute(event.Attributes, cosmosgovtypes.AttributeKeyProposalID); found { + proposalID, err := parser.ParseInt32(value) + if err != nil { + return fmt.Errorf("failed to parse proposal id: %w", err) + } + + if value, found := utils.FindAttribute(event.Attributes, cosmosgovtypes.AttributeKeyProposalResult); found { + if utils.IsExpeditedRejected(value) { + p.proposalStatusChanges[proposalID] = db.ProposalStatusVotingPeriod + } else { + result, err := utils.ParseProposalEndBlockAttributeValue(value) + if err != nil { + return fmt.Errorf("failed to parse proposal result: %w", err) + } + // TODO: refactor this + for idx := len(p.modulePublishedEvents) - 1; idx >= 0; idx-- { + if p.modulePublishedEvents[idx].ProposalID == nil { + p.modulePublishedEvents[idx].ProposalID = &proposalID + p.moduleProposals = append(p.moduleProposals, db.ModuleProposal{ + ProposalID: proposalID, + ModuleID: p.modulePublishedEvents[idx].ModuleID, + }) + } else { + break + } + } + p.proposalStatusChanges[proposalID] = result + } + } + } + return nil +} + +func (p *Processor) handleEmergencyProposalEvent(event abci.Event) error { + if value, found := utils.FindAttribute(event.Attributes, govtypes.AttributeKeyProposalID); found { + proposalID, err := parser.ParseInt32(value) + if err != nil { + return fmt.Errorf("failed to parse proposal id: %w", err) + } + + // TODO: bump initia version and replace with `govtypes.AttributeKeyNextTallyTime` + if value, found := utils.FindAttribute(event.Attributes, "next_tally_time"); found { + nextTallyTime, err := time.Parse(time.RFC3339, value) + if err != nil { + return fmt.Errorf("failed to parse emergency next tally time: %w", err) + } + p.proposalEmergencyNextTally[proposalID] = &nextTallyTime + } + } + return nil +} + +func (p *Processor) handleMoveEvent(event abci.Event) error { + if value, found := utils.FindAttribute(event.Attributes, movetypes.AttributeKeyTypeTag); found { + switch value { + case types.ModulePublishedEventKey: + return p.handlePublishEvent(event) + } + } + return nil +} + +// handlePublishEvent processes module publish events, recording new modules +func (p *Processor) handlePublishEvent(event abci.Event) error { + if value, found := utils.FindAttribute(event.Attributes, movetypes.AttributeKeyData); found { + module, upgradePolicy, err := parser.DecodePublishModuleData(value) + if err != nil { + return fmt.Errorf("failed to decode publish module data: %w", err) + } + p.newModules[module] = true + p.modulePublishedEvents = append(p.modulePublishedEvents, db.ModuleHistory{ + ModuleID: db.GetModuleID(module), + Remark: db.JSON("{}"), + BlockHeight: p.Height, + UpgradePolicy: db.GetUpgradePolicy(upgradePolicy), + }) + } + return nil +} diff --git a/informative-indexer/indexer/processors/proposal/processor.go b/informative-indexer/indexer/processors/proposal/processor.go new file mode 100644 index 00000000..2956b389 --- /dev/null +++ b/informative-indexer/indexer/processors/proposal/processor.go @@ -0,0 +1,85 @@ +package proposal + +import ( + "fmt" + "maps" + "time" + + abci "github.com/cometbft/cometbft/abci/types" + sdk "github.com/cosmos/cosmos-sdk/types" + vmapi "github.com/initia-labs/movevm/api" + + "github.com/initia-labs/core-indexer/informative-indexer/indexer/cacher" + statetracker "github.com/initia-labs/core-indexer/informative-indexer/indexer/state-tracker" + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/mq" +) + +func (p *Processor) InitProcessor(height int64, cacher *cacher.Cacher) { + p.Height = height + p.Cacher = cacher + p.newProposals = make(map[int32]string) + p.proposalStatusChanges = make(map[int32]db.ProposalStatus) + p.proposalDeposits = make([]db.ProposalDeposit, 0) + p.totalDepositChanges = make(map[int32][]sdk.Coin) + p.proposalVotes = make([]db.ProposalVote, 0) + p.proposalEmergencyNextTally = make(map[int32]*time.Time) + p.modulePublishedEvents = make([]db.ModuleHistory, 0) + p.moduleProposals = make([]db.ModuleProposal, 0) + p.newModules = make(map[vmapi.ModuleInfoResponse]bool) + + p.txProcessor = nil +} + +func (p *Processor) Name() string { + return "proposal" +} + +func (p *Processor) ProcessEndBlockEvents(finalizeBlockEvents *[]abci.Event) error { + for _, event := range *finalizeBlockEvents { + if err := p.handleEndBlockEvent(event); err != nil { + return fmt.Errorf("failed to handle end block event %s: %w", event.Type, err) + } + } + return nil +} + +func (p *Processor) NewTxProcessor(txData *db.Transaction) { + p.txProcessor = &TxProcessor{ + txData: txData, + } +} + +func (p *Processor) ProcessTransactionEvents(tx *mq.TxResult) error { + for _, event := range tx.ExecTxResults.Events { + if err := p.handleEvent(event); err != nil { + return fmt.Errorf("failed to handle tx event %s: %w", event.Type, err) + } + } + return nil +} + +func (p *Processor) TrackState(stateUpdateManager *statetracker.StateUpdateManager, dbBatchInsert *statetracker.DBBatchInsert) error { + // Update proposals + maps.Copy(stateUpdateManager.ProposalsToUpdate, p.newProposals) + + dbBatchInsert.ProposalDeposits = p.proposalDeposits + dbBatchInsert.TotalDepositChanges = p.totalDepositChanges + + dbBatchInsert.ProposalVotes = p.proposalVotes + + for proposalID, status := range p.proposalStatusChanges { + stateUpdateManager.ProposalStatusChanges[proposalID] = status + } + + maps.Copy(dbBatchInsert.ProposalEmergencyNextTally, p.proposalEmergencyNextTally) + + dbBatchInsert.ModulePublishedEvents = append(dbBatchInsert.ModulePublishedEvents, p.modulePublishedEvents...) + + for module := range p.newModules { + stateUpdateManager.Modules[module] = nil + } + + dbBatchInsert.ModuleProposals = append(dbBatchInsert.ModuleProposals, p.moduleProposals...) + return nil +} diff --git a/informative-indexer/indexer/processors/proposal/tx_event.go b/informative-indexer/indexer/processors/proposal/tx_event.go new file mode 100644 index 00000000..684244ae --- /dev/null +++ b/informative-indexer/indexer/processors/proposal/tx_event.go @@ -0,0 +1,160 @@ +package proposal + +import ( + "encoding/json" + "fmt" + "strconv" + + abci "github.com/cometbft/cometbft/abci/types" + sdk "github.com/cosmos/cosmos-sdk/types" + cosmosgovtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + govv1types "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + + "github.com/initia-labs/core-indexer/informative-indexer/indexer/utils" + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/parser" +) + +// handleEvent routes events to appropriate handlers based on event type +func (p *Processor) handleEvent(event abci.Event) error { + switch event.Type { + case cosmosgovtypes.EventTypeSubmitProposal: + return p.handleSubmitProposalEvent(event) + case cosmosgovtypes.EventTypeProposalDeposit: + return p.handleProposalDepositEvent(event) + case cosmosgovtypes.EventTypeCancelProposal: + return p.handleCancelProposalEvent(event) + case cosmosgovtypes.EventTypeProposalVote: + return p.handleProposalVoteEvent(event) + default: + return nil + } +} + +// handleEvent routes events to appropriate handlers based on event type +func (p *Processor) handleSubmitProposalEvent(event abci.Event) error { + if value, found := utils.FindAttribute(event.Attributes, cosmosgovtypes.AttributeKeyProposalID); found { + proposalID, err := parser.ParseInt32(value) + if err != nil { + return fmt.Errorf("failed to parse proposal id: %w", err) + } + p.newProposals[proposalID] = p.txProcessor.txData.ID + } + return nil +} + +func (p *Processor) handleProposalDepositEvent(event abci.Event) error { + if value, found := utils.FindAttribute(event.Attributes, cosmosgovtypes.AttributeKeyVotingPeriodStart); found { + proposalID, err := parser.ParseInt32(value) + if err != nil { + return fmt.Errorf("failed to parse proposal id: %w", err) + } + p.proposalStatusChanges[proposalID] = db.ProposalStatusVotingPeriod + } else { + value, found := utils.FindAttribute(event.Attributes, cosmosgovtypes.AttributeKeyProposalID) + if !found { + return fmt.Errorf("failed to filter proposal id") + } + + proposalID, err := parser.ParseInt32(value) + if err != nil { + return fmt.Errorf("failed to parse proposal id: %w", err) + } + + depositor, found := utils.FindAttribute(event.Attributes, cosmosgovtypes.AttributeKeyDepositor) + if !found { + return fmt.Errorf("failed to filter depositor") + } + + amount, found := utils.FindAttribute(event.Attributes, sdk.AttributeKeyAmount) + if !found { + return fmt.Errorf("failed to filter amount") + } + + coins, err := sdk.ParseCoinsNormalized(amount) + if err != nil { + return fmt.Errorf("failed to parse amount: %w", err) + } + + coinsJSON, err := json.Marshal(coins) + if err != nil { + return fmt.Errorf("failed to marshal coins to JSON: %w", err) + } + + p.proposalDeposits = append(p.proposalDeposits, db.ProposalDeposit{ + Depositor: depositor, + Amount: db.JSON(coinsJSON), + ProposalID: proposalID, + TransactionID: p.txProcessor.txData.ID, + }) + + p.totalDepositChanges[proposalID] = append(p.totalDepositChanges[proposalID], coins...) + } + return nil +} + +func (p *Processor) handleCancelProposalEvent(event abci.Event) error { + if value, found := utils.FindAttribute(event.Attributes, cosmosgovtypes.AttributeKeyProposalID); found { + proposalID, err := parser.ParseInt32(value) + if err != nil { + return fmt.Errorf("failed to parse proposal id: %w", err) + } + p.proposalStatusChanges[proposalID] = db.ProposalStatusCancelled + } + return nil +} + +func (p *Processor) handleProposalVoteEvent(event abci.Event) error { + value, found := utils.FindAttribute(event.Attributes, cosmosgovtypes.AttributeKeyProposalID) + if !found { + return fmt.Errorf("failed to filter proposal id") + } + + proposalID, err := parser.ParseInt32(value) + if err != nil { + return fmt.Errorf("failed to parse proposal id: %w", err) + } + + voter, found := utils.FindAttribute(event.Attributes, cosmosgovtypes.AttributeKeyVoter) + if !found { + return fmt.Errorf("failed to filter voter") + } + + value, found = utils.FindAttribute(event.Attributes, cosmosgovtypes.AttributeKeyOption) + if !found { + return fmt.Errorf("failed to filter option") + } + + options, err := parser.DecodeEvent[govv1types.WeightedVoteOptions](value) + if err != nil { + return fmt.Errorf("failed to decode option: %w", err) + } + + votes := map[govv1types.VoteOption]string{ + govv1types.OptionYes: "0", + govv1types.OptionAbstain: "0", + govv1types.OptionNo: "0", + govv1types.OptionNoWithVeto: "0", + } + for _, option := range options { + votes[option.GetOption()] = option.GetWeight() + } + + yesVote, _ := strconv.ParseFloat(votes[govv1types.OptionYes], 64) + noVote, _ := strconv.ParseFloat(votes[govv1types.OptionNo], 64) + abstainVote, _ := strconv.ParseFloat(votes[govv1types.OptionAbstain], 64) + noWithVetoVote, _ := strconv.ParseFloat(votes[govv1types.OptionNoWithVeto], 64) + + p.proposalVotes = append(p.proposalVotes, db.ProposalVote{ + Voter: voter, + ProposalID: proposalID, + TransactionID: p.txProcessor.txData.ID, + IsVoteWeighted: len(options) > 1, + IsValidator: false, + Yes: yesVote, + No: noVote, + Abstain: abstainVote, + NoWithVeto: noWithVetoVote, + }) + return nil +} diff --git a/informative-indexer/indexer/processors/proposal/tx_event_test.go b/informative-indexer/indexer/processors/proposal/tx_event_test.go new file mode 100644 index 00000000..59497663 --- /dev/null +++ b/informative-indexer/indexer/processors/proposal/tx_event_test.go @@ -0,0 +1,237 @@ +package proposal + +import ( + "encoding/json" + "fmt" + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/initia-labs/core-indexer/pkg/db" +) + +// TestCoinsJSONMarshaling verifies that sdk.Coins marshals to the expected JSON format +// This test ensures the fix for proposal deposit amount serialization works correctly +func TestCoinsJSONMarshaling(t *testing.T) { + tests := []struct { + name string + amountStr string + expectedJSON string + shouldError bool + }{ + { + name: "single coin", + amountStr: "1000uinit", + expectedJSON: `[{"denom":"uinit","amount":"1000"}]`, + shouldError: false, + }, + { + name: "multiple coins", + amountStr: "1000uinit,500uusdc", + expectedJSON: `[{"denom":"uinit","amount":"1000"},{"denom":"uusdc","amount":"500"}]`, + shouldError: false, + }, + { + name: "large amount", + amountStr: "999999999999999999uinit", + expectedJSON: `[{"denom":"uinit","amount":"999999999999999999"}]`, + shouldError: false, + }, + { + name: "zero amount", + amountStr: "0uinit", + expectedJSON: `[]`, // SDK normalizes empty coins to empty array + shouldError: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Parse coins like the actual code does + coins, err := sdk.ParseCoinsNormalized(tt.amountStr) + if tt.shouldError { + if err == nil { + t.Errorf("expected error but got none") + } + return + } + if err != nil { + t.Fatalf("failed to parse coins: %v", err) + } + + // Marshal to JSON like the actual code does + coinsJSON, err := json.Marshal(coins) + if err != nil { + t.Fatalf("failed to marshal coins to JSON: %v", err) + } + + // Convert to db.JSON type + dbJSON := db.JSON(coinsJSON) + + // Verify the JSON matches expected format + if string(dbJSON) != tt.expectedJSON { + t.Errorf("JSON mismatch:\nGot: %s\nExpected: %s", string(dbJSON), tt.expectedJSON) + } + + // Verify it's valid JSON by unmarshaling + var coins2 sdk.Coins + if err := json.Unmarshal([]byte(dbJSON), &coins2); err != nil { + t.Errorf("produced invalid JSON: %v", err) + } + + // Verify the unmarshaled coins match the original (for non-zero amounts) + if tt.amountStr != "0uinit" && !coins.Equal(coins2) { + t.Errorf("coins mismatch after round-trip:\nOriginal: %s\nAfter: %s", coins, coins2) + } + }) + } +} + +// TestOldVsNewImplementation compares the old broken implementation with the new fix +// This demonstrates why the old code was broken +func TestOldVsNewImplementation(t *testing.T) { + amountStr := "1000uinit" + + // Parse coins + coins, err := sdk.ParseCoinsNormalized(amountStr) + if err != nil { + t.Fatalf("failed to parse coins: %v", err) + } + + // NEW implementation (correct) + newCoinsJSON, err := json.Marshal(coins) + if err != nil { + t.Fatalf("failed to marshal coins: %v", err) + } + newResult := db.JSON(newCoinsJSON) + + t.Logf("NEW implementation result: %s", string(newResult)) + + // Verify new implementation produces valid JSON + var testCoins sdk.Coins + if err := json.Unmarshal([]byte(newResult), &testCoins); err != nil { + t.Errorf("NEW implementation produced invalid JSON: %v", err) + } + + // Verify the structure + expectedJSON := `[{"denom":"uinit","amount":"1000"}]` + if string(newResult) != expectedJSON { + t.Errorf("NEW implementation JSON mismatch:\nGot: %s\nExpected: %s", string(newResult), expectedJSON) + } +} + +// TestCompareOldAndNewDBJSON directly compares db.JSON() results from old vs new implementation +// This test shows the actual difference between the broken and fixed code +func TestCompareOldAndNewDBJSON(t *testing.T) { + tests := []struct { + name string + amountStr string + }{ + { + name: "single coin", + amountStr: "1000uinit", + }, + { + name: "multiple coins", + amountStr: "1000uinit,500uusdc", + }, + { + name: "large amount", + amountStr: "123456789012345678uinit", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Parse the amount string + coins, err := sdk.ParseCoinsNormalized(tt.amountStr) + if err != nil { + t.Fatalf("failed to parse coins: %v", err) + } + + // OLD implementation - simulates what the broken code was trying to do + // Note: The original code had undefined variables and could only handle single coins + var oldResult db.JSON + if len(coins) > 0 { + coin := coins[0] + oldResult = db.JSON(fmt.Sprintf(`[{"denom":"%s","amount":"%d"}]`, coin.Denom, coin.Amount.Int64())) + } + + // NEW implementation (CORRECT) - this is what we fixed it to + newCoinsJSON, err := json.Marshal(coins) + if err != nil { + t.Fatalf("failed to marshal coins: %v", err) + } + newResult := db.JSON(newCoinsJSON) + + // Direct comparison of db.JSON byte slices + // For single coin case, they should have the same format + if len(coins) == 1 && string(oldResult) != string(newResult) { + t.Errorf("Expected OLD and NEW to have the same format, but they differ:\n OLD: %s\n NEW: %s", string(oldResult), string(newResult)) + } + + // Verify both OLD and NEW produce valid JSON that unmarshals to same coin values + var coinsFromOld, coinsFromNew sdk.Coins + + if err := json.Unmarshal(oldResult, &coinsFromOld); err != nil { + t.Errorf("OLD implementation produced invalid JSON: %v", err) + } + + if err := json.Unmarshal(newResult, &coinsFromNew); err != nil { + t.Errorf("NEW implementation produced invalid JSON: %v", err) + } + + // For single coin case, both should produce equivalent coin values + if len(coins) == 1 && !coinsFromOld.Equal(coinsFromNew) { + t.Errorf("Coin values differ:\n OLD JSON: %s -> %s\n NEW JSON: %s -> %s", + string(oldResult), coinsFromOld, string(newResult), coinsFromNew) + } + + // Verify NEW implementation preserves all coin values correctly + if !coins.Equal(coinsFromNew) { + t.Errorf("NEW implementation doesn't preserve coin values:\n Expected: %s\n Got: %s\n JSON: %s", + coins, coinsFromNew, string(newResult)) + } + }) + } +} + +// TestDBJSONValue verifies that db.JSON.Value() works correctly +func TestDBJSONValue(t *testing.T) { + amountStr := "1000uinit,500uusdc" + + coins, err := sdk.ParseCoinsNormalized(amountStr) + if err != nil { + t.Fatalf("failed to parse coins: %v", err) + } + + coinsJSON, err := json.Marshal(coins) + if err != nil { + t.Fatalf("failed to marshal coins: %v", err) + } + + dbJSON := db.JSON(coinsJSON) + + // Test the Value() method that's used when saving to database + value, err := dbJSON.Value() + if err != nil { + t.Fatalf("db.JSON.Value() failed: %v", err) + } + + t.Logf("db.JSON.Value() result: %s", value) + + // Verify it's valid JSON bytes + jsonBytes, ok := value.([]byte) + if !ok { + t.Errorf("Value() did not return []byte, got %T", value) + } + + // Verify we can unmarshal it + var coins2 sdk.Coins + if err := json.Unmarshal(jsonBytes, &coins2); err != nil { + t.Errorf("Value() produced invalid JSON: %v", err) + } + + if !coins.Equal(coins2) { + t.Errorf("coins mismatch after Value() round-trip:\nOriginal: %s\nAfter: %s", coins, coins2) + } +} diff --git a/informative-indexer/indexer/processors/proposal/types.go b/informative-indexer/indexer/processors/proposal/types.go new file mode 100644 index 00000000..17c16601 --- /dev/null +++ b/informative-indexer/indexer/processors/proposal/types.go @@ -0,0 +1,32 @@ +package proposal + +import ( + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" + vmapi "github.com/initia-labs/movevm/api" + + "github.com/initia-labs/core-indexer/informative-indexer/indexer/processors" + "github.com/initia-labs/core-indexer/pkg/db" +) + +var _ processors.Processor = &Processor{} + +type TxProcessor struct { + txData *db.Transaction +} + +type Processor struct { + processors.BaseProcessor + newProposals map[int32]string + proposalStatusChanges map[int32]db.ProposalStatus + proposalDeposits []db.ProposalDeposit + totalDepositChanges map[int32][]sdk.Coin + proposalVotes []db.ProposalVote + proposalEmergencyNextTally map[int32]*time.Time + modulePublishedEvents []db.ModuleHistory + moduleProposals []db.ModuleProposal + newModules map[vmapi.ModuleInfoResponse]bool + + txProcessor *TxProcessor +} diff --git a/informative-indexer/indexer/processors/types.go b/informative-indexer/indexer/processors/types.go new file mode 100644 index 00000000..2e1d1209 --- /dev/null +++ b/informative-indexer/indexer/processors/types.go @@ -0,0 +1,66 @@ +package processors + +import ( + abci "github.com/cometbft/cometbft/abci/types" + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/mq" + "github.com/initia-labs/initia/app/params" + + "github.com/initia-labs/core-indexer/informative-indexer/indexer/cacher" + statetracker "github.com/initia-labs/core-indexer/informative-indexer/indexer/state-tracker" +) + +type Processor interface { + InitProcessor(height int64, cacher *cacher.Cacher) + Name() string + ProcessBeginBlockEvents(finalizeBlockEvents *[]abci.Event) error + ProcessEndBlockEvents(finalizeBlockEvents *[]abci.Event) error + NewTxProcessor(txData *db.Transaction) + ProcessSDKMessages(tx *mq.TxResult, encodingConfig *params.EncodingConfig) error + ProcessTransactionEvents(tx *mq.TxResult) error + ResolveTxProcessor() error + TrackState(stateUpdateManager *statetracker.StateUpdateManager, dbBatchInsert *statetracker.DBBatchInsert) error +} + +var _ Processor = &BaseProcessor{} + +type BaseProcessor struct { + Height int64 + Cacher *cacher.Cacher +} + +func (p *BaseProcessor) InitProcessor(height int64, cacher *cacher.Cacher) { + p.Height = height + p.Cacher = cacher +} + +func (p *BaseProcessor) Name() string { + return "base" +} + +func (p *BaseProcessor) ProcessBeginBlockEvents(finalizeBlockEvents *[]abci.Event) error { + return nil +} + +func (p *BaseProcessor) ProcessEndBlockEvents(finalizeBlockEvents *[]abci.Event) error { + return nil +} + +func (p *BaseProcessor) NewTxProcessor(txData *db.Transaction) { +} + +func (p *BaseProcessor) ProcessSDKMessages(tx *mq.TxResult, encodingConfig *params.EncodingConfig) error { + return nil +} + +func (p *BaseProcessor) ProcessTransactionEvents(tx *mq.TxResult) error { + return nil +} + +func (p *BaseProcessor) ResolveTxProcessor() error { + return nil +} + +func (p *BaseProcessor) TrackState(stateUpdateManager *statetracker.StateUpdateManager, dbBatchInsert *statetracker.DBBatchInsert) error { + return nil +} diff --git a/informative-indexer/indexer/processors/validator/begin_block_event.go b/informative-indexer/indexer/processors/validator/begin_block_event.go new file mode 100644 index 00000000..d7cf0c7a --- /dev/null +++ b/informative-indexer/indexer/processors/validator/begin_block_event.go @@ -0,0 +1,38 @@ +package validator + +import ( + "fmt" + + abci "github.com/cometbft/cometbft/abci/types" + slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" + + "github.com/initia-labs/core-indexer/informative-indexer/indexer/utils" + "github.com/initia-labs/core-indexer/pkg/db" +) + +// handleEvent routes events to appropriate handlers based on event type +func (p *Processor) handleBeginBlockEvent(event abci.Event) error { + switch event.Type { + case slashingtypes.EventTypeSlash: + return p.handleSlashEvent(event) + default: + return nil + } +} + +func (p *Processor) handleSlashEvent(event abci.Event) error { + if value, found := utils.FindAttribute(event.Attributes, slashingtypes.AttributeKeyJailed); found { + validator, ok := p.Cacher.GetValidatorByConsAddr(value) + if !ok { + return fmt.Errorf("failed to map validator address: %s", value) + } + + p.validators[validator.OperatorAddress] = true + p.slashEvents = append(p.slashEvents, db.ValidatorSlashEvent{ + ValidatorAddress: validator.OperatorAddress, + BlockHeight: p.Height, + Type: string(db.Jailed), + }) + } + return nil +} diff --git a/informative-indexer/indexer/processors/validator/processor.go b/informative-indexer/indexer/processors/validator/processor.go new file mode 100644 index 00000000..d2e65af5 --- /dev/null +++ b/informative-indexer/indexer/processors/validator/processor.go @@ -0,0 +1,89 @@ +package validator + +import ( + "fmt" + + abci "github.com/cometbft/cometbft/abci/types" + "github.com/initia-labs/initia/app/params" + + "github.com/initia-labs/core-indexer/informative-indexer/indexer/cacher" + statetracker "github.com/initia-labs/core-indexer/informative-indexer/indexer/state-tracker" + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/mq" +) + +func (p *Processor) InitProcessor(height int64, cacher *cacher.Cacher) { + p.Height = height + p.Cacher = cacher + p.stakeChanges = make([]db.ValidatorBondedTokenChange, 0) + p.validators = make(map[string]bool) + p.slashEvents = make([]db.ValidatorSlashEvent, 0) + + p.txProcessor = nil +} + +func (p *Processor) Name() string { + return "validator" +} + +func (p *Processor) ProcessBeginBlockEvents(finalizeBlockEvents *[]abci.Event) error { + for _, event := range *finalizeBlockEvents { + if err := p.handleBeginBlockEvent(event); err != nil { + return fmt.Errorf("failed to handle begin block event %s: %w", event.Type, err) + } + } + return nil +} + +func (p *Processor) NewTxProcessor(txData *db.Transaction) { + p.txProcessor = &TxProcessor{ + txData: txData, + txStakeChanges: make(map[string]int64), + } +} + +// ProcessSDKMessages processes SDK transaction messages to identify entry points +func (p *Processor) ProcessSDKMessages(tx *mq.TxResult, encodingConfig *params.EncodingConfig) error { + if !tx.ExecTxResults.IsOK() { + return nil + } + + sdkTx, err := encodingConfig.TxConfig.TxDecoder()(tx.Tx) + if err != nil { + return fmt.Errorf("failed to decode SDK transaction: %w", err) + } + + for _, msg := range sdkTx.GetMsgs() { + p.handleMsg(msg) + } + + return nil +} + +func (p *Processor) ProcessTransactionEvents(tx *mq.TxResult) error { + for _, event := range tx.ExecTxResults.Events { + if err := p.handleEvent(event); err != nil { + return fmt.Errorf("failed to handle tx event %s: %w", event.Type, err) + } + } + return nil +} + +func (p *Processor) ResolveTxProcessor() error { + processedStakeChanges, err := processStakeChanges(p.txProcessor.txStakeChanges, p.txProcessor.txData.ID, p.Height) + if err != nil { + return fmt.Errorf("failed to get stake changes: %w", err) + } + p.stakeChanges = append(p.stakeChanges, processedStakeChanges...) + return nil +} + +func (p *Processor) TrackState(stateUpdateManager *statetracker.StateUpdateManager, dbBatchInsert *statetracker.DBBatchInsert) error { + for addr := range p.validators { + stateUpdateManager.Validators[addr] = true + } + dbBatchInsert.AddValidatorBondedTokenTxs(p.stakeChanges...) + dbBatchInsert.AddValidatorSlashEvents(p.slashEvents...) + + return nil +} diff --git a/informative-indexer/indexer/processors/validator/tx_event.go b/informative-indexer/indexer/processors/validator/tx_event.go new file mode 100644 index 00000000..0228441c --- /dev/null +++ b/informative-indexer/indexer/processors/validator/tx_event.go @@ -0,0 +1,114 @@ +package validator + +import ( + "fmt" + "strings" + + abci "github.com/cometbft/cometbft/abci/types" + sdk "github.com/cosmos/cosmos-sdk/types" + mstakingtypes "github.com/initia-labs/initia/x/mstaking/types" + + "github.com/initia-labs/core-indexer/informative-indexer/indexer/utils" +) + +func (p *Processor) handleEvent(event abci.Event) error { + switch event.Type { + case mstakingtypes.EventTypeCreateValidator: + return p.handleValidatorEvent(event) + case mstakingtypes.EventTypeDelegate: + return p.handleDelegateEvent(event) + case mstakingtypes.EventTypeUnbond: + return p.handleUnbondEvent(event) + case mstakingtypes.EventTypeRedelegate: + return p.handleRedelegateEvent(event) + default: + return nil + } +} + +func (p *Processor) handleValidatorEvent(event abci.Event) error { + if value, found := utils.FindAttribute(event.Attributes, mstakingtypes.AttributeKeyValidator); found { + p.validators[value] = true + } + return nil +} + +func (p *Processor) handleDelegateEvent(event abci.Event) error { + valAddr, amount, err := extractValidatorAndAmount(event) + if err != nil { + return fmt.Errorf("failed to extract validator and amount: %w", err) + } + p.validators[valAddr] = true + if valAddr != "" && amount != "" { + coins, err := sdk.ParseCoinsNormalized(amount) + if err != nil { + return fmt.Errorf("failed to parse amount: %w", err) + } + for _, coin := range coins { + p.updateTxStakeChange(valAddr, coin.Denom, coin.Amount.Int64()) + } + } + return nil +} + +func (p *Processor) handleUnbondEvent(event abci.Event) error { + valAddr, amount, err := extractValidatorAndAmount(event) + if err != nil { + return fmt.Errorf("failed to extract validator and amount: %w", err) + } + p.validators[valAddr] = true + if valAddr != "" && amount != "" { + coins, err := sdk.ParseCoinsNormalized(amount) + if err != nil { + return fmt.Errorf("failed to parse amount: %w", err) + } + for _, coin := range coins { + p.updateTxStakeChange(valAddr, coin.Denom, -coin.Amount.Int64()) + } + } + return nil +} + +func (p *Processor) handleRedelegateEvent(event abci.Event) error { + srcValAddr, found := utils.FindAttribute(event.Attributes, mstakingtypes.AttributeKeySrcValidator) + if !found { + return fmt.Errorf("failed to find src validator address in %s", event.Type) + } + dstValAddr, found := utils.FindAttribute(event.Attributes, mstakingtypes.AttributeKeyDstValidator) + if !found { + return fmt.Errorf("failed to find dst validator address in %s", event.Type) + } + + amount, found := utils.FindAttribute(event.Attributes, sdk.AttributeKeyAmount) + if !found { + return fmt.Errorf("failed to find amount in %s", event.Type) + } + + for _, attr := range event.Attributes { + switch attr.Key { + case mstakingtypes.AttributeKeySrcValidator: + srcValAddr = strings.ToLower(attr.Value) + case mstakingtypes.AttributeKeyDstValidator: + dstValAddr = strings.ToLower(attr.Value) + case sdk.AttributeKeyAmount: + amount = attr.Value + } + } + + if srcValAddr != "" && dstValAddr != "" && amount != "" { + coins, err := sdk.ParseCoinsNormalized(amount) + if err != nil { + return fmt.Errorf("failed to parse amount: %w", err) + } + for _, coin := range coins { + p.updateTxStakeChange(srcValAddr, coin.Denom, -coin.Amount.Int64()) + p.updateTxStakeChange(dstValAddr, coin.Denom, coin.Amount.Int64()) + } + } + return nil +} + +func (p *Processor) updateTxStakeChange(validatorAddr, denom string, amount int64) { + key := fmt.Sprintf("%s.%s", validatorAddr, denom) + p.txProcessor.txStakeChanges[key] += amount +} diff --git a/informative-indexer/indexer/processors/validator/tx_msg.go b/informative-indexer/indexer/processors/validator/tx_msg.go new file mode 100644 index 00000000..b1e66011 --- /dev/null +++ b/informative-indexer/indexer/processors/validator/tx_msg.go @@ -0,0 +1,20 @@ +package validator + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" + + "github.com/initia-labs/core-indexer/pkg/db" +) + +func (p *Processor) handleMsg(msg sdk.Msg) { + switch msg := msg.(type) { + case *slashingtypes.MsgUnjail: + p.validators[msg.ValidatorAddr] = true + p.slashEvents = append(p.slashEvents, db.ValidatorSlashEvent{ + ValidatorAddress: msg.ValidatorAddr, + BlockHeight: p.Height, + Type: string(db.Unjailed), + }) + } +} diff --git a/informative-indexer/indexer/processors/validator/types.go b/informative-indexer/indexer/processors/validator/types.go new file mode 100644 index 00000000..fe40481d --- /dev/null +++ b/informative-indexer/indexer/processors/validator/types.go @@ -0,0 +1,22 @@ +package validator + +import ( + "github.com/initia-labs/core-indexer/informative-indexer/indexer/processors" + "github.com/initia-labs/core-indexer/pkg/db" +) + +var _ processors.Processor = &Processor{} + +type TxProcessor struct { + txData *db.Transaction + txStakeChanges map[string]int64 +} + +type Processor struct { + processors.BaseProcessor + stakeChanges []db.ValidatorBondedTokenChange + validators map[string]bool + slashEvents []db.ValidatorSlashEvent + + txProcessor *TxProcessor +} diff --git a/informative-indexer/indexer/processors/validator/utils.go b/informative-indexer/indexer/processors/validator/utils.go new file mode 100644 index 00000000..73ca96b4 --- /dev/null +++ b/informative-indexer/indexer/processors/validator/utils.go @@ -0,0 +1,66 @@ +package validator + +import ( + "encoding/json" + "fmt" + "strings" + + abci "github.com/cometbft/cometbft/abci/types" + sdk "github.com/cosmos/cosmos-sdk/types" + mstakingtypes "github.com/initia-labs/initia/x/mstaking/types" + + "github.com/initia-labs/core-indexer/informative-indexer/indexer/utils" + "github.com/initia-labs/core-indexer/pkg/db" +) + +func extractValidatorAndAmount(event abci.Event) (string, string, error) { + valAddr, found := utils.FindAttribute(event.Attributes, mstakingtypes.AttributeKeyValidator) + if !found { + return "", "", fmt.Errorf("failed to find validator address in %s", event.Type) + } + amount, found := utils.FindAttribute(event.Attributes, sdk.AttributeKeyAmount) + if !found { + return "", "", fmt.Errorf("failed to find amount in %s", event.Type) + } + + return valAddr, amount, nil +} + +func processStakeChanges(stakeChanges map[string]int64, txID string, blockHeight int64) ([]db.ValidatorBondedTokenChange, error) { + // Group changes by validator address + validatorChanges := make(map[string][]map[string]string) + + for key, amount := range stakeChanges { + parts := strings.Split(key, ".") + if len(parts) != 2 { + return nil, fmt.Errorf("invalid stake change key format: must be 'validatorAddr.denom'") + } + + validatorAddr := parts[0] + denom := parts[1] + + // Add token change to validator's list + validatorChanges[validatorAddr] = append(validatorChanges[validatorAddr], map[string]string{ + "amount": fmt.Sprintf("%d", amount), + "denom": denom, + }) + } + + // Convert grouped changes to ValidatorBondedTokenChange + var changes []db.ValidatorBondedTokenChange + for validatorAddr, tokens := range validatorChanges { + tokensJSON, err := json.Marshal(tokens) + if err != nil { + return nil, fmt.Errorf("failed to marshal tokens: %w", err) + } + + changes = append(changes, db.ValidatorBondedTokenChange{ + ValidatorAddress: validatorAddr, + TransactionID: txID, + BlockHeight: blockHeight, + Tokens: tokensJSON, + }) + } + + return changes, nil +} diff --git a/informative-indexer/indexer/state-tracker/batch_insert.go b/informative-indexer/indexer/state-tracker/batch_insert.go new file mode 100644 index 00000000..8622f05d --- /dev/null +++ b/informative-indexer/indexer/state-tracker/batch_insert.go @@ -0,0 +1,506 @@ +package statetracker + +import ( + "context" + "fmt" + "maps" + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/rs/zerolog" + "gorm.io/gorm" + + "github.com/initia-labs/core-indexer/informative-indexer/indexer/cacher" + "github.com/initia-labs/core-indexer/pkg/db" +) + +// AccountTxKey is a comparable key for AccountTransaction +type AccountTxKey string + +// MakeAccountTxKey creates a unique string key from AccountTransaction fields +func MakeAccountTxKey(txID, address string) AccountTxKey { + return AccountTxKey(fmt.Sprintf("%s:%s", txID, address)) +} + +type DBBatchInsert struct { + transactions []db.Transaction + + accounts map[string]db.Account + accountsInTx map[AccountTxKey]db.AccountTransaction + proposals map[int32]db.Proposal + ProposalStatusChanges map[int32]db.Proposal + PrunedProposals map[int32]db.Proposal + ProposalEmergencyNextTally map[int32]*time.Time + validators map[string]db.Validator + validatorBondedTokenTxs []db.ValidatorBondedTokenChange + + modules map[string]db.Module + ModulePublishedEvents []db.ModuleHistory + ModuleProposals []db.ModuleProposal + Collections map[string]db.Collection + CollectionMutationEvents []db.CollectionMutationEvent + NftMutationEvents []db.NftMutationEvent + CollectionTransactions []db.CollectionTransaction + MintedNftTransactions []db.NftTransaction + TransferredNftTransactions []db.NftTransaction + Nfts map[string]db.Nft + ObjectNewOwners map[string]string + ModuleTransactions []db.ModuleTransaction + BurnedNft map[string]bool + BurnedNftTransactions []db.NftTransaction + ProposalDeposits []db.ProposalDeposit + TotalDepositChanges map[int32][]sdk.Coin + ProposalVotes []db.ProposalVote + ValidatorSlashEvents []db.ValidatorSlashEvent + + cacher *cacher.Cacher + logger *zerolog.Logger +} + +func NewDBBatchInsert(cacher *cacher.Cacher, logger *zerolog.Logger) *DBBatchInsert { + return &DBBatchInsert{ + transactions: make([]db.Transaction, 0), + accountsInTx: make(map[AccountTxKey]db.AccountTransaction), + accounts: make(map[string]db.Account), + proposals: make(map[int32]db.Proposal), + ProposalStatusChanges: make(map[int32]db.Proposal), + PrunedProposals: make(map[int32]db.Proposal), + ProposalEmergencyNextTally: make(map[int32]*time.Time), + validators: make(map[string]db.Validator), + validatorBondedTokenTxs: make([]db.ValidatorBondedTokenChange, 0), + modules: make(map[string]db.Module), + ModulePublishedEvents: make([]db.ModuleHistory, 0), + ModuleProposals: make([]db.ModuleProposal, 0), + Collections: make(map[string]db.Collection), + CollectionMutationEvents: make([]db.CollectionMutationEvent, 0), + CollectionTransactions: make([]db.CollectionTransaction, 0), + MintedNftTransactions: make([]db.NftTransaction, 0), + TransferredNftTransactions: make([]db.NftTransaction, 0), + Nfts: make(map[string]db.Nft), + ObjectNewOwners: make(map[string]string), + ModuleTransactions: make([]db.ModuleTransaction, 0), + BurnedNft: make(map[string]bool), + BurnedNftTransactions: make([]db.NftTransaction, 0), + ProposalDeposits: make([]db.ProposalDeposit, 0), + ProposalVotes: make([]db.ProposalVote, 0), + cacher: cacher, + logger: logger, + } +} + +func (b *DBBatchInsert) AddTransaction(transaction db.Transaction) { + b.transactions = append(b.transactions, transaction) +} + +func (b *DBBatchInsert) AddValidators(validators ...db.Validator) { + for _, validator := range validators { + b.validators[validator.OperatorAddress] = validator + } +} + +func (b *DBBatchInsert) AddAccounts(accounts ...db.Account) { + for _, account := range accounts { + b.accounts[account.Address] = account + } +} + +func (b *DBBatchInsert) AddValidatorBondedTokenTxs(txs ...db.ValidatorBondedTokenChange) { + b.validatorBondedTokenTxs = append(b.validatorBondedTokenTxs, txs...) +} + +func (b *DBBatchInsert) AddValidatorSlashEvents(slashEvents ...db.ValidatorSlashEvent) { + b.ValidatorSlashEvents = append(b.ValidatorSlashEvents, slashEvents...) +} + +func (b *DBBatchInsert) AddModule(module db.Module) { + b.modules[module.ID] = module +} + +func (b *DBBatchInsert) AddAccountsInTx(accounts map[string]db.Account, accountsInTx map[AccountTxKey]db.AccountTransaction) { + maps.Copy(b.accounts, accounts) + maps.Copy(b.accountsInTx, accountsInTx) +} + +func (b *DBBatchInsert) Flush(ctx context.Context, dbTx *gorm.DB, height int64) error { + if err := db.UpdateTxCount(ctx, dbTx, int64(len(b.transactions)), height); err != nil { + b.logger.Error().Msgf("Error updating tracking table: %v", err) + return err + } + + if len(b.accounts) > 0 { + if err := db.InsertVMAddressesAndAccountsIgnoreConflict(ctx, dbTx, b.accounts); err != nil { + return err + } + } + + if len(b.transactions) > 0 { + if err := db.UpsertTransactions(ctx, dbTx, b.transactions); err != nil { + b.logger.Error().Msgf("Error inserting transactions: %v", err) + return err + } + } + + if len(b.ValidatorSlashEvents) > 0 { + if err := db.InsertValidatorSlashEvents(ctx, dbTx, b.ValidatorSlashEvents); err != nil { + return err + } + } + + if len(b.accountsInTx) > 0 { + txs := make([]db.AccountTransaction, 0, len(b.accountsInTx)) + for _, tx := range b.accountsInTx { + txs = append(txs, tx) + } + + if err := db.InsertAccountTxsIgnoreConflict(ctx, dbTx, txs); err != nil { + return err + } + } + + if len(b.validators) > 0 { + validators := make([]db.Validator, 0, len(b.validators)) + for _, validator := range b.validators { + validators = append(validators, validator) + + // update validator map cache + b.cacher.SetValidator(db.ValidatorAddress{ + ConsensusAddress: validator.ConsensusAddress, + AccountID: validator.AccountID, + OperatorAddress: validator.OperatorAddress, + }) + } + + if err := db.UpsertValidators(ctx, dbTx, validators); err != nil { + return err + } + } + + if len(b.validatorBondedTokenTxs) > 0 { + if err := db.InsertValidatorBondedTokenChangesIgnoreConflict(ctx, dbTx, b.validatorBondedTokenTxs); err != nil { + return err + } + } + + if len(b.proposals) > 0 { + proposals := make([]db.Proposal, 0, len(b.proposals)) + for _, proposal := range b.proposals { + proposals = append(proposals, proposal) + } + + if err := db.InsertProposalsIgnoreConflict(ctx, dbTx, proposals); err != nil { + return err + } + } + + if len(b.ProposalStatusChanges) > 0 { + proposals := make([]db.Proposal, 0, len(b.ProposalStatusChanges)) + for _, proposal := range b.ProposalStatusChanges { + proposals = append(proposals, proposal) + } + if err := db.UpdateProposalStatus(ctx, dbTx, proposals); err != nil { + return err + } + } + + if len(b.PrunedProposals) > 0 { + proposals := make([]db.Proposal, 0, len(b.PrunedProposals)) + for _, proposal := range b.PrunedProposals { + proposals = append(proposals, proposal) + } + if err := db.UpdatePrunedProposalStatus(ctx, dbTx, proposals); err != nil { + return err + } + } + + if len(b.ProposalDeposits) > 0 { + if err := db.InsertProposalDeposits(ctx, dbTx, b.ProposalDeposits); err != nil { + return err + } + if err := db.UpdateProposalTotalDeposit(ctx, dbTx, b.TotalDepositChanges); err != nil { + return err + } + } + + if len(b.ProposalVotes) > 0 { + for idx := range b.ProposalVotes { + if validatorAddress, ok := b.cacher.GetValidatorByAccAddr(b.ProposalVotes[idx].Voter); ok { + b.ProposalVotes[idx].IsValidator = true + b.ProposalVotes[idx].ValidatorAddress = &validatorAddress.OperatorAddress + } + } + + if err := db.UpsertProposalVotes(ctx, dbTx, b.ProposalVotes); err != nil { + return err + } + } + + if len(b.ProposalEmergencyNextTally) > 0 { + if err := db.UpdateProposalEmergencyNextTally(ctx, dbTx, b.ProposalEmergencyNextTally); err != nil { + return err + } + } + + if len(b.modules) > 0 { + modules := make([]db.Module, 0, len(b.modules)) + for _, module := range b.modules { + modules = append(modules, module) + } + + if err := db.UpsertModules(ctx, dbTx, modules); err != nil { + return err + } + } + + if len(b.ModulePublishedEvents) > 0 { + if err := db.InsertModuleHistories(ctx, dbTx, b.ModulePublishedEvents); err != nil { + return err + } + } + + if len(b.ModuleTransactions) > 0 { + if err := db.InsertModuleTransactions(ctx, dbTx, b.ModuleTransactions); err != nil { + return err + } + } + + if len(b.ModuleProposals) > 0 { + if err := db.InsertModuleProposalsIgnoreConflict(ctx, dbTx, b.ModuleProposals); err != nil { + return err + } + } + + err := b.FlushCollectionAndNftRelated(ctx, dbTx) + if err != nil { + return err + } + + return nil +} + +func (b *DBBatchInsert) FlushCollectionAndNftRelated(ctx context.Context, dbTx *gorm.DB) error { + // First flush collections since NFTs have foreign key relationships to collections + err := b.FlushCollection(ctx, dbTx) + if err != nil { + return err + } + + // Then flush NFTs which depend on collections + err = b.FlushNft(ctx, dbTx) + if err != nil { + return err + } + + // Flush collection transactions after both collections and NFTs are in place + // since it has foreign key relationships to both tables + err = b.FlushCollectionTransactions(ctx, dbTx) + if err != nil { + return err + } + + // Finally flush all NFT-related transactions (mint, transfer, burn) + // These operations depend on NFTs being in place + err = b.FlushMintedNft(ctx, dbTx) + if err != nil { + return err + } + + err = b.FlushTransferredNft(ctx, dbTx) + if err != nil { + return err + } + + err = b.FlushBurnedNft(ctx, dbTx) + if err != nil { + return err + } + + err = b.FlushCollectionMutationEvents(ctx, dbTx) + if err != nil { + return err + } + + err = b.FlushNftMutationEvents(ctx, dbTx) + if err != nil { + return err + } + return nil +} + +func (b *DBBatchInsert) FlushCollection(ctx context.Context, dbTx *gorm.DB) error { + if len(b.Collections) > 0 { + collections := make([]db.Collection, 0, len(b.Collections)) + for _, collection := range b.Collections { + collections = append(collections, collection) + } + if err := db.UpsertCollection(ctx, dbTx, collections); err != nil { + return err + } + } + return nil +} + +func (b *DBBatchInsert) FlushNft(ctx context.Context, dbTx *gorm.DB) error { + if len(b.Nfts) > 0 { + nfts := make([]*db.Nft, 0, len(b.Nfts)) + for _, nft := range b.Nfts { + nfts = append(nfts, &nft) + } + if err := db.InsertNftsOnConflictDoUpdate(ctx, dbTx, nfts); err != nil { + return err + } + } + return nil +} + +func (b *DBBatchInsert) FlushCollectionTransactions(ctx context.Context, dbTx *gorm.DB) error { + if len(b.CollectionTransactions) > 0 { + if err := db.InsertCollectionTransactions(ctx, dbTx, b.CollectionTransactions); err != nil { + return err + } + } + return nil +} + +func (b *DBBatchInsert) FlushTransferredNft(ctx context.Context, dbTx *gorm.DB) error { + if len(b.ObjectNewOwners) > 0 { + ids := make([]string, 0, len(b.ObjectNewOwners)) + for object := range b.ObjectNewOwners { + ids = append(ids, object) + } + nfts, err := db.GetNftsByIDs(ctx, dbTx, ids) + if err != nil { + return err + } + existingNfts := make(map[string]*db.Nft) + for _, nft := range nfts { + existingNfts[nft.ID] = nft + nft.Owner = b.ObjectNewOwners[nft.ID] + } + if err := db.InsertNftsOnConflictDoUpdate(ctx, dbTx, nfts); err != nil { + return err + } + + nftTxs := make([]db.NftTransaction, 0) + nftHistories := make([]db.NftHistory, 0) + collectionTransactions := make([]db.CollectionTransaction, 0) + for _, tx := range b.TransferredNftTransactions { + if nft, ok := existingNfts[tx.NftID]; ok { + nftTxs = append(nftTxs, tx) + collectionTransactions = append(collectionTransactions, db.CollectionTransaction{ + IsNftTransfer: true, + TxID: tx.TxID, + NftID: &tx.NftID, + CollectionID: nft.Collection, + BlockHeight: tx.BlockHeight, + }) + nftHistories = append(nftHistories, db.NftHistory{ + NftID: tx.NftID, + TxID: tx.TxID, + BlockHeight: tx.BlockHeight, + From: nft.Owner, + To: b.ObjectNewOwners[tx.NftID], + Remark: db.JSON("{}"), + }) + existingNfts[tx.NftID].Owner = b.ObjectNewOwners[tx.NftID] + } + } + + if err := db.InsertCollectionTransactions(ctx, dbTx, collectionTransactions); err != nil { + return err + } + + nfts = make([]*db.Nft, 0, len(existingNfts)) + for _, nft := range existingNfts { + nfts = append(nfts, nft) + } + + if err := db.InsertNftsOnConflictDoUpdate(ctx, dbTx, nfts); err != nil { + return err + } + + if err := db.InsertNftTransactions(ctx, dbTx, nftTxs); err != nil { + return err + } + if err := db.InsertNftHistories(ctx, dbTx, nftHistories); err != nil { + return err + } + + } + return nil +} + +func (b *DBBatchInsert) FlushMintedNft(ctx context.Context, dbTx *gorm.DB) error { + if len(b.MintedNftTransactions) > 0 { + if err := db.InsertNftTransactions(ctx, dbTx, b.MintedNftTransactions); err != nil { + return err + } + } + + return nil +} + +func (b *DBBatchInsert) FlushBurnedNft(ctx context.Context, dbTx *gorm.DB) error { + if len(b.BurnedNftTransactions) > 0 { + nftIDs := make([]string, 0, len(b.BurnedNftTransactions)) + for _, tx := range b.BurnedNftTransactions { + nftIDs = append(nftIDs, tx.NftID) + } + + if err := db.InsertNftTransactions(ctx, dbTx, b.BurnedNftTransactions); err != nil { + return err + } + + if err := db.UpdateBurnedNftsOnConflictDoUpdate(ctx, dbTx, nftIDs); err != nil { + return err + } + } + + return nil +} + +func (b *DBBatchInsert) FlushCollectionMutationEvents(ctx context.Context, dbTx *gorm.DB) error { + if len(b.CollectionMutationEvents) > 0 { + if err := db.InsertCollectionMutationEvents(ctx, dbTx, b.CollectionMutationEvents); err != nil { + return err + } + for _, event := range b.CollectionMutationEvents { + switch event.MutatedFieldName { + case "uri": + if err := db.UpdateCollectionURI(ctx, dbTx, event.CollectionID, event.NewValue); err != nil { + return err + } + case "description": + if err := db.UpdateCollectionDescription(ctx, dbTx, event.CollectionID, event.NewValue); err != nil { + return err + } + case "name": + if err := db.UpdateCollectionName(ctx, dbTx, event.CollectionID, event.NewValue); err != nil { + return err + } + } + } + } + return nil +} + +func (b *DBBatchInsert) FlushNftMutationEvents(ctx context.Context, dbTx *gorm.DB) error { + if len(b.NftMutationEvents) > 0 { + if err := db.InsertNftMutationEvents(ctx, dbTx, b.NftMutationEvents); err != nil { + return err + } + for _, event := range b.NftMutationEvents { + switch event.MutatedFieldName { + case "uri": + if err := db.UpdateNftURI(ctx, dbTx, event.NftID, event.NewValue); err != nil { + return err + } + case "description": + if err := db.UpdateNftDescription(ctx, dbTx, event.NftID, event.NewValue); err != nil { + return err + } + } + } + + } + return nil +} diff --git a/informative-indexer/indexer/state-tracker/state_update_manager.go b/informative-indexer/indexer/state-tracker/state_update_manager.go new file mode 100644 index 00000000..23a7fd5f --- /dev/null +++ b/informative-indexer/indexer/state-tracker/state_update_manager.go @@ -0,0 +1,391 @@ +package statetracker + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "strconv" + + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + cosmosgovtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + "github.com/initia-labs/initia/app/params" + vmapi "github.com/initia-labs/movevm/api" + vmtypes "github.com/initia-labs/movevm/types" + + "github.com/initia-labs/core-indexer/informative-indexer/indexer/types" + "github.com/initia-labs/core-indexer/informative-indexer/indexer/utils" + "github.com/initia-labs/core-indexer/pkg/cosmosrpc" + "github.com/initia-labs/core-indexer/pkg/db" + indexererrors "github.com/initia-labs/core-indexer/pkg/errors" + "github.com/initia-labs/core-indexer/pkg/parser" +) + +// StateUpdateManager tracks entities that need to be synchronized with the blockchain state +// through RPC queries. It maintains sets of validators and modules that have been modified +// and need their latest state to be fetched from the chain. +type StateUpdateManager struct { + // validators tracks validator addresses that need their state to be synchronized + Validators map[string]bool + + // TODO: refactor value type + // modules tracks Move modules that need their state to be synchronized. + // The string pointer value is the transaction hash where the module was published. + // A nil value indicates the module was not published in the current transaction. + Modules map[vmapi.ModuleInfoResponse]*string + + // dbBatchInsert handles database batch operations + dbBatchInsert *DBBatchInsert + + // encodingConfig is used for encoding/decoding validator information + encodingConfig *params.EncodingConfig + + // height is the height of the block to be used for RPC queries + height *int64 + + ProposalsToUpdate map[int32]string + CollectionsToUpdate map[string]bool + NftsToUpdate map[string]bool + ProposalStatusChanges map[int32]db.ProposalStatus +} + +func NewStateUpdateManager( + dbBatchInsert *DBBatchInsert, + encodingConfig *params.EncodingConfig, + height *int64, +) *StateUpdateManager { + return &StateUpdateManager{ + Validators: make(map[string]bool), + Modules: make(map[vmapi.ModuleInfoResponse]*string), + dbBatchInsert: dbBatchInsert, + encodingConfig: encodingConfig, + height: height, + ProposalsToUpdate: make(map[int32]string), + CollectionsToUpdate: make(map[string]bool), + NftsToUpdate: make(map[string]bool), + ProposalStatusChanges: make(map[int32]db.ProposalStatus), + } +} + +func (s *StateUpdateManager) UpdateState(ctx context.Context, rpcClient cosmosrpc.CosmosJSONRPCHub) error { + // TODO: add retry logic + if err := s.updateValidators(ctx, rpcClient); err != nil { + return err + } + + if err := s.updateModules(ctx, rpcClient); err != nil { + return err + } + + if err := s.updateCollections(ctx, rpcClient); err != nil { + return err + } + + if err := s.updateNfts(ctx, rpcClient); err != nil { + return err + } + + if err := s.updateProposals(ctx, rpcClient); err != nil { + return err + } + + return nil +} + +func (s *StateUpdateManager) updateProposals(ctx context.Context, rpcClient cosmosrpc.CosmosJSONRPCHub) error { + for proposalID, txID := range s.ProposalsToUpdate { + proposal, err := rpcClient.Proposal(ctx, proposalID, s.height) + if err != nil { + return fmt.Errorf("failed to query proposal: %w", err) + } + + proposalInfo := proposal.Proposal + if err := proposalInfo.UnpackInterfaces(s.encodingConfig.Codec); err != nil { + return fmt.Errorf("failed to unpack interfaces proposal: %w", err) + } + + proposalStatus := utils.ParseProposalStatus(proposalInfo.GetStatus()) + rawProposalMsgs, err := proposalInfo.GetMsgs() + if err != nil { + return fmt.Errorf("failed to get proposal msgs: %w", err) + } + + proposalType := "" + proposalTypes := make([]string, 0) + proposalMsgs := make([]map[string]any, 0) + for idx, proposalMsg := range rawProposalMsgs { + if idx == 0 { + proposalType = sdk.MsgTypeURL(proposalMsg) + } + proposalTypes = append(proposalTypes, sdk.MsgTypeURL(proposalMsg)) + + var proposalMsgJsDict map[string]any + proposalMsgJson, err := codec.ProtoMarshalJSON(proposalMsg, nil) + if err != nil { + return fmt.Errorf("failed to marshal proposal msg: %w", err) + } + err = json.Unmarshal(proposalMsgJson, &proposalMsgJsDict) + if err != nil { + return fmt.Errorf("failed to unmarshal proposal msg: %w", err) + } + proposalMsgJsDict["@type"] = sdk.MsgTypeURL(proposalMsg) + proposalMsgs = append(proposalMsgs, proposalMsgJsDict) + } + + msgsJson, err := json.Marshal(proposalMsgs) + if err != nil { + return fmt.Errorf("failed to marshal proposal msgs: %w", err) + } + + contentJSON, err := json.Marshal(map[string]any{ + "messages": proposalMsgs, + "metadata": proposalInfo.GetMetadata(), + }) + if err != nil { + return fmt.Errorf("failed to marshal content: %w", err) + } + + proposalTypesJSON, err := json.Marshal(proposalTypes) + if err != nil { + return fmt.Errorf("failed to marshal proposal types: %w", err) + } + + s.dbBatchInsert.proposals[proposalID] = db.Proposal{ + ID: proposalID, + Title: proposalInfo.GetTitle(), + Description: proposalInfo.GetSummary(), + Status: string(proposalStatus), + SubmitTime: *proposalInfo.GetSubmitTime(), + DepositEndTime: *proposalInfo.GetDepositEndTime(), + VotingTime: proposalInfo.GetVotingStartTime(), + VotingEndTime: proposalInfo.GetVotingEndTime(), + TotalDeposit: db.JSON("[]"), + Messages: db.JSON(msgsJson), + Content: db.JSON(contentJSON), + Metadata: proposalInfo.GetMetadata(), + Version: "v1", + Yes: 0, + No: 0, + Abstain: 0, + NoWithVeto: 0, + IsExpedited: proposalInfo.GetExpedited(), + IsEmergency: proposalInfo.GetEmergency(), + EmergencyStartTime: proposalInfo.GetEmergencyStartTime(), + EmergencyNextTallyTime: proposalInfo.GetEmergencyNextTallyTime(), + FailedReason: "", + CreatedHeight: *s.height, + CreatedTx: txID, + ProposerID: proposalInfo.GetProposer(), + ProposalRoute: cosmosgovtypes.RouterKey, + Type: proposalType, + Types: proposalTypesJSON, + } + } + + for proposalID, status := range s.ProposalStatusChanges { + proposal := db.Proposal{ID: proposalID, Status: string(status)} + + if utils.IsProposalResolved(status) { + proposal.ResolvedHeight = s.height + } + + if !utils.IsProposalPruned(status) { + res, err := rpcClient.Proposal(ctx, proposalID, s.height) + if err != nil { + return nil + } + + proposalInfo := res.Proposal + proposal.VotingTime = proposalInfo.GetVotingStartTime() + proposal.VotingEndTime = proposalInfo.GetVotingEndTime() + proposal.IsExpedited = proposalInfo.GetExpedited() + + if proposalInfo.FinalTallyResult.V1TallyResult != nil { + tally := proposalInfo.FinalTallyResult.V1TallyResult + counts := map[string]*int64{ + "abstain": &proposal.Abstain, + "yes": &proposal.Yes, + "no": &proposal.No, + "no_with_veto": &proposal.NoWithVeto, + } + for option, count := range map[string]string{ + "abstain": tally.AbstainCount, + "yes": tally.YesCount, + "no": tally.NoCount, + "no_with_veto": tally.NoWithVetoCount, + } { + parsed, err := strconv.ParseInt(count, 10, 64) + if err != nil { + return fmt.Errorf("failed to parse %s count: %w", option, err) + } + *counts[option] = parsed + } + if proposal.ResolvedVotingPower == nil { + totalVestingPower, err := strconv.ParseInt(proposalInfo.FinalTallyResult.TotalVestingPower, 10, 64) + if err != nil { + return fmt.Errorf("failed to parse total vesting power: %w", err) + } + totalStakingPower, err := strconv.ParseInt(proposalInfo.FinalTallyResult.TotalStakingPower, 10, 64) + if err != nil { + return fmt.Errorf("failed to parse total staking power: %w", err) + } + resolveVotingPower := totalVestingPower + totalStakingPower + proposal.ResolvedVotingPower = &resolveVotingPower + } + } + s.dbBatchInsert.ProposalStatusChanges[proposalID] = proposal + } else { + s.dbBatchInsert.PrunedProposals[proposalID] = proposal + } + } + return nil +} + +func (s *StateUpdateManager) updateValidators(ctx context.Context, rpcClient cosmosrpc.CosmosJSONRPCHub) error { + validatorAddresses := make([]string, 0, len(s.Validators)) + for addr := range s.Validators { + validatorAddresses = append(validatorAddresses, addr) + } + + return s.syncValidators(ctx, rpcClient, validatorAddresses) +} + +func (s *StateUpdateManager) updateModules(ctx context.Context, rpcClient cosmosrpc.CosmosJSONRPCHub) error { + modules := make([]vmapi.ModuleInfoResponse, 0, len(s.Modules)) + publishTxIds := make([]*string, 0, len(s.Modules)) + for module, publishTxId := range s.Modules { + publishTxIds = append(publishTxIds, publishTxId) + modules = append(modules, module) + } + + return s.syncModules(ctx, rpcClient, modules, publishTxIds) +} + +func (s *StateUpdateManager) syncValidators(ctx context.Context, rpcClient cosmosrpc.CosmosJSONRPCHub, validatorAddresses []string) error { + for _, validatorAddr := range validatorAddresses { + valAcc, err := sdk.ValAddressFromBech32(validatorAddr) + if err != nil { + return fmt.Errorf("failed to convert validator address: %w", err) + } + + accAddr := sdk.AccAddress(valAcc) + vmAddr, _ := vmtypes.NewAccountAddressFromBytes(accAddr) + + s.dbBatchInsert.AddAccounts(db.Account{ + Address: accAddr.String(), + VMAddress: db.VMAddress{VMAddress: vmAddr.String()}, + Type: string(db.BaseAccount), + }) + + validator, err := rpcClient.Validator(ctx, validatorAddr, s.height) + if err != nil { + return fmt.Errorf("failed to fetch validator data: %w", err) + } + + valInfo := validator.Validator + if err := valInfo.UnpackInterfaces(s.encodingConfig.InterfaceRegistry); err != nil { + return fmt.Errorf("failed to unpack validator info: %w", err) + } + + consAddr, err := valInfo.GetConsAddr() + if err != nil { + return errors.Join(indexererrors.ErrorNonRetryable, err) + } + + s.dbBatchInsert.AddValidators( + db.NewValidator( + valInfo, + accAddr.String(), + consAddr, + ), + ) + } + + return nil +} + +func (s *StateUpdateManager) syncModules(ctx context.Context, rpcClient cosmosrpc.CosmosJSONRPCHub, modules []vmapi.ModuleInfoResponse, publishTxIds []*string) error { + for idx, module := range modules { + moduleInfo, err := rpcClient.Module(ctx, module.Address.String(), module.Name, s.height) + if err != nil { + return fmt.Errorf("failed to fetch module info: %w", err) + } + + var publishTxId *string + if publishTxIds[idx] != nil { + publishTxId = publishTxIds[idx] + } + + s.dbBatchInsert.AddModule(db.Module{ + Name: module.Name, + ModuleEntryExecuted: 0, + IsVerify: false, + PublishTxID: publishTxId, + PublisherID: module.Address.String(), + ID: db.GetModuleID(module), + Digest: parser.GetModuleDigest(moduleInfo.RawBytes), + UpgradePolicy: db.GetUpgradePolicy(moduleInfo.UpgradePolicy), + }) + } + + return nil +} + +func (s *StateUpdateManager) updateCollections(ctx context.Context, rpcClient cosmosrpc.CosmosJSONRPCHub) error { + if len(s.CollectionsToUpdate) == 0 { + return nil + } + + for collection := range s.CollectionsToUpdate { + resource, err := rpcClient.Resource(ctx, collection, types.CollectionStructType, s.height) + if err != nil { + return fmt.Errorf("failed to fetch collection resource: %w", err) + } + nft, err := parser.DecodeResource[parser.CollectionResource](resource.Resource.MoveResource) + if err != nil { + return fmt.Errorf("failed to decode collection resource: %w", err) + } + + if existingCollection, exists := s.dbBatchInsert.Collections[collection]; exists { + // Update existing collection + existingCollection.URI = nft.Data.URI + existingCollection.Description = nft.Data.Description + existingCollection.Name = nft.Data.Name + s.dbBatchInsert.Collections[collection] = existingCollection + } else { + return fmt.Errorf("collection not found: %s", collection) + } + } + + return nil +} + +func (s *StateUpdateManager) updateNfts(ctx context.Context, rpcClient cosmosrpc.CosmosJSONRPCHub) error { + if len(s.NftsToUpdate) == 0 { + return nil + } + + // TODO: remove query when 0x1::nft::Nft upgrade is done + for nftId := range s.NftsToUpdate { + resource, err := rpcClient.Resource(ctx, nftId, types.NftStructType, s.height) + if err != nil { + return fmt.Errorf("failed to fetch nft: %w", err) + } + + nft, err := parser.DecodeResource[parser.NftResource](resource.Resource.MoveResource) + if err != nil { + return fmt.Errorf("failed to decode nft: %w", err) + } + + if existingNft, exists := s.dbBatchInsert.Nfts[nftId]; exists { + existingNft.URI = nft.Data.URI + existingNft.Description = nft.Data.Description + existingNft.TokenID = nft.Data.TokenID + s.dbBatchInsert.Nfts[nftId] = existingNft + } else { + return fmt.Errorf("nft not found: %s", nftId) + } + } + return nil +} diff --git a/informative-indexer/indexer/types/const.go b/informative-indexer/indexer/types/const.go new file mode 100644 index 00000000..6024df2b --- /dev/null +++ b/informative-indexer/indexer/types/const.go @@ -0,0 +1,8 @@ +package types + +const ( + NftStructType = "0x1::nft::Nft" + CollectionStructType = "0x1::collection::Collection" + + AttributeValueActionUnjail = "/cosmos.slashing.v1beta1.MsgUnjail" +) diff --git a/informative-indexer/indexer/types/move.go b/informative-indexer/indexer/types/move.go new file mode 100644 index 00000000..ae6370b4 --- /dev/null +++ b/informative-indexer/indexer/types/move.go @@ -0,0 +1,66 @@ +package types + +const ( + ModulePublishedEventKey = "0x1::code::ModulePublishedEvent" + CollectionCreateEventKey = "0x1::collection::CreateEvent" + CollectionMutationEventKey = "0x1::collection::MutationEvent" + CollectionMintEventKey = "0x1::collection::MintEvent" + CollectionBurnEventKey = "0x1::collection::BurnEvent" + NftCreateEventKey = "0x1::nft::CreateEvent" + NftMutationEventKey = "0x1::nft::MutationEvent" + ObjectTransferEventKey = "0x1::object::TransferEvent" + ObjectCreateEventKey = "0x1::object::CreateEvent" +) + +type CollectCreateEvent struct { + Collection string `json:"collection"` + Creator string `json:"creator"` + Name string `json:"name"` + Description string `json:"description"` + URI string `json:"uri"` +} + +type CollectionMutationEvent struct { + Collection string `json:"collection"` + MutatedFieldName string `json:"mutated_field_name"` + OldValue string `json:"old_value"` + NewValue string `json:"new_value"` +} + +type CollectionMintEvent struct { + Collection string `json:"collection"` + Nft string `json:"nft"` + TokenID string `json:"token_id"` +} + +type CollectionBurnEvent struct { + Collection string `json:"collection"` + Nft string `json:"nft"` + TokenID string `json:"token_id"` +} + +type NftCreateEvent struct { + Collection string `json:"collection"` + TokenID string `json:"token_id"` + Description string `json:"description"` + URI string `json:"uri"` +} + +type NftMutationEvent struct { + Nft string `json:"nft"` + MutatedFieldName string `json:"mutated_field_name"` + OldValue string `json:"old_value"` + NewValue string `json:"new_value"` +} + +type ObjectTransferEvent struct { + Object string `json:"object"` + From string `json:"from"` + To string `json:"to"` +} + +type ObjectCreateEvent struct { + Object string `json:"object"` + Owner string `json:"owner"` + Version string `json:"version"` +} diff --git a/informative-indexer/indexer/utils/event.go b/informative-indexer/indexer/utils/event.go new file mode 100644 index 00000000..112dbecf --- /dev/null +++ b/informative-indexer/indexer/utils/event.go @@ -0,0 +1,45 @@ +package utils + +import ( + "fmt" + + abci "github.com/cometbft/cometbft/abci/types" + + "github.com/initia-labs/core-indexer/pkg/parser" +) + +// FindAttribute finds the first attribute with the given key and returns its value +func FindAttribute(attributes []abci.EventAttribute, key string) (string, bool) { + for _, attr := range attributes { + if attr.Key == key { + return attr.Value, true + } + } + return "", false +} + +func FindAttributeWithValue(attributes []abci.EventAttribute, key, value string) bool { + for _, attr := range attributes { + if attr.Key == key && attr.Value == value { + return true + } + } + return false +} + +// HandleEventWithKey is a generic handler for events that need to decode data from a specific attribute +func HandleEventWithKey[T any](event abci.Event, key string, flag *bool, store func(T) error) error { + if value, found := FindAttribute(event.Attributes, key); found { + e, err := parser.DecodeEvent[T](value) + if err != nil { + return fmt.Errorf("failed to decode event data: %w", err) + } + if flag != nil { + *flag = true + } + if err := store(e); err != nil { + return fmt.Errorf("failed to process event data: %w", err) + } + } + return nil +} diff --git a/informative-indexer/indexer/utils/hex.go b/informative-indexer/indexer/utils/hex.go new file mode 100644 index 00000000..82e292b1 --- /dev/null +++ b/informative-indexer/indexer/utils/hex.go @@ -0,0 +1,21 @@ +package utils + +import ( + "encoding/hex" + "fmt" +) + +func DecodeHexToHash(hexString string) ([32]byte, error) { + bytes, err := hex.DecodeString(hexString) + if err != nil { + return [32]byte{}, err + } + + if len(bytes) != 32 { + return [32]byte{}, fmt.Errorf("expected 32 bytes, got %d", len(bytes)) + } + + var hash [32]byte + copy(hash[:], bytes) + return hash, nil +} diff --git a/informative-indexer/indexer/utils/proposal.go b/informative-indexer/indexer/utils/proposal.go new file mode 100644 index 00000000..a4b2e491 --- /dev/null +++ b/informative-indexer/indexer/utils/proposal.go @@ -0,0 +1,54 @@ +package utils + +import ( + "fmt" + + cosmosgovtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + cosmosgovv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + + "github.com/initia-labs/core-indexer/pkg/db" +) + +func ParseProposalStatus(status cosmosgovv1.ProposalStatus) db.ProposalStatus { + switch status { + case cosmosgovv1.ProposalStatus_PROPOSAL_STATUS_DEPOSIT_PERIOD: + return db.ProposalStatusDepositPeriod + case cosmosgovv1.ProposalStatus_PROPOSAL_STATUS_VOTING_PERIOD: + return db.ProposalStatusVotingPeriod + case cosmosgovv1.ProposalStatus_PROPOSAL_STATUS_PASSED: + return db.ProposalStatusPassed + case cosmosgovv1.ProposalStatus_PROPOSAL_STATUS_REJECTED: + return db.ProposalStatusRejected + case cosmosgovv1.ProposalStatus_PROPOSAL_STATUS_FAILED: + return db.ProposalStatusFailed + default: + return db.ProposalStatusNil + } +} + +func ParseProposalEndBlockAttributeValue(value string) (db.ProposalStatus, error) { + switch value { + case cosmosgovtypes.AttributeValueProposalPassed: + return db.ProposalStatusPassed, nil + case cosmosgovtypes.AttributeValueProposalRejected: + return db.ProposalStatusRejected, nil + case cosmosgovtypes.AttributeValueProposalFailed: + return db.ProposalStatusFailed, nil + case cosmosgovtypes.AttributeValueProposalDropped: + return db.ProposalStatusInactive, nil + default: + return "", fmt.Errorf("unknown inactive proposal attribute: %s", value) + } +} + +func IsExpeditedRejected(value string) bool { + return value == cosmosgovtypes.AttributeValueExpeditedProposalRejected +} + +func IsProposalResolved(status db.ProposalStatus) bool { + return status == db.ProposalStatusInactive || status == db.ProposalStatusPassed || status == db.ProposalStatusRejected || status == db.ProposalStatusFailed || status == db.ProposalStatusCancelled +} + +func IsProposalPruned(status db.ProposalStatus) bool { + return status == db.ProposalStatusInactive || status == db.ProposalStatusCancelled +} diff --git a/informative-indexer/indexer/validator_uptime.go b/informative-indexer/indexer/validator_uptime.go new file mode 100644 index 00000000..f45cbb63 --- /dev/null +++ b/informative-indexer/indexer/validator_uptime.go @@ -0,0 +1,108 @@ +package indexer + +import ( + "context" + "fmt" + + "github.com/cometbft/cometbft/libs/bytes" + "github.com/cometbft/cometbft/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/bech32" + "gorm.io/gorm" + + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/mq" + "github.com/initia-labs/core-indexer/pkg/sentry_integration" +) + +func Bech32ValConsPub(val bytes.HexBytes) (string, error) { + bech32PrefixCons := sdk.GetConfig().GetBech32ConsensusAddrPrefix() + consensusAddress, err := bech32.ConvertAndEncode(bech32PrefixCons, val) + if err != nil { + return "", err + } + return consensusAddress, err +} + +// ProcessCommitSignatureVote checks all validator votes from the last commit signature +// to determine which validators voted as "absent" or "proposed" a block. It returns +// a mapping of validator consensus addresses to their respective votes. +func (f *Indexer) ProcessCommitSignatureVote(sigs []types.CommitSig) (map[string]db.CommitSignatureType, error) { + commitSigs := make(map[string]db.CommitSignatureType) + for _, commitSig := range sigs { + if commitSig.ValidatorAddress.String() == "" { + continue + } + consensusAddress, err := Bech32ValConsPub(commitSig.ValidatorAddress) + if err != nil { + return nil, err + } + + switch commitSig.BlockIDFlag { + case types.BlockIDFlagAbsent: + commitSigs[consensusAddress] = db.Absent + case types.BlockIDFlagCommit: + commitSigs[consensusAddress] = db.Vote + } + } + return commitSigs, nil +} + +func (f *Indexer) processValidator(parentCtx context.Context, blockResults *mq.BlockResultMsg, proposer *db.ValidatorAddress) error { + span, ctx := sentry_integration.StartSentrySpan(parentCtx, "processValidator", "Parse validator signatures from block and insert into DB") + defer span.Finish() + + // If block.LastCommit or block.ProposerConsensusAddress is nil, it means there's no last commit in the Kafka message, + // indicating that this message represents an old version. In this case, + // we skip processing the message without raising an error, as our intention is to ignore old versions. + if blockResults.LastCommit == nil { + logger.Info().Int64("height", blockResults.Height).Msgf("Skipping processing of this block") + return nil + } + + logger.Info().Msgf("Processing validator commit signatures from block: %d", blockResults.Height) + + sigs, err := f.ProcessCommitSignatureVote(blockResults.LastCommit.Signatures) + if err != nil { + logger.Error().Int64("height", blockResults.Height).Msgf("Error processsing block commit signature from db: %v", err) + return err + } + + logger.Info().Msgf("Proposer for this round is: %v => %v", blockResults.ProposerConsensusAddress, proposer.OperatorAddress) + if err := f.dbClient.WithContext(ctx).Transaction(func(dbTx *gorm.DB) error { + err = db.InsertValidatorCommitSignatureForProposer(ctx, dbTx, proposer.OperatorAddress, blockResults.Height) + if err != nil { + logger.Error().Int64("height", blockResults.Height).Msgf("Error inserting commmit signature for block proposer: %v", err) + return err + } + dbSigs := make([]db.ValidatorCommitSignature, 0) + for consAddr, vote := range sigs { + val, ok := f.cacher.GetValidatorByConsAddr(consAddr) + if !ok { + err := fmt.Errorf("validator not found - %s", consAddr) + logger.Error().Msgf("Error getting validator for a commit signature: %v", err) + return err + } + + dbSigs = append(dbSigs, db.ValidatorCommitSignature{ + ValidatorAddress: val.OperatorAddress, + BlockHeight: blockResults.LastCommit.Height, + Vote: string(vote), + }) + } + err = db.InsertValidatorCommitSignatures(ctx, dbTx, &dbSigs) + if err != nil { + logger.Error().Int64("height", blockResults.Height).Msgf("Error inserting validator commit signatures: %v", err) + return err + } + + return nil + }); err != nil { + logger.Error().Int64("height", blockResults.Height).Msgf("Error committing transaction: %v", err) + return err + } + + logger.Info().Int64("height", blockResults.Height).Msgf("Successfully indexed validator: %d", blockResults.Height) + + return nil +} diff --git a/informative-indexer/run.sh b/informative-indexer/run.sh index 053e70a6..d276f551 100755 --- a/informative-indexer/run.sh +++ b/informative-indexer/run.sh @@ -7,79 +7,31 @@ SCRIPT_DIR=$(cd $(dirname $0) ; pwd -P) TASK=$1 ARGS=${@:2} -help__sweep="sweep <..args> : run sweep" -task__sweep() { +help__run="run <..args> : run indexer" +task__run() { local chain=$1 if [ -z "$chain" ]; then - echo "usage: $0 sweep " + echo "usage: $0 run " exit fi - go build -o informative-indexer.bin . + go build -o informative-indexer . source .env - ./informative-indexer.bin sweep --bootstrap-server $KAFKA_BOOTSTRAP_SERVER \ + ./informative-indexer run --bootstrap-server $KAFKA_BOOTSTRAP_SERVER \ --block-results-topic ${chain}-local-informative-indexer-block-results-messages \ --kafka-api-key $KAFKA_API_KEY \ --kafka-api-secret $KAFKA_API_SECRET \ - --claim-check-bucket ${chain}-local-informative-indexer-large-block-results \ - --claim-check-threshold-mb 1 \ - --db $DB_CONNECTION_STRING \ - --chain $chain \ - --rebalance-interval $REBALANCE_INTERVAL \ - --workers 4 -} - -help__flush="flush <..args> : run flush" -task__flush() { - local chain=$1 - - if [ -z "$chain" ]; then - echo "usage: $0 flush " - exit - fi - - go build -o informative-indexer.bin . - - source .env - - ./informative-indexer.bin flush --bootstrap-server $KAFKA_BOOTSTRAP_SERVER \ - --block-results-topic ${chain}-local-informative-indexer-block-results-messages \ - --kafka-api-key $KAFKA_API_KEY \ - --kafka-api-secret $KAFKA_API_SECRET \ - --block-results-consumer-group ${chain}-local-informative-indexer-flusher \ + --block-results-consumer-group ${chain}-local-informative-indexer \ --block-results-claim-check-bucket ${chain}-local-informative-indexer-large-block-results \ --claim-check-threshold-mb 1 \ --db $DB_CONNECTION_STRING \ --chain $chain \ - --environment local \ --id 1 } -help__prune="prune <..args> : run prune" -task__prune() { - local chain=$1 - - if [ -z "$chain" ]; then - echo "usage: $0 prune " - exit - fi - - go build -o informative-indexer.bin . - - source .env - - ./informative-indexer.bin prune --db $DB_CONNECTION_STRING \ - --backup-bucket-name ${chain}-local-core-informative-data-backup \ - --backup-file-prefix events \ - --pruning-keep-block 10 \ - --pruning-interval 1 \ - --chain $chain \ - --environment local -} - list_all_helps() { compgen -v | egrep "^help__.*" } diff --git a/informative-indexer/storage/s3.go b/informative-indexer/storage/s3.go deleted file mode 100644 index 982d9142..00000000 --- a/informative-indexer/storage/s3.go +++ /dev/null @@ -1,61 +0,0 @@ -package storage - -import ( - "bytes" - "context" - "fmt" - - "github.com/aws/aws-sdk-go-v2/config" - "github.com/aws/aws-sdk-go-v2/credentials" - "github.com/aws/aws-sdk-go-v2/feature/s3/manager" - "github.com/aws/aws-sdk-go-v2/service/s3" - "github.com/aws/aws-sdk-go/aws" -) - -type S3Client struct { - *s3.Client - *manager.Uploader -} - -func NewS3Client(awsAccessKey string, awsSecretKey string) (*S3Client, error) { - creds := credentials.NewStaticCredentialsProvider(awsAccessKey, awsSecretKey, "") - cfg, err := config.LoadDefaultConfig(context.Background(), config.WithCredentialsProvider(creds), config.WithRegion("ap-southeast-1")) - if err != nil { - return nil, err - } - s3Client := s3.NewFromConfig(cfg) - return &S3Client{s3Client, manager.NewUploader(s3Client)}, nil -} - -func (s *S3Client) UploadFile(bucket string, objectPath string, message []byte) error { - reader := bytes.NewReader(message) - _, err := s.Upload(context.Background(), &s3.PutObjectInput{ - Bucket: aws.String(bucket), - Key: aws.String(objectPath), - ContentType: aws.String("application/json"), - Body: reader, - }) - if err != nil { - return fmt.Errorf("failed to upload file %s, %v", objectPath, err) - } - - return nil -} - -func (s *S3Client) ReadFile(bucket string, objectPath string) ([]byte, error) { - resp, err := s.GetObject(context.Background(), &s3.GetObjectInput{ - Bucket: aws.String(bucket), - Key: aws.String(objectPath), - }) - - if err != nil { - return nil, fmt.Errorf("failed to get object %s, %v", objectPath, err) - } - defer resp.Body.Close() - - buf := new(bytes.Buffer) - if _, err = buf.ReadFrom(resp.Body); err != nil { - return nil, fmt.Errorf("failed to read object %s, %v", objectPath, err) - } - return buf.Bytes(), nil -} diff --git a/dockerfiles/.env.example b/local/.env.example similarity index 100% rename from dockerfiles/.env.example rename to local/.env.example diff --git a/local/README.md b/local/README.md new file mode 100644 index 00000000..b1f9222e --- /dev/null +++ b/local/README.md @@ -0,0 +1,126 @@ +# Informative Indexer (Event Indexer) Local Setup Guide + +## Overview +By default, it's configured for the `initiation-2` (Initia testnet), but can be configured for any Initia's Move rollup chain. + +## Prerequisites +- Docker and Docker Compose installed +- Basic understanding of blockchain concepts +- Access to an RPC endpoint of the chain you want to index + +## Setup Instructions + +### 1. Environment Configuration +1. Create a `.env` file in `dockerfiles` directory + - Use the provided `.env.example` file as a reference + - Example configuration: + ```env + POSTGRES_USER="postgres" + POSTGRES_PASSWORD="postgres" + POSTGRES_DB="core_indexer" + CHAIN="initiation-2" + ENVIRONMENT="local" + ``` + +### 2. Initial Block Height Configuration +1. Navigate to `init/init.sql` +2. Modify the `block_height` value to your desired starting point + - This determines from which block the indexer will start processing + +### 3. RPC Configuration +1. Open `docker-compose-informative.yml` +2. Update the `RPC_ENDPOINTS` environment variable under the `sweeper` service: + ```yaml + sweeper: + environment: + RPC_ENDPOINTS: '{"rpcs":[{"url": "YOUR_RPC_ENDPOINT"}]}' + ``` + - For rollup indexing: Use your rollup's RPC endpoint + - For `initiation-2`: leave it as `https://rpc.testnet.initia.xyz` + +## Running the Service + +### Starting the Indexer +```shell +docker compose -f local/docker-compose-informative.yml up --build +``` + +### Verifying the Setup +1. Check if all containers are running: + ```shell + docker compose -f local/docker-compose-informative.yml ps + ``` +2. Monitor logs: + ```shell + docker compose -f local/docker-compose-informative.yml logs -f + ``` + +## Components + +### Storage System (Mock-GCS) +The indexer uses [mock-gcs-server](https://github.com/fsouza/fake-gcs-server) for local storage simulation. + +- Access the storage interface: `http://localhost:9184/storage/v1/b/{bucket_name}` +- Default bucket format: `-local-informative-indexer-large-block-results` +- Example bucket information: + ```json + { + "kind": "storage#bucket", + "id": "-local-informative-indexer-large-block-results", + "name": "-local-informative-indexer-large-block-results", + "versioning": { "enabled": false }, + "timeCreated": "2025-01-23T06:11:01.205566Z", + "updated": "2025-01-23T06:11:01.205566Z", + "location": "US-CENTRAL1", + "storageClass": "STANDARD" + } + ``` + +### GraphQL Interface (Hasura) +The indexer exposes a GraphQL API through Hasura for querying indexed data. + +1. Initialize table tracking: + ```shell + curl -X POST -H 'Content-Type: application/json' \ + --data '{ + "type": "bulk", + "source": "default", + "resource_version": 1, + "args": [ + { + "type": "postgres_track_tables", + "args": { + "allow_warnings": true, + "tables": [ + {"table": {"name": "finalize_block_events", "schema": "public"}, "source": "default"}, + {"table": {"name": "move_events", "schema": "public"}, "source": "default"}, + {"table": {"name": "transaction_events", "schema": "public"}, "source": "default"} + ] + } + } + ] + }' \ + http://localhost:8080/v1/metadata + ``` +2. Access the GraphQL console: `http://localhost:8080/console` + +## Troubleshooting + +### Common Issues +1. Connection refused to RPC endpoint + - Verify RPC endpoint is accessible + - Check network connectivity + - Ensure RPC endpoint is correctly formatted in configuration + +2. Database connection issues + - Verify PostgreSQL credentials in .env file + - Check if PostgreSQL container is running + - Ensure no port conflicts on 5432 (can be changed in docker-compose-informative.yml under postgres service ports). + +3. Hasura metadata issues + - Reset metadata and reapply if tracking fails + - Verify PostgreSQL connection in Hasura console + - Check Hasura logs for detailed error messages + +## Support and Contribution +For issues and feature requests, please create an issue in the repository. diff --git a/dockerfiles/docker-compose-informative.yml b/local/docker-compose-informative.yml similarity index 95% rename from dockerfiles/docker-compose-informative.yml rename to local/docker-compose-informative.yml index 29f31039..a130e7e8 100644 --- a/dockerfiles/docker-compose-informative.yml +++ b/local/docker-compose-informative.yml @@ -104,17 +104,17 @@ services: condition: service_healthy broker: condition: service_healthy - command: [ "/informative-indexer.bin", "sweep" ] + command: [ "/informative-indexer", "sweep" ] - flusher: + indexer: build: context: ../ dockerfile: dockerfiles/Dockerfile.informative - container_name: flusher + container_name: indexer environment: BOOTSTRAP_SERVER: broker:29092 BLOCK_RESULTS_TOPIC: ${CHAIN}-local-informative-indexer-block-results-messages - BLOCK_RESULTS_CONSUMER_GROUP: ${CHAIN}-local-informative-indexer-flusher + BLOCK_RESULTS_CONSUMER_GROUP: ${CHAIN}-local-informative-indexer-indexer BLOCK_RESULTS_CLAIM_CHECK_BUCKET: ${CHAIN}-local-informative-indexer-large-block-results CLAIM_CHECK_THRESHOLD_IN_MB: 1 DB_CONNECTION_STRING: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB} @@ -126,7 +126,7 @@ services: condition: service_healthy broker: condition: service_healthy - command: [ "/informative-indexer.bin", "flush" ] + command: [ "/informative-indexer", "flush" ] # prunner: # build: @@ -143,8 +143,8 @@ services: # ENVIRONMENT: ${ENVIRONMENT} # depends_on: # - sweeper -# - flusher -# command: [ "/informative-indexer.bin", "prune" ] +# - indexer +# command: [ "/informative-indexer", "prune" ] volumes: pg_data: diff --git a/dockerfiles/init/init.sql b/local/init/init.sql similarity index 61% rename from dockerfiles/init/init.sql rename to local/init/init.sql index 541b4d0a..e2ebf5b9 100644 --- a/dockerfiles/init/init.sql +++ b/local/init/init.sql @@ -24,4 +24,20 @@ CREATE TABLE IF NOT EXISTS move_events( event_index integer ); -INSERT INTO transaction_events(transaction_hash, block_height, event_key, event_value, event_index) VALUES ('7cbd3c3abc1790b92a8ddcfcb666d31891a09b7bea2861d92d444ca07a8859b7', 2797040, 'execute.sender', '0x1,0x50fbce14436f1bfa9b30576dbb8a5a0c1e249dd3', 0); \ No newline at end of file +CREATE TABLE IF NOT EXISTS transactions ( + id varchar NOT NULL, + hash bytea NOT NULL, + block_height integer NOT NULL, + gas_used integer NOT NULL, + gas_limit integer NOT NULL, + gas_fee character varying NOT NULL, + err_msg character varying, + success boolean NOT NULL, + sender varchar NOT NULL, + memo character varying NOT NULL, + messages json NOT NULL, + block_index integer NOT NULL +); + + +INSERT INTO transaction_events(transaction_hash, block_height, event_key, event_value, event_index) VALUES ('7cbd3c3abc1790b92a8ddcfcb666d31891a09b7bea2861d92d444ca07a8859b7', 7197856, 'execute.sender', '0x1,0x50fbce14436f1bfa9b30576dbb8a5a0c1e249dd3', 0); diff --git a/pkg/cosmosrpc/errors.go b/pkg/cosmosrpc/errors.go new file mode 100644 index 00000000..e1f3b844 --- /dev/null +++ b/pkg/cosmosrpc/errors.go @@ -0,0 +1,5 @@ +package cosmosrpc + +import "errors" + +var ErrorZeroActiveClients = errors.New("zero active clients") diff --git a/pkg/cosmosrpc/hub.go b/pkg/cosmosrpc/hub.go new file mode 100644 index 00000000..be7e96c1 --- /dev/null +++ b/pkg/cosmosrpc/hub.go @@ -0,0 +1,250 @@ +package cosmosrpc + +import ( + "context" + "fmt" + "sort" + "sync" + "time" + + coretypes "github.com/cometbft/cometbft/rpc/core/types" + initiagovtypes "github.com/initia-labs/initia/x/gov/types" + movetypes "github.com/initia-labs/initia/x/move/types" + mstakingtypes "github.com/initia-labs/initia/x/mstaking/types" + "github.com/rs/zerolog" + + "github.com/initia-labs/core-indexer/pkg/sentry_integration" +) + +type ClientConfig struct { + URL string + ClientOption *ClientOption +} + +type Hub struct { + mu sync.Mutex + Clients []CosmosJSONRPCClient + activeClients []ActiveClient + logger *zerolog.Logger + timeout time.Duration +} + +type ActiveClient struct { + Client CosmosJSONRPCClient + Height int64 +} + +type CosmosJSONRPCHub interface { + CosmosJSONRPCClient + Rebalance(ctx context.Context) error + GetActiveClients() []ActiveClient +} + +func NewHub(configs []ClientConfig, logger *zerolog.Logger, timeout time.Duration) *Hub { + clients := make([]CosmosJSONRPCClient, 0) + for _, config := range configs { + var client *Client + if config.ClientOption == nil { + client = NewClient(config.URL) + } else { + client = NewClientWithOption(config.URL, *config.ClientOption) + } + clients = append(clients, client) + } + return &Hub{ + Clients: clients, + logger: logger, + timeout: timeout, + } +} + +func (h *Hub) Rebalance(ctx context.Context) error { + span, ctx := sentry_integration.StartSentrySpan(ctx, "Rebalance", "Rebalance hub rpcs") + defer span.Finish() + + var result *coretypes.ResultStatus + var err error + clients := make([]ActiveClient, 0) + for _, client := range h.Clients { + ctx, cancel := createTimeoutContext(ctx, h.timeout) + defer cancel() + result, err = client.Status(ctx) + if err != nil { + err = handleTimeoutError(err) + h.logger.Error().Err(err).Msgf("Failed to get client from id :%s status: %s", client.GetIdentifier(), err) + continue + } + clients = append(clients, ActiveClient{Client: client, Height: result.SyncInfo.LatestBlockHeight}) + } + + sort.Slice(clients, func(i, j int) bool { + return clients[i].Height >= clients[j].Height + }) + + h.mu.Lock() + defer h.mu.Unlock() + h.activeClients = clients + if len(h.activeClients) == 0 { + return fmt.Errorf("RPC: All RPC Clients failed to get status. Last error: %v", err) + } + + return nil +} + +func (h *Hub) Status(ctx context.Context) (*coretypes.ResultStatus, error) { + span, ctx := sentry_integration.StartSentrySpan(ctx, "HubStatus", "Calling /status from RPCs") + defer span.Finish() + + result, err := handleQuery(ctx, h.timeout, h.activeClients, func(ctx context.Context, c ActiveClient) (*coretypes.ResultStatus, error) { + return c.Client.Status(ctx) + }) + if err != nil { + return nil, fmt.Errorf("failed to get status: %v", err) + } + + return result, nil +} + +func (h *Hub) Block(ctx context.Context, height *int64) (*coretypes.ResultBlock, error) { + span, ctx := sentry_integration.StartSentrySpan(ctx, "HubBlock", "Calling /block from RPCs") + defer span.Finish() + + result, err := handleQuery(ctx, h.timeout, h.activeClients, func(ctx context.Context, c ActiveClient) (*coretypes.ResultBlock, error) { + result, err := c.Client.Block(ctx, height) + if err != nil { + return nil, err + } else if result.Block.Header.Height < *height { + return nil, fmt.Errorf("RPC: Stale block data") + } else { + return result, nil + } + }) + if err != nil { + return nil, fmt.Errorf("failed to get block: %v", err) + } + + return result, nil +} + +func (h *Hub) BlockResults(ctx context.Context, height *int64) (*coretypes.ResultBlockResults, error) { + span, ctx := sentry_integration.StartSentrySpan(ctx, "HubBlockResults", "Calling /block_results from RPCs") + defer span.Finish() + + result, err := handleQuery(ctx, h.timeout, h.activeClients, func(ctx context.Context, c ActiveClient) (*coretypes.ResultBlockResults, error) { + result, err := c.Client.BlockResults(ctx, height) + if err != nil { + return nil, err + } else if result.Height < *height { + return nil, fmt.Errorf("RPC: Stale block results data") + } else { + return result, nil + } + }) + if err != nil { + return nil, fmt.Errorf("failed to get block results: %v", err) + } + + return result, nil +} + +func (h *Hub) Proposal(ctx context.Context, proposalID int32, height *int64) (*initiagovtypes.QueryProposalResponse, error) { + span, ctx := sentry_integration.StartSentrySpan(ctx, "HubProposal", "Calling /proposal from RPCs") + defer span.Finish() + + result, err := handleQuery(ctx, h.timeout, h.activeClients, func(ctx context.Context, c ActiveClient) (*initiagovtypes.QueryProposalResponse, error) { + return c.Client.Proposal(ctx, proposalID, height) + }) + if err != nil { + return nil, fmt.Errorf("failed to get proposal: %v", err) + } + + return result, nil +} + +func (h *Hub) Validator(ctx context.Context, validatorAddress string, height *int64) (*mstakingtypes.QueryValidatorResponse, error) { + span, ctx := sentry_integration.StartSentrySpan(ctx, "HubValidator", "Calling /validator from RPCs") + defer span.Finish() + + result, err := handleQuery(ctx, h.timeout, h.activeClients, func(ctx context.Context, c ActiveClient) (*mstakingtypes.QueryValidatorResponse, error) { + return c.Client.Validator(ctx, validatorAddress, height) + }) + if err != nil { + return nil, fmt.Errorf("failed to get validator: %v", err) + } + + return result, nil +} + +func (h *Hub) Validators(ctx context.Context, status string, height *int64) (*[]mstakingtypes.Validator, error) { + span, ctx := sentry_integration.StartSentrySpan(ctx, "HubValidatorInfos", "Calling validator infos from RPCs") + defer span.Finish() + + result, err := handleQuery(ctx, h.timeout, h.activeClients, func(ctx context.Context, c ActiveClient) (*[]mstakingtypes.Validator, error) { + return c.Client.Validators(ctx, status, height) + }) + if err != nil { + return nil, fmt.Errorf("failed to get validators: %v", err) + } + + return result, nil +} + +func (h *Hub) Module(ctx context.Context, address, moduleName string, height *int64) (*movetypes.QueryModuleResponse, error) { + span, ctx := sentry_integration.StartSentrySpan(ctx, "HubModule", "Calling /module from RPCs") + defer span.Finish() + + result, err := handleQuery(ctx, h.timeout, h.activeClients, func(ctx context.Context, c ActiveClient) (*movetypes.QueryModuleResponse, error) { + return c.Client.Module(ctx, address, moduleName, height) + }) + if err != nil { + return nil, fmt.Errorf("failed to get module: %v", err) + } + + return result, nil +} + +func (h *Hub) Resource(ctx context.Context, address, structTag string, height *int64) (*movetypes.QueryResourceResponse, error) { + span, ctx := sentry_integration.StartSentrySpan(ctx, "HubResource", "Calling /resource from RPCs") + defer span.Finish() + + result, err := handleQuery(ctx, h.timeout, h.activeClients, func(ctx context.Context, c ActiveClient) (*movetypes.QueryResourceResponse, error) { + return c.Client.Resource(ctx, address, structTag, height) + }) + if err != nil { + return nil, fmt.Errorf("failed to get module resource: %v", err) + } + + return result, nil +} + +func (h *Hub) Genesis(ctx context.Context) (*coretypes.ResultGenesis, error) { + span, ctx := sentry_integration.StartSentrySpan(ctx, "HubGenesis", "Calling /genesis from RPCs") + defer span.Finish() + + result, err := handleQuery(ctx, h.timeout, h.activeClients, func(ctx context.Context, c ActiveClient) (*coretypes.ResultGenesis, error) { + return c.Client.Genesis(ctx) + }) + if err != nil { + return nil, fmt.Errorf("failed to get genesis: %v", err) + } + + return result, nil +} + +func (h *Hub) GetActiveClients() []ActiveClient { + h.mu.Lock() + defer h.mu.Unlock() + return h.activeClients +} + +func (h *Hub) GetIdentifier() string { + if len(h.Clients) == 0 { + return "" + } + + ids := make([]string, len(h.Clients)) + for i, client := range h.Clients { + ids[i] = client.GetIdentifier() + } + return fmt.Sprintf("%v", ids) +} diff --git a/pkg/cosmosrpc/rpc.go b/pkg/cosmosrpc/rpc.go new file mode 100644 index 00000000..dd264105 --- /dev/null +++ b/pkg/cosmosrpc/rpc.go @@ -0,0 +1,236 @@ +package cosmosrpc + +import ( + "context" + "encoding/json" + "net/http" + "strconv" + + cjson "github.com/cometbft/cometbft/libs/json" + coretypes "github.com/cometbft/cometbft/rpc/core/types" + "github.com/cosmos/cosmos-sdk/client" + grpctypes "github.com/cosmos/cosmos-sdk/types/grpc" + "github.com/cosmos/cosmos-sdk/types/query" + initiagovtypes "github.com/initia-labs/initia/x/gov/types" + movetypes "github.com/initia-labs/initia/x/move/types" + mstakingtypes "github.com/initia-labs/initia/x/mstaking/types" + "github.com/ybbus/jsonrpc/v3" + "google.golang.org/grpc/metadata" + + "github.com/initia-labs/core-indexer/pkg/sentry_integration" +) + +type Client struct { + jc jsonrpc.RPCClient + clientCtx client.Context + identifier string +} + +func appendHeightHeader(ctx context.Context, height *int64) context.Context { + if height == nil { + return ctx + } + return metadata.AppendToOutgoingContext(ctx, grpctypes.GRPCBlockHeightHeader, strconv.FormatInt(*height, 10)) +} + +func (c *Client) Call(ctx context.Context, method string, params map[string]any) (*jsonrpc.RPCResponse, error) { + span, ctx := sentry_integration.StartSentrySpan(ctx, c.identifier+"/"+method, "Calling "+method+" of "+c.identifier) + defer span.Finish() + + paramsMap := make(map[string]json.RawMessage, len(params)) + for name, value := range params { + valueJSON, err := cjson.Marshal(value) + if err != nil { + return nil, err + } + paramsMap[name] = valueJSON + } + + return c.jc.Call(ctx, method, paramsMap) +} + +type CosmosJSONRPCClient interface { + Status(ctx context.Context) (*coretypes.ResultStatus, error) + Block(ctx context.Context, height *int64) (*coretypes.ResultBlock, error) + BlockResults(ctx context.Context, height *int64) (*coretypes.ResultBlockResults, error) + Proposal(ctx context.Context, proposalId int32, height *int64) (*initiagovtypes.QueryProposalResponse, error) + Validator(ctx context.Context, validatorAddress string, height *int64) (*mstakingtypes.QueryValidatorResponse, error) + Validators(ctx context.Context, status string, height *int64) (*[]mstakingtypes.Validator, error) + Module(ctx context.Context, address, moduleName string, height *int64) (*movetypes.QueryModuleResponse, error) + Resource(ctx context.Context, address, structTag string, height *int64) (*movetypes.QueryResourceResponse, error) + Genesis(ctx context.Context) (*coretypes.ResultGenesis, error) + GetIdentifier() string +} + +type ClientOption struct { + HTTPClient *http.Client + CustomHeaders map[string]string + AllowUnknownFields bool + DefaultRequestID int +} + +func NewClient(url string) *Client { + c, err := client.NewClientFromNode(url) + if err != nil { + panic(err) + } + return &Client{jsonrpc.NewClient(url), client.Context{}.WithClient(c), url} +} + +func NewClientWithOption(url string, option ClientOption) *Client { + c, err := client.NewClientFromNode(url) + if err != nil { + panic(err) + } + return &Client{ + jsonrpc.NewClientWithOpts(url, &jsonrpc.RPCClientOpts{ + HTTPClient: option.HTTPClient, + CustomHeaders: option.CustomHeaders, + AllowUnknownFields: option.AllowUnknownFields, + DefaultRequestID: option.DefaultRequestID, + }), + client.Context{}.WithClient(c), + url, + } +} + +func handleResponseAndGetResult[T any](response *jsonrpc.RPCResponse, err error) (*T, error) { + if err != nil { + return nil, err + } + if response.Error != nil { + return nil, response.Error + } + + jsBytes, err := json.Marshal(response.Result) + if err != nil { + return nil, err + } + + result := new(T) + err = cjson.Unmarshal(jsBytes, result) + if err != nil { + return nil, err + } + + return result, nil +} + +func (c *Client) Status(ctx context.Context) (*coretypes.ResultStatus, error) { + jsonResponse, err := c.Call(ctx, "status", map[string]any{}) + return handleResponseAndGetResult[coretypes.ResultStatus](jsonResponse, err) +} + +func (c *Client) Block(ctx context.Context, height *int64) (*coretypes.ResultBlock, error) { + jsonResponse, err := c.Call(ctx, "block", map[string]any{"height": height}) + return handleResponseAndGetResult[coretypes.ResultBlock](jsonResponse, err) +} + +func (c *Client) BlockResults(ctx context.Context, height *int64) (*coretypes.ResultBlockResults, error) { + jsonResponse, err := c.Call(ctx, "block_results", map[string]any{"height": height}) + return handleResponseAndGetResult[coretypes.ResultBlockResults](jsonResponse, err) +} + +func (c *Client) Proposal(ctx context.Context, proposalID int32, height *int64) (*initiagovtypes.QueryProposalResponse, error) { + span, ctx := sentry_integration.StartSentrySpan(ctx, c.identifier+"/module", "Calling module of "+c.identifier) + defer span.Finish() + + queryClient := initiagovtypes.NewQueryClient(c.clientCtx) + request := initiagovtypes.QueryProposalRequest{ + ProposalId: uint64(proposalID), + } + + result, err := queryClient.Proposal(appendHeightHeader(ctx, height), &request) + if err != nil { + return nil, err + } + + return result, nil +} + +func (c *Client) Validator(ctx context.Context, ValidatorAddr string, height *int64) (*mstakingtypes.QueryValidatorResponse, error) { + span, ctx := sentry_integration.StartSentrySpan(ctx, c.identifier+"/validator", "Calling validator of "+c.identifier) + defer span.Finish() + + queryClient := mstakingtypes.NewQueryClient(c.clientCtx) + request := mstakingtypes.QueryValidatorRequest{ + ValidatorAddr: ValidatorAddr, + } + + result, err := queryClient.Validator(appendHeightHeader(ctx, height), &request) + if err != nil { + return nil, err + } + + return result, nil +} + +func (c *Client) Validators(ctx context.Context, status string, height *int64) (*[]mstakingtypes.Validator, error) { + span, ctx := sentry_integration.StartSentrySpan(ctx, c.identifier+"/validator_infos", "Calling validator_infos of "+c.identifier) + defer span.Finish() + + queryClient := mstakingtypes.NewQueryClient(c.clientCtx) + nextKey := make([]byte, 0) + vals := make([]mstakingtypes.Validator, 0) + for { + request := mstakingtypes.QueryValidatorsRequest{ + Pagination: &query.PageRequest{ + Key: nextKey, + }, + } + if status != "" { + request.Status = status + } + result, err := queryClient.Validators(appendHeightHeader(ctx, height), &request) + if err != nil { + return nil, err + } + nextKey = result.Pagination.NextKey + vals = append(vals, result.Validators...) + if len(nextKey) == 0 { + break + } + } + return &vals, nil +} + +func (c *Client) Module(ctx context.Context, address, moduleName string, height *int64) (*movetypes.QueryModuleResponse, error) { + span, ctx := sentry_integration.StartSentrySpan(ctx, c.identifier+"/module", "Calling module of "+c.identifier) + defer span.Finish() + + queryClient := movetypes.NewQueryClient(c.clientCtx) + request := movetypes.QueryModuleRequest{ + Address: address, + ModuleName: moduleName, + } + result, err := queryClient.Module(appendHeightHeader(ctx, height), &request) + if err != nil { + return nil, err + } + return result, nil +} + +func (c *Client) Resource(ctx context.Context, address string, structTag string, height *int64) (*movetypes.QueryResourceResponse, error) { + span, ctx := sentry_integration.StartSentrySpan(ctx, c.identifier+"/resource", "Calling resource of "+c.identifier) + defer span.Finish() + + queryClient := movetypes.NewQueryClient(c.clientCtx) + request := movetypes.QueryResourceRequest{ + Address: address, + StructTag: structTag, + } + result, err := queryClient.Resource(appendHeightHeader(ctx, height), &request) + if err != nil { + return nil, err + } + return result, nil +} + +func (c *Client) Genesis(ctx context.Context) (*coretypes.ResultGenesis, error) { + jsonResponse, err := c.Call(ctx, "genesis", map[string]any{}) + return handleResponseAndGetResult[coretypes.ResultGenesis](jsonResponse, err) +} + +func (c *Client) GetIdentifier() string { + return c.identifier +} diff --git a/pkg/cosmosrpc/utils.go b/pkg/cosmosrpc/utils.go new file mode 100644 index 00000000..742d9725 --- /dev/null +++ b/pkg/cosmosrpc/utils.go @@ -0,0 +1,46 @@ +package cosmosrpc + +import ( + "context" + "errors" + "fmt" + "time" +) + +const MAX_RETRY_COUNT = 3 + +// createTimeoutContext checks if the provided context already has a deadline or timeout. +// If it does, it returns the existing context and a no-op cancel function. +// If not, it creates a new context with the specified timeout. +func createTimeoutContext(ctx context.Context, timeout time.Duration) (context.Context, context.CancelFunc) { + if _, ok := ctx.Deadline(); ok { + // If context already has a deadline, return the existing context and a no-op cancel function. + return ctx, func() {} + } + // Create a new context with the specified timeout. + return context.WithTimeout(ctx, timeout) +} + +func handleTimeoutError(err error) error { + if errors.Is(err, context.DeadlineExceeded) { + return fmt.Errorf("RPC: request timed out") + } + return err +} + +func handleQuery[T any, C ActiveClient](ctx context.Context, timeout time.Duration, clients []C, queryFn func(context.Context, C) (*T, error)) (*T, error) { + var lastError error + for range MAX_RETRY_COUNT { + for _, client := range clients { + ctx, cancel := createTimeoutContext(ctx, timeout) + defer cancel() + result, err := queryFn(ctx, client) + if err != nil { + lastError = handleTimeoutError(err) + continue + } + return result, nil + } + } + return nil, fmt.Errorf("RPC: All RPC Clients failed to query. Last error: %v", lastError) +} diff --git a/pkg/db/count.go b/pkg/db/count.go new file mode 100644 index 00000000..c2a7a8fb --- /dev/null +++ b/pkg/db/count.go @@ -0,0 +1,44 @@ +package db + +import ( + "fmt" + "strings" + "time" + + "gorm.io/gorm" +) + +// CountWithTimeout executes a count query with a timeout. +// If the query times out, it returns -1 for the count with no error. +// Returns (count int64, error). +func CountWithTimeout(query *gorm.DB, timeout time.Duration) (int64, error) { + var total int64 + + // Use a transaction with statement_timeout to avoid connection corruption + if err := query.Transaction(func(tx *gorm.DB) error { + // Set timeout only for this transaction + if err := tx.Exec(fmt.Sprintf("SET LOCAL statement_timeout = '%dms'", timeout.Milliseconds())).Error; err != nil { + return err + } + + countErr := tx.Count(&total).Error + + // Reset timeout before committing to prevent leakage to parent transaction + if resetErr := tx.Exec("RESET statement_timeout").Error; resetErr != nil { + // Log the reset error but don't override the count error + if countErr == nil { + return resetErr + } + } + + return countErr + }); err != nil { + // Check for statement timeout + if strings.Contains(err.Error(), "statement timeout") { + return -1, nil + } + return 0, err + } + + return total, nil +} diff --git a/pkg/db/custom_types.go b/pkg/db/custom_types.go new file mode 100644 index 00000000..4cc9b7f0 --- /dev/null +++ b/pkg/db/custom_types.go @@ -0,0 +1,57 @@ +package db + +type AccountType string + +const ( + BaseAccount AccountType = "BaseAccount" + InterchainAccount AccountType = "InterchainAccount" + ModuleAccount AccountType = "ModuleAccount" + ContinuousVestingAccount AccountType = "ContinuousVestingAccount" + DelayedVestingAccount AccountType = "DelayedVestingAccount" + ClawbackVestingAccount AccountType = "ClawbackVestingAccount" + ContractAccount AccountType = "ContractAccount" +) + +type UpgradePolicy string + +const ( + Arbitrary UpgradePolicy = "Arbitrary" + Compatible UpgradePolicy = "Compatible" + Immutable UpgradePolicy = "Immutable" +) + +type CommitSignatureType string + +const ( + Propose CommitSignatureType = "PROPOSE" + Vote CommitSignatureType = "VOTE" + Absent CommitSignatureType = "ABSENT" +) + +type SlashType string + +const ( + Jailed SlashType = "Jailed" + Slashed SlashType = "Slashed" + Unjailed SlashType = "Unjailed" +) + +type FinalizeBlockEventsMode string + +const ( + BeginBlock FinalizeBlockEventsMode = "BeginBlock" + EndBlock FinalizeBlockEventsMode = "EndBlock" +) + +type ProposalStatus string + +const ( + ProposalStatusNil ProposalStatus = "Nil" + ProposalStatusDepositPeriod ProposalStatus = "DepositPeriod" + ProposalStatusVotingPeriod ProposalStatus = "VotingPeriod" + ProposalStatusPassed ProposalStatus = "Passed" + ProposalStatusRejected ProposalStatus = "Rejected" + ProposalStatusFailed ProposalStatus = "Failed" + ProposalStatusInactive ProposalStatus = "Inactive" + ProposalStatusCancelled ProposalStatus = "Cancelled" +) diff --git a/pkg/db/custom_types.sql b/pkg/db/custom_types.sql new file mode 100644 index 00000000..55365bfb --- /dev/null +++ b/pkg/db/custom_types.sql @@ -0,0 +1,74 @@ +-- Since GORM & Atlas cannot handle creating custom types programmatically, we have to define them here. +DO $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'accounttype') THEN + CREATE TYPE accounttype AS ENUM ( + 'BaseAccount', + 'InterchainAccount', + 'ModuleAccount', + 'ContinuousVestingAccount', + 'DelayedVestingAccount', + 'ClawbackVestingAccount', + 'ContractAccount' + ); + END IF; +END $$; + +DO $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'upgradepolicy') THEN + CREATE TYPE upgradepolicy AS ENUM ( + 'Arbitrary', + 'Compatible', + 'Immutable' + ); + END IF; +END $$; + +DO $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'commit_signature_type') THEN + CREATE TYPE commit_signature_type AS ENUM ( + 'PROPOSE', + 'VOTE', + 'ABSENT' + ); + END IF; +END $$; + +DO $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'slashtype') THEN + CREATE TYPE slashtype AS ENUM ( + 'Jailed', + 'Slashed', + 'Unjailed' + ); + END IF; +END $$; + +DO $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'finalize_block_events_mode') THEN + CREATE TYPE finalize_block_events_mode AS ENUM ( + 'BeginBlock', + 'EndBlock' + ); + END IF; +END $$; + +DO $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'proposalstatus') THEN + CREATE TYPE proposalstatus AS ENUM ( + 'Nil', + 'DepositPeriod', + 'VotingPeriod', + 'Passed', + 'Rejected', + 'Failed', + 'Inactive', + 'Cancelled' + ); + END IF; +END $$; diff --git a/pkg/db/db.go b/pkg/db/db.go new file mode 100644 index 00000000..3cdd2aa9 --- /dev/null +++ b/pkg/db/db.go @@ -0,0 +1,1009 @@ +package db + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "strings" + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/getsentry/sentry-go" + "gorm.io/driver/postgres" + "gorm.io/gorm" + "gorm.io/gorm/clause" +) + +const ( + BatchSize = 100 +) + +var QueryTimeout = 5 * time.Minute + +type ValidatorAddress struct { + OperatorAddress string `gorm:"column:operator_address"` + AccountID string `gorm:"column:account_id"` + ConsensusAddress string `gorm:"column:consensus_address"` +} + +func NewClient(databaseURL string) (*gorm.DB, error) { + return gorm.Open(postgres.Open(databaseURL), &gorm.Config{DefaultTransactionTimeout: QueryTimeout}) +} + +func Ping(ctx context.Context, dbClient *gorm.DB) error { + return dbClient.WithContext(ctx).Exec("SELECT 1").Error +} + +func InsertGenesisBlock(ctx context.Context, dbTx *gorm.DB, timestamp time.Time) error { + err := dbTx.WithContext(ctx).Exec(` + INSERT INTO blocks (height, hash, timestamp, proposer) + VALUES (?, ?, ?, ?) + ON CONFLICT DO NOTHING + `, 0, []byte("GENESIS"), timestamp, nil).Error + if err != nil { + return err + } + + return nil +} + +func InsertBlockIgnoreConflict(ctx context.Context, dbTx *gorm.DB, block Block) error { + result := dbTx.WithContext(ctx). + Clauses(clause.OnConflict{ + DoNothing: true, + }). + Create(&block) + + return result.Error +} + +func UpsertBlock(ctx context.Context, dbTx *gorm.DB, block Block) error { + result := dbTx.WithContext(ctx). + Clauses(clause.OnConflict{ + Columns: []clause.Column{{Name: "height"}}, + DoUpdates: clause.AssignmentColumns([]string{"proposer"}), + }). + Create(&block) + + return result.Error +} + +func InsertAccountsIgnoreConflict(ctx context.Context, dbTx *gorm.DB, accounts []Account) error { + span := sentry.StartSpan(ctx, "InsertAccount") + span.Description = "Bulk insert accounts into the database" + defer span.Finish() + + if len(accounts) == 0 { + return nil + } + + result := dbTx.WithContext(ctx). + Clauses(clause.OnConflict{ + DoNothing: true, + }). + CreateInBatches(&accounts, BatchSize) + + return result.Error +} + +func InsertVMAddressesIgnoreConflict(ctx context.Context, dbTx *gorm.DB, addresses []VMAddress) error { + span := sentry.StartSpan(ctx, "InsertVMAddress") + span.Description = "Bulk insert VM addresses into the database" + defer span.Finish() + + if len(addresses) == 0 { + return nil + } + + result := dbTx.WithContext(ctx). + Clauses(clause.OnConflict{ + DoNothing: true, + }).CreateInBatches(&addresses, BatchSize) + + return result.Error +} + +func InsertValidatorsIgnoreConflict(ctx context.Context, dbTx *gorm.DB, validators []Validator) error { + span := sentry.StartSpan(ctx, "InsertValidator") + span.Description = "Bulk insert validators into the database" + defer span.Finish() + + if len(validators) == 0 { + return nil + } + + result := dbTx.WithContext(ctx). + Clauses(clause.OnConflict{ + DoNothing: true, + }). + CreateInBatches(&validators, BatchSize) + + return result.Error +} + +func UpsertValidators(ctx context.Context, dbTx *gorm.DB, validators []Validator) error { + if len(validators) == 0 { + return nil + } + + // List all columns you want to update on conflict, except the primary key + columns := []string{ + "consensus_address", + "voting_powers", + "voting_power", + "moniker", + "identity", + "website", + "details", + "commission_rate", + "commission_max_rate", + "commission_max_change", + "jailed", + "is_active", + "consensus_pubkey", + "account_id", + } + + result := dbTx.WithContext(ctx). + Clauses(clause.OnConflict{ + Columns: []clause.Column{{Name: "operator_address"}}, + DoUpdates: clause.AssignmentColumns(columns), + }). + CreateInBatches(&validators, BatchSize) + + return result.Error +} + +// UpsertValidatorIdentityImages updates identity_image for validators. +// Since we only update existing validators, we use UPDATE instead of INSERT with ON CONFLICT +// to avoid NOT NULL constraint violations on other fields. +func UpsertValidatorIdentityImages(ctx context.Context, dbTx *gorm.DB, validators []Validator) error { + if len(validators) == 0 { + return nil + } + + // Process in batches to avoid large queries + for i := 0; i < len(validators); i += BatchSize { + end := i + BatchSize + if end > len(validators) { + end = len(validators) + } + batch := validators[i:end] + + // Build VALUES clause for batch update using PostgreSQL syntax + var values []any + var placeholders []string + for idx, val := range batch { + paramNum := idx*2 + 1 + placeholders = append(placeholders, fmt.Sprintf("($%d, $%d)", paramNum, paramNum+1)) + values = append(values, val.OperatorAddress, val.IdentityImage) + } + + // Use raw SQL to update only identity_image for existing validators + query := fmt.Sprintf(` + UPDATE validators + SET identity_image = v.identity_image + FROM (VALUES %s) AS v(operator_address, identity_image) + WHERE validators.operator_address = v.operator_address + `, strings.Join(placeholders, ", ")) + + if err := dbTx.WithContext(ctx).Exec(query, values...).Error; err != nil { + return err + } + } + + return nil +} + +func QueryValidatorAddresses(dbClient *gorm.DB) ([]ValidatorAddress, error) { + var validators []ValidatorAddress + result := dbClient. + Table(TableNameValidator). + Select("operator_address, account_id, consensus_address"). + Scan(&validators) + + if result.Error != nil { + return nil, result.Error + } + + return validators, nil +} + +func InsertValidatorBondedTokenChangesIgnoreConflict(ctx context.Context, dbTx *gorm.DB, txs []ValidatorBondedTokenChange) error { + span := sentry.StartSpan(ctx, "InsertValidatorBondedTokenChanges") + span.Description = "Bulk insert validator_bonded_token_changes into the database" + defer span.Finish() + + if len(txs) == 0 { + return nil + } + + result := dbTx.WithContext(ctx). + Clauses(clause.OnConflict{ + DoNothing: true, + }). + CreateInBatches(&txs, BatchSize) + + return result.Error +} + +func InsertProposalsIgnoreConflict(ctx context.Context, dbTx *gorm.DB, proposals []Proposal) error { + span := sentry.StartSpan(ctx, "InsertProposalsIgnoreConflict") + span.Description = "Insert proposals into the database" + defer span.Finish() + + if len(proposals) == 0 { + return nil + } + + result := dbTx.WithContext(ctx). + Clauses(clause.OnConflict{ + DoNothing: true, + }). + CreateInBatches(&proposals, BatchSize) + + return result.Error +} + +func UpdateProposalStatus(ctx context.Context, dbTx *gorm.DB, proposals []Proposal) error { + span := sentry.StartSpan(ctx, "UpdateProposalStatus") + span.Description = "Bulk update proposals into the database" + defer span.Finish() + + if len(proposals) == 0 { + return nil + } + + for _, proposal := range proposals { + result := dbTx.WithContext(ctx). + Model(&Proposal{}). + Where("id = ?", proposal.ID). + Updates(map[string]any{ + "status": proposal.Status, + "voting_time": proposal.VotingTime, + "voting_end_time": proposal.VotingEndTime, + "resolved_height": proposal.ResolvedHeight, + "abstain": proposal.Abstain, + "yes": proposal.Yes, + "no": proposal.No, + "no_with_veto": proposal.NoWithVeto, + "resolved_voting_power": proposal.ResolvedVotingPower, + "is_expedited": proposal.IsExpedited, + }) + if result.Error != nil { + return result.Error + } + } + + return nil +} + +func UpdatePrunedProposalStatus(ctx context.Context, dbTx *gorm.DB, proposals []Proposal) error { + span := sentry.StartSpan(ctx, "UpdatePrunedProposalStatus") + span.Description = "Bulk update pruned proposals into the database" + defer span.Finish() + + if len(proposals) == 0 { + return nil + } + + for _, proposal := range proposals { + result := dbTx.WithContext(ctx). + Model(&Proposal{}). + Where("id = ?", proposal.ID). + Updates(map[string]any{ + "status": proposal.Status, + }) + if result.Error != nil { + return result.Error + } + } + + return nil +} + +func UpdateOnlyExpeditedProposalStatus(ctx context.Context, dbTx *gorm.DB, proposals []Proposal) error { + span := sentry.StartSpan(ctx, "UpdateOnlyExpeditedProposalStatus") + span.Description = "Bulk update only expedited proposals into the database" + defer span.Finish() + + if len(proposals) == 0 { + return nil + } + + for _, proposal := range proposals { + result := dbTx.WithContext(ctx). + Model(&Proposal{}). + Where("id = ?", proposal.ID). + Updates(map[string]any{ + "is_expedited": proposal.IsExpedited, + }) + if result.Error != nil { + return result.Error + } + } + + return nil +} + +func UpdateProposalEmergencyNextTally(ctx context.Context, dbTx *gorm.DB, proposals map[int32]*time.Time) error { + if len(proposals) == 0 { + return nil + } + + for proposal, nextTallyTime := range proposals { + result := dbTx.WithContext(ctx). + Model(&Proposal{}). + Where("id = ?", proposal). + Updates(map[string]any{ + "IsEmergency": true, + "EmergencyNextTallyTime": nextTallyTime, + }) + if result.Error != nil { + return result.Error + } + } + + return nil +} + +func UpsertModules(ctx context.Context, dbTx *gorm.DB, modules []Module) error { + span := sentry.StartSpan(ctx, "UpsertModules") + span.Description = "Bulk upsert modules into the database" + defer span.Finish() + + if len(modules) == 0 { + return nil + } + + // List all columns to update on conflict, excluding primary key and ModuleEntryExecuted + columns := []string{ + "upgrade_policy", + "digest", + } + + result := dbTx.WithContext(ctx). + Clauses(clause.OnConflict{ + Columns: []clause.Column{{Name: "id"}}, + DoUpdates: clause.AssignmentColumns(columns), + UpdateAll: false, + }). + CreateInBatches(&modules, BatchSize) + + return result.Error +} + +func InsertTransactionIgnoreConflict(ctx context.Context, dbTx *gorm.DB, txs []Transaction) error { + span := sentry.StartSpan(ctx, "InsertTransaction") + span.Description = "Bulk insert transactions into the database" + defer span.Finish() + + if len(txs) == 0 { + return nil + } + + result := dbTx.WithContext(ctx). + Clauses(clause.OnConflict{ + DoNothing: true, + }). + CreateInBatches(txs, BatchSize) + + return result.Error +} + +func UpsertTransactions(ctx context.Context, dbTx *gorm.DB, txs []Transaction) error { + span := sentry.StartSpan(ctx, "UpsertTransactions") + span.Description = "Bulk upsert transactions into the database" + defer span.Finish() + + if len(txs) == 0 { + return nil + } + + result := dbTx.WithContext(ctx). + Clauses(clause.OnConflict{ + Columns: []clause.Column{{Name: "id"}}, + DoUpdates: clause.AssignmentColumns([]string{ + "is_ibc", + "is_send", + "is_move_publish", + "is_move_execute_event", + "is_move_execute", + "is_move_upgrade", + "is_move_script", + "is_nft_transfer", + "is_nft_mint", + "is_nft_burn", + "is_collection_create", + "is_opinit", + "is_instantiate", + "is_migrate", + "is_update_admin", + "is_clear_admin", + "is_store_code", + }), + }). + CreateInBatches(txs, BatchSize) + + return result.Error +} + +func InsertAccountTxsIgnoreConflict(ctx context.Context, dbTx *gorm.DB, txs []AccountTransaction) error { + span := sentry.StartSpan(ctx, "InsertAccountTxs") + span.Description = "Bulk insert account_txs into the database" + defer span.Finish() + + if len(txs) == 0 { + return nil + } + + result := dbTx.WithContext(ctx). + Clauses(clause.OnConflict{ + DoNothing: true, + }). + CreateInBatches(txs, BatchSize) + + return result.Error +} + +func InsertTransactionEventsIgnoreConflict(ctx context.Context, dbTx *gorm.DB, txEvents []*TransactionEvent) error { + span := sentry.StartSpan(ctx, "InsertTransactionEvents") + span.Description = "Bulk insert transaction_events into the database" + defer span.Finish() + + if len(txEvents) == 0 { + return nil + } + + result := dbTx.WithContext(ctx). + Clauses(clause.OnConflict{ + DoNothing: true, + }). + CreateInBatches(txEvents, BatchSize) + + return result.Error +} + +func InsertMoveEventsIgnoreConflict(ctx context.Context, dbTx *gorm.DB, moveEvents []*MoveEvent) error { + span := sentry.StartSpan(ctx, "InsertMoveEvents") + span.Description = "Bulk insert move_events into the database" + defer span.Finish() + + if len(moveEvents) == 0 { + return nil + } + + result := dbTx.WithContext(ctx). + Clauses(clause.OnConflict{ + DoNothing: true, + }). + CreateInBatches(moveEvents, BatchSize) + + return result.Error +} + +func InsertFinalizeBlockEventsIgnoreConflict(ctx context.Context, dbTx *gorm.DB, blockEvents []*FinalizeBlockEvent) error { + span := sentry.StartSpan(ctx, "InsertFinalizeBlockEvents") + span.Description = "Bulk insert finalize_block_events into the database" + defer span.Finish() + + if len(blockEvents) == 0 { + return nil + } + + result := dbTx.WithContext(ctx). + Clauses(clause.OnConflict{ + DoNothing: true, + }). + CreateInBatches(blockEvents, BatchSize) + + return result.Error +} + +func GetRowCount(ctx context.Context, dbClient *gorm.DB, table string) (int64, error) { + if !isValidTableName(table) { + return 0, fmt.Errorf("invalid table name: %s", table) + } + + var count int64 + result := dbClient.WithContext(ctx). + Table(table). + Count(&count) + + if result.Error != nil { + return 0, fmt.Errorf("failed to get row count for table %s: %w", table, result.Error) + } + + return count, nil +} + +func BuildPruneQuery(ctx context.Context, dbClient *gorm.DB, table string, threshold int64) (*gorm.DB, error) { + if !isValidTableName(table) { + return nil, fmt.Errorf("invalid table name: %s", table) + } + + query := dbClient.WithContext(ctx). + Table(table). + Where("block_height <= ?", threshold) + + return query, nil +} + +func DeleteRowsToPrune(ctx context.Context, dbClient *gorm.DB, table string, threshold int64) error { + if !isValidTableName(table) { + return fmt.Errorf("invalid table name: %s", table) + } + + result := dbClient.WithContext(ctx). + Table(table). + Where("block_height <= ?", threshold). + Delete(nil) + + return result.Error +} + +func GetOperatorAddress(ctx context.Context, dbClient *gorm.DB, consensusAddress string) (*string, error) { + var operatorAddress string + result := dbClient.WithContext(ctx). + Table(TableNameValidator). + Select("operator_address"). + Where("consensus_address = ?", consensusAddress). + Scan(&operatorAddress) + if result.Error != nil { + return nil, result.Error + } + + return &operatorAddress, nil +} + +func GetAccountOrInsertIfNotExist(ctx context.Context, dbTx *gorm.DB, address string, vmAddress string) error { + var account Account + result := dbTx.WithContext(ctx). + Table(TableNameAccount). + Where("address = ?", address). + First(&account) + + if result.Error == gorm.ErrRecordNotFound { + // First insert the VM address + vmAddr := VMAddress{VMAddress: vmAddress} + if err := dbTx.WithContext(ctx). + Clauses(clause.OnConflict{ + DoNothing: true, + }). + Create(&vmAddr).Error; err != nil { + return err + } + + // Then insert the account + newAccount := Account{ + Address: address, + VMAddressID: vmAddress, + Type: string(BaseAccount), + } + if err := dbTx.WithContext(ctx). + Clauses(clause.OnConflict{ + DoNothing: true, + }). + Create(&newAccount).Error; err != nil { + return err + } + } else if result.Error != nil { + return result.Error + } + + return nil +} + +// InsertValidatorCommitSignatureForProposer inserts a validator commit signature for a proposer +func InsertValidatorCommitSignatureForProposer(ctx context.Context, dbTx *gorm.DB, val string, height int64) error { + signature := ValidatorCommitSignature{ + ValidatorAddress: val, + BlockHeight: height, + Vote: string(Propose), + } + + result := dbTx.WithContext(ctx). + Clauses(clause.OnConflict{ + Columns: []clause.Column{{Name: "validator_address"}, {Name: "block_height"}}, + DoUpdates: clause.Assignments(map[string]any{"vote": string(Propose)}), + }). + Create(&signature) + + return result.Error +} + +func InsertValidatorCommitSignatures(ctx context.Context, dbTx *gorm.DB, votes *[]ValidatorCommitSignature) error { + if len(*votes) == 0 { + return nil + } + + result := dbTx.WithContext(ctx). + Clauses(clause.OnConflict{ + DoNothing: true, + Columns: []clause.Column{{Name: "validator_address"}, {Name: "block_height"}}, + }). + CreateInBatches(votes, BatchSize) + + return result.Error +} + +func UpsertCollection(ctx context.Context, dbTx *gorm.DB, collections []Collection) error { + if len(collections) == 0 { + return nil + } + + result := dbTx.WithContext(ctx). + Clauses(clause.OnConflict{ + Columns: []clause.Column{{Name: "id"}}, + DoUpdates: clause.AssignmentColumns([]string{ + "name", + "description", + "uri", + }), + }). + CreateInBatches(&collections, BatchSize) + + return result.Error +} + +func InsertModuleTransactions(ctx context.Context, dbTx *gorm.DB, moduleTransactions []ModuleTransaction) error { + if len(moduleTransactions) == 0 { + return nil + } + + return dbTx.WithContext(ctx).CreateInBatches(moduleTransactions, BatchSize).Error +} + +func InsertModuleHistories(ctx context.Context, dbTx *gorm.DB, moduleHistories []ModuleHistory) error { + if len(moduleHistories) == 0 { + return nil + } + + return dbTx.WithContext(ctx).CreateInBatches(moduleHistories, BatchSize).Error +} + +func InsertCollectionTransactions(ctx context.Context, dbTx *gorm.DB, collectionTransactions []CollectionTransaction) error { + if len(collectionTransactions) == 0 { + return nil + } + + return dbTx.WithContext(ctx).CreateInBatches(collectionTransactions, BatchSize).Error +} + +func InsertNftsOnConflictDoUpdate(ctx context.Context, dbTx *gorm.DB, nftTransactions []*Nft) error { + if len(nftTransactions) == 0 { + return nil + } + + return dbTx.WithContext(ctx). + Clauses(clause.OnConflict{ + Columns: []clause.Column{{Name: "id"}}, + DoUpdates: clause.AssignmentColumns([]string{ + "owner", + "is_burned", + "description", + "uri", + }), + }).CreateInBatches(nftTransactions, BatchSize).Error +} + +func UpdateBurnedNftsOnConflictDoUpdate(ctx context.Context, dbTx *gorm.DB, nftIDs []string) error { + if len(nftIDs) == 0 { + return nil + } + + return dbTx.WithContext(ctx). + Model(&Nft{}). + Where("id IN ?", nftIDs). + Update("is_burned", true).Error +} + +func InsertNftTransactions(ctx context.Context, dbTx *gorm.DB, nftTransactions []NftTransaction) error { + if len(nftTransactions) == 0 { + return nil + } + + return dbTx.WithContext(ctx).CreateInBatches(nftTransactions, BatchSize).Error +} + +func InsertNftHistories(ctx context.Context, dbTx *gorm.DB, nftHistories []NftHistory) error { + if len(nftHistories) == 0 { + return nil + } + + return dbTx.WithContext(ctx).CreateInBatches(nftHistories, BatchSize).Error +} + +func GetNftsByIDs(ctx context.Context, dbTx *gorm.DB, ids []string) ([]*Nft, error) { + var nfts []*Nft + result := dbTx.WithContext(ctx). + Where("id IN ?", ids). + Find(&nfts) + + if result.Error != nil { + return nil, result.Error + } + + return nfts, nil +} + +func InsertCollectionMutationEvents(ctx context.Context, dbTx *gorm.DB, collectionMutationEvents []CollectionMutationEvent) error { + if len(collectionMutationEvents) == 0 { + return nil + } + + return dbTx.WithContext(ctx).CreateInBatches(collectionMutationEvents, BatchSize).Error +} + +func UpdateCollectionURI(ctx context.Context, dbTx *gorm.DB, collectionID string, uri string) error { + return dbTx.WithContext(ctx). + Model(&Collection{}). + Where("id = ?", collectionID). + Update("uri", uri).Error +} + +func UpdateCollectionDescription(ctx context.Context, dbTx *gorm.DB, collectionID string, description string) error { + return dbTx.WithContext(ctx). + Model(&Collection{}). + Where("id = ?", collectionID). + Update("description", description).Error +} + +func UpdateCollectionName(ctx context.Context, dbTx *gorm.DB, collectionID string, name string) error { + return dbTx.WithContext(ctx). + Model(&Collection{}). + Where("id = ?", collectionID). + Update("name", name).Error +} + +func UpdateNftURI(ctx context.Context, dbTx *gorm.DB, nftID string, uri string) error { + return dbTx.WithContext(ctx). + Model(&Nft{}). + Where("id = ?", nftID). + Update("uri", uri).Error +} + +func UpdateNftDescription(ctx context.Context, dbTx *gorm.DB, nftID string, description string) error { + return dbTx.WithContext(ctx). + Model(&Nft{}). + Where("id = ?", nftID). + Update("description", description).Error +} + +func InsertNftMutationEvents(ctx context.Context, dbTx *gorm.DB, nftMutationEvents []NftMutationEvent) error { + if len(nftMutationEvents) == 0 { + return nil + } + + return dbTx.WithContext(ctx).CreateInBatches(nftMutationEvents, BatchSize).Error +} + +func InsertProposalDeposits(ctx context.Context, dbTx *gorm.DB, proposalDeposits []ProposalDeposit) error { + span := sentry.StartSpan(ctx, "InsertProposalDeposits") + span.Description = "Bulk insert proposal_deposits into the database" + defer span.Finish() + + return dbTx.WithContext(ctx).CreateInBatches(proposalDeposits, BatchSize).Error +} + +func UpdateProposalTotalDeposit(ctx context.Context, dbTx *gorm.DB, totalDepositChanges map[int32][]sdk.Coin) error { + for proposalID, depositChanges := range totalDepositChanges { + var proposal Proposal + result := dbTx.WithContext(ctx). + Where("id = ?", proposalID). + First(&proposal) + + if result.Error != nil { + return result.Error + } + + var totalDeposit sdk.Coins + if err := json.Unmarshal(proposal.TotalDeposit, &totalDeposit); err != nil { + return fmt.Errorf("failed to unmarshal total deposit of proposal %d - %w", proposalID, err) + } + + totalDeposit = totalDeposit.Add(depositChanges...) + totalDepositJSON, err := json.Marshal(totalDeposit) + if err != nil { + return fmt.Errorf("failed to marshal total deposit of proposal %d - %w", proposalID, err) + } + result = dbTx.WithContext(ctx). + Model(&Proposal{}). + Where("id = ?", proposalID). + Updates(map[string]any{ + "total_deposit": totalDepositJSON, + }) + if result.Error != nil { + return result.Error + } + } + return nil +} + +func UpsertProposalVotes(ctx context.Context, dbTx *gorm.DB, proposalVotes []ProposalVote) error { + if len(proposalVotes) == 0 { + return nil + } + // TODO: add constraint on proposal_id and voter + // Process each vote individually like the Python version + for _, vote := range proposalVotes { + // Check if vote already exists + var existingVote ProposalVote + result := dbTx.WithContext(ctx). + Where("proposal_id = ? AND voter = ?", vote.ProposalID, vote.Voter). + First(&existingVote) + + if result.Error != nil { + if errors.Is(result.Error, gorm.ErrRecordNotFound) { + // Vote doesn't exist, insert new one + if err := dbTx.WithContext(ctx).Create(&vote).Error; err != nil { + return fmt.Errorf("failed to insert proposal vote: %w", err) + } + } else { + return fmt.Errorf("failed to check existing vote: %w", result.Error) + } + } else { + // Vote exists, update it + if err := dbTx.WithContext(ctx). + Model(&ProposalVote{}). + Where("proposal_id = ? AND voter = ?", vote.ProposalID, vote.Voter). + Updates(map[string]interface{}{ + "is_vote_weighted": vote.IsVoteWeighted, + "is_validator": vote.IsValidator, + "validator_address": vote.ValidatorAddress, + "yes": vote.Yes, + "no": vote.No, + "abstain": vote.Abstain, + "no_with_veto": vote.NoWithVeto, + "transaction_id": vote.TransactionID, + }).Error; err != nil { + return fmt.Errorf("failed to update proposal vote: %w", err) + } + } + } + + return nil +} + +func GetLatestInformativeBlockHeight(ctx context.Context, dbClient *gorm.DB) (int64, error) { + var tracking Tracking + if err := dbClient.WithContext(ctx).First(&tracking).Error; err != nil { + return 0, err + } + + return tracking.LatestInformativeBlockHeight, nil +} + +func IsTrackingInit(ctx context.Context, dbTx *gorm.DB) (bool, error) { + var tracking Tracking + if err := dbTx.WithContext(ctx).First(&tracking).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return false, nil + } + return false, err + } + return true, nil +} + +func InitTracking(ctx context.Context, dbTx *gorm.DB) error { + tracking := Tracking{ + TxCount: 0, + LatestInformativeBlockHeight: 0, + } + return dbTx.WithContext(ctx).Create(&tracking).Error +} + +func UpdateTxCount(ctx context.Context, dbTx *gorm.DB, txCount int64, height int64) error { + var tracking Tracking + if err := dbTx.WithContext(ctx).First(&tracking).Error; err != nil { + return err + } + + return dbTx.WithContext(ctx). + Model(&tracking). + Where("1 = 1"). + Update("tx_count", gorm.Expr("tx_count + ?", txCount)). + Update("latest_informative_block_height", height).Error +} + +func InsertHistoricalVotingPowers(ctx context.Context, dbTx *gorm.DB, historicalVotingPowers []ValidatorHistoricalPower) error { + if len(historicalVotingPowers) == 0 { + return nil + } + + return dbTx.WithContext(ctx).CreateInBatches(historicalVotingPowers, BatchSize).Error +} + +func QueryLatestInformativeBlockHeight(ctx context.Context, dbTx *gorm.DB) (int64, error) { + var tracking Tracking + if err := dbTx.WithContext(ctx).First(&tracking).Error; err != nil { + return 0, err + } + + return int64(tracking.LatestInformativeBlockHeight), nil +} + +func QueryValidatorCommitSignatures(ctx context.Context, dbTx *gorm.DB, height, lookbackBlocks int64) ([]ValidatorCommitSignature, error) { + var votes []ValidatorCommitSignature + result := dbTx.WithContext(ctx). + Model(&ValidatorCommitSignature{}). + Select("validator_address, vote, block_height"). + Where("block_height < ? AND block_height >= ?", height, height-lookbackBlocks). + Scan(&votes) + + return votes, result.Error +} + +func TruncateTable(ctx context.Context, dbTx *gorm.DB, table string) error { + return dbTx.WithContext(ctx).Exec(fmt.Sprintf("TRUNCATE TABLE %s", table)).Error +} + +func InsertValidatorVoteCounts(ctx context.Context, dbTx *gorm.DB, validatorVoteCounts []ValidatorVoteCount) error { + if len(validatorVoteCounts) == 0 { + return nil + } + + return dbTx.WithContext(ctx).CreateInBatches(validatorVoteCounts, BatchSize).Error +} + +// UpsertValidatorVoteCountLast10000 inserts or updates only last_10000 for validator vote counts. +func UpsertValidatorVoteCountLast10000(ctx context.Context, dbTx *gorm.DB, validatorVoteCounts []ValidatorVoteCount) error { + if len(validatorVoteCounts) == 0 { + return nil + } + return dbTx.WithContext(ctx). + Clauses(clause.OnConflict{ + Columns: []clause.Column{{Name: "validator_address"}}, + DoUpdates: clause.AssignmentColumns([]string{"last_10000"}), + }). + CreateInBatches(validatorVoteCounts, BatchSize).Error +} + +func DeleteValidatorCommitSignatures(ctx context.Context, dbTx *gorm.DB, height int64) error { + return dbTx.WithContext(ctx). + Model(&ValidatorCommitSignature{}). + Where("block_height < ?", height). + Delete(&ValidatorCommitSignature{}).Error +} + +func QueryValidatorAddress(ctx context.Context, dbTx *gorm.DB, consensusAddress string) (*string, error) { + var validator ValidatorAddress + result := dbTx.WithContext(ctx). + Table(TableNameValidator). + Select("operator_address, account_id, consensus_address"). + Where("consensus_address = ?", consensusAddress). + Limit(1). + Scan(&validator) + + if result.Error != nil { + return nil, result.Error + } + + if result.RowsAffected == 0 { + return nil, nil + } + + return &validator.OperatorAddress, nil +} + +func InsertValidatorSlashEvents(ctx context.Context, dbTx *gorm.DB, validatorSlashEvents []ValidatorSlashEvent) error { + if len(validatorSlashEvents) == 0 { + return nil + } + + return dbTx.WithContext(ctx).CreateInBatches(validatorSlashEvents, BatchSize).Error +} + +func InsertModuleProposalsIgnoreConflict(ctx context.Context, dbTx *gorm.DB, moduleProposals []ModuleProposal) error { + if len(moduleProposals) == 0 { + return nil + } + + result := dbTx.WithContext(ctx). + Clauses(clause.OnConflict{ + DoNothing: true, + }). + Create(&moduleProposals) + return result.Error +} diff --git a/pkg/db/embed.go b/pkg/db/embed.go new file mode 100644 index 00000000..13d72a20 --- /dev/null +++ b/pkg/db/embed.go @@ -0,0 +1,8 @@ +package db + +import ( + "embed" +) + +//go:embed custom_types.sql +var customTypesSQLFile embed.FS diff --git a/pkg/db/migrate.go b/pkg/db/migrate.go new file mode 100644 index 00000000..07e80e38 --- /dev/null +++ b/pkg/db/migrate.go @@ -0,0 +1,256 @@ +package db + +import ( + "context" + "database/sql" + "errors" + "fmt" + "io" + "os" + "sort" + "strings" + "time" + + "ariga.io/atlas-provider-gorm/gormschema" + "ariga.io/atlas/sql/migrate" + atlaspostgres "ariga.io/atlas/sql/postgres" + golangmigrate "github.com/golang-migrate/migrate/v4" + "github.com/golang-migrate/migrate/v4/database/postgres" + _ "github.com/golang-migrate/migrate/v4/source/file" + "github.com/rs/zerolog" + gormpostgres "gorm.io/driver/postgres" + "gorm.io/gorm" + + _ "github.com/lib/pq" +) + +const ( + AdminDBName string = "postgres" + SchemaName string = "public" + + TempGormModelsSQL string = "gorm_models.sql" + CustomTypesSQL string = "custom_types.sql" +) + +func GenerateMigrationFilesWithLivePostgres(pgHost, pgUser, name, migrationDir string) error { + ctx := context.Background() + + shadowDB := fmt.Sprintf("atlas_shadow_%d", time.Now().UnixNano()) + dsnAdmin := fmt.Sprintf("host=%s user=%s dbname=%s sslmode=disable", pgHost, pgUser, AdminDBName) + dsnShadow := fmt.Sprintf("host=%s user=%s dbname=%s sslmode=disable", pgHost, pgUser, shadowDB) + + adminConn, err := sql.Open("postgres", dsnAdmin) + if err != nil { + return fmt.Errorf("could not connect to admin db: %w", err) + } + defer adminConn.Close() + + _, err = adminConn.ExecContext(ctx, fmt.Sprintf("CREATE DATABASE %s", shadowDB)) + if err != nil { + return fmt.Errorf("could not create database %s: %w", shadowDB, err) + } + defer adminConn.ExecContext(ctx, fmt.Sprintf("DROP DATABASE IF EXISTS %s", shadowDB)) + + shadowConn, err := sql.Open("postgres", dsnShadow) + if err != nil { + return fmt.Errorf("could not connect to shadow db: %w", err) + } + defer shadowConn.Close() + + drv, err := atlaspostgres.Open(shadowConn) + if err != nil { + return fmt.Errorf("could not connect to shadow postgres: %w", err) + } + + dir, err := migrate.NewLocalDir(migrationDir) + if err != nil { + return fmt.Errorf("could not open migration dir: %w", err) + } + + exec, err := migrate.NewExecutor(drv, dir, migrate.NopRevisionReadWriter{}) + if err != nil { + return fmt.Errorf("could not create new migration executor: %w", err) + } + + if err = executeUpMigrationFiles(ctx, dir, exec); err != nil { + return fmt.Errorf("could not apply migrations: %w", err) + } + + current, err := drv.InspectSchema(ctx, SchemaName, nil) + if err != nil { + return fmt.Errorf("could not inspect schema: %w", err) + } + + gormDBName := fmt.Sprintf("gorm_model_%d", time.Now().UnixNano()) + gormDsn := fmt.Sprintf("host=%s user=%s dbname=%s sslmode=disable", pgHost, pgUser, gormDBName) + + _, err = adminConn.ExecContext(ctx, fmt.Sprintf("CREATE DATABASE %s", gormDBName)) + if err != nil { + return fmt.Errorf("could not create database %s: %w", shadowDB, err) + } + defer func() { + _, err := adminConn.ExecContext(ctx, fmt.Sprintf("DROP DATABASE IF EXISTS %s", gormDBName)) + if err != nil { + fmt.Println(err) + } + }() + + gormConn, err := sql.Open("postgres", gormDsn) + if err != nil { + return fmt.Errorf("could not connect to gorm db: %w", err) + } + defer gormConn.Close() + + gormDB, err := gorm.Open(gormpostgres.New(gormpostgres.Config{DSN: gormDsn}), &gorm.Config{}) + if err != nil { + return fmt.Errorf("could not connect to gorm db: %w", err) + } + defer func() { + db, err := gormDB.DB() + if err == nil { + db.Close() + } + }() + + loader := gormschema.New("postgres", gormschema.WithConfig(gormDB.Config)) + srcDDL, err := loader.Load(AllModels...) + if err != nil { + return fmt.Errorf("could not load all models: %w", err) + } + + memDrv, err := atlaspostgres.Open(gormConn) + if err != nil { + return fmt.Errorf("could not connect to gorm postgres: %w", err) + } + + td, err := os.MkdirTemp("", "atlas-gorm-*") + if err != nil { + return fmt.Errorf("could not create temp dir: %w", err) + } + defer func() { + err := os.RemoveAll(td) + if err != nil { + fmt.Printf("could not remove %s, manually remove it", td) + } + }() + + tmpDir, err := migrate.NewLocalDir(td) + if err != nil { + return fmt.Errorf("could not create temporary local dir: %w", err) + } + + customTypes, err := customTypesSQLFile.Open(CustomTypesSQL) + if err != nil { + return fmt.Errorf("could not open embedded custom types: %w", err) + } + defer customTypes.Close() + + customTypesContent, err := io.ReadAll(customTypes) + if err != nil { + return fmt.Errorf("could not read embedded custom types: %w", err) + } + + if err := tmpDir.WriteFile(CustomTypesSQL, customTypesContent); err != nil { + return fmt.Errorf("could not write embedded custom types: %w", err) + } + + if err := tmpDir.WriteFile(TempGormModelsSQL, []byte(srcDDL)); err != nil { + return fmt.Errorf("could not write temporary file: %w", err) + } + + memExec, err := migrate.NewExecutor(memDrv, tmpDir, migrate.NopRevisionReadWriter{}) + if err != nil { + return fmt.Errorf("could not create new migration executor: %w", err) + } + + tmpFiles, err := tmpDir.Files() + if err != nil { + return fmt.Errorf("could not get temp files: %w", err) + } + if err := memExec.ExecuteFiles(ctx, tmpFiles); err != nil { + return fmt.Errorf("could not execute migration: %w", err) + } + + desired, err := memDrv.InspectSchema(ctx, SchemaName, nil) + if err != nil { + return fmt.Errorf("could not inspect schema: %w", err) + } + + planner := migrate.NewPlanner(drv, dir) + planName := fmt.Sprintf("%s.up", name) + + changes, err := drv.SchemaDiff(current, desired) + if err != nil { + return fmt.Errorf("schema diff: %w", err) + } + + if len(changes) == 0 { + fmt.Println("No schema changes detected.") + return nil + } + + plan, err := drv.PlanChanges(ctx, planName, changes) + if err != nil { + return fmt.Errorf("plan changes: %w", err) + } + + if err := planner.WritePlan(plan); err != nil { + return fmt.Errorf("write migration: %w", err) + } + + fmt.Println("Migration file generated:", planName) + return nil +} + +func executeUpMigrationFiles(ctx context.Context, migrationDir *migrate.LocalDir, executor *migrate.Executor) error { + files, err := migrationDir.Files() + if err != nil { + return fmt.Errorf("read migration files: %w", err) + } + + sort.Slice(files, func(i, j int) bool { return files[i].Name() < files[j].Name() }) + var result []migrate.File + for _, f := range files { + if strings.HasSuffix(f.Name(), ".up.sql") { + result = append(result, f) + } + } + + return executor.ExecuteFiles(ctx, result) +} + +// ApplyMigrationFiles applies pending migrations to the database using golang-migrate +func ApplyMigrationFiles(logger *zerolog.Logger, dbClient *gorm.DB, migrationsDir string) error { + sqlDB, err := dbClient.DB() + if err != nil { + return fmt.Errorf("failed to get database connection: %w", err) + } + + driver, err := postgres.WithInstance(sqlDB, &postgres.Config{}) + if err != nil { + return fmt.Errorf("failed to create postgres driver: %w", err) + } + + sourceURL := fmt.Sprintf("file://%s", migrationsDir) + m, err := golangmigrate.NewWithDatabaseInstance( + sourceURL, + "postgres", + driver, + ) + if err != nil { + return fmt.Errorf("failed to create migrate instance: %w", err) + } + + err = m.Up() + if err != nil && !errors.Is(err, golangmigrate.ErrNoChange) { + return fmt.Errorf("failed to apply migrations: %w", err) + } + + if errors.Is(err, golangmigrate.ErrNoChange) { + logger.Info().Msgf("No pending migrations to apply") + } else { + logger.Info().Msgf("Successfully applied all pending migrations") + } + + return nil +} diff --git a/pkg/db/models.gen.go b/pkg/db/models.gen.go new file mode 100644 index 00000000..0312bf87 --- /dev/null +++ b/pkg/db/models.gen.go @@ -0,0 +1,40 @@ +// Code generated by models.go DO NOT EDIT. +package db + +var AllModels = []any{ + &AccountTransaction{}, + &Account{}, + &Block{}, + &CollectionMutationEvent{}, + &CollectionProposal{}, + &CollectionTransaction{}, + &Collection{}, + &FinalizeBlockEvent{}, + &LcdTxResult{}, + &ModuleHistory{}, + &ModuleProposal{}, + &ModuleTransaction{}, + &Module{}, + &MoveEvent{}, + &NftHistory{}, + &NftMutationEvent{}, + &NftProposal{}, + &NftTransaction{}, + &Nft{}, + &OpinitTransaction{}, + &ProposalDeposit{}, + &ProposalVote{}, + &ProposalVotesLegacy{}, + &Proposal{}, + &SchemaMigration{}, + &Tracking{}, + &TransactionEvent{}, + &Transaction{}, + &ValidatorBondedTokenChange{}, + &ValidatorCommitSignature{}, + &ValidatorHistoricalPower{}, + &ValidatorSlashEvent{}, + &ValidatorVoteCount{}, + &Validator{}, + &VMAddress{}, +} diff --git a/pkg/db/models.go b/pkg/db/models.go new file mode 100644 index 00000000..d9628d9a --- /dev/null +++ b/pkg/db/models.go @@ -0,0 +1,66 @@ +package db + +import ( + "go/ast" + "go/parser" + "go/token" + "log" + "os" + "text/template" +) + +func GenerateAllModels() { + const sourceFile = "table.go" + const outputFile = "models.gen.go" + + fset := token.NewFileSet() + node, err := parser.ParseFile(fset, sourceFile, nil, parser.AllErrors) + if err != nil { + log.Fatalf("parse error: %v", err) + } + + var structs []string + for _, decl := range node.Decls { + genDecl, ok := decl.(*ast.GenDecl) + if !ok || genDecl.Tok != token.TYPE { + continue + } + for _, spec := range genDecl.Specs { + ts, ok := spec.(*ast.TypeSpec) + if !ok { + continue + } + if _, ok := ts.Type.(*ast.StructType); ok { + structs = append(structs, ts.Name.Name) + } + } + } + + if len(structs) == 0 { + log.Println("no structs found") + return + } + + tmpl := template.Must(template.New("models").Parse(`// Code generated by models.go DO NOT EDIT. +package db + +var AllModels = []any{ +{{- range . }} + &{{ . }}{}, +{{- end }} +} +`)) + + out, err := os.Create(outputFile) + if err != nil { + log.Fatalf("cannot create file: %v", err) + } + defer out.Close() + + err = tmpl.Execute(out, structs) + if err != nil { + log.Fatalf("cannot execute template: %v", err) + } + + log.Println("Generated AllModels with", len(structs), "entries") +} diff --git a/pkg/db/move.go b/pkg/db/move.go new file mode 100644 index 00000000..aec44be2 --- /dev/null +++ b/pkg/db/move.go @@ -0,0 +1,24 @@ +package db + +import ( + "fmt" + + movetypes "github.com/initia-labs/initia/x/move/types" + vmapi "github.com/initia-labs/movevm/api" +) + +func GetUpgradePolicy(policy movetypes.UpgradePolicy) string { + switch policy { + case movetypes.UpgradePolicy_UNSPECIFIED: + return string(Arbitrary) + case movetypes.UpgradePolicy_COMPATIBLE: + return string(Compatible) + case movetypes.UpgradePolicy_IMMUTABLE: + return string(Immutable) + } + panic("invalid upgrade policy") +} + +func GetModuleID(module vmapi.ModuleInfoResponse) string { + return fmt.Sprintf("%s::%s", module.Address.String(), module.Name) +} diff --git a/pkg/db/sql_types.go b/pkg/db/sql_types.go new file mode 100644 index 00000000..86719797 --- /dev/null +++ b/pkg/db/sql_types.go @@ -0,0 +1,56 @@ +package db + +import ( + "database/sql/driver" + "encoding/json" + "errors" + "fmt" +) + +// JSON custom type for JSON fields +type JSON json.RawMessage + +// Scan scans value into JSON, implements sql.Scanner interface +func (j *JSON) Scan(value any) error { + bytes, ok := value.([]byte) + if !ok { + return errors.New(fmt.Sprint("Failed to unmarshal JSON value:", value)) + } + + result := json.RawMessage{} + err := json.Unmarshal(bytes, &result) + *j = JSON(result) + return err +} + +// Value return json value, implement driver.Valuer interface +func (j JSON) Value() (driver.Value, error) { + if len(j) == 0 { + return nil, nil + } + return json.RawMessage(j).MarshalJSON() +} + +// JSONB custom type for PostgreSQL JSONB fields +type JSONB json.RawMessage + +// Scan scans value into JSONB, implements sql.Scanner interface +func (j *JSONB) Scan(value any) error { + bytes, ok := value.([]byte) + if !ok { + return errors.New(fmt.Sprint("Failed to unmarshal JSONB value:", value)) + } + + result := json.RawMessage{} + err := json.Unmarshal(bytes, &result) + *j = JSONB(result) + return err +} + +// Value return jsonb value, implement driver.Valuer interface +func (j JSONB) Value() (driver.Value, error) { + if len(j) == 0 { + return nil, nil + } + return json.RawMessage(j).MarshalJSON() +} diff --git a/pkg/db/table.go b/pkg/db/table.go new file mode 100644 index 00000000..28dfc3e9 --- /dev/null +++ b/pkg/db/table.go @@ -0,0 +1,761 @@ +package db + +import ( + "time" +) + +const ( + TableNameAccountTransaction = "account_transactions" + TableNameAccount = "accounts" + TableNameBlock = "blocks" + TableNameCollectionMutationEvent = "collection_mutation_events" + TableNameCollectionProposal = "collection_proposals" + TableNameCollectionTransaction = "collection_transactions" + TableNameCollection = "collections" + TableNameFinalizeBlockEvent = "finalize_block_events" + TableNameLcdTxResult = "lcd_tx_results" + TableNameModuleHistory = "module_histories" + TableNameModuleProposal = "module_proposals" + TableNameModuleTransaction = "module_transactions" + TableNameModule = "modules" + TableNameMoveEvent = "move_events" + TableNameNftHistory = "nft_histories" + TableNameNftMutationEvent = "nft_mutation_events" + TableNameNftProposal = "nft_proposals" + TableNameNftTransaction = "nft_transactions" + TableNameNft = "nfts" + TableNameOpinitTransaction = "opinit_transactions" + TableNameProposalDeposit = "proposal_deposits" + TableNameProposalVote = "proposal_votes" + TableNameProposalVotesLegacy = "proposal_votes_legacy" + TableNameProposal = "proposals" + TableNameSchemaMigration = "schema_migrations" + TableNameTracking = "tracking" + TableNameTransactionEvent = "transaction_events" + TableNameTransaction = "transactions" + TableNameValidatorBondedTokenChange = "validator_bonded_token_changes" + TableNameValidatorCommitSignature = "validator_commit_signatures" + TableNameValidatorHistoricalPower = "validator_historical_powers" + TableNameValidatorSlashEvent = "validator_slash_events" + TableNameValidatorVoteCount = "validator_vote_counts" + TableNameValidator = "validators" + TableNameVMAddress = "vm_addresses" +) + +// AccountTransaction mapped from table +type AccountTransaction struct { + IsSigner bool `gorm:"column:is_signer;not null;index:ix_account_transactions_signer,priority:2" json:"is_signer"` + BlockHeight int64 `gorm:"column:block_height;not null;index:ix_account_transactions_account_id_block_height_desc,priority:2,sort:desc;index:ix_account_transactions_signer,priority:3,sort:desc" json:"block_height"` + TransactionID string `gorm:"column:transaction_id;primaryKey;type:character varying" json:"transaction_id"` + AccountID string `gorm:"column:account_id;primaryKey;type:character varying;index:ix_account_transactions_account_id_block_height_desc,priority:1;index:ix_account_transactions_signer,priority:1" json:"account_id"` + // Foreign key relationships + Account Account `gorm:"foreignKey:AccountID;references:Address" json:"-"` + Block Block `gorm:"foreignKey:BlockHeight;references:Height" json:"-"` + Transaction Transaction `gorm:"foreignKey:TransactionID;references:ID" json:"-"` +} + +// TableName AccountTransaction's table name +func (*AccountTransaction) TableName() string { + return TableNameAccountTransaction +} + +// Account mapped from table +type Account struct { + Address string `gorm:"column:address;primaryKey;type:character varying" json:"address"` + Type string `gorm:"column:type;type:accounttype" json:"type"` + Name string `gorm:"column:name;type:character varying" json:"name"` + VMAddressID string `gorm:"column:vm_address_id;type:character varying" json:"vm_address_id"` + + // Foreign key relationship + VMAddress VMAddress `gorm:"foreignKey:VMAddressID;references:VMAddress" json:"-"` +} + +// TableName Account's table name +func (*Account) TableName() string { + return TableNameAccount +} + +// Block mapped from table +type Block struct { + Height int64 `gorm:"column:height;primaryKey;autoIncrement:true" json:"height"` + Timestamp time.Time `gorm:"column:timestamp;not null;type:timestamp;index:ix_blocks_timestamp" json:"timestamp"` + Proposer *string `gorm:"column:proposer;type:character varying" json:"proposer"` + Hash []byte `gorm:"column:hash;not null" json:"hash"` + + // Foreign key relationship + ProposerValidator Validator `gorm:"foreignKey:Proposer;references:OperatorAddress" json:"-"` +} + +// TableName Block's table name +func (*Block) TableName() string { + return TableNameBlock +} + +// CollectionMutationEvent mapped from table +type CollectionMutationEvent struct { + MutatedFieldName string `gorm:"column:mutated_field_name;not null;type:character varying" json:"mutated_field_name"` + OldValue string `gorm:"column:old_value;not null;type:character varying" json:"old_value"` + NewValue string `gorm:"column:new_value;not null;type:character varying" json:"new_value"` + BlockHeight int64 `gorm:"column:block_height;not null;index:ix_collection_mutation_events_block_height" json:"block_height"` + Remark JSON `gorm:"column:remark;type:json;not null" json:"remark"` + ProposalID *int32 `gorm:"column:proposal_id" json:"proposal_id"` + TxID string `gorm:"column:tx_id;type:character varying" json:"tx_id"` + CollectionID string `gorm:"column:collection_id;type:character varying" json:"collection_id"` + + // Foreign key relationships + Block Block `gorm:"foreignKey:BlockHeight;references:Height" json:"-"` + Collection Collection `gorm:"foreignKey:CollectionID;references:ID" json:"-"` + Proposal Proposal `gorm:"foreignKey:ProposalID;references:ID" json:"-"` + Transaction Transaction `gorm:"foreignKey:TxID;references:ID" json:"-"` +} + +// TableName CollectionMutationEvent's table name +func (*CollectionMutationEvent) TableName() string { + return TableNameCollectionMutationEvent +} + +// CollectionProposal mapped from table +type CollectionProposal struct { + ProposalID int32 `gorm:"column:proposal_id;not null" json:"proposal_id"` + CollectionID string `gorm:"column:collection_id" json:"collection_id"` + NftID string `gorm:"column:nft_id" json:"nft_id"` + + // Foreign key relationships + Collection Collection `gorm:"foreignKey:CollectionID;references:ID" json:"-"` + Nft Nft `gorm:"foreignKey:NftID;references:ID" json:"-"` + Proposal Proposal `gorm:"foreignKey:ProposalID;references:ID" json:"-"` +} + +// TableName CollectionProposal's table name +func (*CollectionProposal) TableName() string { + return TableNameCollectionProposal +} + +// CollectionTransaction mapped from table +type CollectionTransaction struct { + IsNftTransfer bool `gorm:"column:is_nft_transfer;not null" json:"is_nft_transfer"` + IsNftMint bool `gorm:"column:is_nft_mint;not null" json:"is_nft_mint"` + IsNftBurn bool `gorm:"column:is_nft_burn;not null" json:"is_nft_burn"` + IsCollectionCreate bool `gorm:"column:is_collection_create;not null" json:"is_collection_create"` + BlockHeight int64 `gorm:"column:block_height;not null;index:ix_collection_transactions_block_height;index:ix_collection_transactions_collection_id_block_height,priority:2" json:"block_height"` + TxID string `gorm:"column:tx_id;type:character varying;index:ix_collection_transactions_tx_id" json:"tx_id"` + CollectionID string `gorm:"column:collection_id;type:character varying;index:ix_collection_transactions_collection_id;index:ix_collection_transactions_collection_id_block_height,priority:1" json:"collection_id"` + NftID *string `gorm:"column:nft_id;type:character varying;index:ix_collection_transactions_nft_id" json:"nft_id"` + + // Foreign key relationships + Block Block `gorm:"foreignKey:BlockHeight;references:Height" json:"-"` + Collection Collection `gorm:"foreignKey:CollectionID;references:ID" json:"-"` + Nft Nft `gorm:"foreignKey:NftID;references:ID" json:"-"` + Transaction Transaction `gorm:"foreignKey:TxID;references:ID" json:"-"` +} + +// TableName CollectionTransaction's table name +func (*CollectionTransaction) TableName() string { + return TableNameCollectionTransaction +} + +// Collection mapped from table +type Collection struct { + BlockHeight int64 `gorm:"column:block_height;not null;index:ix_collections_block_height" json:"block_height"` + URI string `gorm:"column:uri;not null;type:character varying" json:"uri"` + Description string `gorm:"column:description;not null;type:character varying" json:"description"` + Name string `gorm:"column:name;not null;type:character varying" json:"name"` + ID string `gorm:"column:id;primaryKey;type:text" json:"id"` + Creator string `gorm:"column:creator;type:text;index:ix_collections_creator" json:"creator"` + + // Foreign key relationships + Block Block `gorm:"foreignKey:BlockHeight;references:Height" json:"-"` + CollectionAddr VMAddress `gorm:"foreignKey:ID;references:VMAddress" json:"-"` + CreatorAddr VMAddress `gorm:"foreignKey:Creator;references:VMAddress" json:"-"` +} + +// TableName Collection's table name +func (*Collection) TableName() string { + return TableNameCollection +} + +// FinalizeBlockEvent mapped from table +type FinalizeBlockEvent struct { + BlockHeight int64 `gorm:"column:block_height;primaryKey;index:ix_finalize_block_events_event_key_block_height_desc,priority:2,sort:desc" json:"block_height"` + EventKey string `gorm:"column:event_key;not null;type:character varying;index:ix_finalize_block_events_event_key_block_height_desc,priority:1" json:"event_key"` + EventValue string `gorm:"column:event_value;not null;type:character varying" json:"event_value"` + EventIndex int `gorm:"column:event_index;primaryKey;type:integer" json:"event_index"` + Mode string `gorm:"column:mode;not null;type:finalize_block_events_mode" json:"mode"` +} + +// TableName FinalizeBlockEvent's table name +func (*FinalizeBlockEvent) TableName() string { + return TableNameFinalizeBlockEvent +} + +// LcdTxResult mapped from table +type LcdTxResult struct { + BlockHeight int64 `gorm:"column:block_height;not null;index:ix_lcd_tx_results_block_height" json:"block_height"` + Result JSON `gorm:"column:result;not null;type:json" json:"result"` + TransactionID string `gorm:"column:transaction_id;type:character varying" json:"transaction_id"` + + // Foreign key relationships + Block Block `gorm:"foreignKey:BlockHeight;references:Height" json:"-"` + Transaction Transaction `gorm:"foreignKey:TransactionID;references:ID" json:"-"` +} + +// TableName LcdTxResult's table name +func (*LcdTxResult) TableName() string { + return TableNameLcdTxResult +} + +// ModuleHistory mapped from table +type ModuleHistory struct { + UpgradePolicy string `gorm:"column:upgrade_policy;not null;type:upgradepolicy" json:"upgrade_policy"` + BlockHeight int64 `gorm:"column:block_height;not null;index:ix_module_histories_block_height" json:"block_height"` + Remark JSON `gorm:"column:remark;not null;type:json" json:"remark"` + ProposalID *int32 `gorm:"column:proposal_id" json:"proposal_id"` + TxID *string `gorm:"column:tx_id;type:character varying" json:"tx_id"` + ModuleID string `gorm:"column:module_id;type:character varying;index:ix_module_histories_module_id" json:"module_id"` + + // Foreign key relationships + Block Block `gorm:"foreignKey:BlockHeight;references:Height" json:"-"` + Module Module `gorm:"foreignKey:ModuleID;references:ID" json:"-"` + Proposal Proposal `gorm:"foreignKey:ProposalID;references:ID" json:"-"` + Transaction Transaction `gorm:"foreignKey:TxID;references:ID" json:"-"` +} + +// TableName ModuleHistory's table name +func (*ModuleHistory) TableName() string { + return TableNameModuleHistory +} + +// ModuleProposal mapped from table +type ModuleProposal struct { + ProposalID int32 `gorm:"column:proposal_id;primaryKey" json:"proposal_id"` + ModuleID string `gorm:"column:module_id;primaryKey;type:character varying" json:"module_id"` + + // Foreign key relationships + Module Module `gorm:"foreignKey:ModuleID;references:ID" json:"-"` + Proposal Proposal `gorm:"foreignKey:ProposalID;references:ID" json:"-"` +} + +// TableName ModuleProposal's table name +func (*ModuleProposal) TableName() string { + return TableNameModuleProposal +} + +// ModuleTransaction mapped from table +type ModuleTransaction struct { + IsEntry bool `gorm:"column:is_entry;not null" json:"is_entry"` + BlockHeight int64 `gorm:"column:block_height;not null;index:ix_module_transactions_block_height;index:ix_module_transactions_module_id_block_height_desc,priority:2,sort:desc" json:"block_height"` + TxID string `gorm:"column:tx_id;type:character varying" json:"tx_id"` + ModuleID string `gorm:"column:module_id;type:character varying;index:ix_module_transactions_module_id_block_height_desc,priority:1" json:"module_id"` + + // Foreign key relationships + Block Block `gorm:"foreignKey:BlockHeight;references:Height" json:"-"` + Module Module `gorm:"foreignKey:ModuleID;references:ID" json:"-"` + Transaction Transaction `gorm:"foreignKey:TxID;references:ID" json:"-"` +} + +// TableName ModuleTransaction's table name +func (*ModuleTransaction) TableName() string { + return TableNameModuleTransaction +} + +// Module mapped from table +type Module struct { + Name string `gorm:"column:name;not null;type:varchar" json:"name"` + UpgradePolicy string `gorm:"column:upgrade_policy;not null;type:upgradepolicy" json:"upgrade_policy"` + ModuleEntryExecuted int32 `gorm:"column:module_entry_executed;not null" json:"module_entry_executed"` + IsVerify bool `gorm:"column:is_verify;not null" json:"is_verify"` + PublishTxID *string `gorm:"column:publish_tx_id;type:character varying" json:"publish_tx_id"` + PublisherID string `gorm:"column:publisher_id;type:character varying" json:"publisher_id"` + ID string `gorm:"column:id;primaryKey;type:character varying" json:"id"` + Digest string `gorm:"column:digest;type:character varying" json:"digest"` + + // Foreign key relationships + PublishTx Transaction `gorm:"foreignKey:PublishTxID;references:ID" json:"-"` + Publisher VMAddress `gorm:"foreignKey:PublisherID;references:VMAddress" json:"-"` +} + +// TableName Module's table name +func (*Module) TableName() string { + return TableNameModule +} + +// MoveEvent mapped from table +type MoveEvent struct { + TypeTag string `gorm:"column:type_tag;not null;type:character varying;index:ix_move_events_type_tag_block_height_desc,priority:1" json:"type_tag"` + Data JSONB `gorm:"column:data;not null;type:jsonb" json:"data"` + BlockHeight int64 `gorm:"column:block_height;primaryKey;index:ix_move_events_type_tag_block_height_desc,priority:2,sort:desc" json:"block_height"` + TransactionHash string `gorm:"column:transaction_hash;primaryKey;type:character varying" json:"transaction_hash"` + EventIndex int `gorm:"column:event_index;primaryKey;type:integer" json:"event_index"` +} + +// TableName MoveEvent's table name +func (*MoveEvent) TableName() string { + return TableNameMoveEvent +} + +// NftHistory mapped from table +type NftHistory struct { + BlockHeight int64 `gorm:"column:block_height;not null;index:ix_nft_histories_block_height" json:"block_height"` + Remark JSON `gorm:"column:remark;type:json;not null" json:"remark"` + ProposalID *int32 `gorm:"column:proposal_id" json:"proposal_id"` + TxID string `gorm:"column:tx_id;type:character varying" json:"tx_id"` + From string `gorm:"column:from;type:character varying" json:"from"` + To string `gorm:"column:to;type:character varying" json:"to"` + NftID string `gorm:"column:nft_id;type:character varying" json:"nft_id"` + + // Foreign key relationships + Block Block `gorm:"foreignKey:BlockHeight;references:Height" json:"-"` + FromAddr VMAddress `gorm:"foreignKey:From;references:VMAddress" json:"-"` + Nft Nft `gorm:"foreignKey:NftID;references:ID" json:"-"` + Proposal Proposal `gorm:"foreignKey:ProposalID;references:ID" json:"-"` + ToAddr VMAddress `gorm:"foreignKey:To;references:VMAddress" json:"-"` + Transaction Transaction `gorm:"foreignKey:TxID;references:ID" json:"-"` +} + +// TableName NftHistory's table name +func (*NftHistory) TableName() string { + return TableNameNftHistory +} + +// NftMutationEvent mapped from table +type NftMutationEvent struct { + MutatedFieldName string `gorm:"column:mutated_field_name;not null;type:character varying" json:"mutated_field_name"` + OldValue string `gorm:"column:old_value;not null;type:character varying" json:"old_value"` + NewValue string `gorm:"column:new_value;not null;type:character varying" json:"new_value"` + BlockHeight int64 `gorm:"column:block_height;not null;index:ix_nft_mutation_events_block_height" json:"block_height"` + Remark JSON `gorm:"column:remark;type:json;not null" json:"remark"` + ProposalID *int32 `gorm:"column:proposal_id" json:"proposal_id"` + TxID string `gorm:"column:tx_id;type:character varying" json:"tx_id"` + NftID string `gorm:"column:nft_id;type:character varying" json:"nft_id"` + + // Foreign key relationships + Block Block `gorm:"foreignKey:BlockHeight;references:Height" json:"-"` + Nft Nft `gorm:"foreignKey:NftID;references:ID" json:"-"` + Proposal Proposal `gorm:"foreignKey:ProposalID;references:ID" json:"-"` + Transaction Transaction `gorm:"foreignKey:TxID;references:ID" json:"-"` +} + +// TableName NftMutationEvent's table name +func (*NftMutationEvent) TableName() string { + return TableNameNftMutationEvent +} + +// NftProposal mapped from table +type NftProposal struct { + NftID string `gorm:"column:nft_id;type:character varying" json:"nft_id"` + ProposalID int32 `gorm:"column:proposal_id;not null" json:"proposal_id"` + + // Foreign key relationships + Nft Nft `gorm:"foreignKey:NftID;references:ID" json:"-"` + Proposal Proposal `gorm:"foreignKey:ProposalID;references:ID" json:"-"` +} + +// TableName NftProposal's table name +func (*NftProposal) TableName() string { + return TableNameNftProposal +} + +// NftTransaction mapped from table +type NftTransaction struct { + IsNftTransfer bool `gorm:"column:is_nft_transfer;not null" json:"is_nft_transfer"` + IsNftMint bool `gorm:"column:is_nft_mint;not null" json:"is_nft_mint"` + IsNftBurn bool `gorm:"column:is_nft_burn;not null" json:"is_nft_burn"` + BlockHeight int64 `gorm:"column:block_height;not null;index:ix_nft_transactions_block_height;index:ix_nft_transactions_nft_id_block_height_desc,priority:2,sort:desc" json:"block_height"` + TxID string `gorm:"column:tx_id;type:character varying" json:"tx_id"` + NftID string `gorm:"column:nft_id;type:character varying;index:ix_nft_transactions_nft_id_block_height_desc,priority:1" json:"nft_id"` + + // Foreign key relationships + Block Block `gorm:"foreignKey:BlockHeight;references:Height" json:"-"` + Nft Nft `gorm:"foreignKey:NftID;references:ID" json:"-"` + Transaction Transaction `gorm:"foreignKey:TxID;references:ID" json:"-"` +} + +// TableName NftTransaction's table name +func (*NftTransaction) TableName() string { + return TableNameNftTransaction +} + +func NewNftMintTransaction(nftID, txID string, blockHeight int64) NftTransaction { + return NftTransaction{ + NftID: nftID, + IsNftMint: true, + BlockHeight: blockHeight, + TxID: txID, + } +} + +func NewNftTransferTransaction(nftID, txID string, blockHeight int64) NftTransaction { + return NftTransaction{ + NftID: nftID, + IsNftTransfer: true, + BlockHeight: blockHeight, + TxID: txID, + } +} + +func NewNftBurnTransaction(nftID, txID string, blockHeight int64) NftTransaction { + return NftTransaction{ + NftID: nftID, + IsNftBurn: true, + BlockHeight: blockHeight, + TxID: txID, + } +} + +// Nft mapped from table +type Nft struct { + URI string `gorm:"column:uri;not null;type:character varying" json:"uri"` + Description string `gorm:"column:description;not null;type:character varying" json:"description"` + TokenID string `gorm:"column:token_id;not null;type:character varying" json:"token_id"` + Remark JSON `gorm:"column:remark;type:json;not null" json:"remark"` + ProposalID *int32 `gorm:"column:proposal_id" json:"proposal_id"` + TxID *string `gorm:"column:tx_id;type:character varying;index:ix_nfts_tx_id" json:"tx_id"` + Owner string `gorm:"column:owner;type:character varying;index:ix_nfts_owner" json:"owner"` + ID string `gorm:"column:id;primaryKey;type:character varying" json:"id"` + Collection string `gorm:"column:collection;type:character varying;index:ix_nfts_collection" json:"collection"` + IsBurned bool `gorm:"column:is_burned;not null" json:"is_burned"` + + // Foreign key relationships + CollectionRef Collection `gorm:"foreignKey:Collection;references:ID" json:"-"` + NftAddr VMAddress `gorm:"foreignKey:ID;references:VMAddress" json:"-"` + OwnerAddr VMAddress `gorm:"foreignKey:Owner;references:VMAddress" json:"-"` + Proposal Proposal `gorm:"foreignKey:ProposalID;references:ID" json:"-"` + TxRef Transaction `gorm:"foreignKey:TxID;references:ID" json:"-"` +} + +// TableName Nft's table name +func (*Nft) TableName() string { + return TableNameNft +} + +// TODO: Remove this table +// OpinitTransaction mapped from table +type OpinitTransaction struct { + BridgeID int32 `gorm:"column:bridge_id;not null" json:"bridge_id"` + BlockHeight int64 `gorm:"column:block_height;not null;index:ix_opinit_transactions_block_height" json:"block_height"` + TxID string `gorm:"column:tx_id;type:character varying" json:"tx_id"` + + // Foreign key relationships + Block Block `gorm:"foreignKey:BlockHeight;references:Height" json:"-"` + Transaction Transaction `gorm:"foreignKey:TxID;references:ID" json:"-"` +} + +// TableName OpinitTransaction's table name +func (*OpinitTransaction) TableName() string { + return TableNameOpinitTransaction +} + +// ProposalDeposit mapped from table +type ProposalDeposit struct { + ProposalID int32 `gorm:"column:proposal_id;not null" json:"proposal_id"` + Amount JSON `gorm:"column:amount;not null;type:json" json:"amount"` + TransactionID string `gorm:"column:transaction_id;type:character varying" json:"transaction_id"` + Depositor string `gorm:"column:depositor;type:character varying" json:"depositor"` + + // Foreign key relationships + DepositorAccount Account `gorm:"foreignKey:Depositor;references:Address" json:"-"` + Proposal Proposal `gorm:"foreignKey:ProposalID;references:ID" json:"-"` + Transaction Transaction `gorm:"foreignKey:TransactionID;references:ID" json:"-"` +} + +// TableName ProposalDeposit's table name +func (*ProposalDeposit) TableName() string { + return TableNameProposalDeposit +} + +// ProposalVote mapped from table +type ProposalVote struct { + ProposalID int32 `gorm:"column:proposal_id;not null" json:"proposal_id"` + IsVoteWeighted bool `gorm:"column:is_vote_weighted;not null" json:"is_vote_weighted"` + IsValidator bool `gorm:"column:is_validator;not null" json:"is_validator"` + ValidatorAddress *string `gorm:"column:validator_address;type:character varying" json:"validator_address"` + Yes float64 `gorm:"column:yes;not null" json:"yes"` + No float64 `gorm:"column:no;not null" json:"no"` + Abstain float64 `gorm:"column:abstain;not null" json:"abstain"` + NoWithVeto float64 `gorm:"column:no_with_veto;not null" json:"no_with_veto"` + TransactionID string `gorm:"column:transaction_id;type:character varying" json:"transaction_id"` + Voter string `gorm:"column:voter;type:character varying" json:"voter"` + + // Foreign key relationships + Proposal Proposal `gorm:"foreignKey:ProposalID;references:ID" json:"-"` + Transaction Transaction `gorm:"foreignKey:TransactionID;references:ID" json:"-"` + Validator Validator `gorm:"foreignKey:ValidatorAddress;references:OperatorAddress" json:"-"` + VoterAccount Account `gorm:"foreignKey:Voter;references:Address" json:"-"` +} + +// TableName ProposalVote's table name +func (*ProposalVote) TableName() string { + return TableNameProposalVote +} + +// ProposalVotesLegacy mapped from table +type ProposalVotesLegacy struct { + ProposalID int32 `gorm:"column:proposal_id;not null" json:"proposal_id"` + IsVoteWeighted bool `gorm:"column:is_vote_weighted;not null" json:"is_vote_weighted"` + IsValidator bool `gorm:"column:is_validator;not null" json:"is_validator"` + ValidatorAddress string `gorm:"column:validator_address;type:character varying" json:"validator_address"` + Yes float64 `gorm:"column:yes;not null" json:"yes"` + No float64 `gorm:"column:no;not null" json:"no"` + Abstain float64 `gorm:"column:abstain;not null" json:"abstain"` + NoWithVeto float64 `gorm:"column:no_with_veto;not null" json:"no_with_veto"` + TransactionID string `gorm:"column:transaction_id;type:character varying" json:"transaction_id"` + Voter string `gorm:"column:voter;type:character varying" json:"voter"` + + // Foreign key relationships + Proposal Proposal `gorm:"foreignKey:ProposalID;references:ID" json:"-"` + Transaction Transaction `gorm:"foreignKey:TransactionID;references:ID" json:"-"` + Validator Validator `gorm:"foreignKey:ValidatorAddress;references:OperatorAddress" json:"-"` + VoterAccount Account `gorm:"foreignKey:Voter;references:Address" json:"-"` +} + +// TableName ProposalVotesLegacy's table name +func (*ProposalVotesLegacy) TableName() string { + return TableNameProposalVotesLegacy +} + +// Proposal mapped from table +type Proposal struct { + ID int32 `gorm:"column:id;primaryKey;autoIncrement:true" json:"id"` + Type string `gorm:"column:type;not null;type:character varying" json:"type"` + Title string `gorm:"column:title;not null;type:character varying" json:"title"` + Description string `gorm:"column:description;not null;type:character varying" json:"description"` + ProposalRoute string `gorm:"column:proposal_route;not null;type:character varying" json:"proposal_route"` + Status string `gorm:"column:status;not null;type:proposalstatus" json:"status"` + SubmitTime time.Time `gorm:"column:submit_time;not null;type:timestamp" json:"submit_time"` + DepositEndTime time.Time `gorm:"column:deposit_end_time;not null;type:timestamp" json:"deposit_end_time"` + VotingTime *time.Time `gorm:"column:voting_time;type:timestamp" json:"voting_time"` + VotingEndTime *time.Time `gorm:"column:voting_end_time;type:timestamp" json:"voting_end_time"` + Content JSON `gorm:"column:content;type:json" json:"content"` + TotalDeposit JSON `gorm:"column:total_deposit;not null;type:json" json:"total_deposit"` + Yes int64 `gorm:"column:yes;not null" json:"yes"` + No int64 `gorm:"column:no;not null" json:"no"` + Abstain int64 `gorm:"column:abstain;not null" json:"abstain"` + NoWithVeto int64 `gorm:"column:no_with_veto;not null" json:"no_with_veto"` + IsExpedited bool `gorm:"column:is_expedited;not null" json:"is_expedited"` + Version string `gorm:"column:version;not null;type:character varying" json:"version"` + ResolvedHeight *int64 `gorm:"column:resolved_height;index:ix_proposals_resolved_height" json:"resolved_height"` + Types JSON `gorm:"column:types;not null;type:json" json:"types"` + Messages JSON `gorm:"column:messages;not null;type:json" json:"messages"` + CreatedHeight int64 `gorm:"column:created_height" json:"created_height"` + Metadata string `gorm:"column:metadata;not null;type:character varying" json:"metadata"` + FailedReason string `gorm:"column:failed_reason;not null;type:character varying;default:''" json:"failed_reason"` + ResolvedVotingPower *int64 `gorm:"column:resolved_voting_power" json:"resolved_voting_power"` + CreatedTx string `gorm:"column:created_tx;type:character varying" json:"created_tx"` + ProposerID string `gorm:"column:proposer_id;type:character varying" json:"proposer_id"` + IsEmergency bool `gorm:"column:is_emergency;not null;default:false" json:"is_emergency"` + EmergencyStartTime *time.Time `gorm:"column:emergency_start_time;type:timestamp" json:"emergency_start_time"` + EmergencyNextTallyTime *time.Time `gorm:"column:emergency_next_tally_time;type:timestamp" json:"emergency_next_tally_time"` + + // Foreign key relationships + CreatedBlock Block `gorm:"foreignKey:CreatedHeight;references:Height" json:"-"` + ResolvedBlock Block `gorm:"foreignKey:ResolvedHeight;references:Height" json:"-"` + CreatedTxRef Transaction `gorm:"foreignKey:CreatedTx;references:ID" json:"-"` + Proposer Account `gorm:"foreignKey:ProposerID;references:Address" json:"-"` +} + +// TableName Proposal's table name +func (*Proposal) TableName() string { + return TableNameProposal +} + +// SchemaMigration mapped from table +type SchemaMigration struct { + Version int64 `gorm:"column:version;primaryKey" json:"version"` + Dirty bool `gorm:"column:dirty;not null" json:"dirty"` +} + +// TableName SchemaMigration's table name +func (*SchemaMigration) TableName() string { + return TableNameSchemaMigration +} + +// Tracking mapped from table +type Tracking struct { + ChainID string `gorm:"column:chain_id;primaryKey;type:character varying" json:"chain_id"` + Topic string `gorm:"column:topic;not null;type:character varying" json:"topic"` + KafkaOffset int32 `gorm:"column:kafka_offset;not null" json:"kafka_offset"` + ReplayTopic string `gorm:"column:replay_topic;not null;type:character varying" json:"replay_topic"` + ReplayOffset int32 `gorm:"column:replay_offset;not null" json:"replay_offset"` + LatestInformativeBlockHeight int64 `gorm:"column:latest_informative_block_height" json:"latest_informative_block_height"` + TxCount int64 `gorm:"column:tx_count;not null;default:0" json:"tx_count"` +} + +// TableName Tracking's table name +func (*Tracking) TableName() string { + return TableNameTracking +} + +// TransactionEvent mapped from table +type TransactionEvent struct { + BlockHeight int64 `gorm:"column:block_height;primaryKey;index:ix_transaction_events_block_height_desc,sort:desc;index:ix_transactions_events_event_key_block_height_desc,sort:desc,priority:2" json:"block_height"` + TransactionHash string `gorm:"column:transaction_hash;primaryKey;type:character varying" json:"transaction_hash"` + EventIndex int `gorm:"column:event_index;primaryKey;type:integer" json:"event_index"` + EventKey string `gorm:"column:event_key;not null;type:character varying;index:ix_transactions_events_event_key_block_height_desc,priority:1" json:"event_key"` + EventValue string `gorm:"column:event_value;not null;type:character varying" json:"event_value"` +} + +// TableName TransactionEvent's table name +func (*TransactionEvent) TableName() string { + return TableNameTransactionEvent +} + +// Transaction mapped from table +type Transaction struct { + Hash []byte `gorm:"column:hash;not null" json:"hash"` + BlockHeight int64 `gorm:"column:block_height;not null;type:bigint;index:ix_transactions_block_height;index:ix_transactions_block_height_block_index,priority:1,sort:desc" json:"block_height"` + GasUsed int64 `gorm:"column:gas_used;not null;type:integer" json:"gas_used"` + GasLimit int64 `gorm:"column:gas_limit;not null;type:integer" json:"gas_limit"` + GasFee string `gorm:"column:gas_fee;not null;type:character varying" json:"gas_fee"` + ErrMsg *string `gorm:"column:err_msg;type:character varying" json:"err_msg"` + Success bool `gorm:"column:success;not null" json:"success"` + Memo string `gorm:"column:memo;not null;type:character varying" json:"memo"` + Messages JSON `gorm:"column:messages;not null;type:json" json:"messages"` + IsIbc bool `gorm:"column:is_ibc;not null;index:ix_transactions_send_ibc,priority:2" json:"is_ibc"` + IsSend bool `gorm:"column:is_send;not null;index:ix_transactions_send_ibc,priority:1" json:"is_send"` + IsMovePublish bool `gorm:"column:is_move_publish;not null;index:ix_transactions_move_ops,priority:1" json:"is_move_publish"` + IsMoveExecuteEvent bool `gorm:"column:is_move_execute_event;not null" json:"is_move_execute_event"` + IsMoveExecute bool `gorm:"column:is_move_execute;not null;index:ix_transactions_move_ops,priority:3" json:"is_move_execute"` + IsMoveUpgrade bool `gorm:"column:is_move_upgrade;not null;index:ix_transactions_move_ops,priority:2" json:"is_move_upgrade"` + IsMoveScript bool `gorm:"column:is_move_script;not null;index:ix_transactions_move_ops,priority:4" json:"is_move_script"` + IsNftTransfer bool `gorm:"column:is_nft_transfer;not null" json:"is_nft_transfer"` + IsNftMint bool `gorm:"column:is_nft_mint;not null" json:"is_nft_mint"` + IsNftBurn bool `gorm:"column:is_nft_burn;not null" json:"is_nft_burn"` + IsCollectionCreate bool `gorm:"column:is_collection_create;not null" json:"is_collection_create"` + IsOpinit bool `gorm:"column:is_opinit;not null;index:ix_transactions_opinit,priority:1" json:"is_opinit"` + IsInstantiate bool `gorm:"column:is_instantiate;not null" json:"is_instantiate"` + IsMigrate bool `gorm:"column:is_migrate;not null" json:"is_migrate"` + IsUpdateAdmin bool `gorm:"column:is_update_admin;not null" json:"is_update_admin"` + IsClearAdmin bool `gorm:"column:is_clear_admin;not null" json:"is_clear_admin"` + IsStoreCode bool `gorm:"column:is_store_code;not null" json:"is_store_code"` + ID string `gorm:"column:id;primaryKey;type:character varying" json:"id"` + Sender string `gorm:"column:sender;type:character varying" json:"sender"` + BlockIndex int `gorm:"column:block_index;not null;type:integer;index:ix_transactions_block_height_block_index,priority:2,sort:desc;default:0" json:"block_index"` + + // Foreign key relationships + Block Block `gorm:"foreignKey:BlockHeight;references:Height" json:"-"` + SenderAccount Account `gorm:"foreignKey:Sender;references:Address" json:"-"` +} + +// TableName Transaction's table name +func (*Transaction) TableName() string { + return TableNameTransaction +} + +// ValidatorBondedTokenChange mapped from table +type ValidatorBondedTokenChange struct { + BlockHeight int64 `gorm:"column:block_height;type:bigint;not null;index:ix_validator_bonded_token_changes_validator_address_block_height,priority:2,sort:desc" json:"block_height"` + ValidatorAddress string `gorm:"column:validator_address;not null;type:character varying;index:ix_validator_bonded_token_changes_validator_address_block_height,priority:1" json:"validator_address"` + TransactionID string `gorm:"column:transaction_id;type:character varying;index:ix_validator_bonded_token_changes_transaction_id" json:"transaction_id"` + Tokens JSON `gorm:"column:tokens;not null;type:json" json:"tokens"` + + // Foreign key relationships + Block Block `gorm:"foreignKey:BlockHeight;references:Height" json:"-"` + Transaction Transaction `gorm:"foreignKey:TransactionID;references:ID" json:"-"` + Validator Validator `gorm:"foreignKey:ValidatorAddress;references:OperatorAddress" json:"-"` +} + +// TableName ValidatorBondedTokenChange's table name +func (*ValidatorBondedTokenChange) TableName() string { + return TableNameValidatorBondedTokenChange +} + +// ValidatorCommitSignature mapped from table +type ValidatorCommitSignature struct { + ValidatorAddress string `gorm:"column:validator_address;primaryKey;type:character varying" json:"validator_address"` + BlockHeight int64 `gorm:"column:block_height;bigint;primaryKey" json:"block_height"` + Vote string `gorm:"column:vote;not null;type:commit_signature_type" json:"vote"` + + // Foreign key relationship + Validator Validator `gorm:"foreignKey:ValidatorAddress;references:OperatorAddress" json:"-"` +} + +// TableName ValidatorCommitSignature's table name +func (*ValidatorCommitSignature) TableName() string { + return TableNameValidatorCommitSignature +} + +// ValidatorHistoricalPower mapped from table +type ValidatorHistoricalPower struct { + ValidatorAddress string `gorm:"column:validator_address;type:character varying;index:unique_validator_historicail_power,unique" json:"validator_address"` + Tokens JSON `gorm:"column:tokens;type:json;not null" json:"tokens"` + VotingPower int64 `gorm:"column:voting_power;not null" json:"voting_power"` + HourRoundedTimestamp time.Time `gorm:"column:hour_rounded_timestamp;type:timestamp;not null;index:unique_validator_historicail_power,unique" json:"hour_rounded_timestamp"` + Timestamp time.Time `gorm:"column:timestamp;type:timestamp;not null" json:"timestamp"` + + // Foreign key relationship + Validator Validator `gorm:"foreignKey:ValidatorAddress;references:OperatorAddress" json:"-"` +} + +// TableName ValidatorHistoricalPower's table name +func (*ValidatorHistoricalPower) TableName() string { + return TableNameValidatorHistoricalPower +} + +// ValidatorSlashEvent mapped from table +type ValidatorSlashEvent struct { + ValidatorAddress string `gorm:"column:validator_address;type:character varying;not null" json:"validator_address"` + BlockHeight int64 `gorm:"column:block_height;not null;type:bigint" json:"block_height"` + Type string `gorm:"column:type;type:slashtype" json:"type"` + + // Foreign key relationships + Block Block `gorm:"foreignKey:BlockHeight;references:Height" json:"-"` + Validator Validator `gorm:"foreignKey:ValidatorAddress;references:OperatorAddress" json:"-"` +} + +// TableName ValidatorSlashEvent's table name +func (*ValidatorSlashEvent) TableName() string { + return TableNameValidatorSlashEvent +} + +// ValidatorVoteCount mapped from table +type ValidatorVoteCount struct { + ValidatorAddress string `gorm:"column:validator_address;primaryKey;type:character varying" json:"validator_address"` + Last100 int32 `gorm:"column:last_100;not null" json:"last_100"` + Last10000 int32 `gorm:"column:last_10000;not null" json:"last_10000"` + + // Foreign key relationship + Validator Validator `gorm:"foreignKey:ValidatorAddress;references:OperatorAddress" json:"-"` +} + +// TableName ValidatorVoteCount's table name +func (*ValidatorVoteCount) TableName() string { + return TableNameValidatorVoteCount +} + +// Validator mapped from table +type Validator struct { + OperatorAddress string `gorm:"column:operator_address;primaryKey;type:character varying" json:"operator_address"` + ConsensusAddress string `gorm:"column:consensus_address;not null;type:character varying" json:"consensus_address"` + VotingPowers JSON `gorm:"column:voting_powers;not null;type:json" json:"voting_powers"` + VotingPower int64 `gorm:"column:voting_power;not null" json:"voting_power"` + Moniker string `gorm:"column:moniker;not null;type:character varying" json:"moniker"` + Identity string `gorm:"column:identity;not null;type:character varying" json:"identity"` + Website string `gorm:"column:website;not null;type:character varying" json:"website"` + Details string `gorm:"column:details;not null;type:character varying" json:"details"` + CommissionRate string `gorm:"column:commission_rate;not null;type:character varying" json:"commission_rate"` + CommissionMaxRate string `gorm:"column:commission_max_rate;not null;type:character varying" json:"commission_max_rate"` + CommissionMaxChange string `gorm:"column:commission_max_change;not null;type:character varying" json:"commission_max_change"` + Jailed bool `gorm:"column:jailed;not null" json:"jailed"` + IsActive bool `gorm:"column:is_active" json:"is_active"` + ConsensusPubkey string `gorm:"column:consensus_pubkey;type:character varying" json:"consensus_pubkey"` + AccountID string `gorm:"column:account_id;type:character varying" json:"account_id"` + IdentityImage string `gorm:"column:identity_image;type:text" json:"identity_image"` + + // Foreign key relationship + Account Account `gorm:"foreignKey:AccountID;references:Address" json:"-"` +} + +// TableName Validator's table name +func (*Validator) TableName() string { + return TableNameValidator +} + +// VMAddress mapped from table +type VMAddress struct { + VMAddress string `gorm:"column:vm_address;uniqueIndex:vm_addresses_vm_address_key;primaryKey;not null;type:character varying" json:"vm_address"` +} + +// TableName VMAddress's table name +func (*VMAddress) TableName() string { + return TableNameVMAddress +} diff --git a/pkg/db/utils.go b/pkg/db/utils.go new file mode 100644 index 00000000..e822354e --- /dev/null +++ b/pkg/db/utils.go @@ -0,0 +1,55 @@ +package db + +import ( + "context" + "fmt" + "strings" + + "gorm.io/gorm" + + sdk "github.com/cosmos/cosmos-sdk/types" + movetypes "github.com/initia-labs/initia/x/move/types" +) + +func GetTxID(hash string, blockHeight int64) string { + return fmt.Sprintf("%s/%d", strings.ToUpper(hash), blockHeight) +} + +func NormalizeEscapeString(str string) string { + return strings.ReplaceAll(str, "\x00", "\uFFFD") +} + +func NewAccountFromSDKAddress(address sdk.AccAddress) Account { + return Account{ + Address: address.String(), + VMAddressID: movetypes.ConvertSDKAddressToVMAddress(address).String(), + Type: string(BaseAccount), + } +} + +func NewAccountTx(txId string, blockHeight int64, address string, signer string) AccountTransaction { + return AccountTransaction{ + TransactionID: txId, + BlockHeight: blockHeight, + AccountID: address, + IsSigner: signer == address, + } +} + +func InsertVMAddressesAndAccountsIgnoreConflict(ctx context.Context, dbTx *gorm.DB, accountsMap map[string]Account) error { + accounts := make([]Account, 0, len(accountsMap)) + vmAddresses := make([]VMAddress, 0, len(accountsMap)) + for _, account := range accountsMap { + accounts = append(accounts, account) + vmAddresses = append(vmAddresses, VMAddress{VMAddress: account.VMAddressID}) + } + + if err := InsertVMAddressesIgnoreConflict(ctx, dbTx, vmAddresses); err != nil { + return fmt.Errorf("error inserting vm addresses: %v", err) + } + if err := InsertAccountsIgnoreConflict(ctx, dbTx, accounts); err != nil { + return fmt.Errorf("error inserting accounts: %v", err) + } + + return nil +} diff --git a/informative-indexer/db/valid_tables.go b/pkg/db/valid_tables.go similarity index 70% rename from informative-indexer/db/valid_tables.go rename to pkg/db/valid_tables.go index 4be6cb04..8ea89812 100644 --- a/informative-indexer/db/valid_tables.go +++ b/pkg/db/valid_tables.go @@ -1,12 +1,10 @@ package db -import "github.com/jackc/pgx/v5" +import ( + "gorm.io/gorm/schema" +) -type ValidTable interface { - Unmarshal(pgx.Rows) (map[string]interface{}, error) -} - -var ValidTablesMap = map[string]ValidTable{ +var ValidTablesMap = map[string]schema.Tabler{ "transaction_events": &TransactionEvent{}, "finalize_block_events": &FinalizeBlockEvent{}, "move_events": &MoveEvent{}, diff --git a/pkg/db/validator.go b/pkg/db/validator.go new file mode 100644 index 00000000..6bde2d05 --- /dev/null +++ b/pkg/db/validator.go @@ -0,0 +1,77 @@ +package db + +import ( + "encoding/hex" + "errors" + "time" + + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + sdk "github.com/cosmos/cosmos-sdk/types" + mstakingtypes "github.com/initia-labs/initia/x/mstaking/types" +) + +func NewGenesisValidator(accAddr string, msg *mstakingtypes.MsgCreateValidator) (Validator, error) { + pubKey, ok := msg.Pubkey.GetCachedValue().(cryptotypes.PubKey) + if !ok { + return Validator{}, errors.New("invalid pubkey") + } + + consAddr := sdk.GetConsAddress(pubKey) + return Validator{ + AccountID: accAddr, + OperatorAddress: msg.ValidatorAddress, + ConsensusAddress: consAddr.String(), + Moniker: msg.Description.GetMoniker(), + Identity: msg.Description.GetIdentity(), + Website: msg.Description.GetWebsite(), + Details: msg.Description.GetDetails(), + CommissionRate: msg.Commission.Rate.String(), + CommissionMaxRate: msg.Commission.MaxRate.String(), + CommissionMaxChange: msg.Commission.MaxChangeRate.String(), + Jailed: false, + IsActive: true, + ConsensusPubkey: hex.EncodeToString(consAddr), + VotingPower: 0, + VotingPowers: JSON("{}"), + }, nil +} + +func NewValidator(v mstakingtypes.Validator, accAddr string, conAddr sdk.ConsAddress) Validator { + votingPowersJson, _ := v.VotingPowers.MarshalJSON() + votingPower := int64(0) + if v.IsBonded() { + votingPower = v.VotingPower.Int64() + } + return Validator{ + AccountID: accAddr, + OperatorAddress: v.OperatorAddress, + ConsensusAddress: conAddr.String(), + Moniker: v.Description.GetMoniker(), + Identity: v.Description.GetIdentity(), + Website: v.Description.GetWebsite(), + Details: v.Description.GetDetails(), + CommissionRate: v.Commission.Rate.String(), + CommissionMaxRate: v.Commission.MaxRate.String(), + CommissionMaxChange: v.Commission.MaxChangeRate.String(), + Jailed: v.Jailed, + IsActive: v.IsBonded(), + ConsensusPubkey: hex.EncodeToString(conAddr), + VotingPower: votingPower, + VotingPowers: votingPowersJson, + } +} + +func NewValidatorHistoricalPower(v mstakingtypes.Validator, timestamp time.Time) (ValidatorHistoricalPower, error) { + tokens := v.BondedTokens() + tokensJson, err := tokens.MarshalJSON() + if err != nil { + return ValidatorHistoricalPower{}, err + } + return ValidatorHistoricalPower{ + ValidatorAddress: v.OperatorAddress, + Tokens: tokensJson, + VotingPower: v.VotingPower.Int64(), + HourRoundedTimestamp: timestamp.Truncate(time.Hour).UTC(), + Timestamp: timestamp.UTC(), + }, nil +} diff --git a/pkg/errors/const.go b/pkg/errors/const.go new file mode 100644 index 00000000..b008f4ca --- /dev/null +++ b/pkg/errors/const.go @@ -0,0 +1,6 @@ +package errors + +const ( + TxPareserError = "tx parse error" + TxPareserErrorV2 = "must contain at least one message: invalid request" +) diff --git a/pkg/errors/errors.go b/pkg/errors/errors.go new file mode 100644 index 00000000..48b9b3de --- /dev/null +++ b/pkg/errors/errors.go @@ -0,0 +1,5 @@ +package errors + +import "errors" + +var ErrorNonRetryable = errors.New("error decoding") diff --git a/pkg/go.mod b/pkg/go.mod new file mode 100644 index 00000000..afd6289f --- /dev/null +++ b/pkg/go.mod @@ -0,0 +1,301 @@ +module github.com/initia-labs/core-indexer/pkg + +go 1.25.8 + +require ( + ariga.io/atlas v0.33.1 + ariga.io/atlas-provider-gorm v0.5.2 + cloud.google.com/go/storage v1.61.3 + github.com/cometbft/cometbft v0.38.20 + github.com/confluentinc/confluent-kafka-go/v2 v2.6.1 + github.com/cosmos/cosmos-sdk v0.50.14 + github.com/getsentry/sentry-go v0.29.1 + github.com/golang-migrate/migrate/v4 v4.18.3 + github.com/initia-labs/initia v1.4.3 + github.com/initia-labs/movevm v1.2.0 + github.com/lib/pq v1.10.9 + github.com/rs/zerolog v1.33.0 + github.com/stretchr/testify v1.11.1 + github.com/ybbus/jsonrpc/v3 v3.1.5 + google.golang.org/api v0.271.0 + google.golang.org/grpc v1.79.3 + gorm.io/driver/postgres v1.6.0 + gorm.io/gorm v1.30.0 +) + +require ( + ariga.io/atlas-go-sdk v0.6.8 // indirect + cel.dev/expr v0.25.1 // indirect + cloud.google.com/go v0.123.0 // indirect + cloud.google.com/go/auth v0.18.2 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect + cloud.google.com/go/compute/metadata v0.9.0 // indirect + cloud.google.com/go/iam v1.5.3 // indirect + cloud.google.com/go/monitoring v1.24.3 // indirect + cosmossdk.io/api v0.7.6 // indirect + cosmossdk.io/client/v2 v2.0.0-beta.4 // indirect + cosmossdk.io/collections v0.4.0 // indirect + cosmossdk.io/core v0.11.1 // indirect + cosmossdk.io/depinject v1.1.0 // indirect + cosmossdk.io/errors v1.0.1 // indirect + cosmossdk.io/log v1.4.1 // indirect + cosmossdk.io/math v1.4.0 // indirect + cosmossdk.io/store v1.1.1 // indirect + cosmossdk.io/x/evidence v0.1.1 // indirect + cosmossdk.io/x/feegrant v0.1.1 // indirect + cosmossdk.io/x/tx v0.13.7 // indirect + cosmossdk.io/x/upgrade v0.1.4 // indirect + filippo.io/edwards25519 v1.1.1 // indirect + github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect + github.com/99designs/keyring v1.2.2 // indirect + github.com/DataDog/datadog-go v3.2.0+incompatible // indirect + github.com/DataDog/zstd v1.5.5 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 // indirect + github.com/IGLOU-EU/go-wildcard v1.0.3 // indirect + github.com/agext/levenshtein v1.2.3 // indirect + github.com/alitto/pond v1.8.3 // indirect + github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect + github.com/aptos-labs/serde-reflection/serde-generate/runtime/golang v0.0.0-20231213012317-73b6bbf74833 // indirect + github.com/aws/aws-sdk-go-v2 v1.41.4 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 // indirect + github.com/aws/aws-sdk-go-v2/config v1.32.12 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.12 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 // indirect + github.com/aws/smithy-go v1.24.2 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect + github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect + github.com/bits-and-blooms/bitset v1.20.0 // indirect + github.com/bmatcuk/doublestar v1.3.4 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/chzyer/readline v1.5.1 // indirect + github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 // indirect + github.com/cockroachdb/apd/v2 v2.0.2 // indirect + github.com/cockroachdb/errors v1.11.3 // indirect + github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v1.1.5 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/cometbft/cometbft-db v0.15.0 // indirect + github.com/cosmos/btcutil v1.0.5 // indirect + github.com/cosmos/cosmos-db v1.1.1 // indirect + github.com/cosmos/cosmos-proto v1.0.0-beta.5 // indirect + github.com/cosmos/go-bip39 v1.0.0 // indirect + github.com/cosmos/gogogateway v1.2.0 // indirect + github.com/cosmos/gogoproto v1.7.0 // indirect + github.com/cosmos/iavl v1.2.6 // indirect + github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.2.0 // indirect + github.com/cosmos/ibc-apps/modules/rate-limiting/v8 v8.0.0 // indirect + github.com/cosmos/ibc-go/modules/capability v1.0.1 // indirect + github.com/cosmos/ibc-go/v8 v8.7.0 // indirect + github.com/cosmos/ics23/go v0.11.0 // indirect + github.com/cosmos/interchain-security/v6 v6.3.0 // indirect + github.com/cosmos/ledger-cosmos-go v0.14.0 // indirect + github.com/danieljoos/wincred v1.1.2 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect + github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect + github.com/dgraph-io/badger/v4 v4.3.0 // indirect + github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/dvsekhvalnov/jose2go v1.7.0 // indirect + github.com/emicklei/dot v1.6.2 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.36.0 // indirect + github.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect + github.com/ethereum/go-ethereum v1.16.9 // indirect + github.com/fatih/color v1.18.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-jose/go-jose/v4 v4.1.3 // indirect + github.com/go-kit/kit v0.13.0 // indirect + github.com/go-kit/log v0.2.1 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-openapi/inflect v0.19.0 // indirect + github.com/go-sql-driver/mysql v1.8.1 // indirect + github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect + github.com/gogo/googleapis v1.4.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect + github.com/golang-sql/sqlexp v0.1.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/mock v1.6.0 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/google/btree v1.1.3 // indirect + github.com/google/flatbuffers v23.5.26+incompatible // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/google/orderedcode v0.0.1 // indirect + github.com/google/s2a-go v0.1.9 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect + github.com/googleapis/gax-go/v2 v2.17.0 // indirect + github.com/gorilla/handlers v1.5.2 // indirect + github.com/gorilla/mux v1.8.1 // indirect + github.com/gorilla/websocket v1.5.3 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect + github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect + github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect + github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-getter v1.8.6 // indirect + github.com/hashicorp/go-hclog v1.6.3 // indirect + github.com/hashicorp/go-immutable-radix v1.3.1 // indirect + github.com/hashicorp/go-metrics v0.5.3 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-plugin v1.5.2 // indirect + github.com/hashicorp/go-version v1.8.0 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hashicorp/hcl/v2 v2.18.1 // indirect + github.com/hashicorp/yamux v0.1.1 // indirect + github.com/hdevalence/ed25519consensus v0.1.0 // indirect + github.com/holiman/uint256 v1.3.2 // indirect + github.com/huandu/skiplist v1.2.0 // indirect + github.com/iancoleman/orderedmap v0.3.0 // indirect + github.com/iancoleman/strcase v0.3.0 // indirect + github.com/improbable-eng/grpc-web v0.15.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/initia-labs/OPinit v1.3.0 // indirect + github.com/initia-labs/OPinit/api v1.3.0 // indirect + github.com/initia-labs/initia/api v1.4.0 // indirect + github.com/initia-labs/store v0.1.1 // indirect + github.com/initia-labs/store/memiavl v0.1.1 // indirect + github.com/initia-labs/store/versiondb v0.1.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/pgx/v5 v5.9.2 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/jmhodges/levigo v1.0.0 // indirect + github.com/klauspost/compress v1.18.5 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/ledgerwatch/erigon-lib v0.0.0-20230210071639-db0e7ed11263 // indirect + github.com/linxGnu/grocksdb v1.10.3 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/manifoldco/promptui v0.9.0 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-sqlite3 v1.14.22 // indirect + github.com/microsoft/go-mssqldb v1.7.2 // indirect + github.com/minio/highwayhash v1.0.3 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/go-testing-interface v1.14.1 // indirect + github.com/mitchellh/go-wordwrap v1.0.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/moby/sys/userns v0.1.0 // indirect + github.com/mtibben/percent v0.2.1 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/noble-assets/forwarding/v2 v2.0.3 // indirect + github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a // indirect + github.com/oklog/run v1.1.0 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/client_golang v1.21.0 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.62.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/rakyll/statik v0.1.7 // indirect + github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect + github.com/rs/cors v1.11.1 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sasha-s/go-deadlock v0.3.5 // indirect + github.com/skip-mev/connect/v2 v2.3.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.7.1 // indirect + github.com/spf13/cobra v1.9.1 // indirect + github.com/spf13/pflag v1.0.6 // indirect + github.com/spf13/viper v1.19.0 // indirect + github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect + github.com/tendermint/go-amino v0.16.0 // indirect + github.com/tidwall/btree v1.7.0 // indirect + github.com/tidwall/gjson v1.18.0 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.0 // indirect + github.com/tidwall/tinylru v1.1.0 // indirect + github.com/tidwall/wal v1.1.7 // indirect + github.com/ulikunitz/xz v0.5.15 // indirect + github.com/zbiljic/go-filelock v0.0.0-20170914061330-1dbf7103ab7d // indirect + github.com/zclconf/go-cty v1.14.4 // indirect + github.com/zclconf/go-cty-yaml v1.1.0 // indirect + github.com/zondax/hid v0.9.2 // indirect + github.com/zondax/ledger-go v0.14.3 // indirect + go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.39.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect + go.opentelemetry.io/otel v1.43.0 // indirect + go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/otel/sdk v1.43.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect + go.opentelemetry.io/otel/trace v1.43.0 // indirect + go.uber.org/atomic v1.10.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/crypto v0.49.0 // indirect + golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect + golang.org/x/net v0.52.0 // indirect + golang.org/x/oauth2 v0.36.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.42.0 // indirect + golang.org/x/term v0.41.0 // indirect + golang.org/x/text v0.35.0 // indirect + golang.org/x/time v0.15.0 // indirect + google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 // indirect + google.golang.org/protobuf v1.36.11 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + gorm.io/driver/mysql v1.5.7 // indirect + gorm.io/driver/sqlite v1.5.7 // indirect + gorm.io/driver/sqlserver v1.5.4 // indirect + gotest.tools/v3 v3.5.1 // indirect + nhooyr.io/websocket v1.8.6 // indirect + pgregory.net/rapid v1.1.0 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect +) + +// initia custom +replace ( + github.com/99designs/keyring => github.com/cosmos/keyring v1.2.0 + github.com/cometbft/cometbft => github.com/initia-labs/cometbft v0.38.21-initia.2 + github.com/cosmos/cosmos-sdk => github.com/initia-labs/cosmos-sdk v0.50.15-initia.0 + github.com/cosmos/iavl => github.com/initia-labs/iavl v1.2.6-initia.1 + github.com/noble-assets/forwarding/simapp => github.com/initia-labs/forwarding/simapp v1.0.0 + github.com/noble-assets/forwarding/v2 => github.com/initia-labs/forwarding/v2 v2.0.3-initia.3 + github.com/skip-mev/connect/v2 => github.com/initia-labs/connect/v2 v2.3.1 + github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 +) diff --git a/pkg/go.sum b/pkg/go.sum new file mode 100644 index 00000000..6e157034 --- /dev/null +++ b/pkg/go.sum @@ -0,0 +1,1595 @@ +ariga.io/atlas v0.33.1 h1:m3rn+m2jkfOZDqdZrgTDvDWh9G3Ldr77IElFDGEwDPk= +ariga.io/atlas v0.33.1/go.mod h1:WJesu2UCpGQvgUh3oVP94EiRT61nNy1W/VN5g+vqP1I= +ariga.io/atlas-go-sdk v0.6.8 h1:wonvcyOiXdrQnMrSNigLbMSaFV8yIxgA4Tb8EY2UGGE= +ariga.io/atlas-go-sdk v0.6.8/go.mod h1:9Q+/04PVyJHUse1lEE9Kp6E18xj/6mIzaUTcWYSjSnQ= +ariga.io/atlas-provider-gorm v0.5.2 h1:KuBY1PUmo6tzx3tpNjBypKJia3XrCXimjHDsxbYr9NE= +ariga.io/atlas-provider-gorm v0.5.2/go.mod h1:3a7Y0ZrenuGgoVXmGfn8q8U9qB7fJ5CprrXHMriMb0s= +cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= +cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= +cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= +cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM= +cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M= +cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= +cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= +cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= +cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= +cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= +cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= +cloud.google.com/go/logging v1.13.1 h1:O7LvmO0kGLaHY/gq8cV7T0dyp6zJhYAOtZPX4TF3QtY= +cloud.google.com/go/logging v1.13.1/go.mod h1:XAQkfkMBxQRjQek96WLPNze7vsOmay9H5PqfsNYDqvw= +cloud.google.com/go/longrunning v0.8.0 h1:LiKK77J3bx5gDLi4SMViHixjD2ohlkwBi+mKA7EhfW8= +cloud.google.com/go/longrunning v0.8.0/go.mod h1:UmErU2Onzi+fKDg2gR7dusz11Pe26aknR4kHmJJqIfk= +cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= +cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= +cloud.google.com/go/storage v1.61.3 h1:VS//ZfBuPGDvakfD9xyPW1RGF1Vy3BWUoVZXgW1KMOg= +cloud.google.com/go/storage v1.61.3/go.mod h1:JtqK8BBB7TWv0HVGHubtUdzYYrakOQIsMLffZ2Z/HWk= +cloud.google.com/go/trace v1.11.7 h1:kDNDX8JkaAG3R2nq1lIdkb7FCSi1rCmsEtKVsty7p+U= +cloud.google.com/go/trace v1.11.7/go.mod h1:TNn9d5V3fQVf6s4SCveVMIBS2LJUqo73GACmq/Tky0s= +cosmossdk.io/api v0.7.6 h1:PC20PcXy1xYKH2KU4RMurVoFjjKkCgYRbVAD4PdqUuY= +cosmossdk.io/api v0.7.6/go.mod h1:IcxpYS5fMemZGqyYtErK7OqvdM0C8kdW3dq8Q/XIG38= +cosmossdk.io/client/v2 v2.0.0-beta.4 h1:LGIzWbVTOof/IHQZeoWwxPX0fq607ONXhsfA7eUrQIg= +cosmossdk.io/client/v2 v2.0.0-beta.4/go.mod h1:c753d0sBv3AQRx6X+BOKL1aGpKjZMTZAHGiLPbVi5TE= +cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= +cosmossdk.io/collections v0.4.0/go.mod h1:oa5lUING2dP+gdDquow+QjlF45eL1t4TJDypgGd+tv0= +cosmossdk.io/core v0.11.1 h1:h9WfBey7NAiFfIcUhDVNS503I2P2HdZLebJlUIs8LPA= +cosmossdk.io/core v0.11.1/go.mod h1:OJzxcdC+RPrgGF8NJZR2uoQr56tc7gfBKhiKeDO7hH0= +cosmossdk.io/depinject v1.1.0 h1:wLan7LG35VM7Yo6ov0jId3RHWCGRhe8E8bsuARorl5E= +cosmossdk.io/depinject v1.1.0/go.mod h1:kkI5H9jCGHeKeYWXTqYdruogYrEeWvBQCw1Pj4/eCFI= +cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= +cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= +cosmossdk.io/log v1.4.1 h1:wKdjfDRbDyZRuWa8M+9nuvpVYxrEOwbD/CA8hvhU8QM= +cosmossdk.io/log v1.4.1/go.mod h1:k08v0Pyq+gCP6phvdI6RCGhLf/r425UT6Rk/m+o74rU= +cosmossdk.io/math v1.4.0 h1:XbgExXFnXmF/CccPPEto40gOO7FpWu9yWNAZPN3nkNQ= +cosmossdk.io/math v1.4.0/go.mod h1:O5PkD4apz2jZs4zqFdTr16e1dcaQCc5z6lkEnrrppuk= +cosmossdk.io/store v1.1.1 h1:NA3PioJtWDVU7cHHeyvdva5J/ggyLDkyH0hGHl2804Y= +cosmossdk.io/store v1.1.1/go.mod h1:8DwVTz83/2PSI366FERGbWSH7hL6sB7HbYp8bqksNwM= +cosmossdk.io/x/circuit v0.1.1 h1:KPJCnLChWrxD4jLwUiuQaf5mFD/1m7Omyo7oooefBVQ= +cosmossdk.io/x/circuit v0.1.1/go.mod h1:B6f/urRuQH8gjt4eLIXfZJucrbreuYrKh5CSjaOxr+Q= +cosmossdk.io/x/evidence v0.1.1 h1:Ks+BLTa3uftFpElLTDp9L76t2b58htjVbSZ86aoK/E4= +cosmossdk.io/x/evidence v0.1.1/go.mod h1:OoDsWlbtuyqS70LY51aX8FBTvguQqvFrt78qL7UzeNc= +cosmossdk.io/x/feegrant v0.1.1 h1:EKFWOeo/pup0yF0svDisWWKAA9Zags6Zd0P3nRvVvw8= +cosmossdk.io/x/feegrant v0.1.1/go.mod h1:2GjVVxX6G2fta8LWj7pC/ytHjryA6MHAJroBWHFNiEQ= +cosmossdk.io/x/tx v0.13.7 h1:8WSk6B/OHJLYjiZeMKhq7DK7lHDMyK0UfDbBMxVmeOI= +cosmossdk.io/x/tx v0.13.7/go.mod h1:V6DImnwJMTq5qFjeGWpXNiT/fjgE4HtmclRmTqRVM3w= +cosmossdk.io/x/upgrade v0.1.4 h1:/BWJim24QHoXde8Bc64/2BSEB6W4eTydq0X/2f8+g38= +cosmossdk.io/x/upgrade v0.1.4/go.mod h1:9v0Aj+fs97O+Ztw+tG3/tp5JSlrmT7IcFhAebQHmOPo= +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +filippo.io/edwards25519 v1.1.1 h1:YpjwWWlNmGIDyXOn8zLzqiD+9TyIlPhGFG96P39uBpw= +filippo.io/edwards25519 v1.1.1/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= +github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1/go.mod h1:RKUqNu35KJYcVG/fqTRqmuXJZYNhYkBrnC/hX7yGbTA= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1/go.mod h1:uE9zaUfEQT/nbQjVi2IblCG9iaLtZsuYZ8ne+PuQ02M= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1/go.mod h1:h8hyGFDsU5HMivxiS2iYFZsgDbU9OnnJ163x5UGVKYo= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0 h1:U2rTu3Ef+7w9FHKIAXM6ZyqF3UOWJZ12zIm8zECAFfg= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 h1:jBQA3cKT4L2rWMpgE7Yt3Hwh2aUj8KXjIGLxjHeYNNo= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0/go.mod h1:4OG6tQ9EOP/MT0NMjDlRzWoVFxfu9rN9B2X+tlSVktg= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1/go.mod h1:GpPjLhVR9dnUoJMyHWSPy71xY9/lcmpzIPZXmF0FCVY= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.1.0 h1:DRiANoJTiW6obBQe3SqZizkuV1PEgfiiGivmVocDy64= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.1.0/go.mod h1:qLIye2hwb/ZouqhpSD9Zn3SJipvpEnz1Ywl3VUk9Y0s= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 h1:D3occbWoio4EBLkbkevetNMAVX197GkzbUMtqjGWn80= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= +github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= +github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 h1:sBEjpZlNHzK1voKq9695PJSX2o5NEXl7/OL3coiIY0c= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 h1:UnDZ/zFfG1JhH/DqxIZYU/1CUAlTUScoXD/LcM2Ykk8= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0/go.mod h1:IA1C1U7jO/ENqm/vhi7V9YYpBsp+IMyqNrEN94N7tVc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0 h1:7t/qx5Ost0s0wbA/VDrByOooURhp+ikYwv20i9Y07TQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0/go.mod h1:vB2GH9GAYYJTO3mEn8oYwzEdhlayZIdQz6zdzgUIRvA= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 h1:0s6TxfCu2KHkkZPnBfsQ2y5qia0jl3MMrmBhu3nCOYk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= +github.com/IGLOU-EU/go-wildcard v1.0.3 h1:r8T46+8/9V1STciXJomTWRpPEv4nGJATDbJkdU0Nou0= +github.com/IGLOU-EU/go-wildcard v1.0.3/go.mod h1:/qeV4QLmydCbwH0UMQJmXDryrFKJknWi/jjO8IiuQfY= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/Microsoft/hcsshim v0.11.5 h1:haEcLNpj9Ka1gd3B3tAEs9CpE0c+1IhoL59w/exYU38= +github.com/Microsoft/hcsshim v0.11.5/go.mod h1:MV8xMfmECjl5HdO7U/3/hFVnkmSBjAjmA09d4bExKcU= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= +github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= +github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alitto/pond v1.8.3 h1:ydIqygCLVPqIX/USe5EaV/aSRXTRXDEI9JwuDdu+/xs= +github.com/alitto/pond v1.8.3/go.mod h1:CmvIIGd5jKLasGI3D87qDkQxjzChdKMmnXMg3fG6M6Q= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= +github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= +github.com/aptos-labs/serde-reflection/serde-generate/runtime/golang v0.0.0-20231213012317-73b6bbf74833 h1:/OtHsUoaVegyyGQ9/Ycm5vrC3xTTyj4+N/HsJ0wwAGA= +github.com/aptos-labs/serde-reflection/serde-generate/runtime/golang v0.0.0-20231213012317-73b6bbf74833/go.mod h1:zUz5maIUAS+tl1lC+lJR7HUf0vVnHk6W7bCvN+DzjME= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/aws/aws-sdk-go-v2 v1.41.4 h1:10f50G7WyU02T56ox1wWXq+zTX9I1zxG46HYuG1hH/k= +github.com/aws/aws-sdk-go-v2 v1.41.4/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 h1:3kGOqnh1pPeddVa/E37XNTaWJ8W6vrbYV9lJEkCnhuY= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI= +github.com/aws/aws-sdk-go-v2/config v1.32.12 h1:O3csC7HUGn2895eNrLytOJQdoL2xyJy0iYXhoZ1OmP0= +github.com/aws/aws-sdk-go-v2/config v1.32.12/go.mod h1:96zTvoOFR4FURjI+/5wY1vc1ABceROO4lWgWJuxgy0g= +github.com/aws/aws-sdk-go-v2/credentials v1.19.12 h1:oqtA6v+y5fZg//tcTWahyN9PEn5eDU/Wpvc2+kJ4aY8= +github.com/aws/aws-sdk-go-v2/credentials v1.19.12/go.mod h1:U3R1RtSHx6NB0DvEQFGyf/0sbrpJrluENHdPy1j/3TE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 h1:zOgq3uezl5nznfoK3ODuqbhVg1JzAGDUhXOsU0IDCAo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20/go.mod h1:z/MVwUARehy6GAg/yQ1GO2IMl0k++cu1ohP9zo887wE= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 h1:CNXO7mvgThFGqOFgbNAP2nol2qAWBOGfqR/7tQlvLmc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20/go.mod h1:oydPDJKcfMhgfcgBUZaG+toBbwy8yPWubJXBVERtI4o= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 h1:tN6W/hg+pkM+tf9XDkWUbDEjGLb+raoBMFsTodcoYKw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20/go.mod h1:YJ898MhD067hSHA6xYCx5ts/jEd8BSOLtQDL3iZsvbc= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21 h1:SwGMTMLIlvDNyhMteQ6r8IJSBPlRdXX5d4idhIGbkXA= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21/go.mod h1:UUxgWxofmOdAMuqEsSppbDtGKLfR04HGsD0HXzvhI1k= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 h1:qtJZ70afD3ISKWnoX3xB0J2otEqu3LqicRcDBqsj0hQ= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12/go.mod h1:v2pNpJbRNl4vEUWEh5ytQok0zACAKfdmKS51Hotc3pQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 h1:2HvVAIq+YqgGotK6EkMf+KIEqTISmTYh5zLpYyeTo1Y= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20/go.mod h1:V4X406Y666khGa8ghKmphma/7C0DAtEQYhkq9z4vpbk= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 h1:siU1A6xjUZ2N8zjTHSXFhB9L/2OY8Dqs0xXiLjF30jA= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20/go.mod h1:4TLZCmVJDM3FOu5P5TJP0zOlu9zWgDWU7aUxWbr+rcw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1 h1:csi9NLpFZXb9fxY7rS1xVzgPRGMt7MSNWeQ6eo247kE= +github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1/go.mod h1:qXVal5H0ChqXP63t6jze5LmFalc7+ZE7wOdLtZ0LCP0= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 h1:0GFOLzEbOyZABS3PhYfBIx2rNBACYcKty+XGkTgw1ow= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.8/go.mod h1:LXypKvk85AROkKhOG6/YEcHFPoX+prKTowKnVdcaIxE= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 h1:kiIDLZ005EcKomYYITtfsjn7dtOwHDOFy7IbPXKek2o= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.13/go.mod h1:2h/xGEowcW/g38g06g3KpRWDlT+OTfxxI0o1KqayAB8= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 h1:jzKAXIlhZhJbnYwHbvUQZEB8KfgAEuG0dc08Bkda7NU= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17/go.mod h1:Al9fFsXjv4KfbzQHGe6V4NZSZQXecFcvaIF4e70FoRA= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 h1:Cng+OOwCHmFljXIxpEVXAGMnBia8MSU6Ch5i9PgBkcU= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.9/go.mod h1:LrlIndBDdjA/EeXeyNBle+gyCwTlizzW5ycgWnvIxkk= +github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng= +github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= +github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bits-and-blooms/bitset v1.20.0 h1:2F+rfL86jE2d/bmw7OhqUg2Sj/1rURkBn3MdfoPyRVU= +github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bmatcuk/doublestar v1.3.4 h1:gPypJ5xD31uhX6Tf54sDPUOBXTqKH4c9aPY66CyQrS0= +github.com/bmatcuk/doublestar v1.3.4/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/btcutil v1.1.6 h1:zFL2+c3Lb9gEgqKNzowKUPQNb8jV7v5Oaodi/AYFd6c= +github.com/btcsuite/btcd/btcutil v1.1.6/go.mod h1:9dFymx8HpuLqBnsPELrImQeTQfKBQqzqGbbV3jK55aE= +github.com/bufbuild/protocompile v0.8.0 h1:9Kp1q6OkS9L4nM3FYbr8vlJnEwtbpDPQlQOVXfR+78s= +github.com/bufbuild/protocompile v0.8.0/go.mod h1:+Etjg4guZoAqzVk2czwEQP12yaxLJ8DxuqCJ9qHdH94= +github.com/buger/goterm v1.0.4 h1:Z9YvGmOih81P0FbVtEYTFF6YsSgxSUKEhf/f9bTMXbY= +github.com/buger/goterm v1.0.4/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= +github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= +github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 h1:6xNmx7iTtyBRev0+D/Tv1FZd4SCg8axKApyNyRsAt/w= +github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/BuvyMxRnYBlmVaq4OLiKW6iRQfvC62cvdkI= +github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= +github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v1.1.5 h1:5AAWCBWbat0uE0blr8qzufZP5tBjkRyy/jWe1QWLnvw= +github.com/cockroachdb/pebble v1.1.5/go.mod h1:17wO9el1YEigxkP/YtV8NtCivQDgoCyBg5c4VR/eOWo= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/cometbft/cometbft-db v0.15.0 h1:VLtsRt8udD4jHCyjvrsTBpgz83qne5hnL245AcPJVRk= +github.com/cometbft/cometbft-db v0.15.0/go.mod h1:EBrFs1GDRiTqrWXYi4v90Awf/gcdD5ExzdPbg4X8+mk= +github.com/compose-spec/compose-go/v2 v2.1.3 h1:bD67uqLuL/XgkAK6ir3xZvNLFPxPScEi1KW7R5esrLE= +github.com/compose-spec/compose-go/v2 v2.1.3/go.mod h1:lFN0DrMxIncJGYAXTfWuajfwj5haBJqrBkarHcnjJKc= +github.com/confluentinc/confluent-kafka-go/v2 v2.6.1 h1:XFkytnGvk/ZcY2qU0ql4E4h+ftBaGqkLO7tlZ4kRbr4= +github.com/confluentinc/confluent-kafka-go/v2 v2.6.1/go.mod h1:hScqtFIGUI1wqHIgM3mjoqEou4VweGGGX7dMpcUKves= +github.com/containerd/console v1.0.4 h1:F2g4+oChYvBTsASRTz8NP6iIAi97J3TtSAsLbIFn4ro= +github.com/containerd/console v1.0.4/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= +github.com/containerd/containerd v1.7.18 h1:jqjZTQNfXGoEaZdW1WwPU0RqSn1Bm2Ay/KJPUuO8nao= +github.com/containerd/containerd v1.7.18/go.mod h1:IYEk9/IO6wAPUz2bCMVUbsfXjzw5UNP5fLz4PsUygQ4= +github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8= +github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/containerd/errdefs v0.1.0 h1:m0wCRBiu1WJT/Fr+iOoQHMQS/eP5myQ8lCv4Dz5ZURM= +github.com/containerd/errdefs v0.1.0/go.mod h1:YgWiiHtLmSeBrvpw+UfPijzbLaB77mEG1WwJTDETIV0= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +github.com/containerd/ttrpc v1.2.5 h1:IFckT1EFQoFBMG4c3sMdT8EP3/aKfumK1msY+Ze4oLU= +github.com/containerd/ttrpc v1.2.5/go.mod h1:YCXHsb32f+Sq5/72xHubdiJRQY9inL4a4ZQrAbN1q9o= +github.com/containerd/typeurl/v2 v2.1.1 h1:3Q4Pt7i8nYwy2KmQWIw2+1hTvwTE/6w9FqcttATPO/4= +github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3HZj1hsSQlywkQ0= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= +github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= +github.com/cosmos/cosmos-db v1.1.1 h1:FezFSU37AlBC8S98NlSagL76oqBRWq/prTPvFcEJNCM= +github.com/cosmos/cosmos-db v1.1.1/go.mod h1:AghjcIPqdhSLP/2Z0yha5xPH3nLnskz81pBx3tcVSAw= +github.com/cosmos/cosmos-proto v1.0.0-beta.5 h1:eNcayDLpip+zVLRLYafhzLvQlSmyab+RC5W7ZfmxJLA= +github.com/cosmos/cosmos-proto v1.0.0-beta.5/go.mod h1:hQGLpiIUloJBMdQMMWb/4wRApmI9hjHH05nefC0Ojec= +github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= +github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= +github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= +github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= +github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= +github.com/cosmos/gogoproto v1.7.0 h1:79USr0oyXAbxg3rspGh/m4SWNyoz/GLaAh0QlCe2fro= +github.com/cosmos/gogoproto v1.7.0/go.mod h1:yWChEv5IUEYURQasfyBW5ffkMHR/90hiHgbNgrtp4j0= +github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.2.0 h1:rM+S14DFiqmu6Rc3PuhvWqwywPsnt/CbIslSnBftPFs= +github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.2.0/go.mod h1:O5H9Ic3Pe6cmJn1eqlj5N48sLb8WQ1VWmDP4/11g/4E= +github.com/cosmos/ibc-apps/modules/rate-limiting/v8 v8.0.0 h1:AQO9NIAP3RFqvBCj7IqM/V1LCxmuvcvGUdu0RIEz/c0= +github.com/cosmos/ibc-apps/modules/rate-limiting/v8 v8.0.0/go.mod h1:/ZpKJSW/SKPkFS7jTqkPVn7kOHUUfRNzu+8aS7YOL8o= +github.com/cosmos/ibc-go/modules/capability v1.0.1 h1:ibwhrpJ3SftEEZRxCRkH0fQZ9svjthrX2+oXdZvzgGI= +github.com/cosmos/ibc-go/modules/capability v1.0.1/go.mod h1:rquyOV262nGJplkumH+/LeYs04P3eV8oB7ZM4Ygqk4E= +github.com/cosmos/ibc-go/v8 v8.7.0 h1:HqhVOkO8bDpClXE81DFQgFjroQcTvtpm0tCS7SQVKVY= +github.com/cosmos/ibc-go/v8 v8.7.0/go.mod h1:G2z+Q6ZQSMcyHI2+BVcJdvfOupb09M2h/tgpXOEdY6k= +github.com/cosmos/ics23/go v0.11.0 h1:jk5skjT0TqX5e5QJbEnwXIS2yI2vnmLOgpQPeM5RtnU= +github.com/cosmos/ics23/go v0.11.0/go.mod h1:A8OjxPE67hHST4Icw94hOxxFEJMBG031xIGF/JHNIY0= +github.com/cosmos/interchain-security/v6 v6.3.0 h1:AIsfxLUDtUGVfaqJ1WPwnYIOT5AxoSO58469iw9vNH4= +github.com/cosmos/interchain-security/v6 v6.3.0/go.mod h1:6DSiV2w+DuPkxP1KGFtaxpiwf8Xt2iusj8O53KCx96Q= +github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo= +github.com/cosmos/keyring v1.2.0/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= +github.com/cosmos/ledger-cosmos-go v0.14.0 h1:WfCHricT3rPbkPSVKRH+L4fQGKYHuGOK9Edpel8TYpE= +github.com/cosmos/ledger-cosmos-go v0.14.0/go.mod h1:E07xCWSBl3mTGofZ2QnL4cIUzMbbGVyik84QYKbX3RA= +github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= +github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= +github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.1.0 h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U0x++OzVrdms8= +github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= +github.com/dgraph-io/badger/v4 v4.3.0 h1:lcsCE1/1qrRhqP+zYx6xDZb8n7U+QlwNicpc676Ub40= +github.com/dgraph-io/badger/v4 v4.3.0/go.mod h1:Sc0T595g8zqAQRDf44n+z3wG4BOqLwceaFntt8KPxUM= +github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91 h1:Pux6+xANi0I7RRo5E1gflI4EZ2yx3BGZ75JkAIvGEOA= +github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91/go.mod h1:swkazRqnUf1N62d0Nutz7KIj2UKqsm/H8tD0nBJAXqM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dhui/dktest v0.4.5 h1:uUfYBIVREmj/Rw6MvgmqNAYzTiKOHJak+enB5Di73MM= +github.com/dhui/dktest v0.4.5/go.mod h1:tmcyeHDKagvlDrz7gDKq4UAJOLIfVZYkfD5OnHDwcCo= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/docker/buildx v0.15.1 h1:1cO6JIc0rOoC8tlxfXoh1HH1uxaNvYH1q7J7kv5enhw= +github.com/docker/buildx v0.15.1/go.mod h1:16DQgJqoggmadc1UhLaUTPqKtR+PlByN/kyXFdkhFCo= +github.com/docker/cli v27.0.3+incompatible h1:usGs0/BoBW8MWxGeEtqPMkzOY56jZ6kYlSN5BLDioCQ= +github.com/docker/cli v27.0.3+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/compose/v2 v2.28.1 h1:ORPfiVHrpnRQBDoC3F8JJyWAY8N5gWuo3FgwyivxFdM= +github.com/docker/compose/v2 v2.28.1/go.mod h1:wDtGQFHe99sPLCHXeVbCkc+Wsl4Y/2ZxiAJa/nga6rA= +github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= +github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v27.2.0+incompatible h1:Rk9nIVdfH3+Vz4cyI/uhbINhEZ/oLmc+CBXmH6fbNk4= +github.com/docker/docker v27.2.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8= +github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c/go.mod h1:CADgU4DSXK5QUlFslkQu2yW2TKzFZcXq/leZfM0UH5Q= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/dvsekhvalnov/jose2go v1.7.0 h1:bnQc8+GMnidJZA8zc6lLEAb4xNrIqHwO+9TzqvtQZPo= +github.com/dvsekhvalnov/jose2go v1.7.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203 h1:XBBHcIb256gUJtLmY22n99HaZTz+r2Z51xUPi01m3wg= +github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203/go.mod h1:E1jcSv8FaEny+OP/5k9UxZVw9YFWGj7eI4KR/iOBqCg= +github.com/emicklei/dot v1.6.2 h1:08GN+DD79cy/tzN6uLCT84+2Wk9u+wvqP+Hkx/dIR8A= +github.com/emicklei/dot v1.6.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= +github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= +github.com/envoyproxy/go-control-plane/envoy v1.36.0 h1:yg/JjO5E7ubRyKX3m07GF3reDNEnfOboJ0QySbH736g= +github.com/envoyproxy/go-control-plane/envoy v1.36.0/go.mod h1:ty89S1YCCVruQAm9OtKeEkQLTb+Lkz0k8v9W0Oxsv98= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4= +github.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA= +github.com/ethereum/go-ethereum v1.16.9 h1:UTJ93yoXD7BEMWg+9lSZ8/Zvf0oZfy2ZUmv0Gn0ZclE= +github.com/ethereum/go-ethereum v1.16.9/go.mod h1:Fs6QebQbavneQTYcA39PEKv2+zIjX7rPUZ14DER46wk= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsevents v0.2.0 h1:BRlvlqjvNTfogHfeBOFvSC9N0Ddy+wzQCQukyoD7o/c= +github.com/fsnotify/fsevents v0.2.0/go.mod h1:B3eEk39i4hz8y1zaWS/wPrAP4O6wkIl7HQwKBr1qH/w= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fvbommel/sortorder v1.0.2 h1:mV4o8B2hKboCdkJm+a7uX/SIpZob4JzUpc5GGnM45eo= +github.com/fvbommel/sortorder v1.0.2/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/getsentry/sentry-go v0.29.1 h1:DyZuChN8Hz3ARxGVV8ePaNXh1dQ7d76AiB117xcREwA= +github.com/getsentry/sentry-go v0.29.1/go.mod h1:x3AtIzN01d6SiWkderzaH28Tm0lgkafpJ5Bm3li39O0= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= +github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= +github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU= +github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= +github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= +github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= +github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/gobwas/ws v1.1.0 h1:7RFti/xnNkMJnrK7D1yQ/iCIB5OrrY/54/H930kIbHA= +github.com/gobwas/ws v1.1.0/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= +github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-migrate/migrate/v4 v4.18.3 h1:EYGkoOsvgHHfm5U/naS1RP/6PL/Xv3S4B/swMiAmDLs= +github.com/golang-migrate/migrate/v4 v4.18.3/go.mod h1:99BKpIi6ruaaXRM1A77eqZ+FWPQ3cfRa+ZVy5bmWMaY= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg= +github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= +github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= +github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= +github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8= +github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= +github.com/googleapis/gax-go/v2 v2.17.0 h1:RksgfBpxqff0EZkDWYuz9q/uWsTVz+kf43LsZ1J6SMc= +github.com/googleapis/gax-go/v2 v2.17.0/go.mod h1:mzaqghpQp4JDh3HvADwrat+6M3MOIDp5YKHhb9PAgDY= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= +github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 h1:vTCWu1wbdYo7PEZFem/rlr01+Un+wwVmI7wiegFdRLk= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72/go.mod h1:Vn+BBgKQHVQYdVQ4NZDICE1Brb+JfaONyDHr3q07oQc= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk131ebY= +github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-metrics v0.5.3 h1:M5uADWMOGCTUNU1YuC4hfknOeHNaX54LDm4oYSucoNE= +github.com/hashicorp/go-metrics v0.5.3/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-plugin v1.5.2 h1:aWv8eimFqWlsEiMrYZdPYl+FdHaBJSN4AWwGWfT1G2Y= +github.com/hashicorp/go-plugin v1.5.2/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.8.0 h1:KAkNb1HAiZd1ukkxDFGmokVZe1Xy9HG6NUp+bPle2i4= +github.com/hashicorp/go-version v1.8.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/hcl/v2 v2.18.1 h1:6nxnOJFku1EuSawSD81fuviYUV8DxFr3fp2dUi3ZYSo= +github.com/hashicorp/hcl/v2 v2.18.1/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+JtMeeGErHE= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= +github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= +github.com/holiman/uint256 v1.3.2 h1:a9EgMPSC1AAaj1SZL5zIQD3WbwTuHrMGOerLjGmM/TA= +github.com/holiman/uint256 v1.3.2/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= +github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= +github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= +github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/iancoleman/orderedmap v0.3.0 h1:5cbR2grmZR/DiVt+VJopEhtVs9YGInGIxAoMJn+Ichc= +github.com/iancoleman/orderedmap v0.3.0/go.mod h1:XuLcCUkdL5owUCQeF2Ue9uuw1EptkJDkXXS7VoV7XGE= +github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= +github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= +github.com/in-toto/in-toto-golang v0.5.0 h1:hb8bgwr0M2hGdDsLjkJ3ZqJ8JFLL/tgYdAxF/XEFBbY= +github.com/in-toto/in-toto-golang v0.5.0/go.mod h1:/Rq0IZHLV7Ku5gielPT4wPHJfH1GdHMCq8+WPxw8/BE= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/initia-labs/OPinit v1.3.0 h1:cGxJpzVOfxGO8Ql/Z6SVJCSpokkqB4jFBjo6kx9Uax8= +github.com/initia-labs/OPinit v1.3.0/go.mod h1:VZG+/Wd/9cVDbzCwZld/tve6kcJC1zemeeQvp5FKKCI= +github.com/initia-labs/OPinit/api v1.3.0 h1:MAu4XEJ2uibDVKBo0jB6b6/BGaoXjDUJC+dwhU530ag= +github.com/initia-labs/OPinit/api v1.3.0/go.mod h1:sWDfvmcxd7KD59ukB/Wz0BSpyimyptDEzz1Epe/ET+Y= +github.com/initia-labs/cometbft v0.38.21-initia.2 h1:sFFc6JnbPKFd4XdH3EXZ7TBfi3uVv34HdyHVX5gvvlQ= +github.com/initia-labs/cometbft v0.38.21-initia.2/go.mod h1:CQ/VkJXRdaWxDLyKT+JYAWV0m215oRFtymtIr7skA6o= +github.com/initia-labs/connect/v2 v2.3.1 h1:Y32LCwUHDBgUzzQHqPBJeWeItYoNu2oYD57JKbZCtjw= +github.com/initia-labs/connect/v2 v2.3.1/go.mod h1:35hM7xSgI0h3GMUTgspzKY8Ff2yCXNGNwmAdjqo3z8s= +github.com/initia-labs/cosmos-sdk v0.50.15-initia.0 h1:cgKCqzXBm8md5Q5C9VAyIGCheHhNcOGK/BwpFbett2g= +github.com/initia-labs/cosmos-sdk v0.50.15-initia.0/go.mod h1:/dinzXHi7qK0dEPZjS3LI5gMHueKQdqyjbB9chwswo0= +github.com/initia-labs/forwarding/simapp v1.0.0 h1:MNHLACO0053BAMO3+Ra2ZTlTTB5WieFElguDQH5d8fc= +github.com/initia-labs/forwarding/simapp v1.0.0/go.mod h1:MOIDS73NjoIvTZ3OxUmJXY+Ry7xxXumrXPVZrAeJOhY= +github.com/initia-labs/forwarding/v2 v2.0.3-initia.3 h1:Uu1VqRsSwX7rgS2A4M3Snzyzk9mJRq2v/ZD4xKHTJkM= +github.com/initia-labs/forwarding/v2 v2.0.3-initia.3/go.mod h1:N3OzYf14ton71zCxomBmpR7tOxZ2dKwhsMxUmtuJuVQ= +github.com/initia-labs/iavl v1.2.6-initia.1 h1:4vf9eiccLkob2eiM8YAM8Gf/UBniEFUKpvncM/hVoO8= +github.com/initia-labs/iavl v1.2.6-initia.1/go.mod h1:GiM43q0pB+uG53mLxLDzimxM9l/5N9UuSY3/D0huuVw= +github.com/initia-labs/initia v1.4.3 h1:cEnENL26T7hsa0oDm4hf953tUQYc1cQ3fll84jBfoa0= +github.com/initia-labs/initia v1.4.3/go.mod h1:Y7ir28A0RmL3AQpvTK/mXzyvF6RtijgH/v520xvrk3s= +github.com/initia-labs/initia/api v1.4.0 h1:1DOUBxugC9ZdtMnmmN3qFWnNjlW7I6sssvvu4/ohVtU= +github.com/initia-labs/initia/api v1.4.0/go.mod h1:YQAtPknqt4tZSj+AK0OfZ83XXah2MCna/Ko74/VQe6Q= +github.com/initia-labs/movevm v1.2.0 h1:IbpipjRIZe851FJZZzP3RGIqrOCcNsI6bDF9VC0K0do= +github.com/initia-labs/movevm v1.2.0/go.mod h1:sj/kXD7mUQASqogPTjqltIr4Uid3xxnlcbfiFvvqeXA= +github.com/initia-labs/store v0.1.1 h1:sc4PTv30oS99t0EWgFPy0pCFPYJsHngB2QfZS5XY/Xo= +github.com/initia-labs/store v0.1.1/go.mod h1:8Hgv+JpqjFYy2335pHLnMq6LmVdXyF1G17yi6uWl76M= +github.com/initia-labs/store/memiavl v0.1.1 h1:aymS3es9pPY7ysizK2K+r4TImR0W5N1C5Ld75HRMvXc= +github.com/initia-labs/store/memiavl v0.1.1/go.mod h1:510W4Nf6QAWmFLYPhqhOhO1tagdeocM0b89a/M0zMRk= +github.com/initia-labs/store/versiondb v0.1.0 h1:8lQK7Q6GUwwAc8R3IIBbj9MOlIkKCq0nwnRpjT20Ahc= +github.com/initia-labs/store/versiondb v0.1.0/go.mod h1:fP27G3qPUluu7yM8j2xcW05Brmj0QBT7nlTTFvEszNc= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.9.2 h1:3ZhOzMWnR4yJ+RW1XImIPsD1aNSz4T4fyP7zlQb56hw= +github.com/jackc/pgx/v5 v5.9.2/go.mod h1:mal1tBGAFfLHvZzaYh77YS/eC6IX9OWbRV1QIIM0Jn4= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jhump/protoreflect v1.15.6 h1:WMYJbw2Wo+KOWwZFvgY0jMoVHM6i4XIvRs2RcBj5VmI= +github.com/jhump/protoreflect v1.15.6/go.mod h1:jCHoyYQIJnaabEYnbGwyo9hUqfyUMTbJw/tAut5t97E= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= +github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE= +github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/ledgerwatch/erigon-lib v0.0.0-20230210071639-db0e7ed11263 h1:LGEzZvf33Y1NhuP5+jI/ni9l1TFS6oYPDilgy74NusM= +github.com/ledgerwatch/erigon-lib v0.0.0-20230210071639-db0e7ed11263/go.mod h1:OXgMDuUo2lZ3NpH29ZvMYbk+LxFd5ffDl2Z2mGMuY/I= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/linxGnu/grocksdb v1.10.3 h1:0laII9AQ6kFxo5SjhdTfSh9EgF20piD6TMHK6YuDm+4= +github.com/linxGnu/grocksdb v1.10.3/go.mod h1:OLQKZwiKwaJiAVCsOzWKvwiLwfZ5Vz8Md5TYR7t7pM8= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= +github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +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.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/microsoft/go-mssqldb v1.7.2 h1:CHkFJiObW7ItKTJfHo1QX7QBBD1iV+mn1eOyRP3b/PA= +github.com/microsoft/go-mssqldb v1.7.2/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q= +github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/buildkit v0.14.1 h1:2epLCZTkn4CikdImtsLtIa++7DzCimrrZCT1sway+oI= +github.com/moby/buildkit v0.14.1/go.mod h1:1XssG7cAqv5Bz1xcGMxJL123iCv5TYN4Z/qf647gfuk= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= +github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mountinfo v0.7.1 h1:/tTvQaSJRr2FshkhXiIpux6fQ2Zvc4j7tAhMTStAG2g= +github.com/moby/sys/mountinfo v0.7.1/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +github.com/moby/sys/signal v0.7.0 h1:25RW3d5TnQEoKvRbEKUGay6DCQ46IxAVTT9CUMgmsSI= +github.com/moby/sys/signal v0.7.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/moby/sys/symlink v0.2.0 h1:tk1rOM+Ljp0nFmfOIBtlV3rTDlWOwFRhjEeAhZB0nZc= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= +github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= +github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= +github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= +github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= +github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a h1:dlRvE5fWabOchtH7znfiFCcOvmIYgOeAS5ifBXBlh9Q= +github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= +github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA= +github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= +github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/r3labs/sse v0.0.0-20210224172625-26fe804710bc h1:zAsgcP8MhzAbhMnB1QQ2O7ZhWYVGYSR2iVcjzQuPV+o= +github.com/r3labs/sse v0.0.0-20210224172625-26fe804710bc/go.mod h1:S8xSOnV3CgpNrWd0GQ/OoQfMtlg2uPRSuTzcSGrzwK8= +github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= +github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= +github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sasha-s/go-deadlock v0.3.5 h1:tNCOEEDG6tBqrNDOX35j/7hL5FcFViG6awUGROb2NsU= +github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6vCBBsiChJQ5U= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/secure-systems-lab/go-securesystemslib v0.4.0 h1:b23VGrQhTA8cN2CbBw7/FulN9fTtqYUdS5+Oxzt+DUE= +github.com/secure-systems-lab/go-securesystemslib v0.4.0/go.mod h1:FGBZgq2tXWICsxWQW1msNf49F0Pf2Op5Htayx335Qbs= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= +github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b h1:h+3JX2VoWTFuyQEo87pStk/a99dzIO1mM9KxIyLPGTU= +github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= +github.com/shibumi/go-pathspec v1.3.0 h1:QUyMZhFo0Md5B8zV8x2tesohbb5kfbpTi9rBnKh5dkI= +github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= +github.com/shirou/gopsutil/v3 v3.23.12 h1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4= +github.com/shirou/gopsutil/v3 v3.23.12/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610 h1:4JlsiRVt/YZOvrKH525T7sZXgEWUEjqSDMwE6fXNbdo= +github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610/go.mod h1:kB8gFZX07CyJnw8q9iEZijI3qJTIe1K/Y++P5VGkrcg= +github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= +github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= +github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= +github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= +github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= +github.com/testcontainers/testcontainers-go v0.33.0 h1:zJS9PfXYT5O0ZFXM2xxXfk4J5UMw/kRiISng037Gxdw= +github.com/testcontainers/testcontainers-go v0.33.0/go.mod h1:W80YpTa8D5C3Yy16icheD01UTDu+LmXIA2Keo+jWtT8= +github.com/testcontainers/testcontainers-go/modules/compose v0.33.0 h1:PyrUOF+zG+xrS3p+FesyVxMI+9U+7pwhZhyFozH3jKY= +github.com/testcontainers/testcontainers-go/modules/compose v0.33.0/go.mod h1:oqZaUnFEskdZriO51YBquku/jhgzoXHPot6xe1DqKV4= +github.com/theupdateframework/notary v0.7.0 h1:QyagRZ7wlSpjT5N2qQAh/pN+DVqgekv4DzbAiAiEL3c= +github.com/theupdateframework/notary v0.7.0/go.mod h1:c9DRxcmhHmVLDay4/2fUYdISnHqbFDGRSlXPO0AhYWw= +github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= +github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= +github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/tinylru v1.1.0 h1:XY6IUfzVTU9rpwdhKUF6nQdChgCdGjkMfLzbWyiau6I= +github.com/tidwall/tinylru v1.1.0/go.mod h1:3+bX+TJ2baOLMWTnlyNWHh4QMnFyARg2TLTQ6OFbzw8= +github.com/tidwall/wal v1.1.7 h1:emc1TRjIVsdKKSnpwGBAcsAGg0767SvUk8+ygx7Bb+4= +github.com/tidwall/wal v1.1.7/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E= +github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375 h1:QB54BJwA6x8QU9nHY3xJSZR2kX9bgpZekRKGkLTmEXA= +github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375/go.mod h1:xRroudyp5iVtxKqZCrA6n2TLFRBf8bmnjr1UD4x+z7g= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tonistiigi/fsutil v0.0.0-20240424095704-91a3fc46842c h1:+6wg/4ORAbnSoGDzg2Q1i3CeMcT/jjhye/ZfnBHy7/M= +github.com/tonistiigi/fsutil v0.0.0-20240424095704-91a3fc46842c/go.mod h1:vbbYqJlnswsbJqWUcJN8fKtBhnEgldDrcagTgnBVKKM= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea h1:SXhTLE6pb6eld/v/cCndK0AMpt1wiVFb/YYmqB3/QG0= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= +github.com/tonistiigi/vt100 v0.0.0-20240514184818-90bafcd6abab h1:H6aJ0yKQ0gF49Qb2z5hI1UHxSQt4JMyxebFR15KnApw= +github.com/tonistiigi/vt100 v0.0.0-20240514184818-90bafcd6abab/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= +github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/ybbus/jsonrpc/v3 v3.1.5 h1:0cC/QzS8OCuXYqqDbYnKKhsEe+IZLrNlDx8KPCieeW0= +github.com/ybbus/jsonrpc/v3 v3.1.5/go.mod h1:U1QbyNfL5Pvi2roT0OpRbJeyvGxfWYSgKJHjxWdAEeE= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= +github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/zbiljic/go-filelock v0.0.0-20170914061330-1dbf7103ab7d h1:XQyeLr7N9iY9mi+TGgsBFkj54+j3fdoo8e2u6zrGP5A= +github.com/zbiljic/go-filelock v0.0.0-20170914061330-1dbf7103ab7d/go.mod h1:hoMeDjlNXTNqVwrCk8YDyaBS2g5vFfEX2ezMi4vb6CY= +github.com/zclconf/go-cty v1.14.4 h1:uXXczd9QDGsgu0i/QFR/hzI5NYCHLf6NQw/atrbnhq8= +github.com/zclconf/go-cty v1.14.4/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +github.com/zclconf/go-cty-yaml v1.1.0 h1:nP+jp0qPHv2IhUVqmQSzjvqAWcObN0KBkUl2rWBdig0= +github.com/zclconf/go-cty-yaml v1.1.0/go.mod h1:9YLUH4g7lOhVWqUbctnVlZ5KLpg7JAprQNgxSZ1Gyxs= +github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= +github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= +github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1UpHb342ycI= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5 h1:qxen9oVGzDdIRP6ejyAJc760RwW4SnVDiTYTzwnXuxo= +go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5/go.mod h1:eW0HG9/oHQhvRCvb1/pIXW4cOvtDqeQK+XSi3TnwaXY= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/contrib/detectors/gcp v1.39.0 h1:kWRNZMsfBHZ+uHjiH4y7Etn2FK26LAGkNFw7RHv1DhE= +go.opentelemetry.io/contrib/detectors/gcp v1.39.0/go.mod h1:t/OGqzHBa5v6RHZwrDBJ2OirWc+4q/w2fTbLZwAKjTk= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 h1:YH4g8lQroajqUwWbq/tr2QX1JFmEXaDLgG+ew9bLMWo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0/go.mod h1:fvPi2qXDqFs8M4B4fmJhE92TyQs9Ydjlg3RvfUp+NbQ= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.46.1 h1:gbhw/u49SS3gkPWiYweQNJGm/uJN5GkI/FrosxSHT7A= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.46.1/go.mod h1:GnOaBaFQ2we3b9AGWJpsBa7v1S5RlQzlC3O7dRMxZhM= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0 h1:wNMDy/LVGLj2h3p6zg4d0gypKfWKSWI14E1C4smOgl8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0/go.mod h1:YfbDdXAAkemWJK3H/DshvlrxqFB2rtW4rY6ky/3x/H0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 h1:digkEZCJWobwBqMwC0cwCq8/wkkRy/OowZg5OArWZrM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0/go.mod h1:/OpE/y70qVkndM0TrxT4KBoN3RsFZP0QaofcfYrj76I= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0 h1:ZrPRak/kS4xI3AVXy8F7pipuDXmDsrO8Lg+yQjBLjw0= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0/go.mod h1:3y6kQCWztq6hyW8Z9YxQDDm0Je9AJoFar2G0yDcmhRk= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= +go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4= +go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= +go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +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-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= +golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/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.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/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-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= +golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= +golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/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-20210220032951-036812b2e83c/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/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/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-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/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.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +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.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.41.0 h1:QCgPso/Q3RTJx2Th4bDLqML4W6iJiaXFq2/ftQF13YU= +golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= +golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= +golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +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-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.271.0 h1:cIPN4qcUc61jlh7oXu6pwOQqbJW2GqYh5PS6rB2C/JY= +google.golang.org/api v0.271.0/go.mod h1:CGT29bhwkbF+i11qkRUJb2KMKqcJ1hdFceEIRd9u64Q= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 h1:VQZ/yAbAtjkHgH80teYd2em3xtIkkHd7ZhqfH2N9CsM= +google.golang.org/genproto v0.0.0-20260128011058-8636f8732409/go.mod h1:rxKD3IEILWEu3P44seeNOAwZN4SaoKaQ/2eTg4mM6EM= +google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20 h1:7ei4lp52gK1uSejlA8AZl5AJjeLUOHBQscRQZUgAcu0= +google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20/go.mod h1:ZdbssH/1SOVnjnDlXzxDHK2MCidiqXtbYccJNzNYPEE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 h1:ggcbiqK8WWh6l1dnltU4BgWGIGo+EVYxCaAPih/zQXQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= +google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/cenkalti/backoff.v1 v1.1.0 h1:Arh75ttbsvlpVA7WtVpH4u9h6Zl46xuptxqLxPiSo4Y= +gopkg.in/cenkalti/backoff.v1 v1.1.0/go.mod h1:J6Vskwqd+OMVJl8C33mmtxTBs2gyzfv7UDAkHu8BrjI= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo= +gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= +gorm.io/driver/postgres v1.6.0 h1:2dxzU8xJ+ivvqTRph34QX+WrRaJlmfyPqXmoGVjMBa4= +gorm.io/driver/postgres v1.6.0/go.mod h1:vUw0mrGgrTK+uPHEhAdV4sfFELrByKVGnaVRkXDhtWo= +gorm.io/driver/sqlite v1.5.7 h1:8NvsrhP0ifM7LX9G4zPB97NwovUakUxc+2V2uuf3Z1I= +gorm.io/driver/sqlite v1.5.7/go.mod h1:U+J8craQU6Fzkcvu8oLeAQmi50TkwPEhHDEjQZXDah4= +gorm.io/driver/sqlserver v1.5.4 h1:xA+Y1KDNspv79q43bPyjDMUgHoYHLhXYmdFcYPobg8g= +gorm.io/driver/sqlserver v1.5.4/go.mod h1:+frZ/qYmuna11zHPlh5oc2O6ZA/lS88Keb0XSH1Zh/g= +gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.30.0 h1:qbT5aPv1UH8gI99OsRlvDToLxW5zR7FzS9acZDOZcgs= +gorm.io/gorm v1.30.0/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +k8s.io/api v0.29.2 h1:hBC7B9+MU+ptchxEqTNW2DkUosJpp1P+Wn6YncZ474A= +k8s.io/api v0.29.2/go.mod h1:sdIaaKuU7P44aoyyLlikSLayT6Vb7bvJNCX105xZXY0= +k8s.io/apimachinery v0.29.2 h1:EWGpfJ856oj11C52NRCHuU7rFDwxev48z+6DSlGNsV8= +k8s.io/apimachinery v0.29.2/go.mod h1:6HVkd1FwxIagpYrHSwJlQqZI3G9LfYWRPAkUvLnXTKU= +k8s.io/client-go v0.29.2 h1:FEg85el1TeZp+/vYJM7hkDlSTFZ+c5nnK44DJ4FyoRg= +k8s.io/client-go v0.29.2/go.mod h1:knlvFZE58VpqbQpJNbCbctTVXcd35mMyAAwBdpt4jrA= +k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= +nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= +pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= +tags.cncf.io/container-device-interface v0.7.2 h1:MLqGnWfOr1wB7m08ieI4YJ3IoLKKozEnnNYBtacDPQU= +tags.cncf.io/container-device-interface v0.7.2/go.mod h1:Xb1PvXv2BhfNb3tla4r9JL129ck1Lxv9KuU6eVOfKto= diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go new file mode 100644 index 00000000..e5b1c27f --- /dev/null +++ b/pkg/logger/logger.go @@ -0,0 +1,57 @@ +package logger + +import ( + "context" + "os" + + "github.com/rs/zerolog" +) + +var log zerolog.Logger + +// Config holds the logger configuration +type Config struct { + Component string + ChainID string + Environment string + Level zerolog.Level +} + +// Init initializes the logger with the given configuration +func Init(cfg Config) *zerolog.Logger { + // Set global log level + zerolog.SetGlobalLevel(cfg.Level) + + // Use console writer for local environment + var output zerolog.ConsoleWriter + if cfg.Environment == "local" { + output = zerolog.ConsoleWriter{ + Out: os.Stdout, + TimeFormat: "2006-01-02 15:04:05", + } + log = zerolog.New(output).With().Timestamp().Logger() + } else { + log = zerolog.New(os.Stdout).With().Timestamp().Logger() + } + + // Add context fields + log = log.With(). + Str("component", cfg.Component). + Str("chain_id", cfg.ChainID). + Str("environment", cfg.Environment). + Logger() + + // Set global context logger + zerolog.Ctx(context.Background()).UpdateContext(func(c zerolog.Context) zerolog.Context { + return c.Str("component", cfg.Component). + Str("chain_id", cfg.ChainID). + Str("environment", cfg.Environment) + }) + + return &log +} + +// Get returns the configured logger instance +func Get() *zerolog.Logger { + return &log +} diff --git a/informative-indexer/mq/consumer.go b/pkg/mq/consumer.go similarity index 100% rename from informative-indexer/mq/consumer.go rename to pkg/mq/consumer.go diff --git a/pkg/mq/kafka_msg.go b/pkg/mq/kafka_msg.go new file mode 100644 index 00000000..bb021f04 --- /dev/null +++ b/pkg/mq/kafka_msg.go @@ -0,0 +1,90 @@ +package mq + +import ( + "crypto/sha256" + "encoding/hex" + "encoding/json" + "time" + + abci "github.com/cometbft/cometbft/abci/types" + coretypes "github.com/cometbft/cometbft/rpc/core/types" + "github.com/cometbft/cometbft/types" + "github.com/confluentinc/confluent-kafka-go/v2/kafka" + "github.com/cosmos/cosmos-sdk/types/bech32" + "github.com/rs/zerolog" +) + +var logger *zerolog.Logger + +const ( + NEW_BLOCK_RESULTS_KAFKA_MESSAGE_KEY string = "NEW_BLOCK_RESULTS" + NEW_BLOCK_RESULTS_CLAIM_CHECK_KAFKA_MESSAGE_KEY string = "NEW_BLOCK_RESULTS_CLAIM_CHECK" + NEW_LCD_TX_RESPONSE_KAFKA_MESSAGE_KEY string = "NEW_LCD_TX_RESPONSE" + NEW_LCD_TX_RESPONSE_CLAIM_CHECK_KAFKA_MESSAGE_KEY string = "NEW_LCD_TX_RESPONSE_CLAIM_CHECK" +) + +type KafkaMsg interface { + Emit() kafka.Message +} + +type TxResult struct { + Hash string `json:"hash"` + ExecTxResults *abci.ExecTxResult `json:"exec_tx_results"` + Tx types.Tx `json:"tx"` +} + +type BlockResultMsg struct { + Hash string `json:"hash"` + Height int64 `json:"height"` + Timestamp time.Time `json:"timestamp"` + Txs []TxResult `json:"txs"` + FinalizeBlockEvents []abci.Event `json:"finalize_block_events"` + LastCommit *types.Commit `json:"last_commit"` + ProposerConsensusAddress string `json:"proposer_consensus_address"` + + // version is used to track the version of the message + // consumer can use this to track the version of the message and handle the message accordingly + Version int64 `json:"version"` +} + +type ClaimCheckMsg struct { + ObjectPath string `json:"object_path"` +} + +func NewBlockResultMsgBytes(block *coretypes.ResultBlock, blockResult *coretypes.ResultBlockResults) ([]byte, error) { + consensusAddress, err := bech32.ConvertAndEncode("initvalcons", block.Block.ProposerAddress) + if err != nil { + logger.Error().Msgf("Failed to convert and encode Bech32: %v\n", err) + return nil, err + } + + txResults := make([]TxResult, len(blockResult.TxsResults)) + for idx, txResult := range blockResult.TxsResults { + hash := sha256.Sum256(block.Block.Data.Txs[idx]) + txResults[idx] = TxResult{ + Hash: hex.EncodeToString(hash[:]), + ExecTxResults: txResult, + Tx: block.Block.Data.Txs[idx], + } + } + + msg := &BlockResultMsg{ + Hash: block.Block.Hash().String(), + Timestamp: block.Block.Time, + Height: block.Block.Height, + Txs: txResults, + FinalizeBlockEvents: blockResult.FinalizeBlockEvents, + LastCommit: block.Block.LastCommit, + ProposerConsensusAddress: consensusAddress, + + // version is used to track the version of the message + Version: 0, + } + + v, err := json.Marshal(msg) + if err != nil { + return nil, err + } + + return v, nil +} diff --git a/informative-indexer/mq/producer.go b/pkg/mq/producer.go similarity index 89% rename from informative-indexer/mq/producer.go rename to pkg/mq/producer.go index deaba21e..684a640a 100644 --- a/informative-indexer/mq/producer.go +++ b/pkg/mq/producer.go @@ -8,8 +8,7 @@ import ( "github.com/confluentinc/confluent-kafka-go/v2/kafka" "github.com/rs/zerolog" - "github.com/initia-labs/core-indexer/informative-indexer/common" - "github.com/initia-labs/core-indexer/informative-indexer/storage" + "github.com/initia-labs/core-indexer/pkg/storage" ) type Producer struct { @@ -91,7 +90,7 @@ func (p *Producer) ProduceWithClaimCheck(input *ProduceWithClaimCheckInput, logg if len(input.MessageInBytes) > claimCheckThreshold { uploadToStorage(input.StorageClient, input.ClaimCheckBucket, input.ClaimCheckObjectPath, input.MessageInBytes, logger) - blockClaimCheckMsgBytes, _ := json.Marshal(common.ClaimCheckMsg{ + blockClaimCheckMsgBytes, _ := json.Marshal(ClaimCheckMsg{ ObjectPath: input.ClaimCheckObjectPath, }) @@ -113,8 +112,8 @@ func (p *Producer) ProduceWithClaimCheck(input *ProduceWithClaimCheckInput, logg p.RetryableProduce(kafkaMessage, logger) } -func (p *Producer) ProduceToDLQ(message *kafka.Message, err error, logger *zerolog.Logger) { - DLQTopic := "dlq-" + *message.TopicPartition.Topic +func (p *Producer) ProduceToDLQ(chain, component string, message *kafka.Message, err error, logger *zerolog.Logger) { + DLQTopic := fmt.Sprintf("dlq-%s-%s", chain, component) p.RetryableProduce(kafka.Message{ TopicPartition: kafka.TopicPartition{Topic: &DLQTopic, Partition: int32(kafka.PartitionAny)}, Key: message.Key, diff --git a/pkg/mq/types.go b/pkg/mq/types.go new file mode 100644 index 00000000..e29bb26a --- /dev/null +++ b/pkg/mq/types.go @@ -0,0 +1,66 @@ +package mq + +import ( + "time" + + abci "github.com/cometbft/cometbft/abci/types" +) + +type Block struct { + Height int64 `json:"height"` + Hash string `json:"hash"` + Proposer string `json:"proposer"` + Timestamp time.Time `json:"timestamp"` +} + +type Transaction struct { + Hash []byte `json:"hash"` + BlockHeight int64 `json:"block_height"` + BlockIndex int `json:"block_index"` + GasUsed int64 `json:"gas_used"` + GasLimit uint64 `json:"gas_limit"` + GasFee string `json:"gas_fee"` + ErrMsg *string `json:"err_msg"` + Success bool `json:"success"` + Sender string `json:"sender"` + Memo string `json:"memo"` + Messages []map[string]any `json:"messages"` + IsIBC bool `json:"is_ibc"` + IsSend bool `json:"is_send"` + IsMovePublish bool `json:"is_move_publish"` + IsMoveExecuteEvent bool `json:"is_move_execute_event"` + IsMoveExecute bool `json:"is_move_execute"` + IsMoveUpgrade bool `json:"is_move_upgrade"` + IsMoveScript bool `json:"is_move_script"` + IsNFTTransfer bool `json:"is_nft_transfer"` + IsNFTMint bool `json:"is_nft_mint"` + IsNFTBurn bool `json:"is_nft_burn"` + IsCollectionCreate bool `json:"is_collection_create"` + IsOPInit bool `json:"is_opinit"` + IsInstantiate bool `json:"is_instantiate"` + IsMigrate bool `json:"is_migrate"` + IsUpdateAdmin bool `json:"is_update_admin"` + IsClearAdmin bool `json:"is_clear_admin"` + IsStoreCode bool `json:"is_store_code"` +} + +type LCDTxResponses struct { + Height int64 `json:"height"` + Hash string `json:"hash"` + Result map[string]any `json:"result"` +} + +type RPCEndpoints struct { + RPCs []RPC `json:"rpcs"` +} + +type RPC struct { + URL string `json:"url"` + Headers map[string]string `json:"headers,omitempty"` +} + +type BlockResults struct { + Height int64 `json:"height"` + TxsResults []*abci.ExecTxResult `json:"txs_results"` + FinalizeBlockEvents []abci.Event `json:"finalize_block_events"` +} diff --git a/pkg/parser/accounts.go b/pkg/parser/accounts.go new file mode 100644 index 00000000..dd27df5a --- /dev/null +++ b/pkg/parser/accounts.go @@ -0,0 +1,105 @@ +package parser + +import ( + "encoding/hex" + "fmt" + "regexp" + "strings" + + abci "github.com/cometbft/cometbft/abci/types" + sdk "github.com/cosmos/cosmos-sdk/types" + movetypes "github.com/initia-labs/initia/x/move/types" +) + +const ( + InitBech32Regex = "^init1(?:[a-z0-9]{38}|[a-z0-9]{58})$" + InitHexRegex = "^0x(?:[a-fA-F0-9]{1,64})$" + MoveHexRegex = "0x(?:[a-fA-F0-9]{1,64})" +) + +var ( + regexInitBech = regexp.MustCompile(InitBech32Regex) + regexHex = regexp.MustCompile(InitHexRegex) + regexMoveHex = regexp.MustCompile(MoveHexRegex) +) + +func findAllBech32Address(attr string) []string { + return regexInitBech.FindAllString(attr, -1) +} + +func findAllHexAddress(attr string) []string { + return regexHex.FindAllString(attr, -1) +} + +func findAllMoveHexAddress(attr string) []string { + return regexMoveHex.FindAllString(attr, -1) +} + +func AccAddressFromString(addrStr string) (sdk.AccAddress, error) { + if !strings.HasPrefix(addrStr, "0x") { + return sdk.AccAddressFromBech32(addrStr) + } + + hexStr := strings.ToLower(strings.TrimLeft(strings.TrimPrefix(addrStr, "0x"), "0")) + + if len(hexStr) <= 40 { + hexStr = strings.Repeat("0", 40-len(hexStr)) + hexStr + } else if len(hexStr) <= 64 { + hexStr = strings.Repeat("0", 64-len(hexStr)) + hexStr + } else { + return nil, fmt.Errorf("invalid address string: %s", addrStr) + } + + return hex.DecodeString(hexStr) +} + +func BytesToHex(b []byte) string { + return hex.EncodeToString(b) +} + +func BytesToHexWithPrefix(b []byte) string { + return "0x" + strings.TrimLeft(hex.EncodeToString(b), "0") +} + +func GrepAddressesFromEvents(events []abci.Event) (grepped []sdk.AccAddress, err error) { + for _, event := range events { + for _, attr := range event.Attributes { + var addrs []string + + switch { + case event.Type == movetypes.EventTypeMove && attr.Key == movetypes.AttributeKeyData: + addrs = append(addrs, findAllMoveHexAddress(attr.Value)...) + + default: + for _, attrVal := range strings.Split(attr.Value, ",") { + addrs = append(addrs, findAllBech32Address(attrVal)...) + addrs = append(addrs, findAllHexAddress(attrVal)...) + } + } + + for _, addr := range addrs { + accAddr, err := AccAddressFromString(addr) + if err != nil { + continue // there might be invalid bech32 addresses so do not return error + } + grepped = append(grepped, accAddr) + } + } + } + + return +} + +func GrepSenderFromEvents(events []abci.Event) (sdk.AccAddress, error) { + for _, event := range events { + if event.Type == "message" { + for _, attr := range event.Attributes { + if attr.Key == sdk.AttributeKeySender { + return sdk.AccAddressFromBech32(attr.Value) + } + } + } + } + + return nil, fmt.Errorf("sender not found") +} diff --git a/pkg/parser/int.go b/pkg/parser/int.go new file mode 100644 index 00000000..9db42b69 --- /dev/null +++ b/pkg/parser/int.go @@ -0,0 +1,14 @@ +package parser + +import ( + "fmt" + "strconv" +) + +func ParseInt32(str string) (int32, error) { + value, err := strconv.ParseInt(str, 10, 32) + if err != nil { + return 0, fmt.Errorf("failed to parse int32: %w", err) + } + return int32(value), nil +} diff --git a/pkg/parser/move.go b/pkg/parser/move.go new file mode 100644 index 00000000..16de04b4 --- /dev/null +++ b/pkg/parser/move.go @@ -0,0 +1,66 @@ +package parser + +import ( + "encoding/base64" + "encoding/hex" + "encoding/json" + "errors" + "strings" + + "github.com/cometbft/cometbft/crypto/tmhash" + movetypes "github.com/initia-labs/initia/x/move/types" + vmapi "github.com/initia-labs/movevm/api" + vmtypes "github.com/initia-labs/movevm/types" +) + +type PublishModuleData struct { + ModuleIdPath string `json:"module_id"` + UpgradePolicy movetypes.UpgradePolicy `json:"upgrade_policy"` +} + +func DecodePublishModuleData(data string) (vmapi.ModuleInfoResponse, movetypes.UpgradePolicy, error) { + bz := []byte(data) + + var pmb PublishModuleData + err := json.Unmarshal(bz, &pmb) + if err != nil { + return vmapi.ModuleInfoResponse{}, pmb.UpgradePolicy, err + } + s := strings.Split(pmb.ModuleIdPath, "::") + addr, err := vmtypes.NewAccountAddress(s[0]) + if len(s) != 2 { + return vmapi.ModuleInfoResponse{}, pmb.UpgradePolicy, errors.New("DecodePublishModuleData: module patch length miss match") + } + if err != nil { + return vmapi.ModuleInfoResponse{}, pmb.UpgradePolicy, err + } + return vmapi.ModuleInfoResponse{ + Address: addr, + Name: s[1], + }, pmb.UpgradePolicy, nil +} + +func GetModuleDigest(rawBytes []byte) string { + rawBytesBuf := make([]byte, base64.StdEncoding.EncodedLen(len(rawBytes))) + base64.StdEncoding.Encode(rawBytesBuf, rawBytes) + + return hex.EncodeToString(tmhash.Sum(rawBytesBuf)) +} + +func DecodeEvent[T any](data string) (T, error) { + var e T + err := json.Unmarshal([]byte(data), &e) + if err != nil { + return e, err + } + return e, nil +} + +func DecodeResource[T any](rawData string) (T, error) { + var e T + err := json.Unmarshal([]byte(rawData), &e) + if err != nil { + return e, err + } + return e, nil +} diff --git a/pkg/parser/types.go b/pkg/parser/types.go new file mode 100644 index 00000000..892abb24 --- /dev/null +++ b/pkg/parser/types.go @@ -0,0 +1,33 @@ +package parser + +type ObjectResource struct { + Type string `json:"type"` + Data struct { + AllowUngatedTransfer bool `json:"allow_ungated_transfer"` + Owner string `json:"owner"` + Version string `json:"version"` + } `json:"data"` +} + +type NftResource struct { + Type string `json:"type"` + Data struct { + Description string `json:"description"` + TokenID string `json:"token_id"` + URI string `json:"uri"` + } `json:"data"` +} + +type CollectionResource struct { + Type string `json:"type"` + Data struct { + Creator string `json:"creator"` + Description string `json:"description"` + Name string `json:"name"` + Nfts struct { + Handle string `json:"handle"` + Length string `json:"length"` + } `json:"nfts"` + URI string `json:"uri"` + } `json:"data"` +} diff --git a/pkg/sdkconfig/config.go b/pkg/sdkconfig/config.go new file mode 100644 index 00000000..3f6423ca --- /dev/null +++ b/pkg/sdkconfig/config.go @@ -0,0 +1,24 @@ +package sdkconfig + +import ( + "github.com/cosmos/cosmos-sdk/types" + initiaapp "github.com/initia-labs/initia/app" +) + +// ConfigureSDK sets up the SDK configuration for Initia chain +func ConfigureSDK() { + sdkConfig := types.GetConfig() + sdkConfig.SetCoinType(initiaapp.CoinType) + + accountPubKeyPrefix := initiaapp.AccountAddressPrefix + "pub" + validatorAddressPrefix := initiaapp.AccountAddressPrefix + "valoper" + validatorPubKeyPrefix := initiaapp.AccountAddressPrefix + "valoperpub" + consNodeAddressPrefix := initiaapp.AccountAddressPrefix + "valcons" + consNodePubKeyPrefix := initiaapp.AccountAddressPrefix + "valconspub" + + sdkConfig.SetBech32PrefixForAccount(initiaapp.AccountAddressPrefix, accountPubKeyPrefix) + sdkConfig.SetBech32PrefixForValidator(validatorAddressPrefix, validatorPubKeyPrefix) + sdkConfig.SetBech32PrefixForConsensusNode(consNodeAddressPrefix, consNodePubKeyPrefix) + sdkConfig.SetAddressVerifier(initiaapp.VerifyAddressLen()) + sdkConfig.Seal() +} diff --git a/informative-indexer/common/sentry.go b/pkg/sentry_integration/sentry.go similarity index 96% rename from informative-indexer/common/sentry.go rename to pkg/sentry_integration/sentry.go index 907371ea..cacf624b 100644 --- a/informative-indexer/common/sentry.go +++ b/pkg/sentry_integration/sentry.go @@ -1,4 +1,4 @@ -package common +package sentry_integration import ( "context" diff --git a/informative-indexer/storage/base_gcs.go b/pkg/storage/base_gcs.go similarity index 99% rename from informative-indexer/storage/base_gcs.go rename to pkg/storage/base_gcs.go index e7ea6f72..e61a9218 100644 --- a/informative-indexer/storage/base_gcs.go +++ b/pkg/storage/base_gcs.go @@ -1,11 +1,12 @@ package storage import ( - "cloud.google.com/go/storage" "context" "fmt" - "google.golang.org/api/option" "io" + + "cloud.google.com/go/storage" + "google.golang.org/api/option" ) type BaseGCSClient struct { diff --git a/informative-indexer/storage/fake_gcs.go b/pkg/storage/fake_gcs.go similarity index 100% rename from informative-indexer/storage/fake_gcs.go rename to pkg/storage/fake_gcs.go diff --git a/informative-indexer/storage/gcs.go b/pkg/storage/gcs.go similarity index 100% rename from informative-indexer/storage/gcs.go rename to pkg/storage/gcs.go diff --git a/informative-indexer/storage/storage.go b/pkg/storage/storage.go similarity index 100% rename from informative-indexer/storage/storage.go rename to pkg/storage/storage.go diff --git a/pkg/txparser/tx.go b/pkg/txparser/tx.go new file mode 100644 index 00000000..c03965ca --- /dev/null +++ b/pkg/txparser/tx.go @@ -0,0 +1,178 @@ +package txparser + +import ( + "encoding/json" + "fmt" + "time" + + coretypes "github.com/cometbft/cometbft/rpc/core/types" + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + txtypes "github.com/cosmos/cosmos-sdk/types/tx" + "github.com/initia-labs/initia/app/params" + + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/mq" + "github.com/initia-labs/core-indexer/pkg/parser" +) + +// intoAny is an interface that defines a method to convert a type into a protobuf Any message. +// This is used for serializing transaction data into a format that can be included in responses. +type intoAny interface { + AsAny() *codectypes.Any +} + +// mkTxResult returns a sdk.TxResponse from the given Tendermint ResultTx. +func mkTxResult(txConfig client.TxConfig, resTx *coretypes.ResultTx, blockTime time.Time) (*sdk.TxResponse, error) { + txb, err := txConfig.TxDecoder()(resTx.Tx) + if err != nil { + return nil, err + } + p, ok := txb.(intoAny) + if !ok { + return nil, fmt.Errorf("expecting a type implementing intoAny, got: %T", txb) + } + asAny := p.AsAny() + return sdk.NewResponseResultTx(resTx, asAny, blockTime.Format(time.RFC3339)), nil +} + +// parseMessages returns an array of JsDict decoded version for messages in the provided transaction. +func parseMessages(txResJsDict map[string]any) ([]map[string]any, error) { + // Validate input + if txResJsDict == nil { + return nil, fmt.Errorf("transaction response cannot be nil") + } + + // Safely extract tx field + tx, ok := txResJsDict["tx"].(map[string]any) + if !ok { + return nil, fmt.Errorf("invalid transaction format: missing or invalid 'tx' field") + } + + // Safely extract body field + body, ok := tx["body"].(map[string]any) + if !ok { + return nil, fmt.Errorf("invalid transaction format: missing or invalid 'body' field") + } + + // Safely extract messages field + msgs, ok := body["messages"].([]any) + if !ok { + return nil, fmt.Errorf("invalid transaction format: missing or invalid 'messages' field") + } + + // Pre-allocate slice with known capacity + details := make([]map[string]any, 0, len(msgs)) + + // Process messages + for _, msg := range msgs { + detail, ok := msg.(map[string]any) + if !ok { + return nil, fmt.Errorf("invalid message format: expected map[string]any") + } + details = append(details, detail) + } + + return details, nil +} + +// GetTxResponse converts a transaction result into a JSON-serializable map and proto transaction. +// It returns an error instead of panicking to allow proper error handling by the caller. +func GetTxResponse(encodingConfig *params.EncodingConfig, idx int, txResult *mq.TxResult, blockResults *mq.BlockResultMsg) (map[string]any, []byte, error) { + resTx := coretypes.ResultTx{ + Hash: txResult.Tx.Hash(), + Height: blockResults.Height, + Index: uint32(idx), + TxResult: *txResult.ExecTxResults, + Tx: txResult.Tx, + } + + // Create transaction result + txResponse, err := mkTxResult(encodingConfig.TxConfig, &resTx, blockResults.Timestamp) + if err != nil { + return nil, nil, fmt.Errorf("failed to create tx result: %w", err) + } + + // Get proto transaction + cachedValue := txResponse.Tx.GetCachedValue() + if cachedValue == nil { + return nil, nil, fmt.Errorf("cached transaction value is nil") + } + + protoTx, ok := cachedValue.(*txtypes.Tx) + if !ok { + return nil, nil, fmt.Errorf("failed to convert to proto transaction: unexpected type %T", cachedValue) + } + + // Create and marshal response + response := &txtypes.GetTxResponse{ + Tx: protoTx, + TxResponse: txResponse, + } + + txResJsonByte, err := codec.ProtoMarshalJSON(response, nil) + if err != nil { + return nil, nil, fmt.Errorf("failed to marshal transaction response: %w", err) + } + + // Unmarshal to map + var txResJsDict map[string]any + if err := json.Unmarshal(txResJsonByte, &txResJsDict); err != nil { + return nil, nil, fmt.Errorf("failed to unmarshal transaction response: %w", err) + } + + return txResJsDict, txResJsonByte, nil +} + +func ParseTransaction(encodingConfig *params.EncodingConfig, idx int, txResult *mq.TxResult, txResultJsonDict map[string]any, blockResults *mq.BlockResultMsg) (*db.Transaction, error) { + tx, err := encodingConfig.TxConfig.TxDecoder()(txResult.Tx) + if err != nil { + return nil, fmt.Errorf("failed to decode SDK transaction: %w", err) + } + feeTx, ok := tx.(sdk.FeeTx) + if !ok { + return nil, fmt.Errorf("failed to cast SDK transaction to FeeTx: %w", err) + } + memoTx, ok := tx.(sdk.TxWithMemo) + if !ok { + return nil, fmt.Errorf("failed to cast SDK transaction to TxWithMemo: %w", err) + } + + var errMsg *string + if !txResult.ExecTxResults.IsOK() { + escapedErrMsg := db.NormalizeEscapeString(txResult.ExecTxResults.Log) + errMsg = &escapedErrMsg + } + + msgs, err := parseMessages(txResultJsonDict) + if err != nil { + return nil, fmt.Errorf("failed to parse message dicts: %w", err) + } + + messagesJSON, err := json.Marshal(msgs) + if err != nil { + return nil, fmt.Errorf("failed to marshal messages: %w", err) + } + + sender, err := parser.GrepSenderFromEvents(txResult.ExecTxResults.Events) + if err != nil { + return nil, fmt.Errorf("failed to get sender: %w", err) + } + + return &db.Transaction{ + ID: db.GetTxID(txResult.Hash, blockResults.Height), + Hash: txResult.Tx.Hash(), + BlockHeight: blockResults.Height, + BlockIndex: idx, + GasUsed: txResult.ExecTxResults.GasUsed, + GasLimit: int64(feeTx.GetGas()), + GasFee: feeTx.GetFee().String(), + ErrMsg: errMsg, + Success: txResult.ExecTxResults.IsOK(), + Sender: sender.String(), + Memo: db.NormalizeEscapeString(memoTx.GetMemo()), + Messages: messagesJSON, + }, nil +} diff --git a/pkg/txparser/tx_test.go b/pkg/txparser/tx_test.go new file mode 100644 index 00000000..9e1b76b8 --- /dev/null +++ b/pkg/txparser/tx_test.go @@ -0,0 +1,133 @@ +package txparser + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestParseMessageDicts(t *testing.T) { + tests := []struct { + name string + input map[string]any + want []map[string]any + wantErr bool + }{ + { + name: "valid transaction with single message", + input: map[string]any{ + "tx": map[string]any{ + "body": map[string]any{ + "messages": []any{ + map[string]any{ + "type": "test/Message", + "value": map[string]any{ + "field1": "value1", + }, + }, + }, + }, + }, + }, + want: []map[string]any{ + { + "type": "test/Message", + "value": map[string]any{ + "field1": "value1", + }, + }, + }, + wantErr: false, + }, + { + name: "nil input", + input: nil, + want: nil, + wantErr: true, + }, + { + name: "missing tx field", + input: map[string]any{ + "not_tx": map[string]any{}, + }, + want: nil, + wantErr: true, + }, + { + name: "missing body field", + input: map[string]any{ + "tx": map[string]any{ + "not_body": map[string]any{}, + }, + }, + want: nil, + wantErr: true, + }, + { + name: "missing messages field", + input: map[string]any{ + "tx": map[string]any{ + "body": map[string]any{ + "not_messages": []any{}, + }, + }, + }, + want: nil, + wantErr: true, + }, + { + name: "messages not a slice", + input: map[string]any{ + "tx": map[string]any{ + "body": map[string]any{ + "messages": "not a slice", + }, + }, + }, + want: nil, + wantErr: true, + }, + { + name: "message not a map", + input: map[string]any{ + "tx": map[string]any{ + "body": map[string]any{ + "messages": []any{"not a map"}, + }, + }, + }, + want: nil, + wantErr: true, + }, + { + name: "multiple valid messages", + input: map[string]any{ + "tx": map[string]any{ + "body": map[string]any{ + "messages": []any{ + map[string]any{"foo": "bar"}, + map[string]any{"baz": 123}, + }, + }, + }, + }, + want: []map[string]any{ + {"foo": "bar"}, + {"baz": 123}, + }, + wantErr: false, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + got, err := parseMessages(tc.input) + if tc.wantErr { + assert.Error(t, err) + } else { + assert.NoError(t, err) + assert.Equal(t, tc.want, got) + } + }) + } +} diff --git a/pruner/.env.example b/pruner/.env.example new file mode 100644 index 00000000..1801065c --- /dev/null +++ b/pruner/.env.example @@ -0,0 +1,10 @@ +# For local development only + +## Pruner config +export PRUNING_KEEP_BLOCK="" +export PRUNING_INTERVAL="" +export BACKUP_BUCKET_NAME="" +export BACKUP_FILE_PREFIX="" + +## Database connection +export DB_CONNECTION_STRING="" diff --git a/informative-indexer/cmd/prunner/cmd.go b/pruner/cmd/pruner/cmd.go similarity index 90% rename from informative-indexer/cmd/prunner/cmd.go rename to pruner/cmd/pruner/cmd.go index bafd945f..2654daba 100644 --- a/informative-indexer/cmd/prunner/cmd.go +++ b/pruner/cmd/pruner/cmd.go @@ -1,10 +1,12 @@ -package prunner_cmd +package pruner_cmd import ( - "github.com/initia-labs/core-indexer/informative-indexer/prunner" - "github.com/spf13/cobra" "os" "strconv" + + "github.com/spf13/cobra" + + pruner "github.com/initia-labs/core-indexer/pruner/pruner" ) const ( @@ -18,10 +20,10 @@ const ( FlagCommitSHA = "commit-sha" ) -func PruneCmd() *cobra.Command { +func RunCmd() *cobra.Command { cmd := &cobra.Command{ - Use: "prune", - Short: "Pruning and backup data", + Use: "run", + Short: "Pruning and backup data from database.", Args: cobra.ExactArgs(0), RunE: func(cmd *cobra.Command, args []string) error { dbConnectionString, _ := cmd.Flags().GetString(FlagDBConnectionString) @@ -33,7 +35,7 @@ func PruneCmd() *cobra.Command { environment, _ := cmd.Flags().GetString(FlagEnvironment) commitSHA, _ := cmd.Flags().GetString(FlagCommitSHA) - p, err := prunner.NewPrunner(&prunner.PrunnerConfig{ + p, err := pruner.NewPrunner(&pruner.PrunnerConfig{ DBConnectionString: dbConnectionString, BackupBucketName: backupBucketName, BackupFilePrefix: filePrefix, @@ -48,7 +50,7 @@ func PruneCmd() *cobra.Command { return err } - p.Prune() + p.Run() return nil }, diff --git a/pruner/cmd/root.go b/pruner/cmd/root.go new file mode 100644 index 00000000..0e2f0ae4 --- /dev/null +++ b/pruner/cmd/root.go @@ -0,0 +1,26 @@ +package cmd + +import ( + "os" + + "github.com/spf13/cobra" + + pruner "github.com/initia-labs/core-indexer/pruner/cmd/pruner" +) + +func Execute() { + var rootCmd = &cobra.Command{ + Use: "pruner", + Short: "Pruner Runner", + Long: "Pruner Runner - Pruning and Backup data", + } + + rootCmd.AddCommand( + pruner.RunCmd(), + ) + + err := rootCmd.Execute() + if err != nil { + os.Exit(1) + } +} diff --git a/pruner/go.mod b/pruner/go.mod new file mode 100644 index 00000000..8fd3fee8 --- /dev/null +++ b/pruner/go.mod @@ -0,0 +1,224 @@ +module github.com/initia-labs/core-indexer/pruner + +go 1.25.0 + +require ( + github.com/initia-labs/core-indexer/pkg v0.0.0-20260108034614-7871bbe1d19a + github.com/rs/zerolog v1.34.0 + github.com/spf13/cobra v1.10.2 + gorm.io/gorm v1.31.1 +) + +require ( + ariga.io/atlas v0.33.1 // indirect + ariga.io/atlas-go-sdk v0.6.8 // indirect + ariga.io/atlas-provider-gorm v0.5.2 // indirect + cel.dev/expr v0.25.1 // indirect + cloud.google.com/go v0.116.0 // indirect + cloud.google.com/go/auth v0.10.2 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.5 // indirect + cloud.google.com/go/compute/metadata v0.9.0 // indirect + cloud.google.com/go/iam v1.2.2 // indirect + cloud.google.com/go/monitoring v1.21.2 // indirect + cloud.google.com/go/storage v1.47.0 // indirect + cosmossdk.io/api v0.7.6 // indirect + cosmossdk.io/collections v0.4.0 // indirect + cosmossdk.io/core v0.11.1 // indirect + cosmossdk.io/depinject v1.1.0 // indirect + cosmossdk.io/errors v1.0.1 // indirect + cosmossdk.io/log v1.4.1 // indirect + cosmossdk.io/math v1.4.0 // indirect + cosmossdk.io/store v1.1.1 // indirect + cosmossdk.io/x/tx v0.13.7 // indirect + filippo.io/edwards25519 v1.1.1 // indirect + github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect + github.com/99designs/keyring v1.2.2 // indirect + github.com/DataDog/datadog-go v3.2.0+incompatible // indirect + github.com/DataDog/zstd v1.5.5 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 // indirect + github.com/IGLOU-EU/go-wildcard v1.0.3 // indirect + github.com/agext/levenshtein v1.2.3 // indirect + github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect + github.com/aptos-labs/serde-reflection/serde-generate/runtime/golang v0.0.0-20231213012317-73b6bbf74833 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect + github.com/bmatcuk/doublestar v1.3.4 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 // indirect + github.com/cockroachdb/errors v1.11.3 // indirect + github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v1.1.5 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/cometbft/cometbft v0.38.19 // indirect + github.com/cometbft/cometbft-db v0.15.0 // indirect + github.com/cosmos/btcutil v1.0.5 // indirect + github.com/cosmos/cosmos-db v1.1.1 // indirect + github.com/cosmos/cosmos-proto v1.0.0-beta.5 // indirect + github.com/cosmos/cosmos-sdk v0.50.14 // indirect + github.com/cosmos/go-bip39 v1.0.0 // indirect + github.com/cosmos/gogogateway v1.2.0 // indirect + github.com/cosmos/gogoproto v1.7.0 // indirect + github.com/cosmos/iavl v1.2.6 // indirect + github.com/cosmos/ics23/go v0.11.0 // indirect + github.com/cosmos/ledger-cosmos-go v0.14.0 // indirect + github.com/danieljoos/wincred v1.1.2 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect + github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect + github.com/dgraph-io/badger/v4 v4.3.0 // indirect + github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/dvsekhvalnov/jose2go v1.7.0 // indirect + github.com/emicklei/dot v1.6.2 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.36.0 // indirect + github.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect + github.com/fatih/color v1.18.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/getsentry/sentry-go v0.29.1 // indirect + github.com/go-jose/go-jose/v4 v4.1.3 // indirect + github.com/go-kit/kit v0.13.0 // indirect + github.com/go-kit/log v0.2.1 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-openapi/inflect v0.19.0 // indirect + github.com/go-sql-driver/mysql v1.8.1 // indirect + github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect + github.com/gogo/googleapis v1.4.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-migrate/migrate/v4 v4.18.3 // indirect + github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect + github.com/golang-sql/sqlexp v0.1.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/btree v1.1.3 // indirect + github.com/google/flatbuffers v23.5.26+incompatible // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/google/s2a-go v0.1.8 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect + github.com/googleapis/gax-go/v2 v2.14.0 // indirect + github.com/gorilla/handlers v1.5.2 // indirect + github.com/gorilla/mux v1.8.1 // indirect + github.com/gorilla/websocket v1.5.3 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect + github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect + github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-hclog v1.5.0 // indirect + github.com/hashicorp/go-immutable-radix v1.3.1 // indirect + github.com/hashicorp/go-metrics v0.5.3 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-plugin v1.5.2 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hashicorp/hcl/v2 v2.18.1 // indirect + github.com/hashicorp/yamux v0.1.1 // indirect + github.com/hdevalence/ed25519consensus v0.1.0 // indirect + github.com/huandu/skiplist v1.2.0 // indirect + github.com/iancoleman/strcase v0.3.0 // indirect + github.com/improbable-eng/grpc-web v0.15.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/initia-labs/initia v1.2.2 // indirect + github.com/initia-labs/movevm v1.1.1 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/pgx/v5 v5.9.2 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/jmhodges/levigo v1.0.0 // indirect + github.com/klauspost/compress v1.17.11 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/lib/pq v1.10.9 // indirect + github.com/linxGnu/grocksdb v1.9.3 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-sqlite3 v1.14.22 // indirect + github.com/microsoft/go-mssqldb v1.7.2 // indirect + github.com/mitchellh/go-testing-interface v1.14.1 // indirect + github.com/mitchellh/go-wordwrap v1.0.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mtibben/percent v0.2.1 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a // indirect + github.com/oklog/run v1.1.0 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/client_golang v1.21.0 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.62.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect + github.com/rs/cors v1.11.1 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sasha-s/go-deadlock v0.3.5 // indirect + github.com/skip-mev/connect/v2 v2.3.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.7.1 // indirect + github.com/spf13/pflag v1.0.9 // indirect + github.com/spf13/viper v1.19.0 // indirect + github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect + github.com/stretchr/testify v1.11.1 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect + github.com/tendermint/go-amino v0.16.0 // indirect + github.com/tidwall/btree v1.7.0 // indirect + github.com/zclconf/go-cty v1.14.4 // indirect + github.com/zclconf/go-cty-yaml v1.1.0 // indirect + github.com/zondax/hid v0.9.2 // indirect + github.com/zondax/ledger-go v0.14.3 // indirect + go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.39.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect + go.opentelemetry.io/otel v1.43.0 // indirect + go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/otel/sdk v1.43.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect + go.opentelemetry.io/otel/trace v1.43.0 // indirect + go.uber.org/atomic v1.10.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/crypto v0.49.0 // indirect + golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect + golang.org/x/net v0.51.0 // indirect + golang.org/x/oauth2 v0.36.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.42.0 // indirect + golang.org/x/term v0.41.0 // indirect + golang.org/x/text v0.35.0 // indirect + golang.org/x/time v0.9.0 // indirect + google.golang.org/api v0.209.0 // indirect + google.golang.org/genproto v0.0.0-20241113202542-65e8d215514f // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect + google.golang.org/grpc v1.79.3 // indirect + google.golang.org/protobuf v1.36.10 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + gorm.io/driver/mysql v1.5.7 // indirect + gorm.io/driver/postgres v1.6.0 // indirect + gorm.io/driver/sqlite v1.6.0 // indirect + gorm.io/driver/sqlserver v1.5.4 // indirect + gotest.tools/v3 v3.5.1 // indirect + nhooyr.io/websocket v1.8.6 // indirect + pgregory.net/rapid v1.1.0 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect +) diff --git a/pruner/go.sum b/pruner/go.sum new file mode 100644 index 00000000..397fd233 --- /dev/null +++ b/pruner/go.sum @@ -0,0 +1,1312 @@ +ariga.io/atlas v0.33.1 h1:m3rn+m2jkfOZDqdZrgTDvDWh9G3Ldr77IElFDGEwDPk= +ariga.io/atlas v0.33.1/go.mod h1:WJesu2UCpGQvgUh3oVP94EiRT61nNy1W/VN5g+vqP1I= +ariga.io/atlas-go-sdk v0.6.8 h1:wonvcyOiXdrQnMrSNigLbMSaFV8yIxgA4Tb8EY2UGGE= +ariga.io/atlas-go-sdk v0.6.8/go.mod h1:9Q+/04PVyJHUse1lEE9Kp6E18xj/6mIzaUTcWYSjSnQ= +ariga.io/atlas-provider-gorm v0.5.2 h1:KuBY1PUmo6tzx3tpNjBypKJia3XrCXimjHDsxbYr9NE= +ariga.io/atlas-provider-gorm v0.5.2/go.mod h1:3a7Y0ZrenuGgoVXmGfn8q8U9qB7fJ5CprrXHMriMb0s= +cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= +cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= +cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= +cloud.google.com/go/auth v0.10.2 h1:oKF7rgBfSHdp/kuhXtqU/tNDr0mZqhYbEh+6SiqzkKo= +cloud.google.com/go/auth v0.10.2/go.mod h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI= +cloud.google.com/go/auth/oauth2adapt v0.2.5 h1:2p29+dePqsCHPP1bqDJcKj4qxRyYCcbzKpFyKGt3MTk= +cloud.google.com/go/auth/oauth2adapt v0.2.5/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8= +cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= +cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= +cloud.google.com/go/iam v1.2.2 h1:ozUSofHUGf/F4tCNy/mu9tHLTaxZFLOUiKzjcgWHGIA= +cloud.google.com/go/iam v1.2.2/go.mod h1:0Ys8ccaZHdI1dEUilwzqng/6ps2YB6vRsjIe00/+6JY= +cloud.google.com/go/logging v1.12.0 h1:ex1igYcGFd4S/RZWOCU51StlIEuey5bjqwH9ZYjHibk= +cloud.google.com/go/logging v1.12.0/go.mod h1:wwYBt5HlYP1InnrtYI0wtwttpVU1rifnMT7RejksUAM= +cloud.google.com/go/longrunning v0.6.2 h1:xjDfh1pQcWPEvnfjZmwjKQEcHnpz6lHjfy7Fo0MK+hc= +cloud.google.com/go/longrunning v0.6.2/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI= +cloud.google.com/go/monitoring v1.21.2 h1:FChwVtClH19E7pJ+e0xUhJPGksctZNVOk2UhMmblmdU= +cloud.google.com/go/monitoring v1.21.2/go.mod h1:hS3pXvaG8KgWTSz+dAdyzPrGUYmi2Q+WFX8g2hqVEZU= +cloud.google.com/go/storage v1.47.0 h1:ajqgt30fnOMmLfWfu1PWcb+V9Dxz6n+9WKjdNg5R4HM= +cloud.google.com/go/storage v1.47.0/go.mod h1:Ks0vP374w0PW6jOUameJbapbQKXqkjGd/OJRp2fb9IQ= +cloud.google.com/go/trace v1.11.2 h1:4ZmaBdL8Ng/ajrgKqY5jfvzqMXbrDcBsUGXOT9aqTtI= +cloud.google.com/go/trace v1.11.2/go.mod h1:bn7OwXd4pd5rFuAnTrzBuoZ4ax2XQeG3qNgYmfCy0Io= +cosmossdk.io/api v0.7.6 h1:PC20PcXy1xYKH2KU4RMurVoFjjKkCgYRbVAD4PdqUuY= +cosmossdk.io/api v0.7.6/go.mod h1:IcxpYS5fMemZGqyYtErK7OqvdM0C8kdW3dq8Q/XIG38= +cosmossdk.io/client/v2 v2.0.0-beta.4 h1:LGIzWbVTOof/IHQZeoWwxPX0fq607ONXhsfA7eUrQIg= +cosmossdk.io/client/v2 v2.0.0-beta.4/go.mod h1:c753d0sBv3AQRx6X+BOKL1aGpKjZMTZAHGiLPbVi5TE= +cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= +cosmossdk.io/collections v0.4.0/go.mod h1:oa5lUING2dP+gdDquow+QjlF45eL1t4TJDypgGd+tv0= +cosmossdk.io/core v0.11.1 h1:h9WfBey7NAiFfIcUhDVNS503I2P2HdZLebJlUIs8LPA= +cosmossdk.io/core v0.11.1/go.mod h1:OJzxcdC+RPrgGF8NJZR2uoQr56tc7gfBKhiKeDO7hH0= +cosmossdk.io/depinject v1.1.0 h1:wLan7LG35VM7Yo6ov0jId3RHWCGRhe8E8bsuARorl5E= +cosmossdk.io/depinject v1.1.0/go.mod h1:kkI5H9jCGHeKeYWXTqYdruogYrEeWvBQCw1Pj4/eCFI= +cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= +cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= +cosmossdk.io/log v1.4.1 h1:wKdjfDRbDyZRuWa8M+9nuvpVYxrEOwbD/CA8hvhU8QM= +cosmossdk.io/log v1.4.1/go.mod h1:k08v0Pyq+gCP6phvdI6RCGhLf/r425UT6Rk/m+o74rU= +cosmossdk.io/math v1.4.0 h1:XbgExXFnXmF/CccPPEto40gOO7FpWu9yWNAZPN3nkNQ= +cosmossdk.io/math v1.4.0/go.mod h1:O5PkD4apz2jZs4zqFdTr16e1dcaQCc5z6lkEnrrppuk= +cosmossdk.io/store v1.1.1 h1:NA3PioJtWDVU7cHHeyvdva5J/ggyLDkyH0hGHl2804Y= +cosmossdk.io/store v1.1.1/go.mod h1:8DwVTz83/2PSI366FERGbWSH7hL6sB7HbYp8bqksNwM= +cosmossdk.io/x/evidence v0.1.1 h1:Ks+BLTa3uftFpElLTDp9L76t2b58htjVbSZ86aoK/E4= +cosmossdk.io/x/evidence v0.1.1/go.mod h1:OoDsWlbtuyqS70LY51aX8FBTvguQqvFrt78qL7UzeNc= +cosmossdk.io/x/feegrant v0.1.1 h1:EKFWOeo/pup0yF0svDisWWKAA9Zags6Zd0P3nRvVvw8= +cosmossdk.io/x/feegrant v0.1.1/go.mod h1:2GjVVxX6G2fta8LWj7pC/ytHjryA6MHAJroBWHFNiEQ= +cosmossdk.io/x/tx v0.13.7 h1:8WSk6B/OHJLYjiZeMKhq7DK7lHDMyK0UfDbBMxVmeOI= +cosmossdk.io/x/tx v0.13.7/go.mod h1:V6DImnwJMTq5qFjeGWpXNiT/fjgE4HtmclRmTqRVM3w= +cosmossdk.io/x/upgrade v0.1.4 h1:/BWJim24QHoXde8Bc64/2BSEB6W4eTydq0X/2f8+g38= +cosmossdk.io/x/upgrade v0.1.4/go.mod h1:9v0Aj+fs97O+Ztw+tG3/tp5JSlrmT7IcFhAebQHmOPo= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +filippo.io/edwards25519 v1.1.1 h1:YpjwWWlNmGIDyXOn8zLzqiD+9TyIlPhGFG96P39uBpw= +filippo.io/edwards25519 v1.1.1/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= +github.com/99designs/keyring v1.2.2 h1:pZd3neh/EmUzWONb35LxQfvuY7kiSXAq3HQd97+XBn0= +github.com/99designs/keyring v1.2.2/go.mod h1:wes/FrByc8j7lFOAGLGSNEg8f/PaI3cgTBqhFkHUrPk= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1 h1:lGlwhPtrX6EVml1hO0ivjkUxsSyl4dsiw9qcA1k/3IQ= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1/go.mod h1:RKUqNu35KJYcVG/fqTRqmuXJZYNhYkBrnC/hX7yGbTA= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1/go.mod h1:uE9zaUfEQT/nbQjVi2IblCG9iaLtZsuYZ8ne+PuQ02M= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 h1:sO0/P7g68FrryJzljemN+6GTssUXdANk6aJ7T1ZxnsQ= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1/go.mod h1:h8hyGFDsU5HMivxiS2iYFZsgDbU9OnnJ163x5UGVKYo= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1 h1:6oNBlSdi1QqM1PNW7FPA6xOGA5UNsXnkaYZz9vdPGhA= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1 h1:MyVTgWR8qd/Jw1Le0NZebGBUCLbtak3bJ3z1OlqZBpw= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1/go.mod h1:GpPjLhVR9dnUoJMyHWSPy71xY9/lcmpzIPZXmF0FCVY= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 h1:D3occbWoio4EBLkbkevetNMAVX197GkzbUMtqjGWn80= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 h1:DzHpqpoJVaCgOUdVHxE8QB52S6NiVdDQvGlny1qvPqA= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= +github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= +github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 h1:sBEjpZlNHzK1voKq9695PJSX2o5NEXl7/OL3coiIY0c= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 h1:UQ0AhxogsIRZDkElkblfnwjc3IaltCm2HUMvezQaL7s= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1/go.mod h1:jyqM3eLpJ3IbIFDTKVz2rF9T/xWGW0rIriGwnz8l9Tk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.1 h1:oTX4vsorBZo/Zdum6OKPA4o7544hm6smoRv1QjpTwGo= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.1/go.mod h1:0wEl7vrAD8mehJyohS9HZy+WyEOaQO2mJx86Cvh93kM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 h1:8nn+rsCvTq9axyEh382S0PFLBeaFwNsT43IrPWzctRU= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1/go.mod h1:viRWSEhtMZqz1rhwmOVKkWl6SwmVowfL9O2YR5gI2PE= +github.com/IGLOU-EU/go-wildcard v1.0.3 h1:r8T46+8/9V1STciXJomTWRpPEv4nGJATDbJkdU0Nou0= +github.com/IGLOU-EU/go-wildcard v1.0.3/go.mod h1:/qeV4QLmydCbwH0UMQJmXDryrFKJknWi/jjO8IiuQfY= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= +github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= +github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= +github.com/aptos-labs/serde-reflection/serde-generate/runtime/golang v0.0.0-20231213012317-73b6bbf74833 h1:/OtHsUoaVegyyGQ9/Ycm5vrC3xTTyj4+N/HsJ0wwAGA= +github.com/aptos-labs/serde-reflection/serde-generate/runtime/golang v0.0.0-20231213012317-73b6bbf74833/go.mod h1:zUz5maIUAS+tl1lC+lJR7HUf0vVnHk6W7bCvN+DzjME= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.49.6 h1:yNldzF5kzLBRvKlKz1S0bkvc2+04R1kt13KfBWQBfFA= +github.com/aws/aws-sdk-go v1.49.6/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= +github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bits-and-blooms/bitset v1.20.0 h1:2F+rfL86jE2d/bmw7OhqUg2Sj/1rURkBn3MdfoPyRVU= +github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bmatcuk/doublestar v1.3.4 h1:gPypJ5xD31uhX6Tf54sDPUOBXTqKH4c9aPY66CyQrS0= +github.com/bmatcuk/doublestar v1.3.4/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/btcutil v1.1.6 h1:zFL2+c3Lb9gEgqKNzowKUPQNb8jV7v5Oaodi/AYFd6c= +github.com/btcsuite/btcd/btcutil v1.1.6/go.mod h1:9dFymx8HpuLqBnsPELrImQeTQfKBQqzqGbbV3jK55aE= +github.com/bufbuild/protocompile v0.6.0 h1:Uu7WiSQ6Yj9DbkdnOe7U4mNKp58y9WDMKDn28/ZlunY= +github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 h1:6xNmx7iTtyBRev0+D/Tv1FZd4SCg8axKApyNyRsAt/w= +github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/BuvyMxRnYBlmVaq4OLiKW6iRQfvC62cvdkI= +github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= +github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v1.1.5 h1:5AAWCBWbat0uE0blr8qzufZP5tBjkRyy/jWe1QWLnvw= +github.com/cockroachdb/pebble v1.1.5/go.mod h1:17wO9el1YEigxkP/YtV8NtCivQDgoCyBg5c4VR/eOWo= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/cometbft/cometbft v0.38.19 h1:vNdtCkvhuwUlrcLPAyigV7lQpmmo+tAq8CsB8gZjEYw= +github.com/cometbft/cometbft v0.38.19/go.mod h1:UCu8dlHqvkAsmAFmWDRWNZJPlu6ya2fTWZlDrWsivwo= +github.com/cometbft/cometbft-db v0.15.0 h1:VLtsRt8udD4jHCyjvrsTBpgz83qne5hnL245AcPJVRk= +github.com/cometbft/cometbft-db v0.15.0/go.mod h1:EBrFs1GDRiTqrWXYi4v90Awf/gcdD5ExzdPbg4X8+mk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= +github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= +github.com/cosmos/cosmos-db v1.1.1 h1:FezFSU37AlBC8S98NlSagL76oqBRWq/prTPvFcEJNCM= +github.com/cosmos/cosmos-db v1.1.1/go.mod h1:AghjcIPqdhSLP/2Z0yha5xPH3nLnskz81pBx3tcVSAw= +github.com/cosmos/cosmos-proto v1.0.0-beta.5 h1:eNcayDLpip+zVLRLYafhzLvQlSmyab+RC5W7ZfmxJLA= +github.com/cosmos/cosmos-proto v1.0.0-beta.5/go.mod h1:hQGLpiIUloJBMdQMMWb/4wRApmI9hjHH05nefC0Ojec= +github.com/cosmos/cosmos-sdk v0.50.14 h1:G8CtGHFWbExa+ZpVOVAb4kFmko/R30igsYOwyzRMtgY= +github.com/cosmos/cosmos-sdk v0.50.14/go.mod h1:hrWEFMU1eoXqLJeE6VVESpJDQH67FS1nnMrQIjO2daw= +github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= +github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= +github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= +github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= +github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= +github.com/cosmos/gogoproto v1.7.0 h1:79USr0oyXAbxg3rspGh/m4SWNyoz/GLaAh0QlCe2fro= +github.com/cosmos/gogoproto v1.7.0/go.mod h1:yWChEv5IUEYURQasfyBW5ffkMHR/90hiHgbNgrtp4j0= +github.com/cosmos/iavl v1.2.6 h1:Hs3LndJbkIB+rEvToKJFXZvKo6Vy0Ex1SJ54hhtioIs= +github.com/cosmos/iavl v1.2.6/go.mod h1:GiM43q0pB+uG53mLxLDzimxM9l/5N9UuSY3/D0huuVw= +github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.2.0 h1:rM+S14DFiqmu6Rc3PuhvWqwywPsnt/CbIslSnBftPFs= +github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.2.0/go.mod h1:O5H9Ic3Pe6cmJn1eqlj5N48sLb8WQ1VWmDP4/11g/4E= +github.com/cosmos/ibc-apps/modules/rate-limiting/v8 v8.0.0 h1:AQO9NIAP3RFqvBCj7IqM/V1LCxmuvcvGUdu0RIEz/c0= +github.com/cosmos/ibc-apps/modules/rate-limiting/v8 v8.0.0/go.mod h1:/ZpKJSW/SKPkFS7jTqkPVn7kOHUUfRNzu+8aS7YOL8o= +github.com/cosmos/ibc-go/modules/capability v1.0.1 h1:ibwhrpJ3SftEEZRxCRkH0fQZ9svjthrX2+oXdZvzgGI= +github.com/cosmos/ibc-go/modules/capability v1.0.1/go.mod h1:rquyOV262nGJplkumH+/LeYs04P3eV8oB7ZM4Ygqk4E= +github.com/cosmos/ibc-go/v8 v8.7.0 h1:HqhVOkO8bDpClXE81DFQgFjroQcTvtpm0tCS7SQVKVY= +github.com/cosmos/ibc-go/v8 v8.7.0/go.mod h1:G2z+Q6ZQSMcyHI2+BVcJdvfOupb09M2h/tgpXOEdY6k= +github.com/cosmos/ics23/go v0.11.0 h1:jk5skjT0TqX5e5QJbEnwXIS2yI2vnmLOgpQPeM5RtnU= +github.com/cosmos/ics23/go v0.11.0/go.mod h1:A8OjxPE67hHST4Icw94hOxxFEJMBG031xIGF/JHNIY0= +github.com/cosmos/interchain-security/v6 v6.3.0 h1:AIsfxLUDtUGVfaqJ1WPwnYIOT5AxoSO58469iw9vNH4= +github.com/cosmos/interchain-security/v6 v6.3.0/go.mod h1:6DSiV2w+DuPkxP1KGFtaxpiwf8Xt2iusj8O53KCx96Q= +github.com/cosmos/ledger-cosmos-go v0.14.0 h1:WfCHricT3rPbkPSVKRH+L4fQGKYHuGOK9Edpel8TYpE= +github.com/cosmos/ledger-cosmos-go v0.14.0/go.mod h1:E07xCWSBl3mTGofZ2QnL4cIUzMbbGVyik84QYKbX3RA= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= +github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.1.0 h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U0x++OzVrdms8= +github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= +github.com/dgraph-io/badger/v4 v4.3.0 h1:lcsCE1/1qrRhqP+zYx6xDZb8n7U+QlwNicpc676Ub40= +github.com/dgraph-io/badger/v4 v4.3.0/go.mod h1:Sc0T595g8zqAQRDf44n+z3wG4BOqLwceaFntt8KPxUM= +github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91 h1:Pux6+xANi0I7RRo5E1gflI4EZ2yx3BGZ75JkAIvGEOA= +github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91/go.mod h1:swkazRqnUf1N62d0Nutz7KIj2UKqsm/H8tD0nBJAXqM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dhui/dktest v0.4.5 h1:uUfYBIVREmj/Rw6MvgmqNAYzTiKOHJak+enB5Di73MM= +github.com/dhui/dktest v0.4.5/go.mod h1:tmcyeHDKagvlDrz7gDKq4UAJOLIfVZYkfD5OnHDwcCo= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/docker/docker v27.2.0+incompatible h1:Rk9nIVdfH3+Vz4cyI/uhbINhEZ/oLmc+CBXmH6fbNk4= +github.com/docker/docker v27.2.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/dvsekhvalnov/jose2go v1.7.0 h1:bnQc8+GMnidJZA8zc6lLEAb4xNrIqHwO+9TzqvtQZPo= +github.com/dvsekhvalnov/jose2go v1.7.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/emicklei/dot v1.6.2 h1:08GN+DD79cy/tzN6uLCT84+2Wk9u+wvqP+Hkx/dIR8A= +github.com/emicklei/dot v1.6.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= +github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= +github.com/envoyproxy/go-control-plane/envoy v1.36.0 h1:yg/JjO5E7ubRyKX3m07GF3reDNEnfOboJ0QySbH736g= +github.com/envoyproxy/go-control-plane/envoy v1.36.0/go.mod h1:ty89S1YCCVruQAm9OtKeEkQLTb+Lkz0k8v9W0Oxsv98= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4= +github.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/getsentry/sentry-go v0.29.1 h1:DyZuChN8Hz3ARxGVV8ePaNXh1dQ7d76AiB117xcREwA= +github.com/getsentry/sentry-go v0.29.1/go.mod h1:x3AtIzN01d6SiWkderzaH28Tm0lgkafpJ5Bm3li39O0= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= +github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= +github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU= +github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= +github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= +github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= +github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= +github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-migrate/migrate/v4 v4.18.3 h1:EYGkoOsvgHHfm5U/naS1RP/6PL/Xv3S4B/swMiAmDLs= +github.com/golang-migrate/migrate/v4 v4.18.3/go.mod h1:99BKpIi6ruaaXRM1A77eqZ+FWPQ3cfRa+ZVy5bmWMaY= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg= +github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= +github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= +github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= +github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= +github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= +github.com/googleapis/gax-go/v2 v2.14.0 h1:f+jMrjBPl+DL9nI4IQzLUxMq7XrAqFYB7hBPqMNIe8o= +github.com/googleapis/gax-go/v2 v2.14.0/go.mod h1:lhBCnjdLrWRaPvLWhmc8IS24m9mr07qSYnHncrgo+zk= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= +github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-getter v1.7.5 h1:dT58k9hQ/vbxNMwoI5+xFYAJuv6152UNvdHokfI5wE4= +github.com/hashicorp/go-getter v1.7.5/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= +github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-metrics v0.5.3 h1:M5uADWMOGCTUNU1YuC4hfknOeHNaX54LDm4oYSucoNE= +github.com/hashicorp/go-metrics v0.5.3/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-plugin v1.5.2 h1:aWv8eimFqWlsEiMrYZdPYl+FdHaBJSN4AWwGWfT1G2Y= +github.com/hashicorp/go-plugin v1.5.2/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= +github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/hcl/v2 v2.18.1 h1:6nxnOJFku1EuSawSD81fuviYUV8DxFr3fp2dUi3ZYSo= +github.com/hashicorp/hcl/v2 v2.18.1/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+JtMeeGErHE= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= +github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= +github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= +github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= +github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/iancoleman/orderedmap v0.3.0 h1:5cbR2grmZR/DiVt+VJopEhtVs9YGInGIxAoMJn+Ichc= +github.com/iancoleman/orderedmap v0.3.0/go.mod h1:XuLcCUkdL5owUCQeF2Ue9uuw1EptkJDkXXS7VoV7XGE= +github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= +github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/initia-labs/OPinit v1.2.2 h1:edIddyRnrTGetbbQW5RNpM843VSMclgL9a5m1BqQvL0= +github.com/initia-labs/OPinit v1.2.2/go.mod h1:bCuyrUxpxZ12TA2YD8B4NXKs1RTXKQ0RZkkAHqwLWGU= +github.com/initia-labs/OPinit/api v1.2.0 h1:puw1ppyQgg9oFYv2KrKva/eMwNUKfyLK077/erdKZ28= +github.com/initia-labs/OPinit/api v1.2.0/go.mod h1:Qz11o6zlTtJe495JO7FhEyLhJLPit0rEuLN4pweKL24= +github.com/initia-labs/core-indexer/pkg v0.0.0-20260108034614-7871bbe1d19a h1:uGKYYVpCdQ3BlxwhTTbNGrsemu/CfgMZuJM3w0/Ie00= +github.com/initia-labs/core-indexer/pkg v0.0.0-20260108034614-7871bbe1d19a/go.mod h1:sMFnrIPQEtTP57dxmDMxYvoc8pcKmGuW7zrcptP9HzM= +github.com/initia-labs/initia v1.2.2 h1:gOtJnm+8DvM7yIZASvU14yOqT52YU6gG5LgRMYyjF9c= +github.com/initia-labs/initia v1.2.2/go.mod h1:Re9FJTPiFy3VsooRZU7rMK9olcxBJ1Vooz7qR/Eu18c= +github.com/initia-labs/movevm v1.1.1 h1:HXhfdttsflfPDWfqBUuARf7sy53RsCbuBM4/+1R6Qyk= +github.com/initia-labs/movevm v1.1.1/go.mod h1:sj/kXD7mUQASqogPTjqltIr4Uid3xxnlcbfiFvvqeXA= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.9.2 h1:3ZhOzMWnR4yJ+RW1XImIPsD1aNSz4T4fyP7zlQb56hw= +github.com/jackc/pgx/v5 v5.9.2/go.mod h1:mal1tBGAFfLHvZzaYh77YS/eC6IX9OWbRV1QIIM0Jn4= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jhump/protoreflect v1.15.3 h1:6SFRuqU45u9hIZPJAoZ8c28T3nK64BNdp9w6jFonzls= +github.com/jhump/protoreflect v1.15.3/go.mod h1:4ORHmSBmlCW8fh3xHmJMGyul1zNqZK4Elxc8qKP+p1k= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= +github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/linxGnu/grocksdb v1.9.3 h1:s1cbPcOd0cU2SKXRG1nEqCOWYAELQjdqg3RVI2MH9ik= +github.com/linxGnu/grocksdb v1.9.3/go.mod h1:QYiYypR2d4v63Wj1adOOfzglnoII0gLj3PNh4fZkcFA= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= +github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +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.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +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.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/microsoft/go-mssqldb v1.7.2 h1:CHkFJiObW7ItKTJfHo1QX7QBBD1iV+mn1eOyRP3b/PA= +github.com/microsoft/go-mssqldb v1.7.2/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q= +github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= +github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/noble-assets/forwarding/v2 v2.0.3 h1:JrnPh+D8NNqLFue0CiUHr0VHBj/aCK7gDiBtT2WhLtE= +github.com/noble-assets/forwarding/v2 v2.0.3/go.mod h1:5SNavvUTrJpn4PUSd4RS/jQ8mIwOPbMQvsu2+FXhwZY= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= +github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= +github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a h1:dlRvE5fWabOchtH7znfiFCcOvmIYgOeAS5ifBXBlh9Q= +github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/onsi/gomega v1.26.0 h1:03cDLK28U6hWvCAns6NeydX3zIm4SF3ci69ulidS32Q= +github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA= +github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= +github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= +github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= +github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= +github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sasha-s/go-deadlock v0.3.5 h1:tNCOEEDG6tBqrNDOX35j/7hL5FcFViG6awUGROb2NsU= +github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6vCBBsiChJQ5U= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/skip-mev/block-sdk/v2 v2.1.5 h1:3uoYG2ayP253wiohBPKdD3LrkJGd1Kgw914mmI1ZyOI= +github.com/skip-mev/block-sdk/v2 v2.1.5/go.mod h1:E8SvITZUdxkes3gI3+kgESZL+NLffkcLKnowUgYTOf4= +github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610 h1:4JlsiRVt/YZOvrKH525T7sZXgEWUEjqSDMwE6fXNbdo= +github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610/go.mod h1:kB8gFZX07CyJnw8q9iEZijI3qJTIe1K/Y++P5VGkrcg= +github.com/skip-mev/connect/v2 v2.3.0 h1:wFPE+VUqdYTWPJLUmKXkuS4YhDvE/YYhK/N+B70CwDk= +github.com/skip-mev/connect/v2 v2.3.0/go.mod h1:35hM7xSgI0h3GMUTgspzKY8Ff2yCXNGNwmAdjqo3z8s= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= +github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= +github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= +github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= +github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= +github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= +github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= +github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= +github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= +github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= +github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zclconf/go-cty v1.14.4 h1:uXXczd9QDGsgu0i/QFR/hzI5NYCHLf6NQw/atrbnhq8= +github.com/zclconf/go-cty v1.14.4/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +github.com/zclconf/go-cty-yaml v1.1.0 h1:nP+jp0qPHv2IhUVqmQSzjvqAWcObN0KBkUl2rWBdig0= +github.com/zclconf/go-cty-yaml v1.1.0/go.mod h1:9YLUH4g7lOhVWqUbctnVlZ5KLpg7JAprQNgxSZ1Gyxs= +github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= +github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= +github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1UpHb342ycI= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5 h1:qxen9oVGzDdIRP6ejyAJc760RwW4SnVDiTYTzwnXuxo= +go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5/go.mod h1:eW0HG9/oHQhvRCvb1/pIXW4cOvtDqeQK+XSi3TnwaXY= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/contrib/detectors/gcp v1.39.0 h1:kWRNZMsfBHZ+uHjiH4y7Etn2FK26LAGkNFw7RHv1DhE= +go.opentelemetry.io/contrib/detectors/gcp v1.39.0/go.mod h1:t/OGqzHBa5v6RHZwrDBJ2OirWc+4q/w2fTbLZwAKjTk= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= +go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +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-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= +golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +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.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/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-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo= +golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= +golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/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/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/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-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/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.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +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.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.41.0 h1:QCgPso/Q3RTJx2Th4bDLqML4W6iJiaXFq2/ftQF13YU= +golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= +golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= +golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +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-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.209.0 h1:Ja2OXNlyRlWCWu8o+GgI4yUn/wz9h/5ZfFbKz+dQX+w= +google.golang.org/api v0.209.0/go.mod h1:I53S168Yr/PNDNMi5yPnDc0/LGRZO6o7PoEbl/HY3CM= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20241113202542-65e8d215514f h1:zDoHYmMzMacIdjNe+P2XiTmPsLawi/pCbSPfxt6lTfw= +google.golang.org/genproto v0.0.0-20241113202542-65e8d215514f/go.mod h1:Q5m6g8b5KaFFzsQFIGdJkSJDGeJiybVenoYFMMa3ohI= +google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 h1:fCvbg86sFXwdrl5LgVcTEvNC+2txB5mgROGmRL5mrls= +google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:+rXWjjaukWZun3mLfjmVnQi18E1AsFbDN9QdJ5YXLto= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 h1:gRkg/vSppuSQoDjxyiGfN4Upv/h/DQmIR10ZU8dh4Ww= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= +google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo= +gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= +gorm.io/driver/postgres v1.6.0 h1:2dxzU8xJ+ivvqTRph34QX+WrRaJlmfyPqXmoGVjMBa4= +gorm.io/driver/postgres v1.6.0/go.mod h1:vUw0mrGgrTK+uPHEhAdV4sfFELrByKVGnaVRkXDhtWo= +gorm.io/driver/sqlite v1.6.0 h1:WHRRrIiulaPiPFmDcod6prc4l2VGVWHz80KspNsxSfQ= +gorm.io/driver/sqlite v1.6.0/go.mod h1:AO9V1qIQddBESngQUKWL9yoH93HIeA1X6V633rBwyT8= +gorm.io/driver/sqlserver v1.5.4 h1:xA+Y1KDNspv79q43bPyjDMUgHoYHLhXYmdFcYPobg8g= +gorm.io/driver/sqlserver v1.5.4/go.mod h1:+frZ/qYmuna11zHPlh5oc2O6ZA/lS88Keb0XSH1Zh/g= +gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.31.1 h1:7CA8FTFz/gRfgqgpeKIBcervUn3xSyPUmr6B2WXJ7kg= +gorm.io/gorm v1.31.1/go.mod h1:XyQVbO2k6YkOis7C2437jSit3SsDK72s7n7rsSHd+Gs= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= +nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= +pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/pruner/main.go b/pruner/main.go new file mode 100644 index 00000000..2e59eded --- /dev/null +++ b/pruner/main.go @@ -0,0 +1,7 @@ +package main + +import "github.com/initia-labs/core-indexer/pruner/cmd" + +func main() { + cmd.Execute() +} diff --git a/informative-indexer/prunner/prunner.go b/pruner/pruner/pruner.go similarity index 58% rename from informative-indexer/prunner/prunner.go rename to pruner/pruner/pruner.go index 878a1ce8..f402a07f 100644 --- a/informative-indexer/prunner/prunner.go +++ b/pruner/pruner/pruner.go @@ -6,24 +6,27 @@ import ( "context" "encoding/json" "fmt" - "github.com/initia-labs/core-indexer/informative-indexer/db" - "github.com/initia-labs/core-indexer/informative-indexer/storage" - "github.com/jackc/pgx/v5/pgxpool" - "github.com/rs/zerolog" - "github.com/rs/zerolog/log" "os/signal" "strings" "sync" "syscall" "time" + + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" + "gorm.io/gorm" + + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/storage" ) var logger *zerolog.Logger type Prunner struct { - dbClient *pgxpool.Pool + dbClient *gorm.DB storageClient storage.Client config *PrunnerConfig + once sync.Once } type PrunnerConfig struct { @@ -38,7 +41,7 @@ type PrunnerConfig struct { } func NewPrunner(config *PrunnerConfig) (*Prunner, error) { - logger = zerolog.Ctx(log.With().Str("component", "informative-indexer-prunner").Str("chain", config.Chain).Str("environment", config.Environment).Str("commit_sha", config.CommitSHA).Logger().WithContext(context.Background())) + logger = zerolog.Ctx(log.With().Str("component", "event-indexer-prunner").Str("chain", config.Chain).Str("environment", config.Environment).Str("commit_sha", config.CommitSHA).Logger().WithContext(context.Background())) dbClient, err := db.NewClient(config.DBConnectionString) if err != nil { @@ -93,7 +96,7 @@ func (p *Prunner) StartPruning(signalCtx context.Context) { } func (p *Prunner) pruningTable(ctx context.Context, tableName string) error { - height, err := db.GetLatestBlockHeight(ctx, p.dbClient) + height, err := db.GetLatestInformativeBlockHeight(ctx, p.dbClient) if err != nil { return fmt.Errorf("DB: failed to get latest block height: %w", err) } @@ -106,18 +109,25 @@ func (p *Prunner) pruningTable(ctx context.Context, tableName string) error { logger.Info().Msgf("Pruning rows from table %s with block_height below: %d", tableName, pruningThreshold) - rowsToPrune, err := fetchRowsToPrune(ctx, p.dbClient, tableName, pruningThreshold) + query, err := db.BuildPruneQuery(ctx, p.dbClient, tableName, pruningThreshold) if err != nil { - return fmt.Errorf("DB: Failed to fetch rows to prune from table %s: %w", tableName, err) + return fmt.Errorf("DB: Failed to prepare query for table %s: %w", tableName, err) } + + var count int64 + if err := query.Count(&count).Error; err != nil { + return fmt.Errorf("DB: Failed to count rows for table %s: %w", tableName, err) + } + // no rows to prune - if len(rowsToPrune) == 0 { + if count == 0 { logger.Info().Msgf("Pruning not required for table %s: no rows to prune", tableName) return nil } backupFileName := fmt.Sprintf("%s-%d.zip", p.config.BackupFilePrefix, time.Now().Unix()) - if err := backupToGCS(ctx, p.storageClient, p.config.BackupBucketName, tableName, backupFileName, rowsToPrune); err != nil { + if err := streamBackupToGCS(ctx, query, p.storageClient, p.config.BackupBucketName, + tableName, backupFileName); err != nil { return fmt.Errorf("GCS: Failed to backup data from table %s to GCS: %w", tableName, err) } @@ -129,52 +139,79 @@ func (p *Prunner) pruningTable(ctx context.Context, tableName string) error { return nil } -func fetchRowsToPrune(ctx context.Context, dbClient db.Queryable, tableName string, pruningThreshold int64) ([]interface{}, error) { - rows, err := db.GetRowsToPruneByBlockHeight(ctx, dbClient, tableName, pruningThreshold) +// streamBackupToGCS streams query results directly to a zip file and uploads to GCS +func streamBackupToGCS(ctx context.Context, query *gorm.DB, storageClient storage.Client, bucketName, tableName, fileName string) error { + // create zip + var buffer bytes.Buffer + zipWriter := zip.NewWriter(&buffer) + + // create a file inside the zip + zipFile, err := zipWriter.Create(fmt.Sprintf("%s.json", strings.Split(fileName, ".")[0])) if err != nil { - return nil, fmt.Errorf("DB: Failed to fetch rows to prune from table %s: %w", tableName, err) + return fmt.Errorf("failed to create zip entry: %w", err) + } + + // start writing the JSON array opening bracket + if _, err := zipFile.Write([]byte("[")); err != nil { + return fmt.Errorf("failed to write opening bracket: %w", err) } - var result []interface{} - for rows.Next() { - table, ok := db.ValidTablesMap[tableName] - if !ok { - return nil, fmt.Errorf("failed to get table interface from table name %s", tableName) + // process data in chunks + const chunkSize = 1000 + offset := 0 + isFirstRow := true + + for { + // check if context is canceled + if ctx.Err() != nil { + return ctx.Err() } - row, err := table.Unmarshal(rows) - if err != nil { - return nil, err + + var chunk []map[string]any + if err := query.Limit(chunkSize).Offset(offset).Find(&chunk).Error; err != nil { + return fmt.Errorf("failed to fetch chunk: %w", err) } - result = append(result, row) - } - return result, nil -} + // no more data, break the loop + if len(chunk) == 0 { + break + } -func backupToGCS(ctx context.Context, storageClient storage.Client, bucketName string, tableName string, fileName string, data []interface{}) error { - jsonData, err := json.Marshal(data) - if err != nil { - return fmt.Errorf("failed to marshal data: %w", err) - } + for _, rowData := range chunk { + if !isFirstRow { + if _, err := zipFile.Write([]byte(",")); err != nil { + return fmt.Errorf("failed to write comma: %w", err) + } + } else { + isFirstRow = false + } - // create zip - var buffer bytes.Buffer - zipWriter := zip.NewWriter(&buffer) - w, err := zipWriter.Create(fmt.Sprintf("%s.json", strings.Split(fileName, ".")[0])) - if err != nil { - return fmt.Errorf("failed to create zip entry: %w", err) + rowJSON, err := json.Marshal(rowData) + if err != nil { + return fmt.Errorf("failed to marshal row: %w", err) + } + + if _, err := zipFile.Write(rowJSON); err != nil { + return fmt.Errorf("failed to write row JSON: %w", err) + } + } + + offset += len(chunk) + + if len(chunk) < chunkSize { + break + } } - _, err = w.Write(jsonData) - if err != nil { - return fmt.Errorf("failed to write data to zip: %w", err) + + if _, err := zipFile.Write([]byte("]")); err != nil { + return fmt.Errorf("failed to write closing bracket: %w", err) } - if err = zipWriter.Close(); err != nil { + + if err := zipWriter.Close(); err != nil { return fmt.Errorf("failed to close zip writer: %w", err) } objectName := fmt.Sprintf("%s/%s", tableName, fileName) - - // upload to GCS err = storageClient.UploadFile(bucketName, objectName, buffer.Bytes()) if err != nil { return fmt.Errorf("failed to upload file to GCS: %w", err) @@ -183,7 +220,7 @@ func backupToGCS(ctx context.Context, storageClient storage.Client, bucketName s return nil } -func pruneRows(ctx context.Context, dbClient db.Queryable, tableName string, pruningThreshold int64) error { +func pruneRows(ctx context.Context, dbClient *gorm.DB, tableName string, pruningThreshold int64) error { err := db.DeleteRowsToPrune(ctx, dbClient, tableName, pruningThreshold) if err != nil { return err @@ -191,10 +228,8 @@ func pruneRows(ctx context.Context, dbClient db.Queryable, tableName string, pru return nil } -func (p *Prunner) Prune() { - // Mutex to avoid multiple prunner instances - var once sync.Once - once.Do(func() { +func (p *Prunner) Run() { + p.once.Do(func() { ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer stop() @@ -208,5 +243,8 @@ func (p *Prunner) Prune() { } func (p *Prunner) close() { - p.dbClient.Close() + sqlDB, err := p.dbClient.DB() + if err == nil { + sqlDB.Close() + } } diff --git a/pruner/run.sh b/pruner/run.sh new file mode 100755 index 00000000..90eb8b8b --- /dev/null +++ b/pruner/run.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +set -e + +SCRIPT_DIR=$(cd $(dirname $0) ; pwd -P) + +TASK=$1 +ARGS=${@:2} + + +help__run="run <..args> : run run" +task__run() { + local chain=$1 + + if [ -z "$chain" ]; then + echo "usage: $0 run " + exit + fi + + go build -o pruner . + + source .env + + ./pruner run --db $DB_CONNECTION_STRING \ + --backup-bucket-name ${chain}-local-core-event-data-backup \ + --backup-file-prefix events \ + --pruning-keep-block 10 \ + --pruning-interval 1 \ + --chain $chain +} + +list_all_helps() { + compgen -v | egrep "^help__.*" +} + +NEW_LINE=$'\n' +if type -t "task__$TASK" &>/dev/null; then + task__$TASK $ARGS +else + echo "usage: $0 [<..args>]" + echo "task:" + + HELPS="" + for help in $(list_all_helps) + do + + HELPS="$HELPS ${help/help__/} |-- ${!help}$NEW_LINE" + done + + echo "$HELPS" | column -t -s "|" + exit +fi diff --git a/scripts/update-initia.sh b/scripts/update-initia.sh new file mode 100755 index 00000000..d612677f --- /dev/null +++ b/scripts/update-initia.sh @@ -0,0 +1,186 @@ +#!/usr/bin/env bash +# Update github.com/initia-labs/initia to a target version across all go.mod +# files in this monorepo, and sync replace directives from the upstream initia +# go.mod so they stay in lockstep. +# +# Usage: +# ./scripts/update-initia.sh +# ./scripts/update-initia.sh --no-tidy +# +# Examples: +# ./scripts/update-initia.sh v1.4.2 +# ./scripts/update-initia.sh v1.4.2 --no-tidy + +set -euo pipefail + +# ── args ───────────────────────────────────────────────────────────────────── + +if [ $# -lt 1 ]; then + echo "Usage: $0 [--no-tidy]" + echo "" + echo "Updates github.com/initia-labs/initia to and syncs replace" + echo "directives from the upstream initia go.mod." + echo "" + echo "Examples:" + echo " $0 v1.4.2" + echo " $0 v1.4.2 --no-tidy" + exit 1 +fi + +VERSION="$1" +RUN_TIDY=1 +for arg in "$@"; do + case "$arg" in + --no-tidy) RUN_TIDY=0 ;; + esac +done + +ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +UPSTREAM_URL="https://raw.githubusercontent.com/initia-labs/initia/${VERSION}/go.mod" + +# ── fetch upstream go.mod ──────────────────────────────────────────────────── + +echo "==> Fetching upstream go.mod: $UPSTREAM_URL" + +UPSTREAM_GOMOD=$(curl -fsSL "$UPSTREAM_URL") || { + echo "ERROR: failed to fetch go.mod for $VERSION" + echo " make sure the tag exists at github.com/initia-labs/initia" + exit 1 +} + +echo " ok" + +# ── parse replace directives from upstream ─────────────────────────────────── + +extract_replace_target() { + local module="$1" + echo "$UPSTREAM_GOMOD" \ + | grep -E "^[[:space:]]+$(echo "$module" | sed 's|/|\\/|g') =>" \ + | head -1 \ + | sed -E 's/.*=> //' \ + | sed -E 's/[[:space:]]*$//' +} + +REPLACE_MODULES=( + "github.com/cometbft/cometbft" + "github.com/cosmos/cosmos-sdk" + "github.com/cosmos/iavl" + "github.com/noble-assets/forwarding/simapp" + "github.com/noble-assets/forwarding/v2" + "github.com/skip-mev/connect/v2" + "github.com/99designs/keyring" + "github.com/dgrijalva/jwt-go" + "github.com/gin-gonic/gin" + "github.com/syndtr/goleveldb" +) + +REPLACE_TARGETS=() +for mod in "${REPLACE_MODULES[@]}"; do + REPLACE_TARGETS+=("$(extract_replace_target "$mod")") +done + +INITIA_API_VERSION=$( + echo "$UPSTREAM_GOMOD" \ + | grep -E 'github\.com/initia-labs/initia/api' \ + | head -1 \ + | grep -oE 'v[0-9]+\.[0-9]+\.[0-9]+[^ ]*' \ + | head -1 +) + +echo "" +echo "==> Parsed from upstream:" +echo " initia: $VERSION" +echo " initia/api: ${INITIA_API_VERSION:-}" +for i in "${!REPLACE_MODULES[@]}"; do + target="${REPLACE_TARGETS[$i]}" + if [ -n "$target" ]; then + printf " %-22s => %s\n" "$(basename "${REPLACE_MODULES[$i]}")" "$target" + fi +done + +: "${INITIA_API_VERSION:=$VERSION}" + +# ── discover modules ───────────────────────────────────────────────────────── + +MOD_DIRS=() +while IFS= read -r modfile; do + MOD_DIRS+=("$(dirname "$modfile")") +done < <(find "$ROOT_DIR" -name go.mod -not -path '*/vendor/*') + +echo "" +echo "==> Found ${#MOD_DIRS[@]} module(s)" + +# ── helpers ────────────────────────────────────────────────────────────────── + +sed_inplace() { + local file="$1" expr="$2" + if [[ "$OSTYPE" == darwin* ]]; then + sed -i '' -E "$expr" "$file" + else + sed -i -E "$expr" "$file" + fi +} + +update_replace() { + local file="$1" module="$2" target="$3" + local escaped + escaped=$(echo "$module" | sed 's|/|\\/|g; s|\.|\\.|g') + sed_inplace "$file" \ + "s|(${escaped} =>) .*|\1 ${target}|" +} + +# ── update each go.mod ─────────────────────────────────────────────────────── + +for dir in "${MOD_DIRS[@]}"; do + f="$dir/go.mod" + rel="${dir#$ROOT_DIR/}" + echo "" + echo "--- $rel/go.mod ---" + + # 1) update require: github.com/initia-labs/initia vX.Y.Z + # match "initia " (space) so we don't clobber initia/api, initia/movevm, etc. + if grep -qE 'github\.com/initia-labs/initia ' "$f"; then + sed_inplace "$f" \ + "s|(github\.com/initia-labs/initia) v[[:alnum:]._-]+|\1 ${VERSION}|g" + echo " initia -> $VERSION" + fi + + # 2) update require: github.com/initia-labs/initia/api vX.Y.Z + if grep -qE 'github\.com/initia-labs/initia/api ' "$f"; then + sed_inplace "$f" \ + "s|(github\.com/initia-labs/initia/api) v[[:alnum:]._-]+|\1 ${INITIA_API_VERSION}|g" + echo " initia/api -> $INITIA_API_VERSION" + fi + + # 3) sync replace directives from upstream; flag missing ones + for i in "${!REPLACE_MODULES[@]}"; do + mod="${REPLACE_MODULES[$i]}" + target="${REPLACE_TARGETS[$i]}" + [ -z "$target" ] && continue + escaped_mod=$(echo "$mod" | sed 's|/|\\/|g') + if grep -qE "${escaped_mod} =>" "$f" 2>/dev/null; then + update_replace "$f" "$mod" "$target" + echo " replace $mod => $target" + elif grep -qE "[[:space:]]${escaped_mod} " "$f" 2>/dev/null; then + # auto-add the missing replace via go mod edit + local_target="${target/ /@}" + (cd "$dir" && go mod edit -replace="${mod}=${local_target}") + echo " replace $mod => $target (added)" + fi + done +done + +# ── go mod tidy ────────────────────────────────────────────────────────────── + +if [[ "$RUN_TIDY" -eq 1 ]]; then + echo "" + echo "==> Running go mod tidy ..." + for dir in "${MOD_DIRS[@]}"; do + rel="${dir#$ROOT_DIR/}" + echo " $rel" + (cd "$dir" && go mod tidy) + done +fi + +echo "" +echo "==> Done! Updated initia to $VERSION across ${#MOD_DIRS[@]} module(s)." diff --git a/sweeper/go.mod b/sweeper/go.mod new file mode 100644 index 00000000..f920b6db --- /dev/null +++ b/sweeper/go.mod @@ -0,0 +1,248 @@ +module github.com/initia-labs/core-indexer/sweeper + +go 1.25.8 + +require ( + github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d + github.com/cometbft/cometbft v0.38.20 + github.com/confluentinc/confluent-kafka-go/v2 v2.6.1 + github.com/getsentry/sentry-go v0.29.1 + github.com/initia-labs/core-indexer/pkg v0.0.0-00010101000000-000000000000 + github.com/rs/zerolog v1.33.0 + github.com/spf13/cobra v1.9.1 + gorm.io/gorm v1.30.0 +) + +require ( + ariga.io/atlas v0.33.1 // indirect + ariga.io/atlas-go-sdk v0.6.8 // indirect + ariga.io/atlas-provider-gorm v0.5.2 // indirect + github.com/agext/levenshtein v1.2.3 // indirect + github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect + github.com/bmatcuk/doublestar v1.3.4 // indirect + github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/go-openapi/inflect v0.19.0 // indirect + github.com/go-playground/validator/v10 v10.14.0 // indirect + github.com/go-sql-driver/mysql v1.8.1 // indirect + github.com/gobwas/ws v1.1.0 // indirect + github.com/golang-migrate/migrate/v4 v4.18.3 // indirect + github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect + github.com/golang-sql/sqlexp v0.1.0 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/hcl/v2 v2.18.1 // indirect + github.com/jackc/pgx/v5 v5.9.2 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/lib/pq v1.10.9 // indirect + github.com/mattn/go-sqlite3 v1.14.22 // indirect + github.com/microsoft/go-mssqldb v1.7.2 // indirect + github.com/mitchellh/go-wordwrap v1.0.1 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + github.com/zclconf/go-cty v1.14.4 // indirect + github.com/zclconf/go-cty-yaml v1.1.0 // indirect + go.uber.org/atomic v1.10.0 // indirect + gorm.io/driver/mysql v1.5.7 // indirect + gorm.io/driver/postgres v1.6.0 // indirect + gorm.io/driver/sqlite v1.5.7 // indirect + gorm.io/driver/sqlserver v1.5.4 // indirect +) + +require ( + cel.dev/expr v0.25.1 // indirect + cloud.google.com/go v0.123.0 // indirect + cloud.google.com/go/auth v0.18.2 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect + cloud.google.com/go/compute/metadata v0.9.0 // indirect + cloud.google.com/go/iam v1.5.3 // indirect + cloud.google.com/go/monitoring v1.24.3 // indirect + cloud.google.com/go/storage v1.61.3 // indirect + cosmossdk.io/api v0.7.6 // indirect + cosmossdk.io/collections v0.4.0 // indirect + cosmossdk.io/core v0.11.1 // indirect + cosmossdk.io/depinject v1.1.0 // indirect + cosmossdk.io/errors v1.0.1 // indirect + cosmossdk.io/log v1.4.1 // indirect + cosmossdk.io/math v1.4.0 // indirect + cosmossdk.io/store v1.1.1 // indirect + cosmossdk.io/x/tx v0.13.7 // indirect + filippo.io/edwards25519 v1.1.1 // indirect + github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect + github.com/99designs/keyring v1.2.2 // indirect + github.com/DataDog/datadog-go v3.2.0+incompatible // indirect + github.com/DataDog/zstd v1.5.5 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 // indirect + github.com/IGLOU-EU/go-wildcard v1.0.3 // indirect + github.com/aptos-labs/serde-reflection/serde-generate/runtime/golang v0.0.0-20231213012317-73b6bbf74833 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 // indirect + github.com/cockroachdb/errors v1.11.3 // indirect + github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v1.1.5 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/cometbft/cometbft-db v0.15.0 // indirect + github.com/cosmos/btcutil v1.0.5 // indirect + github.com/cosmos/cosmos-db v1.1.1 // indirect + github.com/cosmos/cosmos-proto v1.0.0-beta.5 // indirect + github.com/cosmos/cosmos-sdk v0.50.14 // indirect + github.com/cosmos/go-bip39 v1.0.0 // indirect + github.com/cosmos/gogogateway v1.2.0 // indirect + github.com/cosmos/gogoproto v1.7.0 // indirect + github.com/cosmos/iavl v1.2.6 // indirect + github.com/cosmos/ics23/go v0.11.0 // indirect + github.com/cosmos/ledger-cosmos-go v0.14.0 // indirect + github.com/danieljoos/wincred v1.1.2 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect + github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect + github.com/dgraph-io/badger/v4 v4.3.0 // indirect + github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/dvsekhvalnov/jose2go v1.7.0 // indirect + github.com/emicklei/dot v1.6.2 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.36.0 // indirect + github.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect + github.com/fatih/color v1.18.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-jose/go-jose/v4 v4.1.3 // indirect + github.com/go-kit/kit v0.13.0 // indirect + github.com/go-kit/log v0.2.1 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect + github.com/gogo/googleapis v1.4.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/google/btree v1.1.3 // indirect + github.com/google/flatbuffers v23.5.26+incompatible // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/google/s2a-go v0.1.9 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect + github.com/googleapis/gax-go/v2 v2.17.0 // indirect + github.com/gorilla/handlers v1.5.2 // indirect + github.com/gorilla/mux v1.8.1 // indirect + github.com/gorilla/websocket v1.5.3 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect + github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect + github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect + github.com/hashicorp/go-hclog v1.6.3 // indirect + github.com/hashicorp/go-immutable-radix v1.3.1 // indirect + github.com/hashicorp/go-metrics v0.5.3 // indirect + github.com/hashicorp/go-plugin v1.5.2 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hashicorp/yamux v0.1.1 // indirect + github.com/hdevalence/ed25519consensus v0.1.0 // indirect + github.com/huandu/skiplist v1.2.0 // indirect + github.com/iancoleman/strcase v0.3.0 // indirect + github.com/improbable-eng/grpc-web v0.15.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/initia-labs/initia v1.4.3 // indirect + github.com/initia-labs/movevm v1.2.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/jmhodges/levigo v1.0.0 // indirect + github.com/klauspost/compress v1.18.5 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/linxGnu/grocksdb v1.10.3 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mitchellh/go-testing-interface v1.14.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mtibben/percent v0.2.1 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a // indirect + github.com/oklog/run v1.1.0 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/client_golang v1.21.0 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.62.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect + github.com/rs/cors v1.11.1 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sasha-s/go-deadlock v0.3.5 // indirect + github.com/skip-mev/connect/v2 v2.3.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.7.1 // indirect + github.com/spf13/pflag v1.0.6 // indirect + github.com/spf13/viper v1.19.0 // indirect + github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect + github.com/stretchr/testify v1.11.1 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect + github.com/tendermint/go-amino v0.16.0 // indirect + github.com/tidwall/btree v1.7.0 // indirect + github.com/ybbus/jsonrpc/v3 v3.1.5 // indirect + github.com/zondax/hid v0.9.2 // indirect + github.com/zondax/ledger-go v0.14.3 // indirect + go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.39.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect + go.opentelemetry.io/otel v1.43.0 // indirect + go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/otel/sdk v1.43.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect + go.opentelemetry.io/otel/trace v1.43.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/crypto v0.49.0 // indirect + golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect + golang.org/x/net v0.52.0 // indirect + golang.org/x/oauth2 v0.36.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.42.0 // indirect + golang.org/x/term v0.41.0 // indirect + golang.org/x/text v0.35.0 // indirect + golang.org/x/time v0.15.0 // indirect + google.golang.org/api v0.271.0 // indirect + google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 // indirect + google.golang.org/grpc v1.79.3 // indirect + google.golang.org/protobuf v1.36.11 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + gotest.tools/v3 v3.5.1 // indirect + nhooyr.io/websocket v1.8.6 // indirect + pgregory.net/rapid v1.1.0 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect +) + +// initia custom +replace ( + github.com/99designs/keyring => github.com/cosmos/keyring v1.2.0 + github.com/cometbft/cometbft => github.com/initia-labs/cometbft v0.38.21-initia.2 + github.com/cosmos/cosmos-sdk => github.com/initia-labs/cosmos-sdk v0.50.15-initia.0 + github.com/cosmos/iavl => github.com/initia-labs/iavl v1.2.6-initia.1 + github.com/noble-assets/forwarding/simapp => github.com/initia-labs/forwarding/simapp v1.0.0 + github.com/noble-assets/forwarding/v2 => github.com/initia-labs/forwarding/v2 v2.0.3-initia.3 + github.com/skip-mev/connect/v2 => github.com/initia-labs/connect/v2 v2.3.1 + github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 +) + +replace github.com/initia-labs/core-indexer/pkg => ../pkg diff --git a/sweeper/go.sum b/sweeper/go.sum new file mode 100644 index 00000000..ce4da177 --- /dev/null +++ b/sweeper/go.sum @@ -0,0 +1,1579 @@ +ariga.io/atlas v0.33.1 h1:m3rn+m2jkfOZDqdZrgTDvDWh9G3Ldr77IElFDGEwDPk= +ariga.io/atlas v0.33.1/go.mod h1:WJesu2UCpGQvgUh3oVP94EiRT61nNy1W/VN5g+vqP1I= +ariga.io/atlas-go-sdk v0.6.8 h1:wonvcyOiXdrQnMrSNigLbMSaFV8yIxgA4Tb8EY2UGGE= +ariga.io/atlas-go-sdk v0.6.8/go.mod h1:9Q+/04PVyJHUse1lEE9Kp6E18xj/6mIzaUTcWYSjSnQ= +ariga.io/atlas-provider-gorm v0.5.2 h1:KuBY1PUmo6tzx3tpNjBypKJia3XrCXimjHDsxbYr9NE= +ariga.io/atlas-provider-gorm v0.5.2/go.mod h1:3a7Y0ZrenuGgoVXmGfn8q8U9qB7fJ5CprrXHMriMb0s= +cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= +cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= +cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= +cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM= +cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M= +cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= +cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= +cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= +cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= +cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= +cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= +cloud.google.com/go/logging v1.13.1 h1:O7LvmO0kGLaHY/gq8cV7T0dyp6zJhYAOtZPX4TF3QtY= +cloud.google.com/go/logging v1.13.1/go.mod h1:XAQkfkMBxQRjQek96WLPNze7vsOmay9H5PqfsNYDqvw= +cloud.google.com/go/longrunning v0.8.0 h1:LiKK77J3bx5gDLi4SMViHixjD2ohlkwBi+mKA7EhfW8= +cloud.google.com/go/longrunning v0.8.0/go.mod h1:UmErU2Onzi+fKDg2gR7dusz11Pe26aknR4kHmJJqIfk= +cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= +cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= +cloud.google.com/go/storage v1.61.3 h1:VS//ZfBuPGDvakfD9xyPW1RGF1Vy3BWUoVZXgW1KMOg= +cloud.google.com/go/storage v1.61.3/go.mod h1:JtqK8BBB7TWv0HVGHubtUdzYYrakOQIsMLffZ2Z/HWk= +cloud.google.com/go/trace v1.11.7 h1:kDNDX8JkaAG3R2nq1lIdkb7FCSi1rCmsEtKVsty7p+U= +cloud.google.com/go/trace v1.11.7/go.mod h1:TNn9d5V3fQVf6s4SCveVMIBS2LJUqo73GACmq/Tky0s= +cosmossdk.io/api v0.7.6 h1:PC20PcXy1xYKH2KU4RMurVoFjjKkCgYRbVAD4PdqUuY= +cosmossdk.io/api v0.7.6/go.mod h1:IcxpYS5fMemZGqyYtErK7OqvdM0C8kdW3dq8Q/XIG38= +cosmossdk.io/client/v2 v2.0.0-beta.4 h1:LGIzWbVTOof/IHQZeoWwxPX0fq607ONXhsfA7eUrQIg= +cosmossdk.io/client/v2 v2.0.0-beta.4/go.mod h1:c753d0sBv3AQRx6X+BOKL1aGpKjZMTZAHGiLPbVi5TE= +cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= +cosmossdk.io/collections v0.4.0/go.mod h1:oa5lUING2dP+gdDquow+QjlF45eL1t4TJDypgGd+tv0= +cosmossdk.io/core v0.11.1 h1:h9WfBey7NAiFfIcUhDVNS503I2P2HdZLebJlUIs8LPA= +cosmossdk.io/core v0.11.1/go.mod h1:OJzxcdC+RPrgGF8NJZR2uoQr56tc7gfBKhiKeDO7hH0= +cosmossdk.io/depinject v1.1.0 h1:wLan7LG35VM7Yo6ov0jId3RHWCGRhe8E8bsuARorl5E= +cosmossdk.io/depinject v1.1.0/go.mod h1:kkI5H9jCGHeKeYWXTqYdruogYrEeWvBQCw1Pj4/eCFI= +cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= +cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= +cosmossdk.io/log v1.4.1 h1:wKdjfDRbDyZRuWa8M+9nuvpVYxrEOwbD/CA8hvhU8QM= +cosmossdk.io/log v1.4.1/go.mod h1:k08v0Pyq+gCP6phvdI6RCGhLf/r425UT6Rk/m+o74rU= +cosmossdk.io/math v1.4.0 h1:XbgExXFnXmF/CccPPEto40gOO7FpWu9yWNAZPN3nkNQ= +cosmossdk.io/math v1.4.0/go.mod h1:O5PkD4apz2jZs4zqFdTr16e1dcaQCc5z6lkEnrrppuk= +cosmossdk.io/store v1.1.1 h1:NA3PioJtWDVU7cHHeyvdva5J/ggyLDkyH0hGHl2804Y= +cosmossdk.io/store v1.1.1/go.mod h1:8DwVTz83/2PSI366FERGbWSH7hL6sB7HbYp8bqksNwM= +cosmossdk.io/x/evidence v0.1.1 h1:Ks+BLTa3uftFpElLTDp9L76t2b58htjVbSZ86aoK/E4= +cosmossdk.io/x/evidence v0.1.1/go.mod h1:OoDsWlbtuyqS70LY51aX8FBTvguQqvFrt78qL7UzeNc= +cosmossdk.io/x/feegrant v0.1.1 h1:EKFWOeo/pup0yF0svDisWWKAA9Zags6Zd0P3nRvVvw8= +cosmossdk.io/x/feegrant v0.1.1/go.mod h1:2GjVVxX6G2fta8LWj7pC/ytHjryA6MHAJroBWHFNiEQ= +cosmossdk.io/x/tx v0.13.7 h1:8WSk6B/OHJLYjiZeMKhq7DK7lHDMyK0UfDbBMxVmeOI= +cosmossdk.io/x/tx v0.13.7/go.mod h1:V6DImnwJMTq5qFjeGWpXNiT/fjgE4HtmclRmTqRVM3w= +cosmossdk.io/x/upgrade v0.1.4 h1:/BWJim24QHoXde8Bc64/2BSEB6W4eTydq0X/2f8+g38= +cosmossdk.io/x/upgrade v0.1.4/go.mod h1:9v0Aj+fs97O+Ztw+tG3/tp5JSlrmT7IcFhAebQHmOPo= +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +filippo.io/edwards25519 v1.1.1 h1:YpjwWWlNmGIDyXOn8zLzqiD+9TyIlPhGFG96P39uBpw= +filippo.io/edwards25519 v1.1.1/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= +github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.1/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1/go.mod h1:RKUqNu35KJYcVG/fqTRqmuXJZYNhYkBrnC/hX7yGbTA= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.1/go.mod h1:uE9zaUfEQT/nbQjVi2IblCG9iaLtZsuYZ8ne+PuQ02M= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1/go.mod h1:h8hyGFDsU5HMivxiS2iYFZsgDbU9OnnJ163x5UGVKYo= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0 h1:U2rTu3Ef+7w9FHKIAXM6ZyqF3UOWJZ12zIm8zECAFfg= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.6.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 h1:jBQA3cKT4L2rWMpgE7Yt3Hwh2aUj8KXjIGLxjHeYNNo= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0/go.mod h1:4OG6tQ9EOP/MT0NMjDlRzWoVFxfu9rN9B2X+tlSVktg= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1/go.mod h1:GpPjLhVR9dnUoJMyHWSPy71xY9/lcmpzIPZXmF0FCVY= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.1.0 h1:DRiANoJTiW6obBQe3SqZizkuV1PEgfiiGivmVocDy64= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.1.0/go.mod h1:qLIye2hwb/ZouqhpSD9Zn3SJipvpEnz1Ywl3VUk9Y0s= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 h1:D3occbWoio4EBLkbkevetNMAVX197GkzbUMtqjGWn80= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= +github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= +github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 h1:sBEjpZlNHzK1voKq9695PJSX2o5NEXl7/OL3coiIY0c= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 h1:UnDZ/zFfG1JhH/DqxIZYU/1CUAlTUScoXD/LcM2Ykk8= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0/go.mod h1:IA1C1U7jO/ENqm/vhi7V9YYpBsp+IMyqNrEN94N7tVc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0 h1:7t/qx5Ost0s0wbA/VDrByOooURhp+ikYwv20i9Y07TQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0/go.mod h1:vB2GH9GAYYJTO3mEn8oYwzEdhlayZIdQz6zdzgUIRvA= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 h1:0s6TxfCu2KHkkZPnBfsQ2y5qia0jl3MMrmBhu3nCOYk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= +github.com/IGLOU-EU/go-wildcard v1.0.3 h1:r8T46+8/9V1STciXJomTWRpPEv4nGJATDbJkdU0Nou0= +github.com/IGLOU-EU/go-wildcard v1.0.3/go.mod h1:/qeV4QLmydCbwH0UMQJmXDryrFKJknWi/jjO8IiuQfY= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/Microsoft/hcsshim v0.11.5 h1:haEcLNpj9Ka1gd3B3tAEs9CpE0c+1IhoL59w/exYU38= +github.com/Microsoft/hcsshim v0.11.5/go.mod h1:MV8xMfmECjl5HdO7U/3/hFVnkmSBjAjmA09d4bExKcU= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= +github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= +github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alitto/pond v1.8.3 h1:ydIqygCLVPqIX/USe5EaV/aSRXTRXDEI9JwuDdu+/xs= +github.com/alitto/pond v1.8.3/go.mod h1:CmvIIGd5jKLasGI3D87qDkQxjzChdKMmnXMg3fG6M6Q= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= +github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= +github.com/aptos-labs/serde-reflection/serde-generate/runtime/golang v0.0.0-20231213012317-73b6bbf74833 h1:/OtHsUoaVegyyGQ9/Ycm5vrC3xTTyj4+N/HsJ0wwAGA= +github.com/aptos-labs/serde-reflection/serde-generate/runtime/golang v0.0.0-20231213012317-73b6bbf74833/go.mod h1:zUz5maIUAS+tl1lC+lJR7HUf0vVnHk6W7bCvN+DzjME= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/aws/aws-sdk-go-v2 v1.41.4 h1:10f50G7WyU02T56ox1wWXq+zTX9I1zxG46HYuG1hH/k= +github.com/aws/aws-sdk-go-v2 v1.41.4/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7 h1:3kGOqnh1pPeddVa/E37XNTaWJ8W6vrbYV9lJEkCnhuY= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.7/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI= +github.com/aws/aws-sdk-go-v2/config v1.32.12 h1:O3csC7HUGn2895eNrLytOJQdoL2xyJy0iYXhoZ1OmP0= +github.com/aws/aws-sdk-go-v2/config v1.32.12/go.mod h1:96zTvoOFR4FURjI+/5wY1vc1ABceROO4lWgWJuxgy0g= +github.com/aws/aws-sdk-go-v2/credentials v1.19.12 h1:oqtA6v+y5fZg//tcTWahyN9PEn5eDU/Wpvc2+kJ4aY8= +github.com/aws/aws-sdk-go-v2/credentials v1.19.12/go.mod h1:U3R1RtSHx6NB0DvEQFGyf/0sbrpJrluENHdPy1j/3TE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 h1:zOgq3uezl5nznfoK3ODuqbhVg1JzAGDUhXOsU0IDCAo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20/go.mod h1:z/MVwUARehy6GAg/yQ1GO2IMl0k++cu1ohP9zo887wE= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 h1:CNXO7mvgThFGqOFgbNAP2nol2qAWBOGfqR/7tQlvLmc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20/go.mod h1:oydPDJKcfMhgfcgBUZaG+toBbwy8yPWubJXBVERtI4o= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 h1:tN6W/hg+pkM+tf9XDkWUbDEjGLb+raoBMFsTodcoYKw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20/go.mod h1:YJ898MhD067hSHA6xYCx5ts/jEd8BSOLtQDL3iZsvbc= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21 h1:SwGMTMLIlvDNyhMteQ6r8IJSBPlRdXX5d4idhIGbkXA= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.21/go.mod h1:UUxgWxofmOdAMuqEsSppbDtGKLfR04HGsD0HXzvhI1k= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 h1:qtJZ70afD3ISKWnoX3xB0J2otEqu3LqicRcDBqsj0hQ= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12/go.mod h1:v2pNpJbRNl4vEUWEh5ytQok0zACAKfdmKS51Hotc3pQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 h1:2HvVAIq+YqgGotK6EkMf+KIEqTISmTYh5zLpYyeTo1Y= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20/go.mod h1:V4X406Y666khGa8ghKmphma/7C0DAtEQYhkq9z4vpbk= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 h1:siU1A6xjUZ2N8zjTHSXFhB9L/2OY8Dqs0xXiLjF30jA= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20/go.mod h1:4TLZCmVJDM3FOu5P5TJP0zOlu9zWgDWU7aUxWbr+rcw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1 h1:csi9NLpFZXb9fxY7rS1xVzgPRGMt7MSNWeQ6eo247kE= +github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1/go.mod h1:qXVal5H0ChqXP63t6jze5LmFalc7+ZE7wOdLtZ0LCP0= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 h1:0GFOLzEbOyZABS3PhYfBIx2rNBACYcKty+XGkTgw1ow= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.8/go.mod h1:LXypKvk85AROkKhOG6/YEcHFPoX+prKTowKnVdcaIxE= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 h1:kiIDLZ005EcKomYYITtfsjn7dtOwHDOFy7IbPXKek2o= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.13/go.mod h1:2h/xGEowcW/g38g06g3KpRWDlT+OTfxxI0o1KqayAB8= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 h1:jzKAXIlhZhJbnYwHbvUQZEB8KfgAEuG0dc08Bkda7NU= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17/go.mod h1:Al9fFsXjv4KfbzQHGe6V4NZSZQXecFcvaIF4e70FoRA= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 h1:Cng+OOwCHmFljXIxpEVXAGMnBia8MSU6Ch5i9PgBkcU= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.9/go.mod h1:LrlIndBDdjA/EeXeyNBle+gyCwTlizzW5ycgWnvIxkk= +github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng= +github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= +github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bits-and-blooms/bitset v1.20.0 h1:2F+rfL86jE2d/bmw7OhqUg2Sj/1rURkBn3MdfoPyRVU= +github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bmatcuk/doublestar v1.3.4 h1:gPypJ5xD31uhX6Tf54sDPUOBXTqKH4c9aPY66CyQrS0= +github.com/bmatcuk/doublestar v1.3.4/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/btcutil v1.1.6 h1:zFL2+c3Lb9gEgqKNzowKUPQNb8jV7v5Oaodi/AYFd6c= +github.com/btcsuite/btcd/btcutil v1.1.6/go.mod h1:9dFymx8HpuLqBnsPELrImQeTQfKBQqzqGbbV3jK55aE= +github.com/bufbuild/protocompile v0.8.0 h1:9Kp1q6OkS9L4nM3FYbr8vlJnEwtbpDPQlQOVXfR+78s= +github.com/bufbuild/protocompile v0.8.0/go.mod h1:+Etjg4guZoAqzVk2czwEQP12yaxLJ8DxuqCJ9qHdH94= +github.com/buger/goterm v1.0.4 h1:Z9YvGmOih81P0FbVtEYTFF6YsSgxSUKEhf/f9bTMXbY= +github.com/buger/goterm v1.0.4/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d h1:S2NE3iHSwP0XV47EEXL8mWmRdEfGscSJ+7EgePNgt0s= +github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 h1:6xNmx7iTtyBRev0+D/Tv1FZd4SCg8axKApyNyRsAt/w= +github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/BuvyMxRnYBlmVaq4OLiKW6iRQfvC62cvdkI= +github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= +github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v1.1.5 h1:5AAWCBWbat0uE0blr8qzufZP5tBjkRyy/jWe1QWLnvw= +github.com/cockroachdb/pebble v1.1.5/go.mod h1:17wO9el1YEigxkP/YtV8NtCivQDgoCyBg5c4VR/eOWo= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/cometbft/cometbft-db v0.15.0 h1:VLtsRt8udD4jHCyjvrsTBpgz83qne5hnL245AcPJVRk= +github.com/cometbft/cometbft-db v0.15.0/go.mod h1:EBrFs1GDRiTqrWXYi4v90Awf/gcdD5ExzdPbg4X8+mk= +github.com/compose-spec/compose-go/v2 v2.1.3 h1:bD67uqLuL/XgkAK6ir3xZvNLFPxPScEi1KW7R5esrLE= +github.com/compose-spec/compose-go/v2 v2.1.3/go.mod h1:lFN0DrMxIncJGYAXTfWuajfwj5haBJqrBkarHcnjJKc= +github.com/confluentinc/confluent-kafka-go/v2 v2.6.1 h1:XFkytnGvk/ZcY2qU0ql4E4h+ftBaGqkLO7tlZ4kRbr4= +github.com/confluentinc/confluent-kafka-go/v2 v2.6.1/go.mod h1:hScqtFIGUI1wqHIgM3mjoqEou4VweGGGX7dMpcUKves= +github.com/containerd/console v1.0.4 h1:F2g4+oChYvBTsASRTz8NP6iIAi97J3TtSAsLbIFn4ro= +github.com/containerd/console v1.0.4/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= +github.com/containerd/containerd v1.7.18 h1:jqjZTQNfXGoEaZdW1WwPU0RqSn1Bm2Ay/KJPUuO8nao= +github.com/containerd/containerd v1.7.18/go.mod h1:IYEk9/IO6wAPUz2bCMVUbsfXjzw5UNP5fLz4PsUygQ4= +github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8= +github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/containerd/errdefs v0.1.0 h1:m0wCRBiu1WJT/Fr+iOoQHMQS/eP5myQ8lCv4Dz5ZURM= +github.com/containerd/errdefs v0.1.0/go.mod h1:YgWiiHtLmSeBrvpw+UfPijzbLaB77mEG1WwJTDETIV0= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +github.com/containerd/ttrpc v1.2.5 h1:IFckT1EFQoFBMG4c3sMdT8EP3/aKfumK1msY+Ze4oLU= +github.com/containerd/ttrpc v1.2.5/go.mod h1:YCXHsb32f+Sq5/72xHubdiJRQY9inL4a4ZQrAbN1q9o= +github.com/containerd/typeurl/v2 v2.1.1 h1:3Q4Pt7i8nYwy2KmQWIw2+1hTvwTE/6w9FqcttATPO/4= +github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3HZj1hsSQlywkQ0= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= +github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= +github.com/cosmos/cosmos-db v1.1.1 h1:FezFSU37AlBC8S98NlSagL76oqBRWq/prTPvFcEJNCM= +github.com/cosmos/cosmos-db v1.1.1/go.mod h1:AghjcIPqdhSLP/2Z0yha5xPH3nLnskz81pBx3tcVSAw= +github.com/cosmos/cosmos-proto v1.0.0-beta.5 h1:eNcayDLpip+zVLRLYafhzLvQlSmyab+RC5W7ZfmxJLA= +github.com/cosmos/cosmos-proto v1.0.0-beta.5/go.mod h1:hQGLpiIUloJBMdQMMWb/4wRApmI9hjHH05nefC0Ojec= +github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= +github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= +github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= +github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= +github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= +github.com/cosmos/gogoproto v1.7.0 h1:79USr0oyXAbxg3rspGh/m4SWNyoz/GLaAh0QlCe2fro= +github.com/cosmos/gogoproto v1.7.0/go.mod h1:yWChEv5IUEYURQasfyBW5ffkMHR/90hiHgbNgrtp4j0= +github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.2.0 h1:rM+S14DFiqmu6Rc3PuhvWqwywPsnt/CbIslSnBftPFs= +github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.2.0/go.mod h1:O5H9Ic3Pe6cmJn1eqlj5N48sLb8WQ1VWmDP4/11g/4E= +github.com/cosmos/ibc-apps/modules/rate-limiting/v8 v8.0.0 h1:AQO9NIAP3RFqvBCj7IqM/V1LCxmuvcvGUdu0RIEz/c0= +github.com/cosmos/ibc-apps/modules/rate-limiting/v8 v8.0.0/go.mod h1:/ZpKJSW/SKPkFS7jTqkPVn7kOHUUfRNzu+8aS7YOL8o= +github.com/cosmos/ibc-go/modules/capability v1.0.1 h1:ibwhrpJ3SftEEZRxCRkH0fQZ9svjthrX2+oXdZvzgGI= +github.com/cosmos/ibc-go/modules/capability v1.0.1/go.mod h1:rquyOV262nGJplkumH+/LeYs04P3eV8oB7ZM4Ygqk4E= +github.com/cosmos/ibc-go/v8 v8.7.0 h1:HqhVOkO8bDpClXE81DFQgFjroQcTvtpm0tCS7SQVKVY= +github.com/cosmos/ibc-go/v8 v8.7.0/go.mod h1:G2z+Q6ZQSMcyHI2+BVcJdvfOupb09M2h/tgpXOEdY6k= +github.com/cosmos/ics23/go v0.11.0 h1:jk5skjT0TqX5e5QJbEnwXIS2yI2vnmLOgpQPeM5RtnU= +github.com/cosmos/ics23/go v0.11.0/go.mod h1:A8OjxPE67hHST4Icw94hOxxFEJMBG031xIGF/JHNIY0= +github.com/cosmos/interchain-security/v6 v6.3.0 h1:AIsfxLUDtUGVfaqJ1WPwnYIOT5AxoSO58469iw9vNH4= +github.com/cosmos/interchain-security/v6 v6.3.0/go.mod h1:6DSiV2w+DuPkxP1KGFtaxpiwf8Xt2iusj8O53KCx96Q= +github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo= +github.com/cosmos/keyring v1.2.0/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= +github.com/cosmos/ledger-cosmos-go v0.14.0 h1:WfCHricT3rPbkPSVKRH+L4fQGKYHuGOK9Edpel8TYpE= +github.com/cosmos/ledger-cosmos-go v0.14.0/go.mod h1:E07xCWSBl3mTGofZ2QnL4cIUzMbbGVyik84QYKbX3RA= +github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= +github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= +github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.1.0 h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U0x++OzVrdms8= +github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= +github.com/dgraph-io/badger/v4 v4.3.0 h1:lcsCE1/1qrRhqP+zYx6xDZb8n7U+QlwNicpc676Ub40= +github.com/dgraph-io/badger/v4 v4.3.0/go.mod h1:Sc0T595g8zqAQRDf44n+z3wG4BOqLwceaFntt8KPxUM= +github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91 h1:Pux6+xANi0I7RRo5E1gflI4EZ2yx3BGZ75JkAIvGEOA= +github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91/go.mod h1:swkazRqnUf1N62d0Nutz7KIj2UKqsm/H8tD0nBJAXqM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dhui/dktest v0.4.5 h1:uUfYBIVREmj/Rw6MvgmqNAYzTiKOHJak+enB5Di73MM= +github.com/dhui/dktest v0.4.5/go.mod h1:tmcyeHDKagvlDrz7gDKq4UAJOLIfVZYkfD5OnHDwcCo= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/docker/buildx v0.15.1 h1:1cO6JIc0rOoC8tlxfXoh1HH1uxaNvYH1q7J7kv5enhw= +github.com/docker/buildx v0.15.1/go.mod h1:16DQgJqoggmadc1UhLaUTPqKtR+PlByN/kyXFdkhFCo= +github.com/docker/cli v27.0.3+incompatible h1:usGs0/BoBW8MWxGeEtqPMkzOY56jZ6kYlSN5BLDioCQ= +github.com/docker/cli v27.0.3+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/compose/v2 v2.28.1 h1:ORPfiVHrpnRQBDoC3F8JJyWAY8N5gWuo3FgwyivxFdM= +github.com/docker/compose/v2 v2.28.1/go.mod h1:wDtGQFHe99sPLCHXeVbCkc+Wsl4Y/2ZxiAJa/nga6rA= +github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= +github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v27.2.0+incompatible h1:Rk9nIVdfH3+Vz4cyI/uhbINhEZ/oLmc+CBXmH6fbNk4= +github.com/docker/docker v27.2.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8= +github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c/go.mod h1:CADgU4DSXK5QUlFslkQu2yW2TKzFZcXq/leZfM0UH5Q= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/dvsekhvalnov/jose2go v1.7.0 h1:bnQc8+GMnidJZA8zc6lLEAb4xNrIqHwO+9TzqvtQZPo= +github.com/dvsekhvalnov/jose2go v1.7.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203 h1:XBBHcIb256gUJtLmY22n99HaZTz+r2Z51xUPi01m3wg= +github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203/go.mod h1:E1jcSv8FaEny+OP/5k9UxZVw9YFWGj7eI4KR/iOBqCg= +github.com/emicklei/dot v1.6.2 h1:08GN+DD79cy/tzN6uLCT84+2Wk9u+wvqP+Hkx/dIR8A= +github.com/emicklei/dot v1.6.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= +github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= +github.com/envoyproxy/go-control-plane/envoy v1.36.0 h1:yg/JjO5E7ubRyKX3m07GF3reDNEnfOboJ0QySbH736g= +github.com/envoyproxy/go-control-plane/envoy v1.36.0/go.mod h1:ty89S1YCCVruQAm9OtKeEkQLTb+Lkz0k8v9W0Oxsv98= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4= +github.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA= +github.com/ethereum/go-ethereum v1.16.9 h1:UTJ93yoXD7BEMWg+9lSZ8/Zvf0oZfy2ZUmv0Gn0ZclE= +github.com/ethereum/go-ethereum v1.16.9/go.mod h1:Fs6QebQbavneQTYcA39PEKv2+zIjX7rPUZ14DER46wk= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsevents v0.2.0 h1:BRlvlqjvNTfogHfeBOFvSC9N0Ddy+wzQCQukyoD7o/c= +github.com/fsnotify/fsevents v0.2.0/go.mod h1:B3eEk39i4hz8y1zaWS/wPrAP4O6wkIl7HQwKBr1qH/w= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fvbommel/sortorder v1.0.2 h1:mV4o8B2hKboCdkJm+a7uX/SIpZob4JzUpc5GGnM45eo= +github.com/fvbommel/sortorder v1.0.2/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/getsentry/sentry-go v0.29.1 h1:DyZuChN8Hz3ARxGVV8ePaNXh1dQ7d76AiB117xcREwA= +github.com/getsentry/sentry-go v0.29.1/go.mod h1:x3AtIzN01d6SiWkderzaH28Tm0lgkafpJ5Bm3li39O0= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= +github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= +github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU= +github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= +github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= +github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= +github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/gobwas/ws v1.1.0 h1:7RFti/xnNkMJnrK7D1yQ/iCIB5OrrY/54/H930kIbHA= +github.com/gobwas/ws v1.1.0/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= +github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-migrate/migrate/v4 v4.18.3 h1:EYGkoOsvgHHfm5U/naS1RP/6PL/Xv3S4B/swMiAmDLs= +github.com/golang-migrate/migrate/v4 v4.18.3/go.mod h1:99BKpIi6ruaaXRM1A77eqZ+FWPQ3cfRa+ZVy5bmWMaY= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg= +github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= +github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= +github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= +github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8= +github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= +github.com/googleapis/gax-go/v2 v2.17.0 h1:RksgfBpxqff0EZkDWYuz9q/uWsTVz+kf43LsZ1J6SMc= +github.com/googleapis/gax-go/v2 v2.17.0/go.mod h1:mzaqghpQp4JDh3HvADwrat+6M3MOIDp5YKHhb9PAgDY= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= +github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72 h1:vTCWu1wbdYo7PEZFem/rlr01+Un+wwVmI7wiegFdRLk= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.72/go.mod h1:Vn+BBgKQHVQYdVQ4NZDICE1Brb+JfaONyDHr3q07oQc= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-getter v1.8.6 h1:9sQboWULaydVphxc4S64oAI4YqpuCk7nPmvbk131ebY= +github.com/hashicorp/go-getter v1.8.6/go.mod h1:nVH12eOV2P58dIiL3rsU6Fh3wLeJEKBOJzhMmzlSWoo= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-metrics v0.5.3 h1:M5uADWMOGCTUNU1YuC4hfknOeHNaX54LDm4oYSucoNE= +github.com/hashicorp/go-metrics v0.5.3/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-plugin v1.5.2 h1:aWv8eimFqWlsEiMrYZdPYl+FdHaBJSN4AWwGWfT1G2Y= +github.com/hashicorp/go-plugin v1.5.2/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.8.0 h1:KAkNb1HAiZd1ukkxDFGmokVZe1Xy9HG6NUp+bPle2i4= +github.com/hashicorp/go-version v1.8.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/hcl/v2 v2.18.1 h1:6nxnOJFku1EuSawSD81fuviYUV8DxFr3fp2dUi3ZYSo= +github.com/hashicorp/hcl/v2 v2.18.1/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+JtMeeGErHE= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= +github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= +github.com/holiman/uint256 v1.3.2 h1:a9EgMPSC1AAaj1SZL5zIQD3WbwTuHrMGOerLjGmM/TA= +github.com/holiman/uint256 v1.3.2/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= +github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= +github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= +github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/iancoleman/orderedmap v0.3.0 h1:5cbR2grmZR/DiVt+VJopEhtVs9YGInGIxAoMJn+Ichc= +github.com/iancoleman/orderedmap v0.3.0/go.mod h1:XuLcCUkdL5owUCQeF2Ue9uuw1EptkJDkXXS7VoV7XGE= +github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= +github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= +github.com/in-toto/in-toto-golang v0.5.0 h1:hb8bgwr0M2hGdDsLjkJ3ZqJ8JFLL/tgYdAxF/XEFBbY= +github.com/in-toto/in-toto-golang v0.5.0/go.mod h1:/Rq0IZHLV7Ku5gielPT4wPHJfH1GdHMCq8+WPxw8/BE= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/initia-labs/OPinit v1.3.0 h1:cGxJpzVOfxGO8Ql/Z6SVJCSpokkqB4jFBjo6kx9Uax8= +github.com/initia-labs/OPinit v1.3.0/go.mod h1:VZG+/Wd/9cVDbzCwZld/tve6kcJC1zemeeQvp5FKKCI= +github.com/initia-labs/OPinit/api v1.3.0 h1:MAu4XEJ2uibDVKBo0jB6b6/BGaoXjDUJC+dwhU530ag= +github.com/initia-labs/OPinit/api v1.3.0/go.mod h1:sWDfvmcxd7KD59ukB/Wz0BSpyimyptDEzz1Epe/ET+Y= +github.com/initia-labs/cometbft v0.38.21-initia.2 h1:sFFc6JnbPKFd4XdH3EXZ7TBfi3uVv34HdyHVX5gvvlQ= +github.com/initia-labs/cometbft v0.38.21-initia.2/go.mod h1:CQ/VkJXRdaWxDLyKT+JYAWV0m215oRFtymtIr7skA6o= +github.com/initia-labs/connect/v2 v2.3.1 h1:Y32LCwUHDBgUzzQHqPBJeWeItYoNu2oYD57JKbZCtjw= +github.com/initia-labs/connect/v2 v2.3.1/go.mod h1:35hM7xSgI0h3GMUTgspzKY8Ff2yCXNGNwmAdjqo3z8s= +github.com/initia-labs/cosmos-sdk v0.50.15-initia.0 h1:cgKCqzXBm8md5Q5C9VAyIGCheHhNcOGK/BwpFbett2g= +github.com/initia-labs/cosmos-sdk v0.50.15-initia.0/go.mod h1:/dinzXHi7qK0dEPZjS3LI5gMHueKQdqyjbB9chwswo0= +github.com/initia-labs/forwarding/v2 v2.0.3-initia.3 h1:Uu1VqRsSwX7rgS2A4M3Snzyzk9mJRq2v/ZD4xKHTJkM= +github.com/initia-labs/forwarding/v2 v2.0.3-initia.3/go.mod h1:N3OzYf14ton71zCxomBmpR7tOxZ2dKwhsMxUmtuJuVQ= +github.com/initia-labs/iavl v1.2.6-initia.1 h1:4vf9eiccLkob2eiM8YAM8Gf/UBniEFUKpvncM/hVoO8= +github.com/initia-labs/iavl v1.2.6-initia.1/go.mod h1:GiM43q0pB+uG53mLxLDzimxM9l/5N9UuSY3/D0huuVw= +github.com/initia-labs/initia v1.4.3 h1:cEnENL26T7hsa0oDm4hf953tUQYc1cQ3fll84jBfoa0= +github.com/initia-labs/initia v1.4.3/go.mod h1:Y7ir28A0RmL3AQpvTK/mXzyvF6RtijgH/v520xvrk3s= +github.com/initia-labs/initia/api v1.4.0 h1:1DOUBxugC9ZdtMnmmN3qFWnNjlW7I6sssvvu4/ohVtU= +github.com/initia-labs/initia/api v1.4.0/go.mod h1:YQAtPknqt4tZSj+AK0OfZ83XXah2MCna/Ko74/VQe6Q= +github.com/initia-labs/movevm v1.2.0 h1:IbpipjRIZe851FJZZzP3RGIqrOCcNsI6bDF9VC0K0do= +github.com/initia-labs/movevm v1.2.0/go.mod h1:sj/kXD7mUQASqogPTjqltIr4Uid3xxnlcbfiFvvqeXA= +github.com/initia-labs/store v0.1.1 h1:sc4PTv30oS99t0EWgFPy0pCFPYJsHngB2QfZS5XY/Xo= +github.com/initia-labs/store v0.1.1/go.mod h1:8Hgv+JpqjFYy2335pHLnMq6LmVdXyF1G17yi6uWl76M= +github.com/initia-labs/store/memiavl v0.1.1 h1:aymS3es9pPY7ysizK2K+r4TImR0W5N1C5Ld75HRMvXc= +github.com/initia-labs/store/memiavl v0.1.1/go.mod h1:510W4Nf6QAWmFLYPhqhOhO1tagdeocM0b89a/M0zMRk= +github.com/initia-labs/store/versiondb v0.1.0 h1:8lQK7Q6GUwwAc8R3IIBbj9MOlIkKCq0nwnRpjT20Ahc= +github.com/initia-labs/store/versiondb v0.1.0/go.mod h1:fP27G3qPUluu7yM8j2xcW05Brmj0QBT7nlTTFvEszNc= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.9.2 h1:3ZhOzMWnR4yJ+RW1XImIPsD1aNSz4T4fyP7zlQb56hw= +github.com/jackc/pgx/v5 v5.9.2/go.mod h1:mal1tBGAFfLHvZzaYh77YS/eC6IX9OWbRV1QIIM0Jn4= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jhump/protoreflect v1.15.6 h1:WMYJbw2Wo+KOWwZFvgY0jMoVHM6i4XIvRs2RcBj5VmI= +github.com/jhump/protoreflect v1.15.6/go.mod h1:jCHoyYQIJnaabEYnbGwyo9hUqfyUMTbJw/tAut5t97E= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= +github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE= +github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/ledgerwatch/erigon-lib v0.0.0-20230210071639-db0e7ed11263 h1:LGEzZvf33Y1NhuP5+jI/ni9l1TFS6oYPDilgy74NusM= +github.com/ledgerwatch/erigon-lib v0.0.0-20230210071639-db0e7ed11263/go.mod h1:OXgMDuUo2lZ3NpH29ZvMYbk+LxFd5ffDl2Z2mGMuY/I= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/linxGnu/grocksdb v1.10.3 h1:0laII9AQ6kFxo5SjhdTfSh9EgF20piD6TMHK6YuDm+4= +github.com/linxGnu/grocksdb v1.10.3/go.mod h1:OLQKZwiKwaJiAVCsOzWKvwiLwfZ5Vz8Md5TYR7t7pM8= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= +github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +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.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/microsoft/go-mssqldb v1.7.2 h1:CHkFJiObW7ItKTJfHo1QX7QBBD1iV+mn1eOyRP3b/PA= +github.com/microsoft/go-mssqldb v1.7.2/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q= +github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/buildkit v0.14.1 h1:2epLCZTkn4CikdImtsLtIa++7DzCimrrZCT1sway+oI= +github.com/moby/buildkit v0.14.1/go.mod h1:1XssG7cAqv5Bz1xcGMxJL123iCv5TYN4Z/qf647gfuk= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= +github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mountinfo v0.7.1 h1:/tTvQaSJRr2FshkhXiIpux6fQ2Zvc4j7tAhMTStAG2g= +github.com/moby/sys/mountinfo v0.7.1/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +github.com/moby/sys/signal v0.7.0 h1:25RW3d5TnQEoKvRbEKUGay6DCQ46IxAVTT9CUMgmsSI= +github.com/moby/sys/signal v0.7.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/moby/sys/symlink v0.2.0 h1:tk1rOM+Ljp0nFmfOIBtlV3rTDlWOwFRhjEeAhZB0nZc= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= +github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= +github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= +github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= +github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= +github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a h1:dlRvE5fWabOchtH7znfiFCcOvmIYgOeAS5ifBXBlh9Q= +github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.26.0 h1:03cDLK28U6hWvCAns6NeydX3zIm4SF3ci69ulidS32Q= +github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA= +github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= +github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/r3labs/sse v0.0.0-20210224172625-26fe804710bc h1:zAsgcP8MhzAbhMnB1QQ2O7ZhWYVGYSR2iVcjzQuPV+o= +github.com/r3labs/sse v0.0.0-20210224172625-26fe804710bc/go.mod h1:S8xSOnV3CgpNrWd0GQ/OoQfMtlg2uPRSuTzcSGrzwK8= +github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= +github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= +github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sasha-s/go-deadlock v0.3.5 h1:tNCOEEDG6tBqrNDOX35j/7hL5FcFViG6awUGROb2NsU= +github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6vCBBsiChJQ5U= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/secure-systems-lab/go-securesystemslib v0.4.0 h1:b23VGrQhTA8cN2CbBw7/FulN9fTtqYUdS5+Oxzt+DUE= +github.com/secure-systems-lab/go-securesystemslib v0.4.0/go.mod h1:FGBZgq2tXWICsxWQW1msNf49F0Pf2Op5Htayx335Qbs= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= +github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b h1:h+3JX2VoWTFuyQEo87pStk/a99dzIO1mM9KxIyLPGTU= +github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= +github.com/shibumi/go-pathspec v1.3.0 h1:QUyMZhFo0Md5B8zV8x2tesohbb5kfbpTi9rBnKh5dkI= +github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= +github.com/shirou/gopsutil/v3 v3.23.12 h1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4= +github.com/shirou/gopsutil/v3 v3.23.12/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610 h1:4JlsiRVt/YZOvrKH525T7sZXgEWUEjqSDMwE6fXNbdo= +github.com/skip-mev/chaintestutil v0.0.0-20240514161515-056d7ba45610/go.mod h1:kB8gFZX07CyJnw8q9iEZijI3qJTIe1K/Y++P5VGkrcg= +github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= +github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= +github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= +github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= +github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= +github.com/testcontainers/testcontainers-go v0.33.0 h1:zJS9PfXYT5O0ZFXM2xxXfk4J5UMw/kRiISng037Gxdw= +github.com/testcontainers/testcontainers-go v0.33.0/go.mod h1:W80YpTa8D5C3Yy16icheD01UTDu+LmXIA2Keo+jWtT8= +github.com/testcontainers/testcontainers-go/modules/compose v0.33.0 h1:PyrUOF+zG+xrS3p+FesyVxMI+9U+7pwhZhyFozH3jKY= +github.com/testcontainers/testcontainers-go/modules/compose v0.33.0/go.mod h1:oqZaUnFEskdZriO51YBquku/jhgzoXHPot6xe1DqKV4= +github.com/theupdateframework/notary v0.7.0 h1:QyagRZ7wlSpjT5N2qQAh/pN+DVqgekv4DzbAiAiEL3c= +github.com/theupdateframework/notary v0.7.0/go.mod h1:c9DRxcmhHmVLDay4/2fUYdISnHqbFDGRSlXPO0AhYWw= +github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= +github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/tinylru v1.1.0 h1:XY6IUfzVTU9rpwdhKUF6nQdChgCdGjkMfLzbWyiau6I= +github.com/tidwall/tinylru v1.1.0/go.mod h1:3+bX+TJ2baOLMWTnlyNWHh4QMnFyARg2TLTQ6OFbzw8= +github.com/tidwall/wal v1.1.7 h1:emc1TRjIVsdKKSnpwGBAcsAGg0767SvUk8+ygx7Bb+4= +github.com/tidwall/wal v1.1.7/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E= +github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375 h1:QB54BJwA6x8QU9nHY3xJSZR2kX9bgpZekRKGkLTmEXA= +github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375/go.mod h1:xRroudyp5iVtxKqZCrA6n2TLFRBf8bmnjr1UD4x+z7g= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tonistiigi/fsutil v0.0.0-20240424095704-91a3fc46842c h1:+6wg/4ORAbnSoGDzg2Q1i3CeMcT/jjhye/ZfnBHy7/M= +github.com/tonistiigi/fsutil v0.0.0-20240424095704-91a3fc46842c/go.mod h1:vbbYqJlnswsbJqWUcJN8fKtBhnEgldDrcagTgnBVKKM= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea h1:SXhTLE6pb6eld/v/cCndK0AMpt1wiVFb/YYmqB3/QG0= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= +github.com/tonistiigi/vt100 v0.0.0-20240514184818-90bafcd6abab h1:H6aJ0yKQ0gF49Qb2z5hI1UHxSQt4JMyxebFR15KnApw= +github.com/tonistiigi/vt100 v0.0.0-20240514184818-90bafcd6abab/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= +github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/ybbus/jsonrpc/v3 v3.1.5 h1:0cC/QzS8OCuXYqqDbYnKKhsEe+IZLrNlDx8KPCieeW0= +github.com/ybbus/jsonrpc/v3 v3.1.5/go.mod h1:U1QbyNfL5Pvi2roT0OpRbJeyvGxfWYSgKJHjxWdAEeE= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= +github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/zbiljic/go-filelock v0.0.0-20170914061330-1dbf7103ab7d h1:XQyeLr7N9iY9mi+TGgsBFkj54+j3fdoo8e2u6zrGP5A= +github.com/zbiljic/go-filelock v0.0.0-20170914061330-1dbf7103ab7d/go.mod h1:hoMeDjlNXTNqVwrCk8YDyaBS2g5vFfEX2ezMi4vb6CY= +github.com/zclconf/go-cty v1.14.4 h1:uXXczd9QDGsgu0i/QFR/hzI5NYCHLf6NQw/atrbnhq8= +github.com/zclconf/go-cty v1.14.4/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +github.com/zclconf/go-cty-yaml v1.1.0 h1:nP+jp0qPHv2IhUVqmQSzjvqAWcObN0KBkUl2rWBdig0= +github.com/zclconf/go-cty-yaml v1.1.0/go.mod h1:9YLUH4g7lOhVWqUbctnVlZ5KLpg7JAprQNgxSZ1Gyxs= +github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= +github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= +github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1UpHb342ycI= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5 h1:qxen9oVGzDdIRP6ejyAJc760RwW4SnVDiTYTzwnXuxo= +go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5/go.mod h1:eW0HG9/oHQhvRCvb1/pIXW4cOvtDqeQK+XSi3TnwaXY= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/contrib/detectors/gcp v1.39.0 h1:kWRNZMsfBHZ+uHjiH4y7Etn2FK26LAGkNFw7RHv1DhE= +go.opentelemetry.io/contrib/detectors/gcp v1.39.0/go.mod h1:t/OGqzHBa5v6RHZwrDBJ2OirWc+4q/w2fTbLZwAKjTk= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 h1:YH4g8lQroajqUwWbq/tr2QX1JFmEXaDLgG+ew9bLMWo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0/go.mod h1:fvPi2qXDqFs8M4B4fmJhE92TyQs9Ydjlg3RvfUp+NbQ= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.46.1 h1:gbhw/u49SS3gkPWiYweQNJGm/uJN5GkI/FrosxSHT7A= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.46.1/go.mod h1:GnOaBaFQ2we3b9AGWJpsBa7v1S5RlQzlC3O7dRMxZhM= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0 h1:wNMDy/LVGLj2h3p6zg4d0gypKfWKSWI14E1C4smOgl8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0/go.mod h1:YfbDdXAAkemWJK3H/DshvlrxqFB2rtW4rY6ky/3x/H0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 h1:digkEZCJWobwBqMwC0cwCq8/wkkRy/OowZg5OArWZrM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0/go.mod h1:/OpE/y70qVkndM0TrxT4KBoN3RsFZP0QaofcfYrj76I= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0 h1:ZrPRak/kS4xI3AVXy8F7pipuDXmDsrO8Lg+yQjBLjw0= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0/go.mod h1:3y6kQCWztq6hyW8Z9YxQDDm0Je9AJoFar2G0yDcmhRk= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= +go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4= +go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= +go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +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-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= +golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +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.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/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-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= +golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= +golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/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/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/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-20201207223542-d4d67f95c62d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/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.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +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.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.41.0 h1:QCgPso/Q3RTJx2Th4bDLqML4W6iJiaXFq2/ftQF13YU= +golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= +golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= +golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +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-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.271.0 h1:cIPN4qcUc61jlh7oXu6pwOQqbJW2GqYh5PS6rB2C/JY= +google.golang.org/api v0.271.0/go.mod h1:CGT29bhwkbF+i11qkRUJb2KMKqcJ1hdFceEIRd9u64Q= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 h1:VQZ/yAbAtjkHgH80teYd2em3xtIkkHd7ZhqfH2N9CsM= +google.golang.org/genproto v0.0.0-20260128011058-8636f8732409/go.mod h1:rxKD3IEILWEu3P44seeNOAwZN4SaoKaQ/2eTg4mM6EM= +google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20 h1:7ei4lp52gK1uSejlA8AZl5AJjeLUOHBQscRQZUgAcu0= +google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20/go.mod h1:ZdbssH/1SOVnjnDlXzxDHK2MCidiqXtbYccJNzNYPEE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 h1:ggcbiqK8WWh6l1dnltU4BgWGIGo+EVYxCaAPih/zQXQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= +google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/cenkalti/backoff.v1 v1.1.0 h1:Arh75ttbsvlpVA7WtVpH4u9h6Zl46xuptxqLxPiSo4Y= +gopkg.in/cenkalti/backoff.v1 v1.1.0/go.mod h1:J6Vskwqd+OMVJl8C33mmtxTBs2gyzfv7UDAkHu8BrjI= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo= +gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= +gorm.io/driver/postgres v1.6.0 h1:2dxzU8xJ+ivvqTRph34QX+WrRaJlmfyPqXmoGVjMBa4= +gorm.io/driver/postgres v1.6.0/go.mod h1:vUw0mrGgrTK+uPHEhAdV4sfFELrByKVGnaVRkXDhtWo= +gorm.io/driver/sqlite v1.5.7 h1:8NvsrhP0ifM7LX9G4zPB97NwovUakUxc+2V2uuf3Z1I= +gorm.io/driver/sqlite v1.5.7/go.mod h1:U+J8craQU6Fzkcvu8oLeAQmi50TkwPEhHDEjQZXDah4= +gorm.io/driver/sqlserver v1.5.4 h1:xA+Y1KDNspv79q43bPyjDMUgHoYHLhXYmdFcYPobg8g= +gorm.io/driver/sqlserver v1.5.4/go.mod h1:+frZ/qYmuna11zHPlh5oc2O6ZA/lS88Keb0XSH1Zh/g= +gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.30.0 h1:qbT5aPv1UH8gI99OsRlvDToLxW5zR7FzS9acZDOZcgs= +gorm.io/gorm v1.30.0/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +k8s.io/api v0.29.2 h1:hBC7B9+MU+ptchxEqTNW2DkUosJpp1P+Wn6YncZ474A= +k8s.io/api v0.29.2/go.mod h1:sdIaaKuU7P44aoyyLlikSLayT6Vb7bvJNCX105xZXY0= +k8s.io/apimachinery v0.29.2 h1:EWGpfJ856oj11C52NRCHuU7rFDwxev48z+6DSlGNsV8= +k8s.io/apimachinery v0.29.2/go.mod h1:6HVkd1FwxIagpYrHSwJlQqZI3G9LfYWRPAkUvLnXTKU= +k8s.io/client-go v0.29.2 h1:FEg85el1TeZp+/vYJM7hkDlSTFZ+c5nnK44DJ4FyoRg= +k8s.io/client-go v0.29.2/go.mod h1:knlvFZE58VpqbQpJNbCbctTVXcd35mMyAAwBdpt4jrA= +k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= +nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= +pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= +tags.cncf.io/container-device-interface v0.7.2 h1:MLqGnWfOr1wB7m08ieI4YJ3IoLKKozEnnNYBtacDPQU= +tags.cncf.io/container-device-interface v0.7.2/go.mod h1:Xb1PvXv2BhfNb3tla4r9JL129ck1Lxv9KuU6eVOfKto= diff --git a/sweeper/main.go b/sweeper/main.go new file mode 100644 index 00000000..acf29c8f --- /dev/null +++ b/sweeper/main.go @@ -0,0 +1,7 @@ +package main + +import "github.com/initia-labs/core-indexer/sweeper/sweeper" + +func main() { + sweeper.Execute() +} diff --git a/sweeper/run.sh b/sweeper/run.sh new file mode 100755 index 00000000..3a71c537 --- /dev/null +++ b/sweeper/run.sh @@ -0,0 +1,57 @@ +#!/bin/bash + +set -e + +SCRIPT_DIR=$(cd $(dirname $0) ; pwd -P) + +TASK=$1 +ARGS=${@:2} + +help__sweep="sweep <..args> : run sweep" +task__sweep() { + local chain=$1 + + if [ -z "$chain" ]; then + echo "usage: $0 sweep " + exit + fi + + go build -o sweeper . + + source .env + + ./sweeper/sweeper sweep --bootstrap-server $KAFKA_BOOTSTRAP_SERVER \ + --block-results-topics ${chain}-local-informative-indexer-block-results-messages,${chain}-local-generic-indexer-block-results-messages \ + --kafka-api-key $KAFKA_API_KEY \ + --kafka-api-secret $KAFKA_API_SECRET \ + --claim-check-bucket ${chain}-local-informative-indexer-large-block-results \ + --claim-check-threshold-mb 1 \ + --db $DB_CONNECTION_STRING \ + --chain $chain \ + --rebalance-interval $REBALANCE_INTERVAL \ + --workers 4 \ + --migrations-dir ../db/migrations +} + + +list_all_helps() { + compgen -v | egrep "^help__.*" +} + +NEW_LINE=$'\n' +if type -t "task__$TASK" &>/dev/null; then + task__$TASK $ARGS +else + echo "usage: $0 [<..args>]" + echo "task:" + + HELPS="" + for help in $(list_all_helps) + do + + HELPS="$HELPS ${help/help__/} |-- ${!help}$NEW_LINE" + done + + echo "$HELPS" | column -t -s "|" + exit +fi diff --git a/informative-indexer/cmd/sweeper/cmd.go b/sweeper/sweeper/cmd.go similarity index 85% rename from informative-indexer/cmd/sweeper/cmd.go rename to sweeper/sweeper/cmd.go index 0af4aea7..962a86d0 100644 --- a/informative-indexer/cmd/sweeper/cmd.go +++ b/sweeper/sweeper/cmd.go @@ -1,13 +1,31 @@ -package sweeper_cmd +package sweeper import ( - "github.com/initia-labs/core-indexer/informative-indexer/sweeper" - "github.com/spf13/cobra" "os" "runtime" "strconv" + "strings" + + "github.com/spf13/cobra" ) +func Execute() { + var rootCmd = &cobra.Command{ + Use: "sweeper", + Short: "Sweeper", + Long: "Sweeper - Polls data from RPC and flushes into multiple message queues", + } + + rootCmd.AddCommand( + SweepCmd(), + ) + + err := rootCmd.Execute() + if err != nil { + os.Exit(1) + } +} + const ( FlagRPCEndpoints = "rpcs" FlagChain = "chain" @@ -16,7 +34,7 @@ const ( FlagNumWorkers = "workers" FlagRebalanceInterval = "rebalance-interval" FlagKafkaBootstrapServer = "bootstrap-server" - FlagKafkaTopic = "block-results-topic" + FlagKafkaTopics = "block-results-topics" FlagKafkaAPIKey = "kafka-api-key" FlagKafkaAPISecret = "kafka-api-secret" FlagClaimCheckBucket = "claim-check-bucket" @@ -26,6 +44,7 @@ const ( FlagCommitSHA = "commit-sha" FlagSentryProfilesSampleRate = "sentry-profiles-sample-rate" FlagSentryTracesSampleRate = "sentry-traces-sample-rate" + FlagMigrationsDir = "migrations-dir" ) func SweepCmd() *cobra.Command { @@ -41,7 +60,7 @@ func SweepCmd() *cobra.Command { numWorkers, _ := cmd.Flags().GetInt(FlagNumWorkers) rebalanceInterval, _ := cmd.Flags().GetInt64(FlagRebalanceInterval) kafkaBootstrapServer, _ := cmd.Flags().GetString(FlagKafkaBootstrapServer) - kafkaTopic, _ := cmd.Flags().GetString(FlagKafkaTopic) + kafkaTopics, _ := cmd.Flags().GetString(FlagKafkaTopics) kafkaAPIKey, _ := cmd.Flags().GetString(FlagKafkaAPIKey) kafkaAPISecret, _ := cmd.Flags().GetString(FlagKafkaAPISecret) claimCheckBucket, _ := cmd.Flags().GetString(FlagClaimCheckBucket) @@ -51,8 +70,9 @@ func SweepCmd() *cobra.Command { commitSHA, _ := cmd.Flags().GetString(FlagCommitSHA) sentryProfilesSampleRate, _ := cmd.Flags().GetFloat64(FlagSentryProfilesSampleRate) sentryTracesSampleRate, _ := cmd.Flags().GetFloat64(FlagSentryTracesSampleRate) + migrationsDir, _ := cmd.Flags().GetString(FlagMigrationsDir) - s, err := sweeper.NewSweeper(&sweeper.SweeperConfig{ + s, err := NewSweeper(&SweeperConfig{ RPCEndpoints: rpcEndpoints, RPCTimeOutInSeconds: rpcTimeOutInSeconds, Chain: chain, @@ -60,7 +80,7 @@ func SweepCmd() *cobra.Command { NumWorkers: int64(numWorkers), RebalanceInterval: rebalanceInterval, KafkaBootstrapServer: kafkaBootstrapServer, - KafkaTopic: kafkaTopic, + KafkaTopics: strings.Split(kafkaTopics, ","), KafkaAPIKey: kafkaAPIKey, KafkaAPISecret: kafkaAPISecret, ClaimCheckBucket: claimCheckBucket, @@ -70,6 +90,7 @@ func SweepCmd() *cobra.Command { CommitSHA: commitSHA, SentryProfilesSampleRate: sentryProfilesSampleRate, SentryTracesSampleRate: sentryTracesSampleRate, + MigrationsDir: migrationsDir, }) if err != nil { @@ -114,7 +135,7 @@ func SweepCmd() *cobra.Command { cmd.Flags().Uint64(FlagNumWorkers, uint64(runtime.NumCPU()), "Worker count") cmd.Flags().Int64(FlagRebalanceInterval, rebalanceInterval, "RPC providers rebalance interval") cmd.Flags().String(FlagKafkaBootstrapServer, os.Getenv("BOOTSTRAP_SERVER"), ": to Kafka bootstrap server") - cmd.Flags().String(FlagKafkaTopic, os.Getenv("BLOCK_RESULTS_TOPIC"), "Kafka topic") + cmd.Flags().String(FlagKafkaTopics, os.Getenv("BLOCK_RESULTS_TOPICS"), "Kafka topics") cmd.Flags().String(FlagKafkaAPIKey, os.Getenv("KAFKA_API_KEY"), "Kafka API key") cmd.Flags().String(FlagKafkaAPISecret, os.Getenv("KAFKA_API_SECRET"), "Kafka API secret") cmd.Flags().String(FlagClaimCheckBucket, os.Getenv("CLAIM_CHECK_BUCKET"), "Claim check bucket") @@ -124,6 +145,7 @@ func SweepCmd() *cobra.Command { cmd.Flags().String(FlagCommitSHA, os.Getenv("COMMIT_SHA"), "Commit SHA") cmd.Flags().Float64(FlagSentryProfilesSampleRate, sentryProfilesSampleRate, "Sentry profiles sample rate") cmd.Flags().Float64(FlagSentryTracesSampleRate, sentryTracesSampleRate, "Sentry traces sample rate") + cmd.Flags().String(FlagMigrationsDir, "db/migrations", "Migration files directory") return cmd } diff --git a/informative-indexer/sweeper/sweeper.go b/sweeper/sweeper/sweeper.go old mode 100644 new mode 100755 similarity index 59% rename from informative-indexer/sweeper/sweeper.go rename to sweeper/sweeper/sweeper.go index f9790918..1829817e --- a/informative-indexer/sweeper/sweeper.go +++ b/sweeper/sweeper/sweeper.go @@ -2,33 +2,33 @@ package sweeper import ( "context" - "crypto/sha256" - "encoding/hex" "encoding/json" "errors" "fmt" + "os/signal" + "syscall" + "time" + "github.com/certifi/gocertifi" coretypes "github.com/cometbft/cometbft/rpc/core/types" "github.com/confluentinc/confluent-kafka-go/v2/kafka" "github.com/getsentry/sentry-go" - "github.com/initia-labs/core-indexer/informative-indexer/common" - "github.com/initia-labs/core-indexer/informative-indexer/cosmosrpc" - "github.com/initia-labs/core-indexer/informative-indexer/db" - "github.com/initia-labs/core-indexer/informative-indexer/mq" - "github.com/initia-labs/core-indexer/informative-indexer/storage" - "github.com/jackc/pgx/v5/pgxpool" "github.com/rs/zerolog" "github.com/rs/zerolog/log" - "os/signal" - "syscall" - "time" + "gorm.io/gorm" + + "github.com/initia-labs/core-indexer/pkg/cosmosrpc" + "github.com/initia-labs/core-indexer/pkg/db" + "github.com/initia-labs/core-indexer/pkg/mq" + "github.com/initia-labs/core-indexer/pkg/sentry_integration" + "github.com/initia-labs/core-indexer/pkg/storage" ) var logger *zerolog.Logger type Sweeper struct { rpcClient cosmosrpc.CosmosJSONRPCHub - dbClient *pgxpool.Pool + dbClient *gorm.DB producer *mq.Producer storageClient storage.Client config *SweeperConfig @@ -42,7 +42,7 @@ type SweeperConfig struct { NumWorkers int64 RebalanceInterval int64 KafkaBootstrapServer string - KafkaTopic string + KafkaTopics []string KafkaAPIKey string KafkaAPISecret string ClaimCheckBucket string @@ -52,6 +52,7 @@ type SweeperConfig struct { SentryDSN string SentryProfilesSampleRate float64 SentryTracesSampleRate float64 + MigrationsDir string } func NewSweeper(config *SweeperConfig) (*Sweeper, error) { @@ -87,15 +88,15 @@ func NewSweeper(config *SweeperConfig) (*Sweeper, error) { } if config.RPCEndpoints == "" { - common.CaptureCurrentHubException(errors.New("PRC: No RPC endpoints provided"), sentry.LevelFatal) + sentry_integration.CaptureCurrentHubException(errors.New("RPC: No RPC endpoints provided"), sentry.LevelFatal) logger.Fatal().Msgf("RPC: No RPC endpoints provided\n") return nil, fmt.Errorf("RPC: No RPC endpoints provided") } - var rpcEndpoints common.RPCEndpoints + var rpcEndpoints mq.RPCEndpoints err = json.Unmarshal([]byte(config.RPCEndpoints), &rpcEndpoints) if err != nil { - common.CaptureCurrentHubException(err, sentry.LevelFatal) + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) logger.Fatal().Msgf("RPC: Error unmarshalling RPC endpoints: %v\n", err) return nil, err } @@ -111,14 +112,14 @@ func NewSweeper(config *SweeperConfig) (*Sweeper, error) { rpcClient := cosmosrpc.NewHub(clientConfigs, logger, time.Duration(config.RPCTimeOutInSeconds)*time.Second) err = rpcClient.Rebalance(context.Background()) if err != nil { - common.CaptureCurrentHubException(err, sentry.LevelFatal) + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) logger.Fatal().Msgf("RPC: Error Rebalancing RPC endpoints: %v\n", err) return nil, err } dbClient, err := db.NewClient(config.DBConnectionString) if err != nil { - common.CaptureCurrentHubException(err, sentry.LevelFatal) + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) logger.Fatal().Msgf("DB: Error creating DB client: %v\n", err) return nil, err } @@ -151,7 +152,7 @@ func NewSweeper(config *SweeperConfig) (*Sweeper, error) { } if err != nil { - common.CaptureCurrentHubException(err, sentry.LevelFatal) + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) logger.Fatal().Msgf("Kafka: Error creating producer: %v\n", err) return nil, err } @@ -167,7 +168,7 @@ func NewSweeper(config *SweeperConfig) (*Sweeper, error) { } else { storageClient, err = storage.NewGCSClient() if err != nil { - common.CaptureCurrentHubException(err, sentry.LevelFatal) + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) logger.Fatal().Msgf("Storage: Error creating storage client: %v\n", err) return nil, err } @@ -185,26 +186,22 @@ func NewSweeper(config *SweeperConfig) (*Sweeper, error) { func (s *Sweeper) StartSweeping(signalCtx context.Context) { s.producer.ListenToKafkaProduceEvents(logger) - height, err := db.GetLatestBlockHeight(context.Background(), s.dbClient) + height, err := db.GetLatestInformativeBlockHeight(context.Background(), s.dbClient) if err != nil { logger.Error().Msgf("DB: Error getting latest block height: %v\n", err) panic(err) } - workerChannel := make(chan bool, s.config.NumWorkers) for { select { case <-signalCtx.Done(): - for i := 0; i < len(workerChannel); i++ { - workerChannel <- true - } return default: height = height + 1 if s.config.RebalanceInterval != 0 && height%s.config.RebalanceInterval == 0 { err := s.rpcClient.Rebalance(context.Background()) if err != nil { - common.CaptureCurrentHubException(err, sentry.LevelWarning) + sentry_integration.CaptureCurrentHubException(err, sentry.LevelWarning) logger.Error().Msgf("Error rebalancing clients: %v", err) } actives := s.rpcClient.GetActiveClients() @@ -212,86 +209,115 @@ func (s *Sweeper) StartSweeping(signalCtx context.Context) { logger.Info().Msgf("Active client url: %s, latest height: %d", active.Client.GetIdentifier(), active.Height) } } - go func(lh int64) { - localHub := sentry.CurrentHub().Clone() - localHub.ConfigureScope(func(scope *sentry.Scope) { - scope.SetTag("height", fmt.Sprint(lh)) - }) - ctx := sentry.SetHubOnContext(context.Background(), localHub) - s.GetBlockFromRPCAndProduce(ctx, lh) - <-workerChannel - }(height) - workerChannel <- true + localHub := sentry.CurrentHub().Clone() + localHub.ConfigureScope(func(scope *sentry.Scope) { + scope.SetTag("height", fmt.Sprint(height)) + }) + ctx := sentry.SetHubOnContext(context.Background(), localHub) + err := s.GetBlockFromRPCAndProduce(ctx, height) + if err != nil { + panic(err) + } } } } -func (s *Sweeper) GetBlockFromRPCAndProduce(parentCtx context.Context, height int64) { +func (s *Sweeper) GetBlockFromRPCAndProduce(parentCtx context.Context, height int64) error { logger.Info().Msgf("RPC: Getting data from block_results: %d", height) - hub := sentry.GetHubFromContext(parentCtx) - transaction, ctx := common.StartSentryTransaction(parentCtx, "Sweep", "Sweep block_results from RPC and produce to Kafka") + transaction, ctx := sentry_integration.StartSentryTransaction(parentCtx, "Sweep", "Sweep block_results from RPC and produce to Kafka") defer transaction.Finish() - block, err := s.rpcClient.Block(parentCtx, &height) + block, err := s.GetBlock(ctx, height) if err != nil { - common.CaptureException(hub, err, sentry.LevelFatal) - logger.Error().Msgf("DB: Error getting block %d: %v\n", height, err) + logger.Error().Msgf("RPC: Error getting block %d: %v\n", height, err) + return err } - - blockResult, err := s.rpcClient.BlockResults(parentCtx, &height) + blockResult, err := s.GetBlockResults(ctx, height) if err != nil { - common.CaptureException(hub, err, sentry.LevelFatal) - logger.Error().Msgf("DB: Error getting block results %d: %v\n", height, err) - } - - txHashes := make([]string, len(block.Block.Data.Txs)) - for i, tx := range block.Block.Data.Txs { - hash := sha256.Sum256(tx) - txHashes[i] = hex.EncodeToString(hash[:]) + logger.Error().Msgf("RPC: Error getting block results %d: %v\n", height, err) + return err } - err = s.MakeAndSendBlockResultMsg(ctx, txHashes, blockResult) + err = s.MakeAndSendBlockResultMsg(ctx, block, blockResult) if err != nil { - logger.Fatal().Msgf("Kafka: Error producing message at height: %d. Error: %v\n", height, err) + logger.Error().Msgf("Kafka: Error producing message at height: %d. Error: %v\n", height, err) + return err } + return nil } -func (s *Sweeper) MakeAndSendBlockResultMsg(ctx context.Context, txHashes []string, blockResult *coretypes.ResultBlockResults) error { - span, ctx := common.StartSentrySpan(ctx, "MakeAndSendBlockResultMsg", "Make and send block results") - defer span.Finish() +func (s *Sweeper) GetBlock(ctx context.Context, height int64) (*coretypes.ResultBlock, error) { + retryCount := 0 + for { + block, err := s.rpcClient.Block(ctx, &height) + if err != nil { + retryCount++ + if retryCount%10 == 0 { + err := s.RebalanceRPCs(ctx) + if errors.Is(err, cosmosrpc.ErrorZeroActiveClients) { + return nil, err + } + } + time.Sleep(time.Second) + logger.Error().Msgf("RPC: Error getting block %d: %v\n", height, err) + continue + } + return block, nil + } +} - txResults := make([]common.TxResult, len(blockResult.TxsResults)) - for i, txResult := range blockResult.TxsResults { - txResults[i] = common.TxResult{ - Hash: txHashes[i], - ExecTxResults: txResult, +func (s *Sweeper) GetBlockResults(ctx context.Context, height int64) (*coretypes.ResultBlockResults, error) { + retryCount := 0 + for { + blockResult, err := s.rpcClient.BlockResults(ctx, &height) + if err != nil { + retryCount++ + if retryCount%10 == 0 { + err := s.RebalanceRPCs(ctx) + if errors.Is(err, cosmosrpc.ErrorZeroActiveClients) { + return nil, err + } + } + logger.Error().Msgf("RPC: Error getting block results %d: %v\n", height, err) + time.Sleep(time.Second) + continue } + return blockResult, nil } +} - blockResultMsg := common.BlockResultMsg{ - Height: blockResult.Height, - Txs: txResults, - FinalizeBlockEvents: blockResult.FinalizeBlockEvents, +func (s *Sweeper) RebalanceRPCs(ctx context.Context) error { + err := s.rpcClient.Rebalance(ctx) + if err != nil { + return err } + return nil +} + +func (s *Sweeper) MakeAndSendBlockResultMsg(ctx context.Context, block *coretypes.ResultBlock, blockResult *coretypes.ResultBlockResults) error { + span, _ := sentry_integration.StartSentrySpan(ctx, "MakeAndSendBlockResultMsg", "Make and send block results") + defer span.Finish() - blockResultMsgBytes, err := common.NewBlockResultMsgBytes(blockResultMsg) + blockResultMsgBytes, err := mq.NewBlockResultMsgBytes(block, blockResult) if err != nil { logger.Error().Msgf("Failed to marshal into block result message: %v\n", err) return err } - s.producer.ProduceWithClaimCheck(&mq.ProduceWithClaimCheckInput{ - Topic: s.config.KafkaTopic, - Key: []byte(fmt.Sprintf("%s_%d", common.NEW_BLOCK_RESULTS_KAFKA_MESSAGE_KEY, blockResult.Height)), - MessageInBytes: blockResultMsgBytes, - ClaimCheckKey: []byte(fmt.Sprintf("%s_%d", common.NEW_BLOCK_RESULTS_CLAIM_CHECK_KAFKA_MESSAGE_KEY, blockResult.Height)), - ClaimCheckThresholdInMB: s.config.ClaimCheckThresholdInMB, - ClaimCheckBucket: s.config.ClaimCheckBucket, - ClaimCheckObjectPath: fmt.Sprintf("%d", blockResult.Height), - StorageClient: s.storageClient, - Headers: []kafka.Header{{Key: "height", Value: []byte(fmt.Sprint(blockResult.Height))}}, - }, logger) + for _, topic := range s.config.KafkaTopics { + s.producer.ProduceWithClaimCheck(&mq.ProduceWithClaimCheckInput{ + Topic: topic, + Key: fmt.Appendf(nil, "%s_%d", mq.NEW_BLOCK_RESULTS_KAFKA_MESSAGE_KEY, blockResult.Height), + MessageInBytes: blockResultMsgBytes, + ClaimCheckKey: fmt.Appendf(nil, "%s_%d", mq.NEW_BLOCK_RESULTS_CLAIM_CHECK_KAFKA_MESSAGE_KEY, blockResult.Height), + ClaimCheckThresholdInMB: s.config.ClaimCheckThresholdInMB, + ClaimCheckBucket: s.config.ClaimCheckBucket, + ClaimCheckObjectPath: fmt.Sprintf("%d", blockResult.Height), + StorageClient: s.storageClient, + Headers: []kafka.Header{{Key: "height", Value: fmt.Appendf(nil, "%d", blockResult.Height)}}, + }, logger) + } return nil } @@ -301,6 +327,12 @@ func (s *Sweeper) Sweep() { defer stop() defer sentry.Flush(2 * time.Second) + if err := db.ApplyMigrationFiles(logger, s.dbClient, s.config.MigrationsDir); err != nil { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelFatal) + logger.Fatal().Msgf("Failed to apply migrations: %v\n", err) + return + } + s.StartSweeping(ctx) logger.Info().Msgf("Stopping sweeper ...") @@ -308,7 +340,11 @@ func (s *Sweeper) Sweep() { } func (s *Sweeper) close() { - s.dbClient.Close() + db, err := s.dbClient.DB() + if err == nil { + db.Close() + } + s.producer.Flush(30000) s.producer.Close() } diff --git a/tx-response-uploader/.env.example b/tx-response-uploader/.env.example new file mode 100644 index 00000000..2229f84d --- /dev/null +++ b/tx-response-uploader/.env.example @@ -0,0 +1,10 @@ +export ID=1 +export BOOTSTRAP_SERVER=xxx.asia-southeast1.gcp.confluent.cloud:9092 +export LCD_TX_RESPONSE_BUCKET=initiation-2-lcd-tx-responses +export KAFKA_API_KEY= +export KAFKA_API_SECRET= +export KAFKA_CONSUMER_GROUP=initiation-2-lcd-tx-response-uploader +export TOPIC=initiation-2-lcd-tx-response-messages +export CHAIN=initiation-2 +export CLAIM_CHECK_BUCKET=initiation-2-large-lcd-tx-response-messages +export ENVIRONMENT= diff --git a/tx-response-uploader/config.go b/tx-response-uploader/config.go new file mode 100644 index 00000000..a722d139 --- /dev/null +++ b/tx-response-uploader/config.go @@ -0,0 +1,101 @@ +package main + +import ( + "os" + "strconv" +) + +type Config struct { + ID string + + BootstrapServer string + LCDTXResponseBucket string + + KafkaAPIKey string + KafkaAPISecret string + Topic string + KafkaConsumerGroup string + + Chain string + Environment string + + ClaimCheckBucket string + + SentryDSN string + CommitSHA string + SentryTraceSampleRate float64 + SentryProfileSampleRate float64 +} + +func getConfig() *Config { + // all env vars are required, panic if doesn't set + if os.Getenv("ID") == "" { + logger.Fatal().Msg("ID is required") + } + if os.Getenv("BOOTSTRAP_SERVER") == "" { + logger.Fatal().Msg("BOOTSTRAP_SERVER is required") + } + if os.Getenv("LCD_TX_RESPONSE_BUCKET") == "" { + logger.Fatal().Msg("LCD_TX_RESPONSE_BUCKET is required") + } + if os.Getenv("KAFKA_API_KEY") == "" { + logger.Fatal().Msg("KAFKA_API_KEY is required") + } + if os.Getenv("KAFKA_API_SECRET") == "" { + logger.Fatal().Msg("KAFKA_API_SECRET is required") + } + if os.Getenv("KAFKA_CONSUMER_GROUP") == "" { + logger.Fatal().Msg("KAFKA_CONSUMER_GROUP is required") + } + if os.Getenv("TOPIC") == "" { + logger.Fatal().Msg("TOPIC is required") + } + if os.Getenv("CHAIN") == "" { + logger.Fatal().Msg("CHAIN is required") + } + if os.Getenv("ENVIRONMENT") == "" { + logger.Fatal().Msg("ENVIRONMENT is required") + } + if os.Getenv("CLAIM_CHECK_BUCKET") == "" { + logger.Fatal().Msg("CLAIM_CHECK_BUCKET is required") + } + var traceSampleRate float64 + var err error + if os.Getenv("SENTRY_TRACE_SAMPLE_RATE") == "" { + traceSampleRate = 0.01 + } else { + traceSampleRate, err = strconv.ParseFloat(os.Getenv("SENTRY_TRACE_SAMPLE_RATE"), 64) + if err != nil { + logger.Error().Msgf("Error parsing SENTRY_TRACE_SAMPLE_RATE: %v", err) + traceSampleRate = 0.01 + } + } + + var profileSampleRate float64 + if os.Getenv("SENTRY_PROFILE_SAMPLE_RATE") == "" { + profileSampleRate = 0.01 + } else { + profileSampleRate, err = strconv.ParseFloat(os.Getenv("SENTRY_PROFILE_SAMPLE_RATE"), 64) + if err != nil { + logger.Error().Msgf("Error parsing SENTRY_PROFILE_SAMPLE_RATE: %v", err) + profileSampleRate = 0.01 + } + } + + return &Config{ + ID: os.Getenv("ID"), + BootstrapServer: os.Getenv("BOOTSTRAP_SERVER"), + LCDTXResponseBucket: os.Getenv("LCD_TX_RESPONSE_BUCKET"), + KafkaAPIKey: os.Getenv("KAFKA_API_KEY"), + KafkaAPISecret: os.Getenv("KAFKA_API_SECRET"), + KafkaConsumerGroup: os.Getenv("KAFKA_CONSUMER_GROUP"), + Topic: os.Getenv("TOPIC"), + Chain: os.Getenv("CHAIN"), + Environment: os.Getenv("ENVIRONMENT"), + ClaimCheckBucket: os.Getenv("CLAIM_CHECK_BUCKET"), + SentryDSN: os.Getenv("SENTRY_DSN"), + CommitSHA: os.Getenv("COMMIT_SHA"), + SentryTraceSampleRate: traceSampleRate, + SentryProfileSampleRate: profileSampleRate, + } +} diff --git a/tx-response-uploader/go.mod b/tx-response-uploader/go.mod new file mode 100644 index 00000000..f1fc32f6 --- /dev/null +++ b/tx-response-uploader/go.mod @@ -0,0 +1,121 @@ +module github.com/initia-labs/core-indexer/tx-response-uploader + +go 1.25.8 + +require ( + github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d + github.com/confluentinc/confluent-kafka-go/v2 v2.6.1 + github.com/getsentry/sentry-go v0.29.1 + github.com/initia-labs/core-indexer/pkg v0.0.0-00010101000000-000000000000 + github.com/rs/zerolog v1.33.0 +) + +require ( + cel.dev/expr v0.25.1 // indirect + cloud.google.com/go v0.123.0 // indirect + cloud.google.com/go/auth v0.18.2 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect + cloud.google.com/go/compute/metadata v0.9.0 // indirect + cloud.google.com/go/iam v1.5.3 // indirect + cloud.google.com/go/monitoring v1.24.3 // indirect + cloud.google.com/go/storage v1.61.3 // indirect + github.com/DataDog/zstd v1.5.5 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 // indirect + github.com/cockroachdb/errors v1.11.3 // indirect + github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v1.1.5 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/cometbft/cometbft v0.38.20 // indirect + github.com/cometbft/cometbft-db v0.15.0 // indirect + github.com/cosmos/btcutil v1.0.5 // indirect + github.com/cosmos/cosmos-sdk v0.50.14 // indirect + github.com/cosmos/gogoproto v1.7.0 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect + github.com/dgraph-io/badger/v4 v4.3.0 // indirect + github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.36.0 // indirect + github.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/go-jose/go-jose/v4 v4.1.3 // indirect + github.com/go-kit/kit v0.13.0 // indirect + github.com/go-kit/log v0.2.1 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/google/btree v1.1.3 // indirect + github.com/google/flatbuffers v23.5.26+incompatible // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/google/s2a-go v0.1.9 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect + github.com/googleapis/gax-go/v2 v2.17.0 // indirect + github.com/jmhodges/levigo v1.0.0 // indirect + github.com/klauspost/compress v1.18.5 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/linxGnu/grocksdb v1.10.3 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a // indirect + github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/client_golang v1.21.0 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.62.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect + github.com/sasha-s/go-deadlock v0.3.5 // indirect + github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect + github.com/stretchr/testify v1.11.1 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect + go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.39.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect + go.opentelemetry.io/otel v1.43.0 // indirect + go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/otel/sdk v1.43.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect + go.opentelemetry.io/otel/trace v1.43.0 // indirect + golang.org/x/crypto v0.49.0 // indirect + golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect + golang.org/x/net v0.52.0 // indirect + golang.org/x/oauth2 v0.36.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.42.0 // indirect + golang.org/x/text v0.35.0 // indirect + golang.org/x/time v0.15.0 // indirect + google.golang.org/api v0.271.0 // indirect + google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 // indirect + google.golang.org/grpc v1.79.3 // indirect + google.golang.org/protobuf v1.36.11 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/initia-labs/core-indexer/pkg => ../pkg + +replace github.com/cometbft/cometbft => github.com/initia-labs/cometbft v0.38.21-initia.2 + +replace github.com/cosmos/cosmos-sdk => github.com/initia-labs/cosmos-sdk v0.50.15-initia.0 + +replace github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 diff --git a/tx-response-uploader/go.sum b/tx-response-uploader/go.sum new file mode 100644 index 00000000..42e43353 --- /dev/null +++ b/tx-response-uploader/go.sum @@ -0,0 +1,691 @@ +cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= +cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= +cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= +cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM= +cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M= +cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= +cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= +cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= +cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= +cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= +cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= +cloud.google.com/go/logging v1.13.1 h1:O7LvmO0kGLaHY/gq8cV7T0dyp6zJhYAOtZPX4TF3QtY= +cloud.google.com/go/logging v1.13.1/go.mod h1:XAQkfkMBxQRjQek96WLPNze7vsOmay9H5PqfsNYDqvw= +cloud.google.com/go/longrunning v0.8.0 h1:LiKK77J3bx5gDLi4SMViHixjD2ohlkwBi+mKA7EhfW8= +cloud.google.com/go/longrunning v0.8.0/go.mod h1:UmErU2Onzi+fKDg2gR7dusz11Pe26aknR4kHmJJqIfk= +cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= +cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= +cloud.google.com/go/storage v1.61.3 h1:VS//ZfBuPGDvakfD9xyPW1RGF1Vy3BWUoVZXgW1KMOg= +cloud.google.com/go/storage v1.61.3/go.mod h1:JtqK8BBB7TWv0HVGHubtUdzYYrakOQIsMLffZ2Z/HWk= +cloud.google.com/go/trace v1.11.7 h1:kDNDX8JkaAG3R2nq1lIdkb7FCSi1rCmsEtKVsty7p+U= +cloud.google.com/go/trace v1.11.7/go.mod h1:TNn9d5V3fQVf6s4SCveVMIBS2LJUqo73GACmq/Tky0s= +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= +github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= +github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 h1:sBEjpZlNHzK1voKq9695PJSX2o5NEXl7/OL3coiIY0c= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 h1:UnDZ/zFfG1JhH/DqxIZYU/1CUAlTUScoXD/LcM2Ykk8= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0/go.mod h1:IA1C1U7jO/ENqm/vhi7V9YYpBsp+IMyqNrEN94N7tVc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0 h1:7t/qx5Ost0s0wbA/VDrByOooURhp+ikYwv20i9Y07TQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0/go.mod h1:vB2GH9GAYYJTO3mEn8oYwzEdhlayZIdQz6zdzgUIRvA= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 h1:0s6TxfCu2KHkkZPnBfsQ2y5qia0jl3MMrmBhu3nCOYk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/Microsoft/hcsshim v0.11.5 h1:haEcLNpj9Ka1gd3B3tAEs9CpE0c+1IhoL59w/exYU38= +github.com/Microsoft/hcsshim v0.11.5/go.mod h1:MV8xMfmECjl5HdO7U/3/hFVnkmSBjAjmA09d4bExKcU= +github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= +github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= +github.com/aws/aws-sdk-go-v2 v1.41.4 h1:10f50G7WyU02T56ox1wWXq+zTX9I1zxG46HYuG1hH/k= +github.com/aws/aws-sdk-go-v2 v1.41.4/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= +github.com/aws/aws-sdk-go-v2/config v1.32.12 h1:O3csC7HUGn2895eNrLytOJQdoL2xyJy0iYXhoZ1OmP0= +github.com/aws/aws-sdk-go-v2/config v1.32.12/go.mod h1:96zTvoOFR4FURjI+/5wY1vc1ABceROO4lWgWJuxgy0g= +github.com/aws/aws-sdk-go-v2/credentials v1.19.12 h1:oqtA6v+y5fZg//tcTWahyN9PEn5eDU/Wpvc2+kJ4aY8= +github.com/aws/aws-sdk-go-v2/credentials v1.19.12/go.mod h1:U3R1RtSHx6NB0DvEQFGyf/0sbrpJrluENHdPy1j/3TE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 h1:zOgq3uezl5nznfoK3ODuqbhVg1JzAGDUhXOsU0IDCAo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20/go.mod h1:z/MVwUARehy6GAg/yQ1GO2IMl0k++cu1ohP9zo887wE= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 h1:CNXO7mvgThFGqOFgbNAP2nol2qAWBOGfqR/7tQlvLmc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20/go.mod h1:oydPDJKcfMhgfcgBUZaG+toBbwy8yPWubJXBVERtI4o= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 h1:tN6W/hg+pkM+tf9XDkWUbDEjGLb+raoBMFsTodcoYKw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20/go.mod h1:YJ898MhD067hSHA6xYCx5ts/jEd8BSOLtQDL3iZsvbc= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 h1:2HvVAIq+YqgGotK6EkMf+KIEqTISmTYh5zLpYyeTo1Y= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20/go.mod h1:V4X406Y666khGa8ghKmphma/7C0DAtEQYhkq9z4vpbk= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 h1:0GFOLzEbOyZABS3PhYfBIx2rNBACYcKty+XGkTgw1ow= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.8/go.mod h1:LXypKvk85AROkKhOG6/YEcHFPoX+prKTowKnVdcaIxE= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 h1:kiIDLZ005EcKomYYITtfsjn7dtOwHDOFy7IbPXKek2o= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.13/go.mod h1:2h/xGEowcW/g38g06g3KpRWDlT+OTfxxI0o1KqayAB8= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 h1:jzKAXIlhZhJbnYwHbvUQZEB8KfgAEuG0dc08Bkda7NU= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17/go.mod h1:Al9fFsXjv4KfbzQHGe6V4NZSZQXecFcvaIF4e70FoRA= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 h1:Cng+OOwCHmFljXIxpEVXAGMnBia8MSU6Ch5i9PgBkcU= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.9/go.mod h1:LrlIndBDdjA/EeXeyNBle+gyCwTlizzW5ycgWnvIxkk= +github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng= +github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/btcsuite/btcd/btcutil v1.1.6 h1:zFL2+c3Lb9gEgqKNzowKUPQNb8jV7v5Oaodi/AYFd6c= +github.com/btcsuite/btcd/btcutil v1.1.6/go.mod h1:9dFymx8HpuLqBnsPELrImQeTQfKBQqzqGbbV3jK55aE= +github.com/buger/goterm v1.0.4 h1:Z9YvGmOih81P0FbVtEYTFF6YsSgxSUKEhf/f9bTMXbY= +github.com/buger/goterm v1.0.4/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d h1:S2NE3iHSwP0XV47EEXL8mWmRdEfGscSJ+7EgePNgt0s= +github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 h1:6xNmx7iTtyBRev0+D/Tv1FZd4SCg8axKApyNyRsAt/w= +github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/BuvyMxRnYBlmVaq4OLiKW6iRQfvC62cvdkI= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v1.1.5 h1:5AAWCBWbat0uE0blr8qzufZP5tBjkRyy/jWe1QWLnvw= +github.com/cockroachdb/pebble v1.1.5/go.mod h1:17wO9el1YEigxkP/YtV8NtCivQDgoCyBg5c4VR/eOWo= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/cometbft/cometbft-db v0.15.0 h1:VLtsRt8udD4jHCyjvrsTBpgz83qne5hnL245AcPJVRk= +github.com/cometbft/cometbft-db v0.15.0/go.mod h1:EBrFs1GDRiTqrWXYi4v90Awf/gcdD5ExzdPbg4X8+mk= +github.com/compose-spec/compose-go/v2 v2.1.3 h1:bD67uqLuL/XgkAK6ir3xZvNLFPxPScEi1KW7R5esrLE= +github.com/compose-spec/compose-go/v2 v2.1.3/go.mod h1:lFN0DrMxIncJGYAXTfWuajfwj5haBJqrBkarHcnjJKc= +github.com/confluentinc/confluent-kafka-go/v2 v2.6.1 h1:XFkytnGvk/ZcY2qU0ql4E4h+ftBaGqkLO7tlZ4kRbr4= +github.com/confluentinc/confluent-kafka-go/v2 v2.6.1/go.mod h1:hScqtFIGUI1wqHIgM3mjoqEou4VweGGGX7dMpcUKves= +github.com/containerd/console v1.0.4 h1:F2g4+oChYvBTsASRTz8NP6iIAi97J3TtSAsLbIFn4ro= +github.com/containerd/console v1.0.4/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= +github.com/containerd/containerd v1.7.18 h1:jqjZTQNfXGoEaZdW1WwPU0RqSn1Bm2Ay/KJPUuO8nao= +github.com/containerd/containerd v1.7.18/go.mod h1:IYEk9/IO6wAPUz2bCMVUbsfXjzw5UNP5fLz4PsUygQ4= +github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8= +github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/containerd/errdefs v0.1.0 h1:m0wCRBiu1WJT/Fr+iOoQHMQS/eP5myQ8lCv4Dz5ZURM= +github.com/containerd/errdefs v0.1.0/go.mod h1:YgWiiHtLmSeBrvpw+UfPijzbLaB77mEG1WwJTDETIV0= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +github.com/containerd/ttrpc v1.2.5 h1:IFckT1EFQoFBMG4c3sMdT8EP3/aKfumK1msY+Ze4oLU= +github.com/containerd/ttrpc v1.2.5/go.mod h1:YCXHsb32f+Sq5/72xHubdiJRQY9inL4a4ZQrAbN1q9o= +github.com/containerd/typeurl/v2 v2.1.1 h1:3Q4Pt7i8nYwy2KmQWIw2+1hTvwTE/6w9FqcttATPO/4= +github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3HZj1hsSQlywkQ0= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= +github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= +github.com/cosmos/gogoproto v1.7.0 h1:79USr0oyXAbxg3rspGh/m4SWNyoz/GLaAh0QlCe2fro= +github.com/cosmos/gogoproto v1.7.0/go.mod h1:yWChEv5IUEYURQasfyBW5ffkMHR/90hiHgbNgrtp4j0= +github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= +github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.1.0 h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U0x++OzVrdms8= +github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= +github.com/dgraph-io/badger/v4 v4.3.0 h1:lcsCE1/1qrRhqP+zYx6xDZb8n7U+QlwNicpc676Ub40= +github.com/dgraph-io/badger/v4 v4.3.0/go.mod h1:Sc0T595g8zqAQRDf44n+z3wG4BOqLwceaFntt8KPxUM= +github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91 h1:Pux6+xANi0I7RRo5E1gflI4EZ2yx3BGZ75JkAIvGEOA= +github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91/go.mod h1:swkazRqnUf1N62d0Nutz7KIj2UKqsm/H8tD0nBJAXqM= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/buildx v0.15.1 h1:1cO6JIc0rOoC8tlxfXoh1HH1uxaNvYH1q7J7kv5enhw= +github.com/docker/buildx v0.15.1/go.mod h1:16DQgJqoggmadc1UhLaUTPqKtR+PlByN/kyXFdkhFCo= +github.com/docker/cli v27.0.3+incompatible h1:usGs0/BoBW8MWxGeEtqPMkzOY56jZ6kYlSN5BLDioCQ= +github.com/docker/cli v27.0.3+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/compose/v2 v2.28.1 h1:ORPfiVHrpnRQBDoC3F8JJyWAY8N5gWuo3FgwyivxFdM= +github.com/docker/compose/v2 v2.28.1/go.mod h1:wDtGQFHe99sPLCHXeVbCkc+Wsl4Y/2ZxiAJa/nga6rA= +github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= +github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v27.1.1+incompatible h1:hO/M4MtV36kzKldqnA37IWhebRA+LnqqcqDja6kVaKY= +github.com/docker/docker v27.1.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8= +github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c/go.mod h1:CADgU4DSXK5QUlFslkQu2yW2TKzFZcXq/leZfM0UH5Q= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203 h1:XBBHcIb256gUJtLmY22n99HaZTz+r2Z51xUPi01m3wg= +github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203/go.mod h1:E1jcSv8FaEny+OP/5k9UxZVw9YFWGj7eI4KR/iOBqCg= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= +github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= +github.com/envoyproxy/go-control-plane/envoy v1.36.0 h1:yg/JjO5E7ubRyKX3m07GF3reDNEnfOboJ0QySbH736g= +github.com/envoyproxy/go-control-plane/envoy v1.36.0/go.mod h1:ty89S1YCCVruQAm9OtKeEkQLTb+Lkz0k8v9W0Oxsv98= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4= +github.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/fsnotify/fsevents v0.2.0 h1:BRlvlqjvNTfogHfeBOFvSC9N0Ddy+wzQCQukyoD7o/c= +github.com/fsnotify/fsevents v0.2.0/go.mod h1:B3eEk39i4hz8y1zaWS/wPrAP4O6wkIl7HQwKBr1qH/w= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fvbommel/sortorder v1.0.2 h1:mV4o8B2hKboCdkJm+a7uX/SIpZob4JzUpc5GGnM45eo= +github.com/fvbommel/sortorder v1.0.2/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= +github.com/getsentry/sentry-go v0.29.1 h1:DyZuChN8Hz3ARxGVV8ePaNXh1dQ7d76AiB117xcREwA= +github.com/getsentry/sentry-go v0.29.1/go.mod h1:x3AtIzN01d6SiWkderzaH28Tm0lgkafpJ5Bm3li39O0= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= +github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= +github.com/go-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU= +github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-viper/mapstructure/v2 v2.0.0 h1:dhn8MZ1gZ0mzeodTG3jt5Vj/o87xZKuNAprG2mQfMfc= +github.com/go-viper/mapstructure/v2 v2.0.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg= +github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= +github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= +github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8= +github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= +github.com/googleapis/gax-go/v2 v2.17.0 h1:RksgfBpxqff0EZkDWYuz9q/uWsTVz+kf43LsZ1J6SMc= +github.com/googleapis/gax-go/v2 v2.17.0/go.mod h1:mzaqghpQp4JDh3HvADwrat+6M3MOIDp5YKHhb9PAgDY= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-version v1.8.0 h1:KAkNb1HAiZd1ukkxDFGmokVZe1Xy9HG6NUp+bPle2i4= +github.com/hashicorp/go-version v1.8.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/in-toto/in-toto-golang v0.5.0 h1:hb8bgwr0M2hGdDsLjkJ3ZqJ8JFLL/tgYdAxF/XEFBbY= +github.com/in-toto/in-toto-golang v0.5.0/go.mod h1:/Rq0IZHLV7Ku5gielPT4wPHJfH1GdHMCq8+WPxw8/BE= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/initia-labs/cometbft v0.38.21-initia.2 h1:sFFc6JnbPKFd4XdH3EXZ7TBfi3uVv34HdyHVX5gvvlQ= +github.com/initia-labs/cometbft v0.38.21-initia.2/go.mod h1:CQ/VkJXRdaWxDLyKT+JYAWV0m215oRFtymtIr7skA6o= +github.com/initia-labs/cosmos-sdk v0.50.15-initia.0 h1:cgKCqzXBm8md5Q5C9VAyIGCheHhNcOGK/BwpFbett2g= +github.com/initia-labs/cosmos-sdk v0.50.15-initia.0/go.mod h1:/dinzXHi7qK0dEPZjS3LI5gMHueKQdqyjbB9chwswo0= +github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= +github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE= +github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/linxGnu/grocksdb v1.10.3 h1:0laII9AQ6kFxo5SjhdTfSh9EgF20piD6TMHK6YuDm+4= +github.com/linxGnu/grocksdb v1.10.3/go.mod h1:OLQKZwiKwaJiAVCsOzWKvwiLwfZ5Vz8Md5TYR7t7pM8= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +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/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/buildkit v0.14.1 h1:2epLCZTkn4CikdImtsLtIa++7DzCimrrZCT1sway+oI= +github.com/moby/buildkit v0.14.1/go.mod h1:1XssG7cAqv5Bz1xcGMxJL123iCv5TYN4Z/qf647gfuk= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= +github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mountinfo v0.7.1 h1:/tTvQaSJRr2FshkhXiIpux6fQ2Zvc4j7tAhMTStAG2g= +github.com/moby/sys/mountinfo v0.7.1/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +github.com/moby/sys/signal v0.7.0 h1:25RW3d5TnQEoKvRbEKUGay6DCQ46IxAVTT9CUMgmsSI= +github.com/moby/sys/signal v0.7.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/moby/sys/symlink v0.2.0 h1:tk1rOM+Ljp0nFmfOIBtlV3rTDlWOwFRhjEeAhZB0nZc= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= +github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= +github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= +github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= +github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a h1:dlRvE5fWabOchtH7znfiFCcOvmIYgOeAS5ifBXBlh9Q= +github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA= +github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= +github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/r3labs/sse v0.0.0-20210224172625-26fe804710bc h1:zAsgcP8MhzAbhMnB1QQ2O7ZhWYVGYSR2iVcjzQuPV+o= +github.com/r3labs/sse v0.0.0-20210224172625-26fe804710bc/go.mod h1:S8xSOnV3CgpNrWd0GQ/OoQfMtlg2uPRSuTzcSGrzwK8= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= +github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/sasha-s/go-deadlock v0.3.5 h1:tNCOEEDG6tBqrNDOX35j/7hL5FcFViG6awUGROb2NsU= +github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6vCBBsiChJQ5U= +github.com/secure-systems-lab/go-securesystemslib v0.4.0 h1:b23VGrQhTA8cN2CbBw7/FulN9fTtqYUdS5+Oxzt+DUE= +github.com/secure-systems-lab/go-securesystemslib v0.4.0/go.mod h1:FGBZgq2tXWICsxWQW1msNf49F0Pf2Op5Htayx335Qbs= +github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b h1:h+3JX2VoWTFuyQEo87pStk/a99dzIO1mM9KxIyLPGTU= +github.com/serialx/hashring v0.0.0-20200727003509-22c0c7ab6b1b/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= +github.com/shibumi/go-pathspec v1.3.0 h1:QUyMZhFo0Md5B8zV8x2tesohbb5kfbpTi9rBnKh5dkI= +github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE= +github.com/shirou/gopsutil/v3 v3.23.12 h1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4= +github.com/shirou/gopsutil/v3 v3.23.12/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= +github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= +github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/testcontainers/testcontainers-go v0.33.0 h1:zJS9PfXYT5O0ZFXM2xxXfk4J5UMw/kRiISng037Gxdw= +github.com/testcontainers/testcontainers-go v0.33.0/go.mod h1:W80YpTa8D5C3Yy16icheD01UTDu+LmXIA2Keo+jWtT8= +github.com/testcontainers/testcontainers-go/modules/compose v0.33.0 h1:PyrUOF+zG+xrS3p+FesyVxMI+9U+7pwhZhyFozH3jKY= +github.com/testcontainers/testcontainers-go/modules/compose v0.33.0/go.mod h1:oqZaUnFEskdZriO51YBquku/jhgzoXHPot6xe1DqKV4= +github.com/theupdateframework/notary v0.7.0 h1:QyagRZ7wlSpjT5N2qQAh/pN+DVqgekv4DzbAiAiEL3c= +github.com/theupdateframework/notary v0.7.0/go.mod h1:c9DRxcmhHmVLDay4/2fUYdISnHqbFDGRSlXPO0AhYWw= +github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375 h1:QB54BJwA6x8QU9nHY3xJSZR2kX9bgpZekRKGkLTmEXA= +github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375/go.mod h1:xRroudyp5iVtxKqZCrA6n2TLFRBf8bmnjr1UD4x+z7g= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tonistiigi/fsutil v0.0.0-20240424095704-91a3fc46842c h1:+6wg/4ORAbnSoGDzg2Q1i3CeMcT/jjhye/ZfnBHy7/M= +github.com/tonistiigi/fsutil v0.0.0-20240424095704-91a3fc46842c/go.mod h1:vbbYqJlnswsbJqWUcJN8fKtBhnEgldDrcagTgnBVKKM= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea h1:SXhTLE6pb6eld/v/cCndK0AMpt1wiVFb/YYmqB3/QG0= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= +github.com/tonistiigi/vt100 v0.0.0-20240514184818-90bafcd6abab h1:H6aJ0yKQ0gF49Qb2z5hI1UHxSQt4JMyxebFR15KnApw= +github.com/tonistiigi/vt100 v0.0.0-20240514184818-90bafcd6abab/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= +github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5 h1:qxen9oVGzDdIRP6ejyAJc760RwW4SnVDiTYTzwnXuxo= +go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5/go.mod h1:eW0HG9/oHQhvRCvb1/pIXW4cOvtDqeQK+XSi3TnwaXY= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/contrib/detectors/gcp v1.39.0 h1:kWRNZMsfBHZ+uHjiH4y7Etn2FK26LAGkNFw7RHv1DhE= +go.opentelemetry.io/contrib/detectors/gcp v1.39.0/go.mod h1:t/OGqzHBa5v6RHZwrDBJ2OirWc+4q/w2fTbLZwAKjTk= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 h1:YH4g8lQroajqUwWbq/tr2QX1JFmEXaDLgG+ew9bLMWo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0/go.mod h1:fvPi2qXDqFs8M4B4fmJhE92TyQs9Ydjlg3RvfUp+NbQ= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.46.1 h1:gbhw/u49SS3gkPWiYweQNJGm/uJN5GkI/FrosxSHT7A= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.46.1/go.mod h1:GnOaBaFQ2we3b9AGWJpsBa7v1S5RlQzlC3O7dRMxZhM= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0 h1:wNMDy/LVGLj2h3p6zg4d0gypKfWKSWI14E1C4smOgl8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0/go.mod h1:YfbDdXAAkemWJK3H/DshvlrxqFB2rtW4rY6ky/3x/H0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 h1:digkEZCJWobwBqMwC0cwCq8/wkkRy/OowZg5OArWZrM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0/go.mod h1:/OpE/y70qVkndM0TrxT4KBoN3RsFZP0QaofcfYrj76I= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0 h1:ZrPRak/kS4xI3AVXy8F7pipuDXmDsrO8Lg+yQjBLjw0= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0/go.mod h1:3y6kQCWztq6hyW8Z9YxQDDm0Je9AJoFar2G0yDcmhRk= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= +go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= +go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4= +go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= +go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +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.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= +golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= +golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +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-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= +golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= +golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/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.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +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-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/term v0.41.0 h1:QCgPso/Q3RTJx2Th4bDLqML4W6iJiaXFq2/ftQF13YU= +golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= +golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= +golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= +golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +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-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/api v0.271.0 h1:cIPN4qcUc61jlh7oXu6pwOQqbJW2GqYh5PS6rB2C/JY= +google.golang.org/api v0.271.0/go.mod h1:CGT29bhwkbF+i11qkRUJb2KMKqcJ1hdFceEIRd9u64Q= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 h1:VQZ/yAbAtjkHgH80teYd2em3xtIkkHd7ZhqfH2N9CsM= +google.golang.org/genproto v0.0.0-20260128011058-8636f8732409/go.mod h1:rxKD3IEILWEu3P44seeNOAwZN4SaoKaQ/2eTg4mM6EM= +google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20 h1:7ei4lp52gK1uSejlA8AZl5AJjeLUOHBQscRQZUgAcu0= +google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20/go.mod h1:ZdbssH/1SOVnjnDlXzxDHK2MCidiqXtbYccJNzNYPEE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 h1:ggcbiqK8WWh6l1dnltU4BgWGIGo+EVYxCaAPih/zQXQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= +google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +gopkg.in/cenkalti/backoff.v1 v1.1.0 h1:Arh75ttbsvlpVA7WtVpH4u9h6Zl46xuptxqLxPiSo4Y= +gopkg.in/cenkalti/backoff.v1 v1.1.0/go.mod h1:J6Vskwqd+OMVJl8C33mmtxTBs2gyzfv7UDAkHu8BrjI= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +k8s.io/api v0.29.2 h1:hBC7B9+MU+ptchxEqTNW2DkUosJpp1P+Wn6YncZ474A= +k8s.io/api v0.29.2/go.mod h1:sdIaaKuU7P44aoyyLlikSLayT6Vb7bvJNCX105xZXY0= +k8s.io/apimachinery v0.29.2 h1:EWGpfJ856oj11C52NRCHuU7rFDwxev48z+6DSlGNsV8= +k8s.io/apimachinery v0.29.2/go.mod h1:6HVkd1FwxIagpYrHSwJlQqZI3G9LfYWRPAkUvLnXTKU= +k8s.io/client-go v0.29.2 h1:FEg85el1TeZp+/vYJM7hkDlSTFZ+c5nnK44DJ4FyoRg= +k8s.io/client-go v0.29.2/go.mod h1:knlvFZE58VpqbQpJNbCbctTVXcd35mMyAAwBdpt4jrA= +k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +tags.cncf.io/container-device-interface v0.7.2 h1:MLqGnWfOr1wB7m08ieI4YJ3IoLKKozEnnNYBtacDPQU= +tags.cncf.io/container-device-interface v0.7.2/go.mod h1:Xb1PvXv2BhfNb3tla4r9JL129ck1Lxv9KuU6eVOfKto= diff --git a/tx-response-uploader/main.go b/tx-response-uploader/main.go new file mode 100644 index 00000000..5bc55e4c --- /dev/null +++ b/tx-response-uploader/main.go @@ -0,0 +1,245 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + "os/signal" + "strings" + "syscall" + "time" + + "github.com/certifi/gocertifi" + "github.com/confluentinc/confluent-kafka-go/v2/kafka" + "github.com/getsentry/sentry-go" + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" + + "github.com/initia-labs/core-indexer/pkg/mq" + "github.com/initia-labs/core-indexer/pkg/sentry_integration" + "github.com/initia-labs/core-indexer/pkg/storage" +) + +var logger *zerolog.Logger + +type TxResponseUploader struct { + producer *mq.Producer + consumer *mq.Consumer + + storageClient storage.Client + + config *Config +} + +func getHashAndHeightFromHeaders(headers []kafka.Header) (hash string, height string) { + for _, header := range headers { + switch header.Key { + case HeaderHashKey: + hash = string(header.Value) + case HeaderHeightKey: + height = string(header.Value) + } + } + + return +} + +func (u *TxResponseUploader) process(ctx context.Context, message *kafka.Message) error { + span, ctx := sentry_integration.StartSentrySpan(ctx, "process", "Process Kafka Message") + defer span.Finish() + + hash, height := getHashAndHeightFromHeaders(message.Headers) + + if hash == "" || height == "" { + logger.Error().Msgf("Error getting hash and height from headers") + return fmt.Errorf("either no hash or height from headers") + } + + var data []byte + if strings.HasPrefix(string(message.Key), NewLcdTxResponseClaimCheckKafkaMessageKey) { + logger.Info().Msgf("Processing claim check message: %s", string(message.Key)) + var claimCheckMessage ClaimCheckMessage + err := json.Unmarshal(message.Value, &claimCheckMessage) + if err != nil { + logger.Error().Msgf("Error unmarshalling claim check message: %v", err) + return err + } + + retryCount := 0 + // read from storage until succeeds + for { + retryCount++ + data, err = u.storageClient.ReadFile(u.config.ClaimCheckBucket, claimCheckMessage.ObjectPath) + if err == nil { + break + } + + if retryCount >= 5 { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelError) + } else { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelWarning) + } + + logger.Error().Msgf("Error reading file from storage: %v", err) + } + } else { + data = message.Value + } + + return u.storageClient.UploadFile(u.config.LCDTXResponseBucket, fmt.Sprintf("%s/%s", strings.ToUpper(hash), height), data) +} + +func (u *TxResponseUploader) close() { + u.producer.Flush(10000) + u.producer.Close() + u.consumer.Close() +} + +func NewTxResponseUploader(config *Config) *TxResponseUploader { + sentryClientOptions := sentry.ClientOptions{ + Dsn: config.SentryDSN, + ServerName: config.Chain + "-" + ServiceName, + EnableTracing: true, + ProfilesSampleRate: config.SentryProfileSampleRate, + TracesSampleRate: config.SentryTraceSampleRate, + Environment: config.Environment, + Release: config.CommitSHA, + Tags: map[string]string{ + "chain": config.Chain, + "environment": config.Environment, + "component": ServiceName, + "commit_sha": config.CommitSHA, + }, + } + + rootCAs, err := gocertifi.CACerts() + if err != nil { + logger.Fatal().Msgf("Sentry: Error getting root CAs: %v\n", err) + } else { + sentryClientOptions.CaCerts = rootCAs + } + + err = sentry.Init(sentryClientOptions) + + if err != nil { + logger.Fatal().Msgf("Sentry: Error initializing sentry: %v\n", err) + } + + storageClient, err := storage.NewGCSClient() + if err != nil { + logger.Fatal().Msgf("Error connecting to GCS: %v", err) + } + + consumer, err := mq.NewConsumer(&kafka.ConfigMap{ + "bootstrap.servers": config.BootstrapServer, + "group.id": config.KafkaConsumerGroup, + "client.id": config.KafkaConsumerGroup + "-" + config.ID, + "auto.offset.reset": "earliest", + "enable.auto.commit": false, + "security.protocol": "SASL_SSL", + "sasl.mechanisms": "PLAIN", + "sasl.username": config.KafkaAPIKey, + "sasl.password": config.KafkaAPISecret, + "max.poll.interval.ms": 600000, + }) + + if err != nil { + logger.Fatal().Msgf("Failed to create consumer: %s\n", err) + } + + producer, err := mq.NewProducer(&kafka.ConfigMap{ + "bootstrap.servers": config.BootstrapServer, + "client.id": config.KafkaConsumerGroup + "-" + config.ID, + "acks": "all", + "linger.ms": 200, + "security.protocol": "SASL_SSL", + "sasl.mechanisms": "PLAIN", + "sasl.username": config.KafkaAPIKey, + "sasl.password": config.KafkaAPISecret, + "message.max.bytes": 7340032, + }) + if err != nil { + logger.Fatal().Msgf("Failed to create producer: %s\n", err) + } + + return &TxResponseUploader{ + producer: producer, + consumer: consumer, + storageClient: storageClient, + config: config, + } +} + +func (u *TxResponseUploader) StartUploading(signalContext context.Context) { + logger.Info().Msgf("Starting uploading to GCS") + + err := u.consumer.SubscribeTopics([]string{u.config.Topic}, nil) + if err != nil { + logger.Fatal().Msgf("Failed to subscribe to topic: %s\n", err) + } + + logger.Info().Msgf("Subscribed to topic: %s\n", u.config.Topic) + + for { + select { + case <-signalContext.Done(): + return + default: + message, err := u.consumer.ReadMessage(10 * time.Second) + if err != nil { + if err.(kafka.Error).IsTimeout() { + continue + } + + logger.Error().Msgf("Error reading message: %v", err) + continue + } + + sentry.ConfigureScope(func(scope *sentry.Scope) { + scope.SetTag("id", u.config.ID) + scope.SetTag("partition", fmt.Sprint(message.TopicPartition.Partition)) + scope.SetTag("offset", message.TopicPartition.Offset.String()) + }) + + transaction, ctx := sentry_integration.StartSentryTransaction(context.Background(), "Upload", "Read Tx Response from Kafka and upload to GCS") + err = u.process(ctx, message) + if err != nil { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelError) + logger.Error().Msgf("Error processing message: %v", err) + u.producer.ProduceToDLQ(u.config.Chain, "tx-responses", message, err, logger) + } + + _, err = u.consumer.CommitMessage(message) + if err != nil { + sentry_integration.CaptureCurrentHubException(err, sentry.LevelError) + logger.Error().Msgf("Non-retryable Error committing message: %v", err) + } + transaction.Finish() + } + } +} + +func main() { + config := getConfig() + logger = zerolog.Ctx( + log.With(). + Str("component", ServiceName). + Str("chain", config.Chain). + Str("id", config.ID). + Str("environment", config.Environment). + Str("commit_sha", config.CommitSHA). + Logger(). + WithContext(context.Background()), + ) + + // graceful shutdown + ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) + defer stop() + + uploader := NewTxResponseUploader(config) + + uploader.StartUploading(ctx) + + logger.Info().Msgf("Shutting down ...") + uploader.close() +} diff --git a/tx-response-uploader/tx-response-uploader b/tx-response-uploader/tx-response-uploader new file mode 100755 index 00000000..dd621733 Binary files /dev/null and b/tx-response-uploader/tx-response-uploader differ diff --git a/tx-response-uploader/types.go b/tx-response-uploader/types.go new file mode 100644 index 00000000..6feb9a1c --- /dev/null +++ b/tx-response-uploader/types.go @@ -0,0 +1,12 @@ +package main + +const ( + ServiceName string = "tx-response-uploader" + NewLcdTxResponseClaimCheckKafkaMessageKey string = "NEW_LCD_TX_RESPONSE_CLAIM_CHECK" + HeaderHashKey string = "tx_hash" + HeaderHeightKey string = "height" +) + +type ClaimCheckMessage struct { + ObjectPath string `json:"object_path"` +}