Skip to content

feat: terraform deployment#64

Closed
0xkenj1 wants to merge 33 commits intodevfrom
feat/terraform-deployment
Closed

feat: terraform deployment#64
0xkenj1 wants to merge 33 commits intodevfrom
feat/terraform-deployment

Conversation

@0xkenj1
Copy link
Copy Markdown
Contributor

@0xkenj1 0xkenj1 commented Feb 4, 2025

🤖 Linear

Closes GIT-236 GIT-237

Description

Checklist before requesting a review

  • I have conducted a self-review of my code.
  • I have conducted a QA.
  • If it is a core feature, I have included comprehensive tests.

Summary by CodeRabbit

  • New Features

    • Introduced a comprehensive Terraform configuration for staging infrastructure, including VPC, IAM roles, ECS services, RDS, and load balancing.
    • Added a new PinataProvider class for improved metadata fetching from IPFS.
    • Implemented a load balancer setup for routing HTTP traffic to APIs.
  • Bug Fixes

    • Improved control flow in the metadata retrieval process to reduce unnecessary fetch operations.
  • Documentation

    • Expanded deployment guides and configuration templates to simplify setup, including a new example configuration file for staging.
  • Tests

    • Minor adjustments to test labels for improved clarity.

@0xkenj1 0xkenj1 marked this pull request as draft February 4, 2025 00:36
@0xkenj1
Copy link
Copy Markdown
Contributor Author

0xkenj1 commented Feb 4, 2025

@CodeRabbit

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Feb 4, 2025

@0xkenj1: I'll review your changes related to terraform deployment.

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Feb 4, 2025

📝 Walkthrough

Walkthrough

The changes introduce a new Terraform-based deployment configuration that spans multiple modules and environments. A dedicated .gitignore file for Terraform is added to prevent tracking sensitive or unnecessary files. New Terraform configurations and lock files set up a staging environment with resources such as an S3 backend for state management, ECS clusters, and a comprehensive set of variables for configuring compute, networking, storage, and IAM components. Additional modules are included for managing container registries, bastion hosts, load balancers, and RDS databases. Updates also extend to application code by introducing new metadata providers and minor test modifications. The deployment documentation has been updated with a new README and a sample terraform.tfvars file, providing a clear structure for configuring and managing infrastructure via Terraform.

✨ Finishing Touches
  • 📝 Generate Docstrings (Beta)

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 11

🔭 Outside diff range comments (1)
scripts/bootstrap/src/metadata.script.ts (1)

334-334: Move hardcoded concurrency value to configuration.

The concurrency limit is hardcoded and marked with a FIXME comment.

Move the concurrency value to the environment configuration:

-            { concurrency: 10 }, //FIXME: remove hardcoded concurrency
+            { concurrency: process.env.METADATA_FETCH_CONCURRENCY || 10 },
🧹 Nitpick comments (47)
scripts/bootstrap/README.md (3)

5-11: Documentation of Available Scripts
The table lists the db:migrate and db:reset commands clearly with descriptions. However, the PR objectives and AI summary mention additional cache-related commands (db:cache:migrate and db:cache:reset). If these commands are now part of the feature, please consider adding them to this table for completeness.


63-68: Reset Warning Details
The warning section effectively outlines the consequences of executing a database reset. Consider emphasizing that data loss is irreversible in production environments.


112-113: E2E Tests Reminder
A TODO note reminds you to add end-to-end tests for the scripts. Consider prioritizing this work to ensure that the migration and reset functionalities are fully validated in realistic scenarios.

packages/indexer-client/src/providers/envioIndexerClient.ts (1)

256-285: Use the existing error handling utility.

The method implementation looks good but could benefit from using the existing handleError utility for consistency.

Consider refactoring to use the existing error handling:

 async getBlockRangeByChainId(chainId: ChainId): Promise<{ from: number; to: number }> {
-        const response = (await this.client.request(
-            gql`
-                query getBlockRangeByChainId($chainId: Int!) {
-                    from: raw_events(
-                        where: { chain_id: { _eq: $chainId } }
-                        order_by: { block_number: asc }
-                        limit: 1
-                    ) {
-                        block_number
-                    }
-                    to: raw_events(
-                        where: { chain_id: { _eq: $chainId } }
-                        order_by: { block_number: desc }
-                        limit: 1
-                    ) {
-                        block_number
-                    }
-                }
-            `,
-            { chainId },
-        )) as { from: { block_number: number }[]; to: { block_number: number }[] };
-        if (!response.from[0] || !response.to[0]) {
-            throw new Error("No block range found");
-        }
-        return {
-            from: response.from[0].block_number,
-            to: response.to[0].block_number,
-        };
+        try {
+            const response = (await this.client.request(
+                gql`
+                    query getBlockRangeByChainId($chainId: Int!) {
+                        from: raw_events(
+                            where: { chain_id: { _eq: $chainId } }
+                            order_by: { block_number: asc }
+                            limit: 1
+                        ) {
+                            block_number
+                        }
+                        to: raw_events(
+                            where: { chain_id: { _eq: $chainId } }
+                            order_by: { block_number: desc }
+                            limit: 1
+                        ) {
+                            block_number
+                        }
+                    }
+                `,
+                { chainId },
+            )) as { from: { block_number: number }[]; to: { block_number: number }[] };
+            if (!response.from[0] || !response.to[0]) {
+                throw new InvalidIndexerResponse("No block range found");
+            }
+            return {
+                from: response.from[0].block_number,
+                to: response.to[0].block_number,
+            };
+        } catch (error) {
+            throw this.handleError(error, "getBlockRangeByChainId");
+        }
scripts/bootstrap/src/schemas/index.ts (1)

56-65: Avoid invoking multiple schemas for the same environment.
You already parse env variables once using validationSchema in this file. Re-parsing them with dbEnvSchema.safeParse can introduce risk of inconsistent validations. If possible, unify these steps to parse the environment once and reuse the parsed result.

packages/metadata/src/providers/publicGateway.provider.ts (2)

41-45: Consider stricter validation for arrays or other data types.
Currently, the code checks if data is not an object and also not valid JSON, which might allow arrays or nested objects to pass through. If more precise validation is desired (e.g., only top-level objects), you could add further checks or rely fully on the Zod schema to validate nested structures.


57-57: Optional: Add retry or fallback logic instead of failing immediately.
When all gateways fail, you throw a generic error. Consider implementing an exponential backoff or a fallback approach for more resilience.

scripts/bootstrap/src/pricing.script.ts (1)

3-3: Remove or restore unused references.
ESLint indicates that EnvioIndexerClient, INDEXER_URL, INDEXER_SECRET, and chainId in certain spots are unused. If you plan to use them soon, consider uncommenting the relevant logic. Otherwise, remove them to clean up ESLint errors and avoid confusion.

-import { EnvioIndexerClient } from "@grants-stack-indexer/indexer-client";-    const { DATABASE_URL, NODE_ENV, INDEXER_URL, INDEXER_SECRET, CHAIN_IDS } = getDatabaseConfigFromEnv();
+    const { DATABASE_URL, NODE_ENV, CHAIN_IDS } = getDatabaseConfigFromEnv();- // const envioIndexerClient = new EnvioIndexerClient(INDEXER_URL, INDEXER_SECRET);- for (const chainId of CHAIN_IDS) {
+ for (const chainId of CHAIN_IDS) {
    // ...
}

Also applies to: 40-40, 76-76, 79-79

🧰 Tools
🪛 ESLint

[error] 3-3: 'EnvioIndexerClient' is defined but never used.

(@typescript-eslint/no-unused-vars)

apps/processing/src/config/env.ts (1)

55-68: Extend test coverage for new metadata schemas.

The added dummy, pinata, and public-gateway schemas look good and follow Zod best practices. Consider adding or extending tests (unit or integration) to confirm that missing or malformed required fields (e.g., PINATA_JWT, PUBLIC_GATEWAY_URLS) are correctly caught.

packages/pricing/src/providers/coingecko.provider.ts (2)

38-38: Clarify or remove commented-out tokens.

Commented-out tokens (e.g., // GIST, // GcV, // MTK) may cause confusion. If they’re placeholders for future support, consider using a tracked TODO. Otherwise, remove them for clarity.

Also applies to: 46-46, 57-57


220-224: Use the injected logger instead of console.log.

Calls to console.log (lines 220–222, 224) can be replaced with the injected logger to maintain consistency and controllable log levels.

A quick fix could be:

- console.log("================================================");
- console.log(path);
- console.log("================================================");
- console.log(error.code, error.response, error.message);
+ this.logger.debug("================================================");
+ this.logger.debug(path);
+ this.logger.debug("================================================");
+ this.logger.error(`Axios error encountered: ${error.message}`, { code: error.code, response: error.response });
packages/metadata/src/exceptions/invalidMetadataSource.exception.ts (1)

3-7: Add JSDoc documentation for the exception class.

Please add JSDoc documentation to describe the purpose and usage of this exception class.

+/**
+ * Exception thrown when an invalid metadata source is specified.
+ * This is a non-retriable error, indicating that the operation cannot be retried with the same input.
+ */
 export class InvalidMetadataSourceException extends NonRetriableError {
     constructor() {
         super(`Invalid metadata source`);
     }
 }
packages/metadata/src/exceptions/missingDependencies.exception.ts (1)

3-7: Add JSDoc documentation for the exception class.

Please add JSDoc documentation to describe the purpose and usage of this exception class.

+/**
+ * Exception thrown when required dependencies are missing.
+ * This is a non-retriable error, indicating that the operation cannot be retried without providing the missing dependencies.
+ * @param dependencies - Array of dependency names that are missing
+ */
 export class MissingDependenciesException extends NonRetriableError {
     constructor(dependencies: string[]) {
         super(`Missing dependencies: ${dependencies.join(", ")}`);
     }
 }
packages/metadata/src/providers/dummy.provider.ts (2)

1-1: Import IMetadataProvider interface directly for proper JSDoc inheritance.

For proper JSDoc inheritance with @inheritdoc, import the interface directly instead of using the internal module.

-import type { IMetadataProvider } from "../internal.js";
+import type { IMetadataProvider } from "../interfaces/metadata.interface.js";

3-10: Remove unnecessary constructor and improve documentation.

The empty constructor can be removed, and the documentation should be improved.

+/**
+ * A dummy implementation of IMetadataProvider that always returns undefined.
+ * Useful for testing or as a placeholder in development.
+ */
 export class DummyMetadataProvider implements IMetadataProvider {
-    constructor() {}

     /* @inheritdoc */
     async getMetadata<T>(_ipfsCid: string): Promise<T | undefined> {
         return undefined;
     }
🧰 Tools
🪛 Biome (1.9.4)

[error] 4-4: This constructor is unnecessary.

Unsafe fix: Remove the unnecessary constructor.

(lint/complexity/noUselessConstructor)

packages/processors/src/external.ts (1)

10-14: Add JSDoc documentation for the decoder functions.

Per our TypeScript guidelines, please add JSDoc documentation for the newly exported decoder functions to improve code maintainability.

Add documentation like this:

+/**
+ * Decoder functions for application data
+ */
 export {
     decodeDVMDApplicationData,
     decodeDVMDExtendedApplicationData,
     decodeDGApplicationData,
 } from "./internal.js";
scripts/bootstrap/src/utils/kysely.ts (1)

9-19: Consider adding a test table cleanup.

The function correctly retrieves the schema name and includes helpful documentation. However, consider cleaning up the test table after getting the schema name to prevent leaving temporary tables in the database.

 export const getSchemaName = (schema: SchemaModule): string => {
     let name = "public";
     schema.createTable("test").$call((b) => {
         name = b.toOperationNode().table.table.schema?.name ?? "public";
     });
+    schema.dropTable("test").$call(() => {});
     return name;
 };
packages/metadata/src/interfaces/index.ts (1)

3-18: LGTM! Consider adding JSDoc comments.

The types are well-structured using discriminated unions. Consider adding JSDoc comments to document the purpose and usage of each type.

+/** Type of metadata provider to use */
 export type MetadataProvider = "pinata" | "public-gateway" | "dummy";

+/** Configuration for dummy metadata provider */
 export type DummyMetadataConfig = {
     metadataSource: "dummy";
 };

+/** Configuration for public gateway metadata provider */
 export type GatewayMetadataConfig = {
     metadataSource: "public-gateway";
     gateways: string[];
 };

+/** Configuration for Pinata metadata provider */
 export type PinataMetadataConfig = {
     metadataSource: "pinata";
     jwt: string;
     gateway: string;
 };
scripts/bootstrap/src/utils/parsing.ts (1)

16-30: Consider enhancing error handling in the check function.

While the implementation is generally good, the error handling in the check function could be more informative.

Consider this enhancement:

 .check((argv) => {
-    zodSchema.parse(argv);
+    try {
+        zodSchema.parse(argv);
+    } catch (error) {
+        throw new Error(`Invalid arguments: ${error.message}`);
+    }
     return true;
 })
packages/data-flow/src/helpers/index.ts (1)

13-36: Consider enhancing error handling and logging.

The empty catch blocks might hide important errors, and the function could benefit from logging failed decoding attempts.

Consider this enhancement:

 export const getMetadataCidsFromEvents = (events: AnyIndexerFetchedEvent[]): string[] => {
     const ids = new Set<string>();
+    const logger = new Logger({ context: 'getMetadataCidsFromEvents' });

     for (const event of events) {
         if ("metadata" in event.params) {
             ids.add(event.params.metadata[1]);
         } else if ("data" in event.params) {
             try {
                 const decoded = decodeDGApplicationData(event.params.data);
                 ids.add(decoded.metadata.pointer);
-            } catch (error) {}
+            } catch (error) {
+                logger.debug('Failed to decode DG application data', { error });
+            }
             try {
                 const decoded = decodeDVMDApplicationData(event.params.data);
                 ids.add(decoded.metadata.pointer);
-            } catch (error) {}
+            } catch (error) {
+                logger.debug('Failed to decode DVMD application data', { error });
+            }
             try {
                 const decoded = decodeDVMDExtendedApplicationData(event.params.data);
                 ids.add(decoded.metadata.pointer);
-            } catch (error) {}
+            } catch (error) {
+                logger.debug('Failed to decode DVMD extended application data', { error });
+            }
         }
     }

     return Array.from(ids);
 };
packages/metadata/src/providers/pinata.provider.ts (3)

16-18: Remove commented console.log statements.

Debug console.log statements should be removed before committing.

-        // console.log("pinataJwt", this.pinataJwt);
-        // console.log("pinataGateway", this.pinataGateway);

30-32: Remove additional commented console.log statements.

More debug console.log statements that should be removed.

-            // console.log("ipfsCid", ipfsCid);
-            // console.log("pinataClient", this.pinataClient.gateways);
-            // console.log("pinataResponse", pinataResponse);

Also applies to: 36-37


24-49: Consider enhancing error handling with specific error types.

The error handling could be more specific to help with debugging and monitoring.

Consider this enhancement:

 /* @inheritdoc */
 async getMetadata<T>(ipfsCid: string): Promise<T | undefined> {
     try {
         if (ipfsCid === "" || !isValidCid(ipfsCid)) {
+            this.logger.debug("Invalid IPFS CID", { ipfsCid });
             return undefined;
         }
         const pinataResponse = await this.pinataClient.gateways.get(ipfsCid);
         if (!pinataResponse.data) {
+            this.logger.debug("No data in Pinata response", { ipfsCid });
             return undefined;
         }
         this.logger.debug("Fetch metadata from pinata", {
             ipfsCid,
             pinataResponse,
         });
         return pinataResponse.data as T;
     } catch (error) {
+        const isNetworkError = error instanceof Error && 
+            error.message.includes('network');
+        const errorType = isNetworkError ? 'network_error' : 'unknown_error';
         this.logger.error("Error fetching metadata from pinata", {
             ipfsCid,
             error,
+            errorType,
         });
         return undefined;
     }
 }
packages/metadata/src/factory/index.ts (1)

17-56: Consider refactoring static-only class to a function.

While the implementation is solid, consider refactoring this static-only class to a simple function for better maintainability:

-export class MetadataProviderFactory {
-    static create(
+export function createMetadataProvider(
         options: MetadataConfig<MetadataProvider>,
         deps?: {
             logger?: ILogger;
         },
-    ): IMetadataProvider {
+): IMetadataProvider {

The current implementation has good error handling and type safety.

🧰 Tools
🪛 Biome (1.9.4)

[error] 17-56: Avoid classes that contain only static members.

Prefer using simple functions instead of classes with only static members.

(lint/complexity/noStaticOnlyClass)

scripts/migrations/src/migrateDb.script.ts (1)

82-85: Enhance error logging in catch block.

Consider improving error logging to include more context:

 main().catch((error) => {
-    console.error(error);
+    Logger.getInstance().error('Migration script failed', { error });
     process.exit(1);
 });
apps/processing/src/services/sharedDependencies.service.ts (1)

55-55: Consider using an enum for NODE_ENV values.

To improve type safety and prevent typos, consider using an enum for the possible NODE_ENV values.

+export enum NodeEnv {
+  Production = 'production',
+  Staging = 'staging',
+  Development = 'development'
+}

-isProduction: env.NODE_ENV === "production" || env.NODE_ENV === "staging",
+isProduction: [NodeEnv.Production, NodeEnv.Staging].includes(env.NODE_ENV as NodeEnv),
scripts/bootstrap/src/metadata.script.ts (1)

322-336: Improve error handling in metadata fetching.

The error handling logs the error but doesn't provide detailed information about the failure.

Enhance error logging:

                } catch (error) {
-                    console.log("rejected", id);
+                    this.logger.error(`Failed to fetch metadata for ID: ${id}`, {
+                        error,
+                        className: this.constructor.name,
+                    });
                    return { status: "rejected", reason: error };
                }
packages/pricing/src/providers/cachingProxy.provider.ts (1)

193-199: Translate Spanish comments to English.

Comments should be in English for consistency and maintainability.

Translate the comments:

-                // Calcular la diferencia de tiempo en minutos
-                // const timeDifference = (timestampMs - closestPrice.timestampMs) / 60000; // en minutos
+                // Calculate time difference in minutes
+                // const timeDifference = (timestampMs - closestPrice.timestampMs) / 60000; // in minutes
-                //     console.log(
-                //         `Diferencia de tiempo: ${timeDifference} minutos para el timestamp ${timestampMs}`,
-                //     );
+                //     console.log(
+                //         `Time difference: ${timeDifference} minutes for timestamp ${timestampMs}`,
+                //     );
packages/data-flow/src/orchestrator.ts (1)

102-102: Consider using an enum for environment types.

The environment type is defined as a string union type. Using an enum would provide better type safety and maintainability.

+export enum Environment {
+    Development = "development",
+    Staging = "staging",
+    Production = "production",
+}

-        private environment: "development" | "staging" | "production" = "development",
+        private environment: Environment = Environment.Development,
deployment/modules/container-registry/outputs.tf (2)

1-3: Document the Processing Repository URL Output.
The output for the processing repository URL is functional. Consider adding a description attribute to improve self-documentation and maintainability.

Example diff:

output "processing_repository_url" {
-  value = aws_ecr_repository.processing_repository.repository_url
+  value       = aws_ecr_repository.processing_repository.repository_url
+  description = "The URL for the processing ECR repository"
}

5-7: Document the Processing Repository ARN Output.
Similar to the URL output, adding a description attribute here could clarify the purpose for future maintainers.

Example diff:

output "processing_repository_arn" {
-  value = aws_ecr_repository.processing_repository.arn
+  value       = aws_ecr_repository.processing_repository.arn
+  description = "The ARN for the processing ECR repository"
}
deployment/state/variables.tf (1)

6-9: Review 'app_environment' Variable Definition.
The app_environment variable is properly defined. As an enhancement, you might consider adding a default or a set of allowed values to safeguard against misconfiguration.

deployment/modules/networking/variables.tf (1)

6-9: Clarify 'app_environment' Variable for Networking.
The definition is clear; however, consider documenting expected values (e.g., staging, production) to prevent misconfiguration.

deployment/modules/iam/outputs.tf (3)

1-3: Enhance Processing Service Role ARN Output Documentation.
While the output correctly retrieves the ARN, adding a description attribute can improve clarity for users referencing this output.

Example diff:

output "processing_service_role_arn" {
-  value = aws_iam_role.processing_service_role.arn
+  value       = aws_iam_role.processing_service_role.arn
+  description = "The ARN of the IAM role for the processing service"
}

5-7: Enhance API Service Role ARN Output Documentation.
Similarly, consider adding a descriptive attribute to explain the output, which benefits future maintainers or integrations.

Example diff:

output "api_service_role_arn" {
-  value = aws_iam_role.api_service_role.arn
+  value       = aws_iam_role.api_service_role.arn
+  description = "The ARN of the IAM role for the API service"
}

9-11: Enhance Bastion Instance Profile Name Output Documentation.
Adding a description here can be very helpful for clarifying the purpose of this output.

Example diff:

output "bastion_instance_profile_name" {
-  value = aws_iam_instance_profile.bastion_instance_profile.name
+  value       = aws_iam_instance_profile.bastion_instance_profile.name
+  description = "The name of the IAM instance profile for the bastion host"
}
scripts/bootstrap/.env.example (2)

3-3: Suggestion: Specify Protocol in INDEXER_URL

Consider including a protocol (e.g., http:// or https://) in the INDEXER_URL value so that consumers of this variable have complete URL information.


4-4: Note on Array Format for PUBLIC_GATEWAY_URLS

The environment variable PUBLIC_GATEWAY_URLS is provided in an array-like syntax. Ensure that the code consuming this variable properly JSON-parses the value, and document the expected format clearly.

deployment/modules/storage/variables.tf (1)

26-29: Nitpick: Mark Sensitive Data

While rds_password is correctly declared as a string, consider adding a sensitive = true flag to prevent accidental exposure in Terraform logs or outputs.

scripts/migrations/README.md (3)

57-69: Cache Migration Section – Code Block Enhancement
The "Migrating Cache" section is informative. To comply with markdown linting guidelines (MD040), please add a language specifier (e.g., use ```bash) for the fenced code block that shows the command pnpm db:cache:migrate --schema=schema_name.

🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

61-61: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


87-94: Resetting Cache Section – Code Block Consistency
The "Resetting Cache" section is clear; however, adding a language specifier (such as ```bash) for the fenced code block displaying pnpm db:cache:reset --schema=schema_name would improve markdown clarity and adhere to best practices.

🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

90-90: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


104-104: Minor Language Improvement
Consider revising the instruction “Create a new migration file in scripts/migrations/src/migrations” to improve clarity. For example, using “within” or “into” may sound more natural in this context.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~104-~104: The preposition ‘to’ seems more likely in this position.
Context: ...rations 1. Create a new migration file in [scripts/migrations/src/migrations](....

(AI_HYDRA_LEO_REPLACE_IN_TO)

docker-compose.yaml (2)

46-46: Clarify the commented-out console assets configuration.
The change updates the commented-out line for HASURA_GRAPHQL_CONSOLE_ASSETS_DIR by leaving it commented with a note. Please ensure that if this configuration is intended for future use, the comment explains its purpose or otherwise remove it to avoid confusion.


58-70: New processing service configuration review.
The newly added processing service block looks largely correct; it specifies the build context, uses the Dockerfile, and depends on datalayer-postgres-db with proper network configuration. One suggestion is to consider adding a healthcheck for the processing service to help with early detection of issues during container startup.

deployment/environments/staging/variables.tf (1)

36-54: Review variable types for retry settings.
The retry-related variables (RETRY_MAX_ATTEMPTS, RETRY_BASE_DELAY_MS, RETRY_MAX_DELAY_MS, and RETRY_FACTOR) are defined with type string. Often, these values are used in arithmetic contexts and might be better represented as numbers. If numeric operations are expected downstream, consider changing their types to number.

deployment/environments/staging/main.tf (1)

68-113: Module "compute" configuration and interpolation review.
The compute module is passed many relevant variables. A couple of points for consideration:

  • The DATALAYER_HASURA_DATABASE_URL is constructed inline using string interpolation. For enhanced readability and maintainability, consider using Terraform’s format() function.
  • The commented-out INDEXER_ADMIN_SECRET variable (line 104) should be removed if it is no longer needed or revisited if it will be used in a future deployment.
deployment/modules/compute/variables.tf (1)

28-47: Consistent use of variable types for retry settings.
Similar to the staging variables file, the retry-related variables here are defined as strings. If these values are used in computations within the compute module, it may be more appropriate to define them as numbers. Ensure that your design intentionally uses strings; otherwise, consider updating the type.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2494cb6 and d7992ba.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (82)
  • .env.example (0 hunks)
  • Dockerfile (1 hunks)
  • apps/processing/src/config/env.ts (4 hunks)
  • apps/processing/src/services/sharedDependencies.service.ts (3 hunks)
  • apps/processing/test/unit/sharedDependencies.service.spec.ts (3 hunks)
  • deployment/.gitignore (1 hunks)
  • deployment/environments/staging/.terraform.lock.hcl (1 hunks)
  • deployment/environments/staging/main.tf (1 hunks)
  • deployment/environments/staging/variables.tf (1 hunks)
  • deployment/modules/bastion/main.tf (1 hunks)
  • deployment/modules/bastion/outputs.tf (1 hunks)
  • deployment/modules/bastion/variables.tf (1 hunks)
  • deployment/modules/compute/main.tf (1 hunks)
  • deployment/modules/compute/outputs.tf (1 hunks)
  • deployment/modules/compute/variables.tf (1 hunks)
  • deployment/modules/container-registry/main.tf (1 hunks)
  • deployment/modules/container-registry/outputs.tf (1 hunks)
  • deployment/modules/container-registry/variables.tf (1 hunks)
  • deployment/modules/iam/main.tf (1 hunks)
  • deployment/modules/iam/outputs.tf (1 hunks)
  • deployment/modules/iam/variables.tf (1 hunks)
  • deployment/modules/networking/main.tf (1 hunks)
  • deployment/modules/networking/outputs.tf (1 hunks)
  • deployment/modules/networking/variables.tf (1 hunks)
  • deployment/modules/storage/main.tf (1 hunks)
  • deployment/modules/storage/outputs.tf (1 hunks)
  • deployment/modules/storage/variables.tf (1 hunks)
  • deployment/state/.terraform.lock.hcl (1 hunks)
  • deployment/state/main.tf (1 hunks)
  • deployment/state/variables.tf (1 hunks)
  • docker-compose.yaml (3 hunks)
  • package.json (1 hunks)
  • packages/data-flow/package.json (1 hunks)
  • packages/data-flow/src/external.ts (1 hunks)
  • packages/data-flow/src/helpers/index.ts (1 hunks)
  • packages/data-flow/src/internal.ts (1 hunks)
  • packages/data-flow/src/orchestrator.ts (6 hunks)
  • packages/data-flow/test/unit/eventsFetcher.spec.ts (1 hunks)
  • packages/data-flow/test/unit/orchestrator.spec.ts (2 hunks)
  • packages/indexer-client/src/interfaces/indexerClient.ts (1 hunks)
  • packages/indexer-client/src/providers/envioIndexerClient.ts (2 hunks)
  • packages/indexer-client/test/unit/envioIndexerClient.spec.ts (3 hunks)
  • packages/metadata/package.json (1 hunks)
  • packages/metadata/src/exceptions/invalidMetadataSource.exception.ts (1 hunks)
  • packages/metadata/src/exceptions/missingDependencies.exception.ts (1 hunks)
  • packages/metadata/src/external.ts (1 hunks)
  • packages/metadata/src/factory/index.ts (1 hunks)
  • packages/metadata/src/interfaces/index.ts (1 hunks)
  • packages/metadata/src/interfaces/metadata.interface.ts (1 hunks)
  • packages/metadata/src/internal.ts (1 hunks)
  • packages/metadata/src/providers/cachingProxy.provider.ts (1 hunks)
  • packages/metadata/src/providers/dummy.provider.ts (1 hunks)
  • packages/metadata/src/providers/index.ts (1 hunks)
  • packages/metadata/src/providers/pinata.provider.ts (1 hunks)
  • packages/metadata/src/providers/publicGateway.provider.ts (4 hunks)
  • packages/pricing/src/providers/cachingProxy.provider.ts (5 hunks)
  • packages/pricing/src/providers/coingecko.provider.ts (4 hunks)
  • packages/processors/src/external.ts (1 hunks)
  • packages/processors/src/internal.ts (1 hunks)
  • packages/processors/src/processors/strategy/directAllocation/handlers/directAllocated.handler.ts (2 hunks)
  • packages/processors/src/processors/strategy/donationVotingMerkleDistributionDirectTransfer/handlers/allocated.handler.ts (2 hunks)
  • packages/repository/src/db/connection.ts (2 hunks)
  • packages/shared/src/external.ts (1 hunks)
  • packages/shared/src/retry/exponentialBackoff.strategy.ts (1 hunks)
  • packages/shared/src/tokens/tokens.ts (5 hunks)
  • packages/shared/src/utils/testing.ts (1 hunks)
  • scripts/bootstrap/.env.example (1 hunks)
  • scripts/bootstrap/README.md (1 hunks)
  • scripts/bootstrap/package.json (1 hunks)
  • scripts/bootstrap/src/metadata.script.ts (1 hunks)
  • scripts/bootstrap/src/pricing.script.ts (1 hunks)
  • scripts/bootstrap/src/schemas/index.ts (1 hunks)
  • scripts/bootstrap/src/utils/index.ts (1 hunks)
  • scripts/bootstrap/src/utils/kysely.ts (1 hunks)
  • scripts/bootstrap/src/utils/parsing.ts (1 hunks)
  • scripts/bootstrap/tsconfig.build.json (1 hunks)
  • scripts/bootstrap/tsconfig.json (1 hunks)
  • scripts/bootstrap/vitest.config.ts (1 hunks)
  • scripts/migrations/README.md (3 hunks)
  • scripts/migrations/package.json (1 hunks)
  • scripts/migrations/src/migrateDb.script.ts (2 hunks)
  • scripts/migrations/src/migrations/external-services-cache/20250127T000000_add_cache_tables.ts (1 hunks)
⛔ Files not processed due to max files limit (5)
  • scripts/migrations/src/migrations/processing/20241029T120000_initial.ts
  • scripts/migrations/src/resetDb.script.ts
  • scripts/migrations/src/schemas/index.ts
  • scripts/migrations/src/utils/kysely.ts
  • scripts/migrations/src/utils/parsing.ts
💤 Files with no reviewable changes (1)
  • .env.example
✅ Files skipped from review due to trivial changes (11)
  • packages/metadata/src/internal.ts
  • deployment/modules/compute/outputs.tf
  • scripts/bootstrap/tsconfig.json
  • packages/data-flow/src/internal.ts
  • scripts/bootstrap/src/utils/index.ts
  • deployment/.gitignore
  • deployment/state/.terraform.lock.hcl
  • deployment/environments/staging/.terraform.lock.hcl
  • packages/data-flow/test/unit/orchestrator.spec.ts
  • scripts/bootstrap/package.json
  • scripts/bootstrap/tsconfig.build.json
🧰 Additional context used
📓 Path-based instructions (40)
packages/shared/src/utils/testing.ts (1)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.
scripts/migrations/src/migrations/external-services-cache/20250127T000000_add_cache_tables.ts (2)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.

Pattern scripts/**/*.ts: Ensure scripts:
- Use process.cwd() for root references.
- Follow folder conventions (infra/ for infra scripts, utilities/ for utilities).
- Are organized in package.json with script:infra:{name} or script:util:{name}.

  • Be concise and avoid overly nitpicky feedback outside of these best practices.
packages/data-flow/src/external.ts (1)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.
packages/metadata/src/exceptions/missingDependencies.exception.ts (1)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.
packages/metadata/src/providers/index.ts (2)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.

Pattern **/providers/**/*.ts: Review provider files for the following:

  • Providers should supply narrowly scoped data/resources.
  • Ensure classes interacting with metadata sources (e.g., GitHub, JSON files, IPFS) implement the IMetadataProvider interface and follow naming conventions (e.g., GithubProvider, JsonFileProvider).
  • Be concise and avoid overly nitpicky feedback outside of these best practices.
packages/processors/src/internal.ts (1)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.
packages/metadata/src/exceptions/invalidMetadataSource.exception.ts (1)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.
packages/repository/src/db/connection.ts (1)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.
packages/indexer-client/test/unit/envioIndexerClient.spec.ts (2)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.

Pattern **/*.spec.ts: Review the unit test files with the following guidelines:
- Avoid using the word "should" in test descriptions.
- Ensure descriptive test names convey the intent of each test.
- Validate adherence to the Mocha/Chai/Jest test library best practices.

  • Be concise and avoid overly nitpicky feedback outside of these best practices.
packages/metadata/src/external.ts (1)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.
packages/indexer-client/src/interfaces/indexerClient.ts (1)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.
scripts/bootstrap/vitest.config.ts (2)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.

Pattern scripts/**/*.ts: Ensure scripts:
- Use process.cwd() for root references.
- Follow folder conventions (infra/ for infra scripts, utilities/ for utilities).
- Are organized in package.json with script:infra:{name} or script:util:{name}.

  • Be concise and avoid overly nitpicky feedback outside of these best practices.
packages/shared/src/external.ts (1)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.
packages/processors/src/external.ts (1)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.
packages/metadata/src/providers/dummy.provider.ts (2)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.

Pattern **/providers/**/*.ts: Review provider files for the following:

  • Providers should supply narrowly scoped data/resources.
  • Ensure classes interacting with metadata sources (e.g., GitHub, JSON files, IPFS) implement the IMetadataProvider interface and follow naming conventions (e.g., GithubProvider, JsonFileProvider).
  • Be concise and avoid overly nitpicky feedback outside of these best practices.
scripts/bootstrap/src/utils/kysely.ts (2)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.

Pattern scripts/**/*.ts: Ensure scripts:
- Use process.cwd() for root references.
- Follow folder conventions (infra/ for infra scripts, utilities/ for utilities).
- Are organized in package.json with script:infra:{name} or script:util:{name}.

  • Be concise and avoid overly nitpicky feedback outside of these best practices.
packages/pricing/src/providers/cachingProxy.provider.ts (2)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.

Pattern **/providers/**/*.ts: Review provider files for the following:

  • Providers should supply narrowly scoped data/resources.
  • Ensure classes interacting with metadata sources (e.g., GitHub, JSON files, IPFS) implement the IMetadataProvider interface and follow naming conventions (e.g., GithubProvider, JsonFileProvider).
  • Be concise and avoid overly nitpicky feedback outside of these best practices.
packages/processors/src/processors/strategy/directAllocation/handlers/directAllocated.handler.ts (1)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.
packages/data-flow/test/unit/eventsFetcher.spec.ts (2)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.

Pattern **/*.spec.ts: Review the unit test files with the following guidelines:
- Avoid using the word "should" in test descriptions.
- Ensure descriptive test names convey the intent of each test.
- Validate adherence to the Mocha/Chai/Jest test library best practices.

  • Be concise and avoid overly nitpicky feedback outside of these best practices.
packages/data-flow/src/helpers/index.ts (1)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.
apps/processing/src/services/sharedDependencies.service.ts (2)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.

Pattern **/services/**/*.ts: Review service files with the following considerations:
- A Service encapsulates a broader business workflow and might orchestrate various components or interact with multiple data sources or APIs.
- Ensure proper composability: Services should use Providers for data/resource access and apply business/orchestration logic.
- Validate naming conventions for aggregating services (e.g., AggregatorService or domain-specific names like MetricsService).

scripts/bootstrap/src/utils/parsing.ts (2)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.

Pattern scripts/**/*.ts: Ensure scripts:
- Use process.cwd() for root references.
- Follow folder conventions (infra/ for infra scripts, utilities/ for utilities).
- Are organized in package.json with script:infra:{name} or script:util:{name}.

  • Be concise and avoid overly nitpicky feedback outside of these best practices.
packages/shared/src/retry/exponentialBackoff.strategy.ts (1)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.
scripts/bootstrap/src/metadata.script.ts (2)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.

Pattern scripts/**/*.ts: Ensure scripts:
- Use process.cwd() for root references.
- Follow folder conventions (infra/ for infra scripts, utilities/ for utilities).
- Are organized in package.json with script:infra:{name} or script:util:{name}.

  • Be concise and avoid overly nitpicky feedback outside of these best practices.
packages/metadata/src/providers/cachingProxy.provider.ts (2)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.

Pattern **/providers/**/*.ts: Review provider files for the following:

  • Providers should supply narrowly scoped data/resources.
  • Ensure classes interacting with metadata sources (e.g., GitHub, JSON files, IPFS) implement the IMetadataProvider interface and follow naming conventions (e.g., GithubProvider, JsonFileProvider).
  • Be concise and avoid overly nitpicky feedback outside of these best practices.
packages/shared/src/tokens/tokens.ts (1)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.
scripts/bootstrap/src/schemas/index.ts (2)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.

Pattern scripts/**/*.ts: Ensure scripts:
- Use process.cwd() for root references.
- Follow folder conventions (infra/ for infra scripts, utilities/ for utilities).
- Are organized in package.json with script:infra:{name} or script:util:{name}.

  • Be concise and avoid overly nitpicky feedback outside of these best practices.
packages/metadata/src/providers/publicGateway.provider.ts (2)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.

Pattern **/providers/**/*.ts: Review provider files for the following:

  • Providers should supply narrowly scoped data/resources.
  • Ensure classes interacting with metadata sources (e.g., GitHub, JSON files, IPFS) implement the IMetadataProvider interface and follow naming conventions (e.g., GithubProvider, JsonFileProvider).
  • Be concise and avoid overly nitpicky feedback outside of these best practices.
scripts/migrations/src/migrateDb.script.ts (2)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.

Pattern scripts/**/*.ts: Ensure scripts:
- Use process.cwd() for root references.
- Follow folder conventions (infra/ for infra scripts, utilities/ for utilities).
- Are organized in package.json with script:infra:{name} or script:util:{name}.

  • Be concise and avoid overly nitpicky feedback outside of these best practices.
packages/metadata/src/interfaces/index.ts (1)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.
packages/processors/src/processors/strategy/donationVotingMerkleDistributionDirectTransfer/handlers/allocated.handler.ts (1)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.
packages/metadata/src/providers/pinata.provider.ts (2)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.

Pattern **/providers/**/*.ts: Review provider files for the following:

  • Providers should supply narrowly scoped data/resources.
  • Ensure classes interacting with metadata sources (e.g., GitHub, JSON files, IPFS) implement the IMetadataProvider interface and follow naming conventions (e.g., GithubProvider, JsonFileProvider).
  • Be concise and avoid overly nitpicky feedback outside of these best practices.
packages/data-flow/src/orchestrator.ts (1)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.
packages/pricing/src/providers/coingecko.provider.ts (2)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.

Pattern **/providers/**/*.ts: Review provider files for the following:

  • Providers should supply narrowly scoped data/resources.
  • Ensure classes interacting with metadata sources (e.g., GitHub, JSON files, IPFS) implement the IMetadataProvider interface and follow naming conventions (e.g., GithubProvider, JsonFileProvider).
  • Be concise and avoid overly nitpicky feedback outside of these best practices.
scripts/bootstrap/src/pricing.script.ts (2)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.

Pattern scripts/**/*.ts: Ensure scripts:
- Use process.cwd() for root references.
- Follow folder conventions (infra/ for infra scripts, utilities/ for utilities).
- Are organized in package.json with script:infra:{name} or script:util:{name}.

  • Be concise and avoid overly nitpicky feedback outside of these best practices.
packages/indexer-client/src/providers/envioIndexerClient.ts (2)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.

Pattern **/providers/**/*.ts: Review provider files for the following:

  • Providers should supply narrowly scoped data/resources.
  • Ensure classes interacting with metadata sources (e.g., GitHub, JSON files, IPFS) implement the IMetadataProvider interface and follow naming conventions (e.g., GithubProvider, JsonFileProvider).
  • Be concise and avoid overly nitpicky feedback outside of these best practices.
packages/metadata/src/interfaces/metadata.interface.ts (1)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.
apps/processing/test/unit/sharedDependencies.service.spec.ts (2)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.

Pattern **/*.spec.ts: Review the unit test files with the following guidelines:
- Avoid using the word "should" in test descriptions.
- Ensure descriptive test names convey the intent of each test.
- Validate adherence to the Mocha/Chai/Jest test library best practices.

  • Be concise and avoid overly nitpicky feedback outside of these best practices.
packages/metadata/src/factory/index.ts (1)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.
apps/processing/src/config/env.ts (1)

Pattern **/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.
📓 Learnings (1)
packages/pricing/src/providers/coingecko.provider.ts (1)
Learnt from: jahabeebs
PR: defi-wonderland/grants-stack-indexer-v2#57
File: packages/pricing/src/providers/coingecko.provider.ts:187-188
Timestamp: 2025-01-22T19:10:33.586Z
Learning: In TypeScript code, ensure that error contexts reference the correct method name where the error occurred, especially in catch blocks. For example, if an error occurs in method `getTokenPrices`, the error context should use "getTokenPrices" as the method name, not "getTokenPrice".
🪛 Checkov (3.2.334)
deployment/modules/bastion/main.tf

[HIGH] 4-13: Ensure Instance Metadata Service Version 1 is not enabled

(CKV_AWS_79)

deployment/modules/container-registry/main.tf

[HIGH] 2-4: Ensure ECR image scanning on push is enabled

(CKV_AWS_163)

deployment/modules/iam/main.tf

[HIGH] 98-116: Ensure no IAM policies documents allow "*" as a statement's resource for restrictable actions

(CKV_AWS_355)


[HIGH] 119-136: Ensure IAM policies does not allow write access without constraints

(CKV_AWS_290)


[HIGH] 119-136: Ensure no IAM policies documents allow "*" as a statement's resource for restrictable actions

(CKV_AWS_355)

🪛 Biome (1.9.4)
packages/metadata/src/providers/dummy.provider.ts

[error] 4-4: This constructor is unnecessary.

Unsafe fix: Remove the unnecessary constructor.

(lint/complexity/noUselessConstructor)

packages/metadata/src/factory/index.ts

[error] 17-56: Avoid classes that contain only static members.

Prefer using simple functions instead of classes with only static members.

(lint/complexity/noStaticOnlyClass)

🪛 LanguageTool
scripts/bootstrap/README.md

[grammar] ~74-~74: An auxiliary verb seems to be missing from this progressive structure. Did you mean “it's using”, “it is using”, or “it was using”?
Context: ...ackages//repository/migrations) 2. Name it using the format: `YYYYMMDDTHHmmss_descriptio...

(PRP_VBG)

scripts/migrations/README.md

[uncategorized] ~104-~104: The preposition ‘to’ seems more likely in this position.
Context: ...rations 1. Create a new migration file in [scripts/migrations/src/migrations](....

(AI_HYDRA_LEO_REPLACE_IN_TO)

🪛 ESLint
scripts/bootstrap/src/metadata.script.ts

[error] 1-1: 'fs' is defined but never used.

(@typescript-eslint/no-unused-vars)


[error] 6-6: 'getMetadataCidsFromEvents' is defined but never used.

(@typescript-eslint/no-unused-vars)


[error] 7-7: 'EnvioIndexerClient' is defined but never used.

(@typescript-eslint/no-unused-vars)


[error] 10-10: 'ChainId' is defined but never used.

(@typescript-eslint/no-unused-vars)


[error] 49-49: 'INDEXER_URL' is assigned a value but never used.

(@typescript-eslint/no-unused-vars)


[error] 50-50: 'INDEXER_SECRET' is assigned a value but never used.

(@typescript-eslint/no-unused-vars)


[error] 51-51: 'CHAIN_IDS' is assigned a value but never used.

(@typescript-eslint/no-unused-vars)


[error] 52-52: 'INDEXER_FETCH_LIMIT' is assigned a value but never used.

(@typescript-eslint/no-unused-vars)


[error] 83-83: 'hasMoreEvents' is assigned a value but never used.

(@typescript-eslint/no-unused-vars)


[error] 83-83: 'hasMoreEvents' is never reassigned. Use 'const' instead.

(prefer-const)


[error] 85-85: 'checkpointMap' is assigned a value but never used.

(@typescript-eslint/no-unused-vars)

scripts/bootstrap/src/pricing.script.ts

[error] 3-3: 'EnvioIndexerClient' is defined but never used.

(@typescript-eslint/no-unused-vars)


[error] 40-40: 'INDEXER_URL' is assigned a value but never used.

(@typescript-eslint/no-unused-vars)


[error] 40-40: 'INDEXER_SECRET' is assigned a value but never used.

(@typescript-eslint/no-unused-vars)


[error] 79-79: 'chainId' is assigned a value but never used.

(@typescript-eslint/no-unused-vars)

🪛 markdownlint-cli2 (0.17.2)
scripts/migrations/README.md

61-61: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


90-90: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)

🔇 Additional comments (115)
packages/shared/src/utils/testing.ts (1)

1-43: Excellent TypeScript practices in the existing code!

The implementation demonstrates good TypeScript practices:

  • Proper use of type guards
  • Appropriate use of unknown type
  • Well-structured generics
  • Comprehensive JSDoc documentation
scripts/bootstrap/README.md (11)

1-4: Introduction Clarity and Purpose
The opening section clearly states the file’s purpose and provides a succinct overview of the migration scripts package.


12-20: Environment Setup and Example Code Block
The instructions for creating the .env file and the code block example for DATABASE_URL are clear and helpful.


21-26: Environment Variables Table
The table succinctly documents the DATABASE_URL variable along with its description and an example value. No issues detected.


27-34: Usage Instructions
The steps to install dependencies using pnpm install are straightforward. The inclusion of a code snippet aids clarity.


35-42: Running Migrations Section
Instructions for applying pending migrations are clear. The code snippet showing pnpm db:migrate --schema=schema_name helps users understand how to run the command.


43-46: Optional Arguments Description
The explanation of the optional --schema (or -s) argument is concise.


47-54: Step-by-Step Migration Process
The enumerated list detailing the migration process (loading environment variables, connecting to the database, etc.) is informative.


55-62: Resetting the Database Instructions
The instructions for resetting the database schema, including the accompanying code snippet, are clearly presented.


78-91: Example Migration File
The example code (including the import statement and skeleton functions for up and down) is clear and follows best practices for migration scripts.


92-111: Troubleshooting Guidance
The troubleshooting section covers common connection, permission, and migration failure issues in a user-friendly manner. This section is quite comprehensive.


114-117: References Section
The reference to the Kysely library is useful. Ensure that any new tools or libraries introduced as part of the recent changes (e.g., for cache management if applicable) are also documented here.

packages/indexer-client/src/interfaces/indexerClient.ts (1)

36-41: LGTM! Well-documented interface method.

The new method is properly documented with JSDoc comments and has a clear, type-safe signature.

packages/data-flow/test/unit/eventsFetcher.spec.ts (1)

16-16: 🛠️ Refactor suggestion

Add test cases for the new getBlockRangeByChainId method.

The mock implementation is added but there are no test cases to verify the behavior of the new method.

Consider adding test cases to verify:

  • Successful retrieval of block range
  • Error handling when no blocks are found
  • Error handling for GraphQL request failures
packages/indexer-client/src/providers/envioIndexerClient.ts (1)

18-23: LGTM! Proper handling of optional secret.

The constructor properly handles the optional secret parameter with a guard clause.

packages/indexer-client/test/unit/envioIndexerClient.spec.ts (2)

108-110: LGTM! Properly commented out obsolete test.

The test for the secret header is correctly commented out to reflect the optional secret parameter.


672-672: Add test cases for getBlockRangeByChainId.

Test cases are needed to verify the behavior of the new method.

Add test cases to verify:

  1. Successful retrieval of block range
  2. Error handling when no blocks are found
  3. Error handling for GraphQL request failures

Example test structure:

describe("getBlockRangeByChainId", () => {
    it("returns block range when blocks exist", async () => {
        // Test implementation
    });

    it("throws InvalidIndexerResponse when no blocks found", async () => {
        // Test implementation
    });

    it("throws IndexerClientError when GraphQL request fails", async () => {
        // Test implementation
    });
});
apps/processing/src/config/env.ts (2)

26-26: Validate optional and default fields thoroughly.

All changes to the base schema appear logically consistent (e.g., optional INDEXER_ADMIN_SECRET, default METADATA_SOURCE). However, confirm downstream usage of INDEXER_ADMIN_SECRET to ensure optionality doesn't break references expecting a defined secret. Similarly, ensure new defaults for NODE_ENV and METADATA_SOURCE align with all environments.

Also applies to: 35-35, 37-37, 40-40


83-111: Commendable use of discriminated unions for metadata sources.

The nested .discriminatedUnion("METADATA_SOURCE", [...]) approach and corresponding transformations simplify type narrowing. This is a robust approach for environment-based branching. Make sure any invalid source is handled gracefully in production (the thrown error is good, but consider logging or ensuring fallback behavior if needed).

packages/metadata/src/providers/index.ts (1)

1-3: Good modular exports for new providers.

Exposing publicGateway.provider.js, pinata.provider.js, and dummy.provider.js in lieu of a removed ipfs.provider.js aligns neatly with the new METADATA_SOURCE logic. This architecture promotes clear, provider-specific imports across the codebase.

packages/metadata/src/external.ts (1)

1-14: LGTM!

The export statements are well-organized and follow TypeScript best practices.

packages/processors/src/internal.ts (1)

16-17: LGTM! Well-organized exports.

The new decoder export follows the established pattern of grouping related exports and uses the correct .js extension for TypeScript modules.

packages/data-flow/src/external.ts (1)

8-8: LGTM! Clean export addition.

The new export for getMetadataCidsFromEvents is properly integrated within the existing export block.

packages/metadata/src/interfaces/metadata.interface.ts (1)

10-17: LGTM! Well-documented interface changes.

The changes follow our TypeScript guidelines:

  • Return type is properly updated to include null
  • JSDoc is updated to document the new return type
  • Uses Zod for runtime type validation
scripts/bootstrap/src/utils/kysely.ts (1)

3-7: LGTM!

The interface is well-structured and provides a clear contract for migration configurations.

packages/metadata/src/interfaces/index.ts (1)

20-26: LGTM!

The conditional type provides excellent type safety and follows TypeScript best practices.

scripts/bootstrap/vitest.config.ts (1)

4-22: LGTM!

The Vitest configuration is well-structured with comprehensive test and coverage settings.

scripts/migrations/src/migrations/external-services-cache/20250127T000000_add_cache_tables.ts (2)

23-26: LGTM!

The down migration correctly drops the tables in the appropriate order.


17-17: Verify the impact of nullable metadata.

The metadata column is now nullable. Please verify if this change is intentional and if the application code properly handles null metadata values.

✅ Verification successful

Let's gather more targeted information. The first attempt using the "**/*.ts" glob didn’t return any matches, which might indicate that the TypeScript code is not located at that path or the glob pattern isn't matching the files as expected. To better assess how the application handles the potentially null metadata field, please run the following script to search for references to metadata and any null‐handling code (such as optional chaining or explicit null checks) specifically in the non-migration code.

Below is a new shell script that:

  • Lists all TypeScript files (excluding the migration folder).
  • Searches for any reference to metadata.
  • Looks for optional chaining (e.g. metadata?.).
  • Checks for explicit null checks (e.g. if (metadata ...).

Please execute this script and share the output for further verification.

Once we have the output from this script, we can better determine whether the nullable metadata column is handled appropriately in the application code.


Nullable metadata behavior is properly handled.

Reviewing the code, especially the comprehensive tests in the various processors and registry handlers, we see that the application explicitly expects and correctly handles cases where metadata is null (e.g., using nullish coalescing and assertions like expect(changeset.args.metadata).toBeNull()). Thus, the change making the metadata column nullable appears intentional and is supported by proper null handling in the application code.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check if application code handles null metadata values.

# Search for metadata field access in TypeScript files
rg -A 5 'metadata\.' '**/*.ts'

# Search for null checks on metadata
rg -A 5 'metadata\s*[?!]' '**/*.ts'

Length of output: 166


Script:

#!/bin/bash
echo "Listing all .ts files with metadata references outside migration files:"
find . -type f -name "*.ts" ! -path "./scripts/migrations/*" -exec grep -Hn "metadata" {} +

echo -e "\nChecking for optional chaining usage on metadata (metadata?.) outside migration files:"
find . -type f -name "*.ts" ! -path "./scripts/migrations/*" -exec grep -Hn "metadata\?." {} +

echo -e "\nChecking for explicit null checks on metadata (if (metadata ..."
find . -type f -name "*.ts" ! -path "./scripts/migrations/*" -exec grep -Hn "if *( *metadata" {} +

Length of output: 66338

scripts/bootstrap/src/utils/parsing.ts (2)

1-8: LGTM! Clean imports and well-defined constant.

The imports are properly organized, and the constant DEFAULT_SCHEMA is well-defined with a clear purpose.


9-14: LGTM! Well-structured Zod schema with descriptive metadata.

The schema is properly defined with appropriate type constraints and descriptive information.

packages/shared/src/external.ts (2)

12-12: LGTM! Clean export of testing utilities.

The export statement is properly structured and includes related utilities together.


20-26: LGTM! Well-organized token-related exports.

The token-related exports are properly grouped and follow a logical structure.

packages/data-flow/src/helpers/index.ts (1)

8-12: LGTM! Well-documented function with JSDoc.

The function is properly documented with clear parameter and return type descriptions.

packages/shared/src/retry/exponentialBackoff.strategy.ts (1)

23-27: Verify the impact of more aggressive retry parameters.

The retry strategy is now more aggressive with faster initial retries (200ms vs 5000ms), slower exponential growth (1.5x vs 2x), and more attempts (10 vs 3). While this could help resolve quick transient issues faster, it might increase load under persistent failures.

Consider:

  1. Adding a comment explaining the rationale for these specific values
  2. Adding metrics/monitoring to track retry patterns in production
packages/metadata/src/providers/cachingProxy.provider.ts (1)

22-52: LGTM! Improved null handling in cache logic.

The changes properly handle null metadata values while maintaining good error handling and logging practices.

scripts/migrations/src/migrateDb.script.ts (1)

35-80: LGTM! Good environment handling.

The changes properly handle different environments and migration configurations while maintaining good error handling and logging.

packages/processors/src/processors/strategy/directAllocation/handlers/directAllocated.handler.ts (2)

60-65: LGTM! Simplified timestamp handling.

The code now correctly destructures only the required amountInUsd value, making the code more focused.


81-81: LGTM! Correct timestamp conversion.

The timestamp is properly converted from seconds to milliseconds for the Date constructor.

packages/repository/src/db/connection.ts (2)

36-42: LGTM! Well-documented configuration option.

The isProduction flag is properly documented with JSDoc, including the default value.


111-115: Consider using environment-specific SSL configurations.

While the current SSL configuration is functional, consider using environment-specific SSL certificate configurations for better security in production.

✅ Verification successful

Enhance Production SSL Configurations in Connection Settings

The current implementation uses a simple conditional to enable SSL in production:

ssl: config.isProduction
    ? {
          rejectUnauthorized: false,
      }
    : undefined,

While this approach turns on SSL, setting rejectUnauthorized: false in production disables certificate validation. Based on best practices for PostgreSQL SSL in production, it’s advisable to:

  • Use CA-Signed Certificates: Replace self-signed or unchecked configurations by loading certificate authorities (and optionally client certificates) so that certificate chains are properly verified.
  • Enforce Strict Verification: Instead of disabling verification with rejectUnauthorized: false, configure the connection to use a mode equivalent to sslmode=verify-full, ensuring that the provided certificate, key, and CA are all validated.
  • Introduce Environment-Specific Options: Extend your configuration to include production-specific parameters (e.g., paths to the CA certificate, client certificate, and key) rather than relying on a generic flag.

Implementing these changes aligns your production setup with security best practices, ensuring that SSL connections are both encrypted and authenticated.

🏁 Scripts executed

The following scripts were executed for the analysis:

Web query:

What are the best practices for PostgreSQL SSL configuration in production?

Length of output: 8150

packages/processors/src/processors/strategy/donationVotingMerkleDistributionDirectTransfer/handlers/allocated.handler.ts (2)

68-73: LGTM! Consistent with other handlers.

The timestamp handling is simplified and consistent with the DirectAllocatedHandler implementation.


103-103: LGTM! Proper timestamp conversion.

The timestamp is correctly converted from seconds to milliseconds.

apps/processing/src/services/sharedDependencies.service.ts (2)

3-3: LGTM! Improved dependency management.

The change to use MetadataProviderFactory follows the factory pattern and improves dependency management.


94-96: LGTM! Factory pattern implementation.

The MetadataProviderFactory.create implementation follows the factory pattern and properly injects dependencies.

apps/processing/test/unit/sharedDependencies.service.spec.ts (2)

4-4: LGTM! Environment configuration updated correctly.

The changes correctly reflect the transition from IPFS-specific configuration to a more generic metadata source configuration.

Also applies to: 109-110, 115-116


134-134: Verify provider initialization test.

The test now correctly verifies the initialization of PublicGatewayProvider with the appropriate parameters.

✅ Verification successful

The new shell script searches through all test files for any "IpfsProvider" mentions (confirming that no outdated references remain) and ensures that the test file under apps/processing/test/unit/sharedDependencies.service.spec.ts includes the expected "PublicGatewayProvider" reference. Once you manually verify the output of this script, you should see no occurrences of "IpfsProvider" and the proper usage of "PublicGatewayProvider", which confirms that the provider initialization test has been updated correctly.


Provider Initialization Test Validated

  • In apps/processing/test/unit/sharedDependencies.service.spec.ts, the test correctly verifies that PublicGatewayProvider is initialized with mockEnv and mocks.logger as expected.
  • Although the grep search shows occurrences of "IpfsProvider" in both this test file and in packages/metadata/test/providers/ipfs.provider.spec.ts, the key provider initialization check has been updated to use PublicGatewayProvider. The presence of "IpfsProvider" may indicate additional legacy tests or references, but does not affect the validity of the updated initialization test.
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify that all tests related to PublicGatewayProvider are updated.

# Test: Search for any remaining references to IpfsProvider in test files
rg -l "IpfsProvider" "test/**/*.spec.ts"

Length of output: 98


Script:

#!/bin/bash
# Description: Verify that no tests reference "IpfsProvider" anywhere in the repository
echo "Searching for 'IpfsProvider' in all .spec.ts files..."
fd -e ts -t f --regex "\.spec\.ts$" | xargs rg -l "IpfsProvider" || echo "No references found."

# Description: Verify that the test file correctly tests PublicGatewayProvider
echo "Searching for 'PublicGatewayProvider' in apps/processing/test/unit/sharedDependencies.service.spec.ts..."
rg "PublicGatewayProvider" apps/processing/test/unit/sharedDependencies.service.spec.ts || echo "No PublicGatewayProvider references found in test file."

Length of output: 771

packages/data-flow/src/orchestrator.ts (1)

259-259: Address TODO comment about allowPartialLastBlock.

The TODO comment about allowPartialLastBlock needs clarification or resolution.

Please clarify the implications of the allowPartialLastBlock parameter and document the decision in the code:

-            // allowPartialLastBlock: false, //TODO: ask nigiri about this
+            // TODO(GIT-XXX): Determine if allowPartialLastBlock should be enabled
+            // This parameter affects how events are fetched when the last block is incomplete.
+            // Current behavior: false - only fetch complete blocks
+            allowPartialLastBlock: false,
✅ Verification successful

Clarification on allowPartialLastBlock Parameter and Its Impact on Event Fetching

  • The updated comment now documents that allowPartialLastBlock controls how incomplete blocks are handled when fetching events.
  • The current implementation sets it to false, meaning only complete blocks are processed.
  • The TODO now clearly indicates the need to consult with nigiri on whether to enable fetching partial last blocks.
🏁 Scripts executed

The following scripts were executed for the analysis:

Error: No shell scripts or web queries found

packages/shared/src/tokens/tokens.ts (4)

20-24: LGTM! Well-defined type for token mapping.

The TokensMap type provides a clear and type-safe structure for mapping chain IDs to token addresses.


26-36: LGTM! Efficient implementation of price source code extraction.

The function uses a Set for unique values and follows functional programming principles with clear iteration patterns.


629-629: LGTM! Useful constant for price source codes.

The TOKENS_SOURCE_CODES constant provides a centralized list of unique price source codes.


635-639: LGTM! Improved error handling with NonRetriableError.

Good choice extending NonRetriableError for better error classification and handling.

deployment/modules/storage/outputs.tf (1)

1-3: LGTM! Clear output definition for RDS endpoint.

The output correctly exposes the RDS endpoint from the module, which is essential for database connectivity.

deployment/modules/bastion/outputs.tf (1)

1-3: LGTM! Clear output definition for bastion host IP.

The output correctly exposes the bastion host's public IP, which is essential for SSH access.

deployment/modules/container-registry/variables.tf (1)

1-4: LGTM! Well-defined variable for ECR repository naming.

The variable has a clear description and correct type definition for the ECR repository name.

deployment/modules/container-registry/main.tf (1)

1-5: Enable ECR Image Scanning on Push.
The resource definition for the processing ECR repository looks correct; however, following security best practices and the Checkov hint, consider enabling image scanning on push. This can help detect vulnerabilities as images are pushed.

Example diff:

resource "aws_ecr_repository" "processing_repository" {
  name = "${var.app_name}-processing"
+ image_scanning_configuration {
+   scan_on_push = true
+ }
}
🧰 Tools
🪛 Checkov (3.2.334)

[HIGH] 2-4: Ensure ECR image scanning on push is enabled

(CKV_AWS_163)

deployment/state/variables.tf (1)

1-4: Validate 'app_name' Variable Definition.
The variable app_name is clearly defined with a description and type. Optionally, consider if a default value or validation constraints might be beneficial based on deployment requirements.

deployment/modules/networking/variables.tf (2)

1-4: Confirm 'app_name' Variable Usage in Networking Module.
The app_name variable is appropriately defined for use as the cluster name. Ensure that its usage is consistent with other modules across the deployment infrastructure.


11-14: Verify 'region' Variable Definition.
The region variable is straightforward and meets requirements. Ensure that the provided string value adheres to AWS region naming conventions during deployment.

deployment/modules/iam/variables.tf (1)

1-24: Clear and Concise Variable Definitions

The new variable definitions for app_name, app_environment, region, account_id, and db_name are clear and well-documented. They provide necessary configuration details for the IAM module. Ensure that the values for these variables are supplied correctly in the corresponding environment files.

Dockerfile (2)

12-12: Deployment Command Update – Validate Environment Impact

The pnpm deploy command on line 12 has been updated by removing the --prod flag. Please verify that this change does not inadvertently alter the intended production behavior. Confirm that any environment-specific configurations previously tied to that flag are now handled appropriately elsewhere.


17-17: Default CMD Usage Confirmation

The CMD specified on line 17 (["pnpm", "start"]) looks standard for initiating the processing service. Please ensure that the start script in your package configuration correctly boots the application in the intended environment.

deployment/modules/networking/outputs.tf (1)

1-24: Networking Outputs Configured Correctly

The outputs for private_subnets, public_subnets, rds_security_group_id, processing_security_group_id, api_security_group_id, and rds_subnet_group_name are clearly defined. They provide essential data for downstream modules. Just confirm that the referenced modules and resources (like module.vpc and the various AWS resources) exist and are properly configured.

deployment/modules/bastion/variables.tf (1)

1-20: Bastion Module Variable Definitions – Consistent and Clear

The newly introduced variables (app_name, app_environment, subnet_id, and bastion_instance_profile_name) are well defined with descriptive text. They align with the tagging and resource configuration in the bastion module. Ensure that these values are correctly provided in your environment-specific variable files.

scripts/bootstrap/.env.example (1)

5-9: Approval: Environment Variables are Well Defined

The variables CHAIN_IDS, LOG_LEVEL, PRICING_SOURCE, COINGECKO_API_KEY, and COINGECKO_API_TYPE are clearly defined and consistent. Just make sure that any array values are handled appropriately by the bootstrap process.

deployment/modules/storage/variables.tf (8)

1-4: Approval: New Variable 'app_name'

The app_name variable is clearly declared with an appropriate description and type. This will help in identifying resources in deployments.


6-9: Approval: 'app_environment' Variable

The app_environment variable is defined with a clear description and the correct type. This enhances environment-specific configurations.


11-14: Approval: 'region' Variable

The region variable is appropriately declared, ensuring that region-specific configurations can be handled.


16-19: Approval: 'db_name' Variable

The declaration of db_name is clear and aligns with Terraform best practices.


21-24: Approval: 'rds_username' Variable

The rds_username variable is defined as needed for RDS configuration.


31-34: Approval: 'rds_security_group_id' Variable

The rds_security_group_id is clearly defined and will assist in correctly assigning security groups to the RDS instance.


36-39: Approval: 'rds_subnet_ids' Variable

Declaring rds_subnet_ids as a list of strings is appropriate for referencing multiple subnets.


41-44: Approval: 'rds_subnet_group_name' Variable

The variable for the RDS subnet group name is properly declared and clear in its intent.

deployment/modules/storage/main.tf (9)

1-4: Approval: RDS Module Declaration

The module block for setting up the RDS instance via the Terraform AWS modules is correctly defined with the proper source and version.


5-5: Approval: Identifier Format

The identifier using "${var.app_name}-${var.app_environment}-rds" follows best practices for ensuring resource uniqueness across environments.


7-10: Verification: Database Engine Settings

The configuration uses family = "postgres16", engine = "postgres", and engine_version = "16". Please double-check that these settings are supported by your AWS region and the module version in use.


11-13: Approval: Instance Specifications

The use of "db.t4g.micro" for the instance class along with allocated_storage = 10 GB is acceptable for lightweight or development workloads.


14-18: Review: Master User Password Management

Setting manage_master_user_password to false implies that password management is handled externally. Ensure that credential management (for example via AWS Secrets Manager) is in place.


19-20: Approval: VPC Security Group and Subnet IDs

The use of variables for vpc_security_group_ids and subnet_ids provides flexibility and proper isolation of the RDS instance.


22-24: Approval: Backup and Maintenance Settings

The defined backup retention period, backup window, and maintenance window settings are clearly laid out and appropriate for ensuring database reliability.


25-30: Approval: Accessibility and Encryption

Ensuring the database is not publicly accessible (publicly_accessible = false) and enabling encryption (storage_encrypted = true) adhere to AWS security best practices.


31-35: Approval: Resource Tagging

Including tags for Environment and Project is a good practice for resource management and cost allocation.

deployment/state/main.tf (8)

1-3: Approval: AWS Provider Configuration

The provider for AWS is correctly set up with the region "us-east-2". Confirm that this region is the intended location for storing your Terraform state.


4-4: Approval: AWS Caller Identity Data Block

The aws_caller_identity data source is correctly used to dynamically retrieve the account ID for later use.


6-9: Approval: Local Variables for State Configuration

The local variables bucket_name and account_id are well defined, facilitating a consistent naming strategy for the state bucket.


11-13: Approval: S3 Bucket Module Declaration

The module "s3_terraform_state" is correctly sourced from the Terraform AWS modules repository with a specified version.


15-15: Approval: Bucket Naming

Assigning bucket = local.bucket_name ensures that the S3 bucket name is constructed dynamically in line with the environment and application name.


17-20: Approval: Security Settings for S3 Bucket

The configuration options for blocking public ACLs, public policies, ignoring public ACLs, and restricting public buckets demonstrate a strong focus on security.


22-42: Approval: Custom S3 Bucket Policy

The bucket policy is defined using jsonencode and provides the necessary permissions tied to the current AWS account's root user. Ensure that these permissions align with your security model.


44-48: Approval: S3 Bucket Tagging

The tags applied to the S3 bucket (using Environment and Name) will help manage and identify the bucket resources efficiently.

packages/metadata/package.json (1)

30-36: Approval: Addition of Pinata Dependency

The new dependency "pinata": "1.10.1" has been added under dependencies. This addition aligns with the recent modifications in the metadata provider configuration. Ensure that related tests and documentation are updated accordingly.

packages/data-flow/package.json (1)

38-38: New Dependency Addition Review
Adding "p-map": "7.0.3" under dependencies is clear and aligns with the recent modifications in the orchestrator for concurrent metadata fetching. Please ensure that adequate tests are in place to verify the integration of this dependency in the concurrent processing logic.

scripts/migrations/package.json (1)

19-20: Cache Migration Scripts Added
The new scripts "db:cache:migrate" and "db:cache:reset" are correctly configured to use tsx with the proper --migrationsFolder parameter. This improves the management of cache-related migrations as intended.

package.json (2)

10-11: Bootstrap Scripts Introduction
The addition of "bootstrap:metadata" and "bootstrap:pricing" scripts helps streamline bootstrap operations for metadata and pricing. Ensure that these commands correctly trigger the corresponding tasks in the @grants-stack-indexer/bootstrap package.


15-16: DB Cache Commands Integration
The inclusion of "db:cache:migrate" and "db:cache:reset" commands in the root scripts ensures consistency with the newly added cache migration functionality in the migrations package. This integration supports easier orchestration across the monorepo.

scripts/migrations/README.md (1)

7-13: Updated Migration Scripts Documentation
The migration scripts table now clearly includes cache-related commands (db:cache:migrate and db:cache:reset), improving overall documentation clarity. Please ensure that any future updates in cache management are mirrored here.

deployment/modules/networking/main.tf (5)

4-28: VPC Module Configuration Review
The VPC module is configured with clear parameters, including a static CIDR, availability zones, and subnet definitions. The use of interpolated variables for naming and environment tagging is appropriate. Ensure that the var.app_name and var.app_environment variables are defined in your Terraform variables.


33-49: Processing Security Group Setup
The aws_security_group for processing is set up with an all-outbound rule, which is typical for internal service communications. The naming and tagging conventions are consistent.


51-86: API Security Group Configuration
The API security group permits ingress on ports 80, 8080, and 443 for TCP traffic while allowing all outbound traffic. This configuration is standard for public-facing services. Verify that exposing these ports aligns with your overall security posture and that any public endpoints are properly secured (e.g., behind a load balancer).


88-120: RDS Security Group Configuration
The RDS security group appropriately allows PostgreSQL (port 5432) access from both private and public subnet CIDR blocks as provided by the VPC module outputs. Although this is acceptable for certain architectures, ensure that this level of exposure is intentional based on your security requirements.


122-130: AWS DB Subnet Group Definition
The aws_db_subnet_group is defined to use the private subnets from the VPC module. This configuration is straightforward and follows best practices for isolating database resources.

docker-compose.yaml (1)

108-110: Extend network connectivity for indexer-graphql-api.
By adding the datalayer network to the indexer-graphql-api service, the service can now communicate with other components on that network. Verify that this change aligns with overall network segmentation requirements and that any security implications are addressed.

deployment/environments/staging/variables.tf (1)

56-65: ⚠️ Potential issue

Ensure consistency for the CHAINS variable type.
The CHAINS variable here declares id as a number. However, in a related configuration (see deployment/modules/compute/variables.tf), the id field is defined as a string. This inconsistency could lead to type errors during deployment.

Please review and update one of the files to ensure that both use the same type for id (either both as number or both as string).

deployment/environments/staging/main.tf (1)

1-15: Terraform backend and provider configuration look solid.
The S3 backend configuration and required provider blocks are appropriately defined. Ensure that the bucket name, key, and region match your staging environment’s expectations.

deployment/modules/iam/main.tf (2)

1-17: Processing service role definition is clear and aligned.
The assume role policy for the processing_service_role appears to follow AWS best practices for ECS tasks.


118-136: ⚠️ Potential issue

Logger access policy might be too permissive.
The logger_access_policy similarly allows log actions on all resources. While it is common for logging policies to use "Resource": "*", consider whether you can restrict this further (for example, to specific log groups) to reduce risk.

Let me know if you would like assistance in drafting a more restrictive version of this policy.

🧰 Tools
🪛 Checkov (3.2.334)

[HIGH] 119-136: Ensure IAM policies does not allow write access without constraints

(CKV_AWS_290)


[HIGH] 119-136: Ensure no IAM policies documents allow "*" as a statement's resource for restrictable actions

(CKV_AWS_355)

deployment/modules/compute/variables.tf (1)

176-185: ⚠️ Potential issue

CHAINS variable type discrepancy needs resolution.
Within this file, the CHAINS variable defines the id field as a string:

id = string

Yet in deployment/environments/staging/variables.tf, id is defined as a number. This type mismatch could lead to runtime errors. Please choose one type for the id field and update both files accordingly.

deployment/modules/compute/main.tf (8)

1-3: Local Variable for Log Group Name

The local variable log_group_name is defined using Terraform interpolation to generate a log group path. This is clear and aligns with expected practices.


5-8: ECS Module Source and Version

The ECS module is referenced from the popular Terraform AWS modules with a fixed version of "5.12.0". Pinning the version helps ensure stability, but please verify that version 5.12.0 complies with your infrastructure requirements and is supported by your overall configuration.


9-13: ECS Cluster Name Configuration

The ECS cluster name is dynamically constructed using ${var.app_name} and ${var.app_environment}. This dynamic naming is clear and familiar; just ensure the generated name complies with AWS resource naming restrictions.


15-21: CloudWatch Log Group Settings

The CloudWatch log group is configured using the earlier local variable and sets the retention period to 7 days. Confirm that a 7‑day retention policy meets your operational or compliance requirements.


25-48: API Service Configuration

Within the services block, the api_service is defined with clear settings:

  • It does not create a new security group or task definition but references an existing task definition (aws_ecs_task_definition.api_task.arn).
  • It assigns a public IP and deploys into public subnets, which is typical for an API facing service.
  • Auto scaling parameters (min_capacity, max_capacity, CPU thresholds) are set to reasonable defaults.

Everything appears correctly structured. Just verify that assign_public_ip = true is intentional and aligns with your network security model.


51-67: Processing Service Configuration

The configuration for processing services uses a for expression over var.CHAINS, dynamically creating a service for each chain with unique settings:

  • It references the corresponding task definition using the chain ID.
  • Autoscaling is explicitly disabled (ensure this is expected given the workload).

The dynamic naming and tagging are clear. Please double-check that the private subnet and security group configurations for processing services align with your network design.


72-125: API Task Definition Configuration

This ECS task definition for the API service is well organized:

  • It specifies required Fargate compatibilities, network settings, and resource sizes.
  • The container definition is built via jsonencode and dynamically maps environment variables from a Terraform map.
  • Port mappings and logging configurations are clearly specified.

Be sure that all variables (e.g., var.DATALAYER_HASURA_* values) are correctly defined elsewhere, as this dynamic environment block relies on them.


127-218: Processing Task Definition for Each Chain

This resource dynamically iterates over var.CHAINS with for_each to create a task definition per chain. Key observations:

  • The container definition specifies essential properties such as CPU, memory, and network mode.
  • Environment variables are explicitly set. Notably, the variable CHAINS is assigned via jsonencode([each.value]). Please verify that the containerized application expects a JSON array containing a single chain object; if only an ID or a primitive value is needed, this may require adjustment.
  • There is a commented-out block for INDEXER_ADMIN_SECRET; if this variable is no longer used or should be omitted, consider removing the commented code to keep the configuration clean.

Overall, the configuration is thorough and clearly structured.

Comment on lines +45 to +53
export function isJSON(item: unknown): item is ObjectType {
try {
JSON.parse(item as string);
return true;
} catch (e) {
console.log(e);
return false;
}
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Several issues in the isJSON implementation need attention.

The current implementation has multiple issues that need to be addressed:

  1. The function name is misleading as it returns ObjectType but checks if a string can be parsed as JSON
  2. It attempts to parse already parsed objects
  3. Uses console.log for error handling
  4. Missing JSDoc documentation
  5. Doesn't verify if parsed result is actually an object

Here's the corrected implementation:

+/**
+ * Type guard to check if a value is a valid JSON object
+ * @param item The value to check
+ * @returns True if the value can be parsed as a JSON object, false otherwise
+ */
 export function isJSON(item: unknown): item is ObjectType {
+    // If it's already an object, validate it can be stringified/parsed
+    if (isObject(item)) {
+        try {
+            JSON.parse(JSON.stringify(item));
+            return true;
+        } catch {
+            return false;
+        }
+    }
+
+    // If it's a string, try to parse it as JSON
     try {
-        JSON.parse(item as string);
+        const parsed = JSON.parse(String(item));
+        return isObject(parsed);
     } catch (e) {
-        console.log(e);
         return false;
     }
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export function isJSON(item: unknown): item is ObjectType {
try {
JSON.parse(item as string);
return true;
} catch (e) {
console.log(e);
return false;
}
}
/**
* Type guard to check if a value is a valid JSON object
* @param item The value to check
* @returns True if the value can be parsed as a JSON object, false otherwise
*/
export function isJSON(item: unknown): item is ObjectType {
// If it's already an object, validate it can be stringified/parsed
if (isObject(item)) {
try {
JSON.parse(JSON.stringify(item));
return true;
} catch {
return false;
}
}
// If it's a string, try to parse it as JSON
try {
const parsed = JSON.parse(String(item));
return isObject(parsed);
} catch (e) {
return false;
}
}

Comment on lines +69 to +77
## Development

### Adding New Migrations

1. Create a new migration file in [`packages/repository/src/migrations`](../../packages//repository/migrations)
2. Name it using the format: `YYYYMMDDTHHmmss_description.ts`
3. Implement the `up` and `down` functions
4. Run `pnpm db:migrate` to apply the new migration

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Adding New Migrations Guidance and File Path Consistency
The section on adding new migrations is detailed and useful. However, please note the following:

  • The migration file creation instructions reference a path:
    packages/repository/src/migrations
    There is a double slash (//) in the URL which should be corrected for clarity and accuracy.
  • Additionally, the AI summary and PR objectives indicate that the migration file path should now be updated to scripts/migrations/src/migrations. Please verify and update the link text if this change is intended.
🧰 Tools
🪛 LanguageTool

[grammar] ~74-~74: An auxiliary verb seems to be missing from this progressive structure. Did you mean “it's using”, “it is using”, or “it was using”?
Context: ...ackages//repository/migrations) 2. Name it using the format: `YYYYMMDDTHHmmss_descriptio...

(PRP_VBG)

DATABASE_URL: z.string().url(),
INDEXER_URL: z.string().url(),
INDEXER_SECRET: z.string().optional(),
INDEXER_FETCH_LIMIT: z.number().optional().default(1000),
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Use z.coerce.number() for environment variable parsing.
Environment variables are typically provided as strings, so z.number() will fail unless the value is unset. Switch to z.coerce.number() to properly handle string inputs.

-    INDEXER_FETCH_LIMIT: z.number().optional().default(1000),
+    INDEXER_FETCH_LIMIT: z.coerce.number().optional().default(1000),
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
INDEXER_FETCH_LIMIT: z.number().optional().default(1000),
INDEXER_FETCH_LIMIT: z.coerce.number().optional().default(1000),

Comment on lines +32 to +43
export const getMigrationsFolder = (): string => {
const migrationsFolder = path.join(
path.dirname(new URL(import.meta.url).pathname),
`../migrations`,
);

if (!existsSync(migrationsFolder)) {
throw new Error(`Migrations folder not found`);
}

return migrationsFolder;
};
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Consider using process.cwd() for root references.

According to the coding guidelines for scripts, root references should use process.cwd().

Consider this modification:

 export const getMigrationsFolder = (): string => {
     const migrationsFolder = path.join(
-        path.dirname(new URL(import.meta.url).pathname),
-        `../migrations`,
+        process.cwd(),
+        'scripts/bootstrap/src/migrations',
     );

     if (!existsSync(migrationsFolder)) {
         throw new Error(`Migrations folder not found`);
     }

     return migrationsFolder;
 };
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export const getMigrationsFolder = (): string => {
const migrationsFolder = path.join(
path.dirname(new URL(import.meta.url).pathname),
`../migrations`,
);
if (!existsSync(migrationsFolder)) {
throw new Error(`Migrations folder not found`);
}
return migrationsFolder;
};
export const getMigrationsFolder = (): string => {
const migrationsFolder = path.join(
process.cwd(),
'scripts/bootstrap/src/migrations',
);
if (!existsSync(migrationsFolder)) {
throw new Error(`Migrations folder not found`);
}
return migrationsFolder;
};

Comment on lines +1 to +14
import fs from "fs";
import { configDotenv } from "dotenv";
import { pMapIterable } from "p-map";
import { retry, RetryOptions } from "ts-retry";

import { getMetadataCidsFromEvents } from "@grants-stack-indexer/data-flow";
import { EnvioIndexerClient } from "@grants-stack-indexer/indexer-client";
import { CachingMetadataProvider, PublicGatewayProvider } from "@grants-stack-indexer/metadata";
import { createKyselyDatabase, KyselyMetadataCache } from "@grants-stack-indexer/repository";
import { ChainId, Logger } from "@grants-stack-indexer/shared";

import { getDatabaseConfigFromEnv } from "./schemas/index.js";
import { parseArguments } from "./utils/index.js";

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Clean up unused imports.

Several imported modules are not used in the code:

  • fs
  • getMetadataCidsFromEvents
  • EnvioIndexerClient
  • ChainId

Remove the unused imports to improve code maintainability:

-import fs from "fs";
import { configDotenv } from "dotenv";
import { pMapIterable } from "p-map";
import { retry, RetryOptions } from "ts-retry";

-import { getMetadataCidsFromEvents } from "@grants-stack-indexer/data-flow";
-import { EnvioIndexerClient } from "@grants-stack-indexer/indexer-client";
import { CachingMetadataProvider, PublicGatewayProvider } from "@grants-stack-indexer/metadata";
import { createKyselyDatabase, KyselyMetadataCache } from "@grants-stack-indexer/repository";
-import { ChainId, Logger } from "@grants-stack-indexer/shared";
+import { Logger } from "@grants-stack-indexer/shared";
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
import fs from "fs";
import { configDotenv } from "dotenv";
import { pMapIterable } from "p-map";
import { retry, RetryOptions } from "ts-retry";
import { getMetadataCidsFromEvents } from "@grants-stack-indexer/data-flow";
import { EnvioIndexerClient } from "@grants-stack-indexer/indexer-client";
import { CachingMetadataProvider, PublicGatewayProvider } from "@grants-stack-indexer/metadata";
import { createKyselyDatabase, KyselyMetadataCache } from "@grants-stack-indexer/repository";
import { ChainId, Logger } from "@grants-stack-indexer/shared";
import { getDatabaseConfigFromEnv } from "./schemas/index.js";
import { parseArguments } from "./utils/index.js";
import { configDotenv } from "dotenv";
import { pMapIterable } from "p-map";
import { retry, RetryOptions } from "ts-retry";
import { CachingMetadataProvider, PublicGatewayProvider } from "@grants-stack-indexer/metadata";
import { createKyselyDatabase, KyselyMetadataCache } from "@grants-stack-indexer/repository";
import { Logger } from "@grants-stack-indexer/shared";
import { getDatabaseConfigFromEnv } from "./schemas/index.js";
import { parseArguments } from "./utils/index.js";
🧰 Tools
🪛 ESLint

[error] 1-1: 'fs' is defined but never used.

(@typescript-eslint/no-unused-vars)


[error] 6-6: 'getMetadataCidsFromEvents' is defined but never used.

(@typescript-eslint/no-unused-vars)


[error] 7-7: 'EnvioIndexerClient' is defined but never used.

(@typescript-eslint/no-unused-vars)


[error] 10-10: 'ChainId' is defined but never used.

(@typescript-eslint/no-unused-vars)

}

if (cachedPrice) {
// console.log("Cached price", cachedPrice);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Remove commented-out console.log statements.

Debug logging statements should be removed from production code.

Remove the commented-out console.log statements:

-            // console.log("Cached price", cachedPrice);
-            // console.log("Fetched price", price);

Also applies to: 54-54

Comment on lines +322 to +335
await pMap(
metadataIds,
async (id) => {
try {
const result =
await this.dependencies.metadataProvider.getMetadata<unknown>(id);
return { status: "fulfilled", value: result };
} catch (error) {
console.log("rejected", id);
return { status: "rejected", reason: error };
}
},
{ concurrency: 10 }, //FIXME: remove hardcoded concurrency
);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Redundant metadata fetching implementation.

The code contains two implementations for fetching metadata: one using Promise.allSettled and another using pMap.

Remove the redundant implementation and use only pMap for better concurrency control:

-        const results = await Promise.allSettled(
-            metadataIds.map((id) =>
-                this.retryHandler.execute(() =>
-                    this.dependencies.metadataProvider.getMetadata<unknown>(id),
-                ),
-            ),
-        );

         await pMap(
             metadataIds,
             async (id) => {
                 try {
                     const result =
                         await this.dependencies.metadataProvider.getMetadata<unknown>(id);
                     return { status: "fulfilled", value: result };
                 } catch (error) {
                     console.log("rejected", id);
                     return { status: "rejected", reason: error };
                 }
             },
             { concurrency: 10 }, //FIXME: remove hardcoded concurrency
         );
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
await pMap(
metadataIds,
async (id) => {
try {
const result =
await this.dependencies.metadataProvider.getMetadata<unknown>(id);
return { status: "fulfilled", value: result };
} catch (error) {
console.log("rejected", id);
return { status: "rejected", reason: error };
}
},
{ concurrency: 10 }, //FIXME: remove hardcoded concurrency
);
await pMap(
metadataIds,
async (id) => {
try {
const result =
await this.dependencies.metadataProvider.getMetadata<unknown>(id);
return { status: "fulfilled", value: result };
} catch (error) {
console.log("rejected", id);
return { status: "rejected", reason: error };
}
},
{ concurrency: 10 }, //FIXME: remove hardcoded concurrency
);

Comment on lines +4 to +13
resource "aws_instance" "bastion" {
ami = "ami-0884d2865dbe9de4b"
instance_type = "t3.large"
subnet_id = var.subnet_id
iam_instance_profile = var.bastion_instance_profile_name

tags = {
Name = "${var.app_name}-${var.app_environment}-bastion"
}
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codebase verification

🛠️ Refactor suggestion

IMDSv2 Enforcement Missing in Bastion Instance

The bastion resource currently has no metadata_options block, so the Checkov warning (CKV_AWS_79) still applies. Please add the following block to enforce IMDSv2:

metadata_options {
  http_tokens   = "required"
  http_endpoint = "enabled"
}
  • Update the deployment/modules/bastion/main.tf file accordingly.
🔗 Analysis chain

IMDS Security Enhancement Needed

The bastion resource is defined correctly; however, note that Checkov reported a high-severity warning (CKV_AWS_79) regarding the Instance Metadata Service (IMDS) version. It's recommended to add a metadata_options block to enforce the use of IMDSv2, preventing the use of the less secure version 1.

Consider applying a diff such as:

 resource "aws_instance" "bastion" {
   ami                  = "ami-0884d2865dbe9de4b"
   instance_type        = "t3.large"
   subnet_id            = var.subnet_id
   iam_instance_profile = var.bastion_instance_profile_name
+  metadata_options {
+    http_tokens   = "required"
+    http_endpoint = "enabled"
+  }
 
   tags = {
     Name = "${var.app_name}-${var.app_environment}-bastion"
   }
 }
🏁 Scripts executed

The following scripts were executed for the analysis:

Error: No shell scripts or web queries found


Script:

#!/bin/bash
# Check if the metadata_options block has been added in the bastion instance configuration.
rg "metadata_options" deployment/modules/bastion/main.tf

Length of output: 56


Script:

#!/bin/bash
# Display the first 30 lines of the bastion module file for manual inspection
sed -n '1,30p' deployment/modules/bastion/main.tf

Length of output: 349

🧰 Tools
🪛 Checkov (3.2.334)

[HIGH] 4-13: Ensure Instance Metadata Service Version 1 is not enabled

(CKV_AWS_79)

@@ -0,0 +1,9 @@
DATABASE_URL=postgre://postgres:testing@localhost:5434/datalayer-postgres-db
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Critical Issue: Incorrect Database URL Scheme

The DATABASE_URL value uses "postgre://" which appears to be a typo. Typically, this should be "postgres://" for PostgreSQL connections.

Comment on lines +97 to +116
# ECR access policy
resource "aws_iam_policy" "ecr_access_policy" {
name = "${var.app_name}-${var.app_environment}-ECRAccessPolicy"

policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Effect = "Allow",
Action = [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage"
],
Resource = "*"
}
]
})
}
Copy link
Copy Markdown

@coderabbitai coderabbitai bot Feb 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Review ECR access policy for over-permissive resource specification.
The ecr_access_policy currently allows actions on all resources ("Resource": "*") which triggered Checkov warnings. If possible, restrict this policy to only the repositories needed by using a more specific ARN pattern. For example:

-resource = "*"
+resource = "arn:aws:ecr:${var.region}:${var.account_id}:repository/${var.app_name}-*"

Please verify that this restriction meets your requirements.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# ECR access policy
resource "aws_iam_policy" "ecr_access_policy" {
name = "${var.app_name}-${var.app_environment}-ECRAccessPolicy"
policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Effect = "Allow",
Action = [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage"
],
Resource = "*"
}
]
})
}
# ECR access policy
resource "aws_iam_policy" "ecr_access_policy" {
name = "${var.app_name}-${var.app_environment}-ECRAccessPolicy"
policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Effect = "Allow",
Action = [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage"
],
resource = "arn:aws:ecr:${var.region}:${var.account_id}:repository/${var.app_name}-*"
}
]
})
}
🧰 Tools
🪛 Checkov (3.2.334)

[HIGH] 98-116: Ensure no IAM policies documents allow "*" as a statement's resource for restrictable actions

(CKV_AWS_355)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

agree with the rabbit here

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@0xnigir1 Thanks for confirming! I'll make sure to flag similar IAM policy issues in future reviews.


✏️ Learnings added
Learnt from: 0xnigir1
PR: defi-wonderland/grants-stack-indexer-v2#64
File: deployment/modules/iam/main.tf:97-116
Timestamp: 2025-02-20T22:54:27.202Z
Learning: When reviewing IAM policies for ECR access, ensure that the resource specification is not overly permissive (avoid "*"). Instead, use specific ARN patterns like "arn:aws:ecr:${region}:${account_id}:repository/${repository_name}-*" to follow the principle of least privilege.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.


If you found this review helpful, would you consider giving us a shout-out on X?
Thank you for using CodeRabbit!

@0xkenj1 0xkenj1 marked this pull request as ready for review February 20, 2025 20:09
@0xkenj1
Copy link
Copy Markdown
Contributor Author

0xkenj1 commented Feb 20, 2025

@CodeRabbit review again pls

@linear
Copy link
Copy Markdown

linear bot commented Feb 20, 2025

@linear
Copy link
Copy Markdown

linear bot commented Feb 20, 2025

@0xkenj1 0xkenj1 requested review from 0xnigir1 and 0xyaco February 20, 2025 21:07
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we don't need this one right?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

delete

@jahabeebs
Copy link
Copy Markdown
Collaborator

jahabeebs commented Feb 20, 2025

@coderabbitai full review

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

♻️ Duplicate comments (2)
deployment/modules/bastion/main.tf (1)

4-14: ⚠️ Potential issue

IMDSv2 enforcement missing in Bastion instance configuration.
The AWS EC2 instance for the bastion host is missing a metadata_options block, which is critical to enforce the use of IMDSv2 (addressing CKV_AWS_79). Without this, the instance may fall back on the less secure IMDSv1.
Please add the following diff to enforce IMDSv2:

 resource "aws_instance" "bastion" {
   ami                    = "ami-0884d2865dbe9de4b"
   instance_type          = "t3.large"
   subnet_id              = var.subnet_id
   iam_instance_profile   = var.bastion_instance_profile_name
   vpc_security_group_ids = [var.bastion_security_group_id]
+  metadata_options {
+    http_tokens   = "required"
+    http_endpoint = "enabled"
+  }
   
   tags = {
     Name = "${var.app_name}-${var.app_environment}-bastion"
   }
 }
🧰 Tools
🪛 Checkov (3.2.334)

[HIGH] 4-14: Ensure Instance Metadata Service Version 1 is not enabled

(CKV_AWS_79)

deployment/modules/iam/main.tf (1)

97-116: ⚠️ Potential issue

Restrict Over-Permissive ECR Access Policy

The ECR access policy currently uses "Resource": "*", which triggers static analysis warnings (e.g. CKV_AWS_355). It is recommended to restrict the resources to a more specific ARN (for example, using a pattern like "arn:aws:ecr:${var.region}:${var.account_id}:repository/${var.app_name}-*").

Suggested Diff:

-        Resource = "*"
+        Resource = "arn:aws:ecr:${var.region}:${var.account_id}:repository/${var.app_name}-*"
🧰 Tools
🪛 Checkov (3.2.334)

[HIGH] 98-116: Ensure no IAM policies documents allow "*" as a statement's resource for restrictable actions

(CKV_AWS_355)

🧹 Nitpick comments (21)
packages/indexer-client/test/unit/envioIndexerClient.spec.ts (1)

36-36: Fix typo in comment.

The comment contains a typo: "Sample test datåa" should be "Sample test data".

-        // Sample test datåa
+        // Sample test data
packages/metadata/src/providers/pinata.provider.ts (2)

16-17: Consider removing leftover console logs or converting them to logger statements.
They’re currently commented out, but it’s cleaner and safer to rely on the logger for debugging and to avoid accidentally exposing sensitive data.

-// console.log("pinataJwt", this.pinataJwt);
-// console.log("pinataGateway", this.pinataGateway);
-// console.log("ipfsCid", ipfsCid);
-// console.log("pinataClient", this.pinataClient.gateways);
-// console.log("pinataResponse", pinataResponse);

Also applies to: 30-31, 36-36


25-49: Validate that returning undefined aligns with error-handling requirements.
Currently, if any issue arises (invalid CID or exceptions during fetch), the function quietly returns undefined. Consider distinguishing invalid CIDs from fetch errors, so calling code can differentiate between these scenarios.

packages/metadata/src/providers/publicGateway.provider.ts (2)

26-26: Avoid returning both undefined and null unless strictly necessary.
The union type Promise<T | undefined | null> can be confusing. If both undefined and null signify “no data,” consolidating to one might improve clarity. If a true distinction exists, consider documenting the difference in JSDoc.


30-56: Implement a retry policy or fallback mechanism for each gateway.
A retry approach (as mentioned in the TODO) ensures resilience when transient network failures occur, rather than instantly moving to the next gateway or returning no data. This could significantly improve reliability.

packages/data-flow/src/orchestrator.ts (1)

144-150: Extract magic number into a configurable constant.

The 30-minute threshold (1000 * 60 * 60 * 0.5) should be extracted into a named constant or configuration parameter for better maintainability and flexibility across different environments.

+const METADATA_FETCH_AGE_THRESHOLD_MS = 1000 * 60 * 60 * 0.5; // 30 minutes
+
 if (
     events[0] &&
-    Math.abs(new Date().getTime() - events[0].blockTimestamp!) >
-        1000 * 60 * 60 * 0.5 // 30 minutes
+    Math.abs(new Date().getTime() - events[0].blockTimestamp!) > METADATA_FETCH_AGE_THRESHOLD_MS
 ) {
deployment/modules/bastion/outputs.tf (1)

1-3: Consider security implications of exposing bastion's public IP.

While the output is correctly defined, exposing the bastion host's public IP in Terraform outputs could pose a security risk if the state file is compromised. Consider:

  1. Using SSM Session Manager instead of exposing a public IP
  2. If public IP is necessary, document the security controls in place (e.g., IP whitelisting, SSH key requirements)
deployment/modules/load_balancer/outputs.tf (1)

1-5: Consider adding a description for the output.
It may be beneficial to include a description within the output block (e.g., describing that this ARN is used for inter-module references) to improve self-documentation.

deployment/modules/container-registry/outputs.tf (1)

1-7: Consider adding descriptions to the outputs.
Providing descriptive texts for outputs like processing_repository_url and processing_repository_arn can improve clarity for users referencing these values in other modules.

deployment/state/variables.tf (1)

1-9: LGTM for variable declarations.
The variables app_name and app_environment are clearly defined and adhere to Terraform best practices. Optionally, you might consider adding allowed values or defaults for app_environment if the valid environments are known.

deployment/modules/storage/variables.tf (1)

26-30: Secure variable setup for rds_password.
The definition is straightforward; however, consider ensuring sensitive data is managed securely (e.g., with Vault or Terraform variables marked as sensitive).

deployment/modules/load_balancer/main.tf (1)

28-36: Listener Configuration – Consider Enabling TLS
The listener is configured on port 80 using the HTTP protocol. However, the static analysis hint advises using at least TLS 1.2. Consider adding an HTTPS listener (with appropriate certificate configuration) to ensure secure client connections in production.

🧰 Tools
🪛 Checkov (3.2.334)

[HIGH] 28-36: Ensure that load balancer is using at least TLS 1.2

(CKV_AWS_103)

deployment/state/main.tf (1)

1-3: AWS Provider Declaration
The provider is declared with a hard-coded region (us-east-2). This is acceptable if intentional, but consider parameterizing the region for increased flexibility in multi-region deployments.

deployment/modules/networking/main.tf (2)

1-28: VPC Module Configuration is Clear
The VPC module is sourced from a well-known repository (terraform-aws-modules/vpc/aws) and configured with explicit CIDR blocks, subnets, availability zones, and NAT gateway settings. Consider parameterizing certain values (like AZs and CIDRs) if you plan to support multiple regions or dynamic environments in the future.


112-134: API Security Group – Consider Narrowing Ingress Ports
The API security group currently allows all TCP ports (0–65535) from the load balancer. For better security, consider restricting this range to only the ports required by your application.

deployment/modules/iam/main.tf (1)

119-136: Review Logger Access Policy Wildcard

The logger access policy also uses a wildcard ("Resource": "*") which has been flagged by static analysis (CKV_AWS_290 and CKV_AWS_355). While CloudWatch Logs often have broader permissions by design, please verify whether additional restrictions are possible or desired for improved security.

🧰 Tools
🪛 Checkov (3.2.334)

[HIGH] 119-136: Ensure IAM policies does not allow write access without constraints

(CKV_AWS_290)


[HIGH] 119-136: Ensure no IAM policies documents allow "*" as a statement's resource for restrictable actions

(CKV_AWS_355)

deployment/modules/compute/variables.tf (1)

1-3: Explicit Variable Definition for “region” Recommended

The “region” variable is declared without a description or explicit type. For clarity and consistency, consider adding a description and a type (e.g. type = string).

Suggested Diff:

-variable "region" {
-}
+variable "region" {
+  description = "The AWS region to deploy resources in"
+  type        = string
+}
deployment/README.md (4)

3-6: Overview Section: Informative Context Provided
The "## Overview" section succinctly explains the purpose of the deployment module and its usage of Terraform for managing AWS resources. Consider adding a reference or a link to Terraform documentation to help users get more context if needed.


7-15: Getting Started & Prerequisites: Clear Setup Instructions
The "## 🚀 Getting Started" section along with the "### Prerequisites" provides a clear checklist for installation and setup (Terraform with version >= 1.0.0 and AWS CLI). You might consider mentioning a brief note on verifying AWS CLI credentials as an additional prerequisite step.


62-107: Variables Section: Detailed and Comprehensive
The "## Variables" section provides an extensive table detailing all configurable parameters with clear descriptions. For enhanced usability, consider indicating default values where applicable or noting whether certain variables are required versus optional.


108-116: ECR Docker Deployment: Practical and Clear
The final section on deploying a Docker image to the ECR repository is practical and includes complete command examples. For the benefit of less experienced users, a brief explanation of each command’s purpose could add extra clarity.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f80492e and 005ad37.

📒 Files selected for processing (34)
  • deployment/.gitignore (1 hunks)
  • deployment/README.md (1 hunks)
  • deployment/environments/staging/.terraform.lock.hcl (1 hunks)
  • deployment/environments/staging/main.tf (1 hunks)
  • deployment/environments/staging/terraform.tfvars.example (1 hunks)
  • deployment/environments/staging/variables.tf (1 hunks)
  • deployment/modules/bastion/main.tf (1 hunks)
  • deployment/modules/bastion/outputs.tf (1 hunks)
  • deployment/modules/bastion/variables.tf (1 hunks)
  • deployment/modules/compute/main.tf (1 hunks)
  • deployment/modules/compute/outputs.tf (1 hunks)
  • deployment/modules/compute/variables.tf (1 hunks)
  • deployment/modules/container-registry/main.tf (1 hunks)
  • deployment/modules/container-registry/outputs.tf (1 hunks)
  • deployment/modules/container-registry/variables.tf (1 hunks)
  • deployment/modules/iam/main.tf (1 hunks)
  • deployment/modules/iam/outputs.tf (1 hunks)
  • deployment/modules/iam/variables.tf (1 hunks)
  • deployment/modules/load_balancer/main.tf (1 hunks)
  • deployment/modules/load_balancer/outputs.tf (1 hunks)
  • deployment/modules/load_balancer/variables.tf (1 hunks)
  • deployment/modules/networking/main.tf (1 hunks)
  • deployment/modules/networking/outputs.tf (1 hunks)
  • deployment/modules/networking/variables.tf (1 hunks)
  • deployment/modules/storage/main.tf (1 hunks)
  • deployment/modules/storage/outputs.tf (1 hunks)
  • deployment/modules/storage/variables.tf (1 hunks)
  • deployment/state/.terraform.lock.hcl (1 hunks)
  • deployment/state/main.tf (1 hunks)
  • deployment/state/variables.tf (1 hunks)
  • packages/data-flow/src/orchestrator.ts (1 hunks)
  • packages/indexer-client/test/unit/envioIndexerClient.spec.ts (1 hunks)
  • packages/metadata/src/providers/pinata.provider.ts (1 hunks)
  • packages/metadata/src/providers/publicGateway.provider.ts (1 hunks)
🧰 Additional context used
📓 Path-based instructions (3)
`**/*.ts`: Review TypeScript files for adherence to the fo...

**/*.ts: Review TypeScript files for adherence to the following guidelines:
- Avoid over-abstraction; prioritize composition over inheritance.
- Use dependency injection and follow SOLID principles.
- Avoid any; use unknown when necessary.
- Use runtime type-checking for environment variables (e.g., Zod).
- Prevent circular dependencies with the internal module pattern.
- Libraries should have an external.ts file explicitly listing public exports.
- Use bigint as-is; cast to Number only when exposing values via APIs.
- Document all code with JSDoc.
- Encourage static async factory functions for constructors.

  • Avoid overly nitpicky feedback beyond these best practices.
  • packages/indexer-client/test/unit/envioIndexerClient.spec.ts
  • packages/data-flow/src/orchestrator.ts
  • packages/metadata/src/providers/pinata.provider.ts
  • packages/metadata/src/providers/publicGateway.provider.ts
`**/*.spec.ts`: Review the unit test files with the followin...

**/*.spec.ts: Review the unit test files with the following guidelines:
- Avoid using the word "should" in test descriptions.
- Ensure descriptive test names convey the intent of each test.
- Validate adherence to the Mocha/Chai/Jest test library best practices.

  • Be concise and avoid overly nitpicky feedback outside of these best practices.
  • packages/indexer-client/test/unit/envioIndexerClient.spec.ts
`**/providers/**/*.ts`: Review provider files for the follow...

**/providers/**/*.ts: Review provider files for the following:

  • Providers should supply narrowly scoped data/resources.
  • Ensure classes interacting with metadata sources (e.g., GitHub, JSON files, IPFS) implement the IMetadataProvider interface and follow naming conventions (e.g., GithubProvider, JsonFileProvider).
  • Be concise and avoid overly nitpicky feedback outside of these best practices.
  • packages/metadata/src/providers/pinata.provider.ts
  • packages/metadata/src/providers/publicGateway.provider.ts
🧠 Learnings (1)
packages/data-flow/src/orchestrator.ts (1)
Learnt from: 0xnigir1
PR: defi-wonderland/grants-stack-indexer-v2#57
File: packages/data-flow/src/orchestrator.ts:300-319
Timestamp: 2025-01-22T01:29:58.740Z
Learning: In the Orchestrator's bulkFetchMetadataAndPricesForBatch method, error handling is not required as it's a performance optimization. If the bulk fetch fails, the data will be fetched again during processing in the processor.
🪛 Checkov (3.2.334)
deployment/modules/container-registry/main.tf

[HIGH] 2-4: Ensure ECR image scanning on push is enabled

(CKV_AWS_163)

deployment/modules/bastion/main.tf

[HIGH] 4-14: Ensure Instance Metadata Service Version 1 is not enabled

(CKV_AWS_79)

deployment/modules/load_balancer/main.tf

[HIGH] 28-36: Ensure that load balancer is using at least TLS 1.2

(CKV_AWS_103)

deployment/modules/iam/main.tf

[HIGH] 98-116: Ensure no IAM policies documents allow "*" as a statement's resource for restrictable actions

(CKV_AWS_355)


[HIGH] 119-136: Ensure IAM policies does not allow write access without constraints

(CKV_AWS_290)


[HIGH] 119-136: Ensure no IAM policies documents allow "*" as a statement's resource for restrictable actions

(CKV_AWS_355)

🔇 Additional comments (75)
packages/indexer-client/test/unit/envioIndexerClient.spec.ts (1)

1-740: Well-structured test suite with comprehensive coverage!

The test suite is well-organized with:

  • Clear test descriptions
  • Proper setup and teardown
  • Comprehensive error handling
  • Good use of mocking
  • Thorough assertions
packages/data-flow/src/orchestrator.ts (1)

144-150: Consider edge case with empty events array.

The current implementation checks events[0] before accessing its blockTimestamp. While this prevents null pointer issues, it might skip metadata fetching for the entire batch if the first event is invalid but subsequent events are valid and old enough to require metadata fetching.

Consider refactoring to check if any event in the batch meets the age criteria:

-if (
-    events[0] &&
-    Math.abs(new Date().getTime() - events[0].blockTimestamp!) >
-        1000 * 60 * 60 * 0.5 // 30 minutes
-) {
+const now = new Date().getTime();
+if (events.some(event => 
+    event && event.blockTimestamp && 
+    Math.abs(now - event.blockTimestamp) > METADATA_FETCH_AGE_THRESHOLD_MS
+)) {
deployment/modules/compute/outputs.tf (1)

1-3: LGTM!

The output variable is well-defined and correctly references the ECS cluster name from the module.

deployment/modules/storage/outputs.tf (1)

1-3: LGTM!

The output variable is well-defined and correctly references the RDS endpoint from the module.

deployment/modules/container-registry/variables.tf (1)

1-5: LGTM: The app_name variable is correctly defined.
The variable declaration follows Terraform conventions and includes a clear description.

deployment/modules/networking/variables.tf (3)

1-4: Define the app_name variable clearly.
The variable is straightforward with a clear description and proper string type. This will allow consistent tagging and identification across environments.


6-9: Define the app_environment variable appropriately.
The variable uses a clear description and the string type, aligning with best practices for environment configuration.


11-14: Define the region variable correctly.
The variable is defined with an appropriate description and type, ensuring that regional settings can be managed consistently.

deployment/modules/iam/outputs.tf (3)

1-3: Output for processing_service_role_arn is correct.
The output cleanly exposes the ARN of the processing service role, which is essential for inter-module references.


5-7: Output for api_service_role_arn is defined properly.
This output correctly captures the ARN of the API service role, facilitating its use by dependent modules.


9-11: Output for bastion_instance_profile_name is set up correctly.
The definition retrieves the IAM instance profile name as expected, allowing other configurations to reference the bastion host profile.

deployment/modules/iam/variables.tf (5)

1-4: Define the app_name variable for the IAM module.
The variable is cleanly defined with a useful description and string type to ensure consistency with other modules.


5-8: Define the app_environment variable appropriately.
The variable is set up with a clear description and type, ensuring consistent environment references in IAM configurations.


10-13: Define the region variable appropriately.
This variable supports regional configuration and is defined with clear semantics and the proper type.


15-18: Define the account_id variable correctly.
This variable will help tailor IAM roles and policies based on the AWS account, and its definition is clear and concise.


20-23: Define the db_name variable to support database configurations.
The variable is straightforward, with a descriptive label and a string type, ensuring clarity in database reference within IAM settings.

deployment/.gitignore (1)

1-24: .gitignore tailored for Terraform projects.
The file includes entries to ignore Terraform state files, local dependency directories, crash logs, and sensitive variable files. This setup is essential for maintaining security and preventing leakage of sensitive information into version control.

deployment/modules/load_balancer/variables.tf (5)

1-4: Excellent variable definition for app_name.
The variable is clearly defined with an appropriate description and type.


6-9: Clear configuration for app_environment.
The description and type make it easy to understand its intended use.


12-15: Consistent variable naming for vpc_id.
The definition is straightforward and aligns with our naming conventions.


17-20: Proper declaration of public_subnets.
Using a list of strings is correct for subnet IDs and the description is clear.


22-25: Well-defined load_balancer_security_group_id.
Definition is precise and ties in well with associated networking configurations.

deployment/modules/bastion/variables.tf (5)

1-4: Clear and precise variable for app_name.
The variable definition follows our conventions and is self-explanatory.


6-9: Good definition for app_environment.
The description explicitly states the environment purpose, ensuring clarity.


11-14: Accurate variable declaration for subnet_id.
The description details where the bastion host will reside, making the purpose evident.


16-19: Proper setup for bastion_instance_profile_name.
The variable is clearly defined with a descriptive explanation for its usage.


21-24: Correct declaration for bastion_security_group_id.
The type and description are appropriately specified for managing security group associations.

deployment/modules/networking/outputs.tf (8)

1-4: Well-defined output for private_subnets.
Exposing the private subnets from the VPC module aids in cross-module integration.


5-8: Output for vpc_id is correctly implemented.
This output serves as a useful reference for resources that depend on the VPC configuration.


9-12: Output for public_subnets is clear and consistent.
The configuration correctly exposes the public subnets from the underlying VPC module.


13-16: Proper output for rds_security_group_id.
This output will be invaluable for modules that need to reference the RDS security group.


17-20: Accurate output for processing_security_group_id.
The value is set directly from the created AWS security group, ensuring consistency.


21-24: Output for api_security_group_id is well-defined.
It will facilitate integration with other modules that require API-level security context.


25-28: Clear configuration for rds_subnet_group_name.
This output provides essential information for isolating database resources.


29-32: Accurate output for load_balancer_security_group_id.
Linking directly to the security group ID helps ensure proper resource mapping across modules.

deployment/modules/storage/variables.tf (8)

1-4: Good definition for app_name.
The variable is set up correctly with a concise description and proper type.


6-9: Clear declaration for app_environment.
The variable’s purpose is explicit, contributing to configuration consistency.


11-15: Accurate definition for region.
The inclusion of the region variable is essential for resource deployment across AWS regions.


16-20: Appropriate variable for db_name.
This variable clearly identifies the target database and its naming convention.


21-25: Correct declaration of rds_username.
Ensuring a proper string type aids in reliable database access configuration.


31-35: Well-defined variable for rds_security_group_id.
The description and type align with its expected usage in network security interface.


36-40: Proper use of a list type for rds_subnet_ids.
This format allows for flexible configuration across multiple subnet IDs.


41-45: Clear declaration for rds_subnet_group_name.
This helps in identifying the database subnet group for RDS deployments.

deployment/modules/storage/main.tf (8)

1-7: Comprehensive module configuration for RDS begins here.
The module source and version are set correctly, and the identifier is dynamically constructed using environment variables.


7-13: Correct configuration of database infrastructure settings.
Defining parameters like db_subnet_group_name, family, engine, engine_version, instance_class, and allocated_storage sets up the RDS instance as intended.


14-18: Secure and external management of master user password.
By not managing the master user password within the module, you ensure better security practices.


19-20: Appropriate security configuration for the RDS instance.
Using vpc_security_group_ids with a list and providing subnet_ids supports proper resource isolation.


22-24: Defined backup strategy with retention and window settings.
These parameters provide a balanced approach between recovery objectives and maintenance windows.


25-27: Maintenance window is clearly specified.
Ensure this time frame aligns with your operational requirements and maintenance policies.


27-29: Resource accessibility and security are correctly managed.
Setting publicly_accessible to false and enabling storage_encrypted are best practices for database security.


31-35: Well-applied tagging strategy.
Tagging with environment and project values improves traceability and resource management.

deployment/modules/load_balancer/main.tf (2)

1-7: Load Balancer Resource Configuration Looks Good
The aws_lb resource is configured properly with a clear naming convention and appropriate subnet and security group references.


9-26: Target Group Setup – Verify Health Check Matcher
The target group configuration, including health check parameters, is set up correctly. Please verify that the strict matcher value "200" is suitable for your application; in some cases you might prefer a pattern (e.g., matching any 2xx response).

deployment/state/main.tf (2)

4-9: Caller Identity and Locals Definition
The data source for the current AWS caller identity and the local variables (for bucket naming and account ID) are defined clearly and concisely.


11-48: S3 Terraform State Module Configuration
The module configuration for managing S3-based Terraform state is well-structured with proper security features such as blocking public ACLs and policies. The inline JSON policy is correctly encoded to allow necessary S3 actions for the specified root user.

deployment/state/.terraform.lock.hcl (1)

1-26: Terraform Lock File – Auto-generated and Consistent
This lock file is automatically maintained by Terraform and includes the correct version information along with cryptographic hashes for integrity. No manual changes are required.

deployment/environments/staging/.terraform.lock.hcl (1)

1-46: Staging Environment Lock File – Integrity Verified
The staging lock file properly specifies the AWS and Random providers with their version constraints and hash lists. This ensures consistent provider usage in the staging environment.

deployment/modules/networking/main.tf (4)

33-49: Processing Security Group – Simple and Effective
The security group for processing is straightforward, allowing all outbound traffic. The configuration and tagging are correct.


53-85: RDS Security Group – Ingress Rules Require Verification
Two ingress rules are defined to allow PostgreSQL (port 5432) access from both private and public subnets. Allowing access from public subnets (for API usage) can potentially expose the database to unwanted connections.
Please verify that this configuration is intentional and adequately secured via other mechanisms.


87-110: Load Balancer Security Group is Configured Appropriately
The load balancer security group allows inbound traffic on port 80 from any source, which is typical for public facing services.


136-144: RDS Subnet Group – Well Defined
The DB subnet group correctly references private subnets from the VPC module, ensuring that the RDS instance is deployed in an isolated network.

deployment/environments/staging/main.tf (7)

1-8: Terraform Backend Configuration Looks Solid

The S3 backend configuration is clearly defined with the bucket, key, region, and encryption enabled. This setup will help ensure state consistency in the staging environment.


22-27: Module “container_registry” Integration Verified

The “container_registry” module is integrated correctly. The reference to var.app_name helps maintain naming consistency.


31-36: Networking Module Configuration is Clear

The “networking” module has been configured with the required variables. The parameters passed (including region and subnets) appear to be consistent with the deployment requirements.


38-45: IAM Module Setup Is Consistent

The module “iam” is correctly provided with the necessary variables including the account ID (retrieved via data.aws_caller_identity.current.account_id) and the database name.


47-58: Storage Module Configuration is Well Structured

The “storage” module receives all the required inputs such as DB credentials, security group IDs, and subnet configurations. This ensures that your RDS instance is properly configured.


60-67: Bastion and Load Balancer Modules are Configured Correctly

The “bastion” and “load_balancer” modules appear to be integrated properly (e.g. passing subnet IDs and instance profile names). Verify that the referenced outputs from the IAM module are defined as expected in that module.


78-125: Compute Module Invocation is Comprehensive

The “compute” module is called with a detailed set of parameters covering repository URLs, image tags, service role ARNs, environment variables, and network settings. Ensure that sensitive data such as passwords are managed securely (for example, via secure variable management or AWS Secrets Manager).

deployment/modules/compute/main.tf (4)

1-4: Local Variables Are Defined Appropriately

The locals for the log group and container name are clearly defined and use the app name and environment effectively.


6-78: ECS Module Configuration and Service Definitions

The usage of the external ECS module (version 5.12.0) with merged service definitions is well structured. The API service and dynamic processing services are clearly delineated. Verify that the autoscaling configuration and security group assignments align with your operational needs.


81-142: API Task Definition is Comprehensive

The API task definition includes clear container definitions, environment variable mappings (using a for-loop for conversion), health checks, and logging configurations. The use of tonumber for port conversion is proper given that the variable may be defined as a string elsewhere.


143-234: Dynamic Processing Task Definitions are Well Implemented

The processing tasks are dynamically created using the “for_each” construct over var.CHAINS. The configuration includes appropriate resource settings (CPU, memory, network mode) and environment variables. Ensure that the JSON encoding for the “CHAINS” environment variable and other similar settings matches the expectations of your containerized application.

deployment/README.md (3)

1-2: Header Section: Clear Module Identification
The header "# Deployment Module" clearly marks the beginning of the deployment documentation section.


16-27: Module Structure: Comprehensive and Well-Organized
The "### Module Structure" section clearly outlines all the submodules (Networking, IAM, Compute, Storage, Load Balancer, Container Registry, and Bastion), which enhances the readability and navigability of the deployment configuration. Linking to further documentation for each submodule could further aid in maintainability.


28-61: Usage Section: Step-by-Step Guidance is User-Friendly
The "### Usage" section offers a logical, step-by-step guide including file copying, initializing the Terraform workspace, planning changes, applying updates, and destroying infrastructure. The use of code snippets makes the instructions actionable.

Comment on lines +67 to +70
DATALAYER_PG_USER = "postgres"
DATALAYER_PG_PASSWORD = "postgres"
DATALAYER_PG_DB_NAME = "GitcoinDatalayerRdsDb"
DATALAYER_PG_EXPOSED_PORT = "5432"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Store database passwords and admin secrets securely.
Sensitive values (e.g., DATALAYER_PG_PASSWORD, DATALAYER_HASURA_ADMIN_SECRET) are in plain text here. Evaluate moving them to a more secure storage mechanism (e.g., Terraform variable injection, secrets manager).

- DATALAYER_PG_PASSWORD     = "postgres"
- DATALAYER_HASURA_ADMIN_SECRET                  = "LuE74uG8BMsdYEF"
+ # Do not store credentials in plaintext in version control.
+ # Consider referencing them with external secret management.

Also applies to: 80-81

Comment on lines +15 to +52
CHAINS = [
{
"id" : 10,
"name" : "optimism",
"rpcUrls" : [
"https://optimism.llamarpc.com",
"https://rpc.ankr.com/optimism",
"https://optimism.gateway.tenderly.co",
"https://optimism.blockpi.network/v1/rpc/public",
"https://mainnet.optimism.io",
"https://opt-mainnet.g.alchemy.com/v2/demo"
],
"fetchLimit" : 1000,
"fetchDelayMs" : 2000
},
{ "id" : 1,
"name" : "mainnet",
"rpcUrls" : [
"https://eth.llamarpc.com",
"https://rpc.flashbots.net/fast"
],
"fetchLimit" : 1000,
"fetchDelayMs" : 2000
}
,
{
"id" : 42161,
"name" : "arbitrum",
"rpcUrls" : [
"https://arbitrum.llamarpc.com",
"https://arbitrum.gateway.tenderly.co",
"https://arbitrum.blockpi.network/v1/rpc/public",
"https://arbitrum-mainnet.g.alchemy.com/v2/demo"
],
"fetchLimit" : 1000,
"fetchDelayMs" : 2000
}
]
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Confirm chain data matches actual usage.
These chain configuration entries (e.g., network names, RPC endpoints) are user-provided. Ensure they’re all correct, alive endpoints before finalizing.


🏁 Script executed:

#!/bin/bash
# Description: Quickly verify that the listed RPC endpoints return valid responses via HTTP GET
for rpcUrl in \
  "https://optimism.llamarpc.com" \
  "https://rpc.ankr.com/optimism" \
  "https://optimism.gateway.tenderly.co" \
  "https://optimism.blockpi.network/v1/rpc/public" \
  "https://mainnet.optimism.io" \
  "https://opt-mainnet.g.alchemy.com/v2/demo" \
  "https://eth.llamarpc.com" \
  "https://rpc.flashbots.net/fast" \
  "https://arbitrum.llamarpc.com" \
  "https://arbitrum.gateway.tenderly.co" \
  "https://arbitrum.blockpi.network/v1/rpc/public" \
  "https://arbitrum-mainnet.g.alchemy.com/v2/demo"
do
  echo "Checking $rpcUrl"
  curl -I -s "$rpcUrl" | head -n 1
done

Length of output: 7711


Action Required: Update RPC Endpoint Configurations

The verification script revealed that several RPC endpoints are returning error responses (e.g., 404, 405, 429, 400). Please review and update the following endpoints in deployment/environments/staging/terraform.tfvars.example (lines 15–52) to ensure they reflect the correct and live endpoints used in production:

  • Optimism Chain:

    • "https://rpc.ankr.com/optimism" → returned 404
    • "https://optimism.gateway.tenderly.co" → returned 404
    • "https://optimism.blockpi.network/v1/rpc/public" → returned 405
    • "https://mainnet.optimism.io" → returned 405
    • "https://opt-mainnet.g.alchemy.com/v2/demo" → returned 429
  • Mainnet:

    • "https://eth.llamarpc.com" is working, but "https://rpc.flashbots.net/fast" returned 400
  • Arbitrum:

    • "https://arbitrum.gateway.tenderly.co" → returned 404
    • "https://arbitrum.blockpi.network/v1/rpc/public" → returned 405

Please confirm with actual usage requirements and update these entries as needed.

Comment on lines +2 to +4
resource "aws_ecr_repository" "processing_repository" {
name = "${var.app_name}-processing"
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Enable ECR image scanning on push.
This resource block would benefit from enabling image scanning to adhere to security best practices as flagged by Checkov. Consider adding the attribute image_scan_on_push = true to ensure that images are scanned upon push.

-resource "aws_ecr_repository" "processing_repository" {
-  name = "${var.app_name}-processing"
-}
+resource "aws_ecr_repository" "processing_repository" {
+  name               = "${var.app_name}-processing"
+  image_scan_on_push = true
+}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
resource "aws_ecr_repository" "processing_repository" {
name = "${var.app_name}-processing"
}
resource "aws_ecr_repository" "processing_repository" {
name = "${var.app_name}-processing"
image_scan_on_push = true
}
🧰 Tools
🪛 Checkov (3.2.334)

[HIGH] 2-4: Ensure ECR image scanning on push is enabled

(CKV_AWS_163)

Comment on lines +56 to +66
variable "CHAINS" {
description = "Chains to be indexed"
type = list(object({
id = number
name = string
rpcUrls = list(string)
fetchLimit = number
fetchDelayMs = number
}))
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Inconsistent Type for “CHAINS” Variable “id” Field

The “CHAINS” variable in this file defines the “id” field as a number, whereas in other modules (e.g. in deployment/modules/compute/variables.tf) it is defined as a string. This inconsistency may lead to type mismatches when passing the variable between modules.

Comment on lines +185 to +194
variable "CHAINS" {
description = "Chains to be indexed"
type = list(object({
id = string
name = string
rpcUrls = list(string)
fetchLimit = number
fetchDelayMs = number
}))
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Ensure Consistency for “CHAINS” Variable

In this module the “CHAINS” variable defines the “id” as a string, which conflicts with its definition (as a number) in the staging variables file. Standardizing the type across modules is essential for type safety and predictable behavior.

Decide on either a string or number type for “id” and update the declarations accordingly.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

♻️ Duplicate comments (4)
deployment/modules/container-registry/main.tf (1)

2-4: ⚠️ Potential issue

Enable ECR Image Scanning on Push
Static analysis (Checkov, CKV_AWS_163) and previous feedback indicate that ECR image scanning on push is a security best practice. It is recommended to add the attribute image_scan_on_push = true to the resource. This change helps ensure that images are automatically scanned for vulnerabilities as they are pushed.

Proposed diff:

-resource "aws_ecr_repository" "processing_repository" {
-  name = "${var.app_name}-processing"
-}
+resource "aws_ecr_repository" "processing_repository" {
+  name               = "${var.app_name}-processing"
+  image_scan_on_push = true
+}
🧰 Tools
🪛 Checkov (3.2.334)

[HIGH] 2-4: Ensure ECR image scanning on push is enabled

(CKV_AWS_163)

deployment/modules/bastion/main.tf (1)

4-14: ⚠️ Potential issue

Enforce IMDSv2 for Bastion Instance
A security best practice is to enforce Instance Metadata Service Version 2 on your bastion host. Currently, the aws_instance resource does not include a metadata_options block, which is flagged by static analysis (CKV_AWS_79) and previous reviews.
Consider adding the following block to the resource:

 resource "aws_instance" "bastion" {
   ami                    = "ami-0884d2865dbe9de4b"
   instance_type          = "t3.large"
   subnet_id              = var.subnet_id
   iam_instance_profile   = var.bastion_instance_profile_name
   vpc_security_group_ids = [var.bastion_security_group_id]
+  metadata_options {
+    http_tokens   = "required"
+    http_endpoint = "enabled"
+  }
 
   tags = {
     Name = "${var.app_name}-${var.app_environment}-bastion"
   }
 }
🧰 Tools
🪛 Checkov (3.2.334)

[HIGH] 4-14: Ensure Instance Metadata Service Version 1 is not enabled

(CKV_AWS_79)

deployment/environments/staging/variables.tf (1)

56-65: ⚠️ Potential issue

Inconsistent type for CHAINS variable "id".
The CHAINS variable defines the id field as a number here, but elsewhere (e.g. in the compute module) it is defined as a string. This inconsistency can lead to type mismatches when passing the variable between modules.

Would you like to update the type to string in this file to match the compute module definition?

deployment/modules/compute/variables.tf (1)

183-194: ⚠️ Potential issue

Processing environment variables and CHAINS configuration.
The CHAINS variable here defines the id as a string, which differs from the definition in the staging environment variables file. Please ensure the type is consistent across modules to avoid runtime type mismatches.

🧹 Nitpick comments (12)
packages/indexer-client/test/unit/envioIndexerClient.spec.ts (1)

36-36: Fix typographical error in comment.

The comment contains a typographical error: "Sample test datåa" should be "Sample test data".

-        // Sample test datåa
+        // Sample test data
packages/metadata/src/providers/pinata.provider.ts (2)

16-21: Remove or clean up commented-out console logs.

These commented-out lines are likely no longer needed. Removing them helps maintain cleaner code and avoids confusion for future maintainers.

-        // console.log("pinataJwt", this.pinataJwt);
-        // console.log("pinataGateway", this.pinataGateway);

24-49: Enhance error handling and validation for metadata fetching.

Currently, all fetch failures revert to returning undefined. Consider distinguishing between different error types, or providing more context in the error path. This can help callers differentiate “not found” from truly “invalid” data scenarios.

packages/data-flow/src/orchestrator.ts (1)

144-150: Consider making the time threshold configurable.

The 30-minute threshold for determining when to fetch metadata and prices is currently hardcoded. Consider moving this to a configuration variable for better flexibility across different environments.

+private readonly METADATA_FETCH_AGE_THRESHOLD_MS = 1000 * 60 * 30; // 30 minutes
+
 if (
     events[0] &&
-    Math.abs(new Date().getTime() - events[0].blockTimestamp!) >
-        1000 * 60 * 60 * 0.5 // 30 minutes
+    new Date().getTime() - events[0].blockTimestamp! > this.METADATA_FETCH_AGE_THRESHOLD_MS
 ) {
deployment/state/main.tf (1)

11-48: S3 Terraform State Module – State Security Best Practices
The module for managing the S3 backend state is implemented well with public access restrictions in place. As an enhancement, consider enabling bucket versioning and server‐side encryption to further secure your Terraform state files.

Optional Diff Suggestion:

 module "s3_terraform_state" {
   source  = "terraform-aws-modules/s3-bucket/aws"
   version = "4.4.0"

   bucket = local.bucket_name

   block_public_acls       = true
   block_public_policy     = true
   ignore_public_acls      = true
   restrict_public_buckets = true

+  versioning = {
+    enabled = true
+  }
+
+  server_side_encryption_configuration = {
+    rule = {
+      apply_server_side_encryption_by_default = {
+        sse_algorithm = "AES256"
+      }
+    }
+  }

   policy = jsonencode({
     "Version" : "2012-10-17",
     "Statement" : [
       {
         "Effect" : "Allow",
         "Principal" : {
           "AWS" : "arn:aws:iam::${local.account_id}:root"
         },
         "Action" : [
           "s3:GetObject",
           "s3:PutObject",
           "s3:DeleteObject",
           "s3:ListBucket"
         ],
         "Resource" : [
           "arn:aws:s3:::${local.bucket_name}",
           "arn:aws:s3:::${local.bucket_name}/*"
         ]
       }
     ]
   })

   tags = {
     Environment = var.app_environment
     Name        = local.bucket_name
   }
 }
deployment/modules/networking/main.tf (2)

4-28: VPC Module Configuration – Consider Making AZs and Subnets Configurable
The VPC module successfully instantiates your VPC using the terraform-aws-modules. Currently, availability zones and subnet CIDRs are hard-coded. For greater flexibility and reusability, consider exposing these as variables so that they can be adjusted per environment or region without modifying the code.


33-49: Processing Security Group – Add Descriptive Metadata
The security group for processing has a clear egress rule, but it would be beneficial to add descriptive comments or a description attribute for the security group and its rules. This improves the readability and maintainability of the configuration.

deployment/modules/iam/main.tf (2)

97-116: ECR access policy uses a wildcard resource.
Right now the policy allows ECR actions on all resources (Resource = "*") which may be overly permissive. Consider restricting it to a more specific ARN (for example, using:

-        Resource = "*"
+        Resource = "arn:aws:ecr:${var.region}:${var.account_id}:repository/${var.app_name}-*"
```)

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Checkov (3.2.334)</summary>

[HIGH] 98-116: Ensure no IAM policies documents allow "*" as a statement's resource for restrictable actions

(CKV_AWS_355)

</details>

</details>

---

`118-136`: **Logger access policy allows logging actions on all resources.**  
While allowing CloudWatch Logs actions on all resources is common, it might be worth verifying if this can be further restricted to minimize the attack surface.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Checkov (3.2.334)</summary>

[HIGH] 119-136: Ensure IAM policies does not allow write access without constraints

(CKV_AWS_290)

---

[HIGH] 119-136: Ensure no IAM policies documents allow "*" as a statement's resource for restrictable actions

(CKV_AWS_355)

</details>

</details>

</blockquote></details>
<details>
<summary>deployment/README.md (3)</summary><blockquote>

`16-27`: **Well-Outlined Module Structure**  
The module structure section lists all the key submodules clearly. For enhanced usability, consider adding links to the respective submodule documentation or paths (if available) so users can quickly navigate to more details.

---

`28-37`: **Clear Usage Section – Step 1**  
The usage instructions begin with a clear directive for copying the example Terraform variables file. This explicit step helps reduce confusion regarding initial configuration. A brief note explaining what to expect after updating the variables could further enhance clarity.

---

`62-107`: **Comprehensive Variables Table**  
The variables table is extensive and outlines each configuration bit in detail. For enhanced readability, especially on smaller screens or when printed, consider:  
- Splitting the essential variables from optional ones, or  
- Including a note on how these variables map to the actual Terraform configurations.  

This additional context can help users understand which variables they must prioritize.

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between f80492e2d587a227b9b5265d87844a6305bec427 and 005ad37db91746138c7005fc9cd2d5ac2c2c9de7.

</details>

<details>
<summary>📒 Files selected for processing (34)</summary>

* `deployment/.gitignore` (1 hunks)
* `deployment/README.md` (1 hunks)
* `deployment/environments/staging/.terraform.lock.hcl` (1 hunks)
* `deployment/environments/staging/main.tf` (1 hunks)
* `deployment/environments/staging/terraform.tfvars.example` (1 hunks)
* `deployment/environments/staging/variables.tf` (1 hunks)
* `deployment/modules/bastion/main.tf` (1 hunks)
* `deployment/modules/bastion/outputs.tf` (1 hunks)
* `deployment/modules/bastion/variables.tf` (1 hunks)
* `deployment/modules/compute/main.tf` (1 hunks)
* `deployment/modules/compute/outputs.tf` (1 hunks)
* `deployment/modules/compute/variables.tf` (1 hunks)
* `deployment/modules/container-registry/main.tf` (1 hunks)
* `deployment/modules/container-registry/outputs.tf` (1 hunks)
* `deployment/modules/container-registry/variables.tf` (1 hunks)
* `deployment/modules/iam/main.tf` (1 hunks)
* `deployment/modules/iam/outputs.tf` (1 hunks)
* `deployment/modules/iam/variables.tf` (1 hunks)
* `deployment/modules/load_balancer/main.tf` (1 hunks)
* `deployment/modules/load_balancer/outputs.tf` (1 hunks)
* `deployment/modules/load_balancer/variables.tf` (1 hunks)
* `deployment/modules/networking/main.tf` (1 hunks)
* `deployment/modules/networking/outputs.tf` (1 hunks)
* `deployment/modules/networking/variables.tf` (1 hunks)
* `deployment/modules/storage/main.tf` (1 hunks)
* `deployment/modules/storage/outputs.tf` (1 hunks)
* `deployment/modules/storage/variables.tf` (1 hunks)
* `deployment/state/.terraform.lock.hcl` (1 hunks)
* `deployment/state/main.tf` (1 hunks)
* `deployment/state/variables.tf` (1 hunks)
* `packages/data-flow/src/orchestrator.ts` (1 hunks)
* `packages/indexer-client/test/unit/envioIndexerClient.spec.ts` (1 hunks)
* `packages/metadata/src/providers/pinata.provider.ts` (1 hunks)
* `packages/metadata/src/providers/publicGateway.provider.ts` (1 hunks)

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>📓 Path-based instructions (3)</summary>

<details>
<summary>`**/*.ts`:   Review TypeScript files for adherence to the fo...</summary>

> `**/*.ts`:   Review TypeScript files for adherence to the following guidelines:
>         - Avoid over-abstraction; prioritize composition over inheritance.
>         - Use dependency injection and follow SOLID principles.
>         - Avoid `any`; use `unknown` when necessary.
>         - Use runtime type-checking for environment variables (e.g., Zod).
>         - Prevent circular dependencies with the internal module pattern.
>         - Libraries should have an `external.ts` file explicitly listing public exports.
>         - Use `bigint` as-is; cast to `Number` only when exposing values via APIs.
>         - Document all code with JSDoc.
>         - Encourage static async factory functions for constructors.
> - Avoid overly nitpicky feedback beyond these best practices.

- `packages/indexer-client/test/unit/envioIndexerClient.spec.ts`
- `packages/metadata/src/providers/pinata.provider.ts`
- `packages/metadata/src/providers/publicGateway.provider.ts`
- `packages/data-flow/src/orchestrator.ts`

</details>
<details>
<summary>`**/*.spec.ts`: Review the unit test files with the followin...</summary>

> `**/*.spec.ts`: Review the unit test files with the following guidelines:
>         - Avoid using the word "should" in test descriptions.
>         - Ensure descriptive test names convey the intent of each test.
>         - Validate adherence to the Mocha/Chai/Jest test library best practices.
>  - Be concise and avoid overly nitpicky feedback outside of these best practices.

- `packages/indexer-client/test/unit/envioIndexerClient.spec.ts`

</details>
<details>
<summary>`**/providers/**/*.ts`: Review provider files for the follow...</summary>

> `**/providers/**/*.ts`: Review provider files for the following:
> - Providers should supply narrowly scoped data/resources.
> - Ensure classes interacting with metadata sources (e.g., GitHub, JSON files, IPFS) implement the `IMetadataProvider` interface and follow naming conventions (e.g., `GithubProvider`, `JsonFileProvider`).
>  - Be concise and avoid overly nitpicky feedback outside of these best practices.

- `packages/metadata/src/providers/pinata.provider.ts`
- `packages/metadata/src/providers/publicGateway.provider.ts`

</details>

</details><details>
<summary>🧠 Learnings (1)</summary>

<details>
<summary>packages/data-flow/src/orchestrator.ts (1)</summary>

Learnt from: 0xnigir1
PR: #57
File: packages/data-flow/src/orchestrator.ts:300-319
Timestamp: 2025-01-22T01:29:58.740Z
Learning: In the Orchestrator's bulkFetchMetadataAndPricesForBatch method, error handling is not required as it's a performance optimization. If the bulk fetch fails, the data will be fetched again during processing in the processor.


</details>

</details><details>
<summary>🪛 Checkov (3.2.334)</summary>

<details>
<summary>deployment/modules/container-registry/main.tf</summary>

[HIGH] 2-4: Ensure ECR image scanning on push is enabled

(CKV_AWS_163)

</details>
<details>
<summary>deployment/modules/bastion/main.tf</summary>

[HIGH] 4-14: Ensure Instance Metadata Service Version 1 is not enabled

(CKV_AWS_79)

</details>
<details>
<summary>deployment/modules/load_balancer/main.tf</summary>

[HIGH] 28-36: Ensure that load balancer is using at least TLS 1.2

(CKV_AWS_103)

</details>
<details>
<summary>deployment/modules/iam/main.tf</summary>

[HIGH] 98-116: Ensure no IAM policies documents allow "*" as a statement's resource for restrictable actions

(CKV_AWS_355)

---

[HIGH] 119-136: Ensure IAM policies does not allow write access without constraints

(CKV_AWS_290)

---

[HIGH] 119-136: Ensure no IAM policies documents allow "*" as a statement's resource for restrictable actions

(CKV_AWS_355)

</details>

</details>

</details>

<details>
<summary>🔇 Additional comments (124)</summary><blockquote>

<details>
<summary>packages/indexer-client/test/unit/envioIndexerClient.spec.ts (1)</summary>

`1-740`: **Well-structured and comprehensive test coverage!**

The test implementation is thorough and follows testing best practices:
- Clear test descriptions that avoid using "should"
- Comprehensive coverage of success and error cases
- Well-organized test structure with proper setup and teardown
- Good edge case coverage

</details>
<details>
<summary>packages/metadata/src/providers/publicGateway.provider.ts (1)</summary>

`26-26`: **Validate consumer handling of added `null` return type.**

Now that `getMetadata` may return `null`, ensure that callers properly handle it in addition to `undefined`, or else unexpected null-handling errors may arise.

</details>
<details>
<summary>deployment/environments/staging/terraform.tfvars.example (3)</summary>

`15-52`: **[Duplicate of previous feedback] Verify RPC endpoints.**

Several RPC endpoints may be unavailable or incorrect, based on previous verification scripts. Double-check that each endpoint is valid and aligns with production requirements.

---

`67-70`: **[Duplicate of previous feedback] Avoid committing plaintext database credentials.**

These credentials (user and password) should be stored securely. Consider referencing them through a secrets manager or environment variables that are not committed to version control.

---

`80-81`: **[Duplicate of previous feedback] Hide admin secrets in a secure location.**

Exposing `DATALAYER_HASURA_ADMIN_SECRET` in plain text is risky. Storing secrets in a secret management system or injecting them at runtime is recommended.

</details>
<details>
<summary>deployment/modules/compute/outputs.tf (1)</summary>

`1-3`: **LGTM!**

The output is well-defined and follows Terraform naming conventions.

</details>
<details>
<summary>deployment/modules/storage/outputs.tf (1)</summary>

`1-3`: **LGTM!**

The output is well-defined and follows Terraform naming conventions.

</details>
<details>
<summary>deployment/modules/load_balancer/outputs.tf (1)</summary>

`2-4`: **Clear Output Declaration for Load Balancer Target Group ARN**  
The output block correctly exposes the ARN from `aws_lb_target_group.api_target_group`. Ensure that the referenced resource is defined and configured in the associated module.

</details>
<details>
<summary>deployment/modules/container-registry/variables.tf (1)</summary>

`1-4`: **Well-Defined ECR Repository Name Variable**  
The variable `app_name` is clearly defined with an appropriate description and type. This promotes consistency across modules that use this variable.

</details>
<details>
<summary>deployment/modules/container-registry/outputs.tf (1)</summary>

`1-7`: **Correctly Exposed ECR Repository Outputs**  
Both outputs (`processing_repository_url` and `processing_repository_arn`) are defined clearly, allowing dependent modules (such as compute or ECS task definitions) to retrieve essential repository information post-deployment.

</details>
<details>
<summary>deployment/state/variables.tf (1)</summary>

`1-9`: **Consistent Declaration of Application Variables**  
The new variables `app_name` and `app_environment` are well declared with clear descriptions. Their inclusion promotes consistency across various modules and environments (e.g., staging, bastion) for managing application-specific configurations.

</details>
<details>
<summary>deployment/modules/networking/variables.tf (3)</summary>

`1-4`: **Approve `app_name` Variable Declaration**  
The `app_name` variable is clearly defined with an appropriate description and type.

---

`6-9`: **Approve `app_environment` Variable Declaration**  
The `app_environment` variable is defined consistently with a clear description and proper type.

---

`11-14`: **Approve `region` Variable Declaration**  
The `region` variable is well declared with the required description and type.

</details>
<details>
<summary>deployment/modules/iam/outputs.tf (3)</summary>

`1-3`: **Approve `processing_service_role_arn` Output**  
The output correctly exposes the ARN from the related IAM role.

---

`5-7`: **Approve `api_service_role_arn` Output**  
The output is properly defined to return the ARN for the API service role.

---

`9-11`: **Approve `bastion_instance_profile_name` Output**  
The output correctly references the bastion instance profile name from the IAM resource.

</details>
<details>
<summary>deployment/modules/iam/variables.tf (5)</summary>

`1-4`: **Approve `app_name` Variable Declaration**  
The `app_name` variable is defined properly with a descriptive purpose and type.

---

`5-8`: **Approve `app_environment` Variable Declaration**  
This variable is clearly defined and follows the expected convention.

---

`10-13`: **Approve `region` Variable Declaration**  
The declaration for `region` is consistent and correct.

---

`15-18`: **Approve `account_id` Variable Declaration**  
The `account_id` variable is defined with an appropriate description and type.

---

`20-23`: **Approve `db_name` Variable Declaration**  
The `db_name` variable is properly added to capture the database name, with clear documentation.

</details>
<details>
<summary>deployment/.gitignore (6)</summary>

`1-3`: **Approve Terraform Local Dependency Ignorance**  
The entry to ignore local Terraform dependency directories (i.e. `.terraform/`) is appropriately defined.

---

`4-7`: **Approve Terraform State Files Ignorance**  
The state and backup files (`terraform.tfstate` and `terraform.tfstate.backup`) are excluded to prevent sensitive data leakage.

---

`8-10`: **Approve Crash Log Ignorance**  
Ignoring crash logs like `crash.log` is a good practice to keep the repository clean.

---

`11-16`: **Approve Override Files Exclusion**  
The overrides and their variants are correctly excluded from version control.

---

`17-20`: **Approve Local CLI Config Files Exclusion**  
The configuration files for Terraform CLI are appropriately ignored.

---

`21-24`: **Approve Sensitive Variables Files Exclusion**  
The pattern for ignoring `.tfvars` files prevents accidental exposure of sensitive variable values.

</details>
<details>
<summary>deployment/modules/load_balancer/variables.tf (5)</summary>

`1-4`: **Variable "app_name" Defined Clearly.**  
The variable "app_name" is well defined with a clear description and the correct string type.

---

`6-10`: **Variable "app_environment" Defined Clearly.**  
The "app_environment" variable is correctly specified with an appropriate description and string type.

---

`12-16`: **Variable "vpc_id" Configured Correctly.**  
The variable "vpc_id" has a clear description and matches the expected string type.

---

`17-21`: **Variable "public_subnets" is Appropriate.**  
The definition for "public_subnets" uses the list(string) type appropriately with a clear description.

---

`22-26`: **Variable "load_balancer_security_group_id" is Correctly Defined.**  
The variable is properly declared for the security group ID with a clear description and string type.

</details>
<details>
<summary>deployment/modules/bastion/variables.tf (5)</summary>

`1-4`: **Variable "app_name" for Bastion Module is Properly Declared.**  
The "app_name" variable is defined with a descriptive annotation and the correct type.

---

`6-10`: **Variable "app_environment" is Consistent and Clear.**  
Providing an example (e.g., dev, staging, prod) in the description helps improve clarity.

---

`11-15`: **Variable "subnet_id" is Well Specified.**  
The subnet ID for the bastion deployment is clearly defined with the correct type.

---

`16-20`: **Variable "bastion_instance_profile_name" is Accurate.**  
This variable is clearly documented and uses the correct type to support bastion host configuration.

---

`21-25`: **Variable "bastion_security_group_id" is Defined Correctly.**  
The declaration is clear and the type is appropriate for capturing the security group ID.

</details>
<details>
<summary>deployment/modules/networking/outputs.tf (8)</summary>

`1-3`: **Output "private_subnets" is Clear and Useful.**  
The output directly references the VPC module’s private subnets, ensuring transparent data flow.

---

`5-7`: **Output "vpc_id" is Defined Correctly.**  
This output cleanly exposes the VPC ID from the module for downstream consumption.

---

`9-11`: **Output "public_subnets" is Configured Properly.**  
The output conveniently references the public subnets from the VPC module.

---

`13-15`: **Output "rds_security_group_id" is Appropriately Exposed.**  
This output correctly pulls the security group ID from the AWS resource configuration.

---

`17-19`: **Output "processing_security_group_id" is Well Defined.**  
Ensuring that the processing security group ID is output adds clarity for dependent modules.

---

`21-23`: **Output "api_security_group_id" Exposes Essential Information.**  
Properly configured, this output aids in accessing the API security group ID where needed.

---

`25-27`: **Output "rds_subnet_group_name" is Clear and Consistent.**  
This output effectively retrieves the subnet group name for RDS, aligning with expected practices.

---

`29-31`: **Output "load_balancer_security_group_id" is Correctly Set.**  
The output cleanly exposes the load balancer security group ID from AWS resources.

</details>
<details>
<summary>deployment/modules/storage/variables.tf (9)</summary>

`1-4`: **Variable "app_name" is Defined Consistently.**  
The declaration follows expected conventions and aids in resource tagging and identification.

---

`6-10`: **Variable "app_environment" is Clear and Consistent.**  
This definition supports environment separation and aids in deploying differentiations across environments.

---

`11-15`: **Variable "region" is Appropriately Declared.**  
Providing a region variable enhances flexibility and adheres to common deployment practices.

---

`16-20`: **Variable "db_name" is Clear and Useful.**  
This variable enables external configuration of the database name, which is important for multi-environment setups.

---

`21-25`: **Variable "rds_username" is Defined Correctly.**  
The RDS username variable is concise and sets the proper type for later credential management.

---

`26-30`: **Variable "rds_password" is Configured Appropriately.**  
This sensitive variable is declared with a clear description; ensure secure handling in state files.

---

`31-35`: **Variable "rds_security_group_id" is Well Specified.**  
The variable targets the correct resource and uses string type appropriately.

---

`36-40`: **Variable "rds_subnet_ids" is Defined Using a List.**  
Using list(string) correctly matches the expectation for multiple subnet IDs.

---

`41-45`: **Variable "rds_subnet_group_name" is Clear and Useful.**  
This declaration supports later referencing in the RDS module and follows naming conventions.

</details>
<details>
<summary>deployment/modules/storage/main.tf (9)</summary>

`1-4`: **Module "rds" Declaration is Correct.**  
The module source and version are properly specified, ensuring consistency with Terraform module standards.

---

`5-6`: **Identifier Construction is Clear.**  
The use of interpolation to form the identifier (combining app name and environment) is correct and readable.

---

`7-13`: **Database Configuration Block is Well Structured.**  
Variables such as `db_subnet_group_name`, `family`, `engine`, `engine_version`, `instance_class`, and `allocated_storage` are appropriately defined.

---

`14-18`: **Credentials and Password Management Configured Appropriately.**  
Setting `manage_master_user_password` to false and linking credentials via variables is clear; ensure that password management aligns with security protocols.

---

`19-21`: **Security Group and Subnet IDs are Properly Linked.**  
Wrapping the ID into a list for `vpc_security_group_ids` and referencing `subnet_ids` from variables ensures proper network isolation.

---

`22-24`: **Backup Configuration is Clearly Specified.**  
The backup retention period and window are defined in a straightforward manner; review the backup window ("03:00-06:00") to ensure it meets operational requirements.

---

`25-26`: **Maintenance Window is Set Correctly.**  
The specified maintenance window is clear and follows the expected syntax for Terraform configurations.

---

`27-30`: **Public Access and Storage Encryption are Configured.**  
Setting `publicly_accessible` to false and enabling `storage_encrypted` adheres to recommended security practices.

---

`31-35`: **Tagging Configuration is Consistent and Clear.**  
Tag definitions based on environment and project support resource management and tracking; the keys and values are well aligned with standard practices.

</details>
<details>
<summary>deployment/modules/load_balancer/main.tf (2)</summary>

`1-7`: **Load Balancer Resource – Naming and Configuration**  
The resource block for the AWS load balancer is clear and correctly parameterized using variables. Ensure that the provided public subnets and security group IDs are correctly set up elsewhere in the configuration.

---

`9-26`: **Target Group Configuration – Health Check Settings**  
The target group definition is well structured with a detailed health check configuration. Verify that the health check path (`/healthz`) and parameters such as timeouts and thresholds align with your application requirements.

</details>
<details>
<summary>deployment/state/main.tf (2)</summary>

`1-3`: **AWS Provider Declaration**  
The provider block correctly sets the region. Ensure that this region aligns with your overall deployment strategy.

---

`4-9`: **Caller Identity and Local Variables**  
The data block and locals for constructing the bucket name and fetching the account ID are concise and appropriate. Verify that the bucket naming convention complies with AWS naming rules and uniqueness requirements.

</details>
<details>
<summary>deployment/state/.terraform.lock.hcl (1)</summary>

`1-26`: **Terraform Lock File for AWS Provider**  
This lock file is auto-generated by Terraform and appears to be in order. No manual adjustments are necessary.

</details>
<details>
<summary>deployment/environments/staging/.terraform.lock.hcl (2)</summary>

`1-26`: **Terraform Lock File – AWS Provider Configuration**  
As with the state lock file, this file is auto-managed. The provider version and constraints are correctly specified.

---

`27-46`: **Terraform Lock File – Random Provider Configuration**  
The lock file includes correct details for the Random provider as well. No further action is needed.

</details>
<details>
<summary>deployment/modules/networking/main.tf (3)</summary>

`87-110`: **Load Balancer Security Group – Ingress Open to All**  
This security group permits inbound traffic on port 80 from any IP address which is common for public-facing load balancers. Ensure that the intended risk profile is acceptable and that any additional protective measures (like WAF or rate-limiting) are in place if needed.

---

`112-134`: **API Security Group – Interconnecting with the Load Balancer**  
The API security group correctly references the load balancer security group in its ingress rule. Confirm that this tightly coupled security model meets your security requirements.

---

`136-144`: **RDS Subnet Group – Correct Association with Private Subnets**  
The DB subnet group is properly configured to use the VPC’s private subnets. This is standard for RDS deployments to ensure the database is not exposed publicly.

</details>
<details>
<summary>deployment/environments/staging/variables.tf (5)</summary>

`1-11`: **Approve environment and basic app variable definitions.**  
The variables for `region`, `app_name`, and `app_environment` are clearly defined—with a default region value provided—and include brief descriptions.

---

`13-27`: **Approval for API and processing image tag variables.**  
The `processing_image_tag`, `api_repository_url`, and `api_image_tag` variables are defined with accurate types and clear descriptions.

---

`31-55`: **Review retry and environment variables.**  
The retry-related variables and `NODE_ENV` are declared as strings, which is acceptable in a containerized environment where all environment variables must be strings.

---

`69-111`: **Approval for indexer and gateway-related variables.**  
The variables such as `INDEXER_GRAPHQL_URL`, `METADATA_SOURCE`, `PUBLIC_GATEWAY_URLS`, `PRICING_SOURCE`, `COINGECKO_API_KEY`, `COINGECKO_API_TYPE`, and `LOG_LEVEL` are well-documented and appropriately typed.

---

`117-208`: **Approval for DATALAYER PostgreSQL and Hasura configuration variables.**  
All the database and Hasura configuration variables are detailed with clear descriptions. Just be sure that any sensitive information (like passwords or admin secrets) is handled securely in production workflows.

</details>
<details>
<summary>deployment/modules/iam/main.tf (14)</summary>

`1-17`: **Processing service role definition is clear.**  
The IAM role for the processing service is defined with an appropriate assume-role policy for ECS tasks.

---

`19-35`: **API service role definition is appropriate.**  
The API service role uses a correct assume-role policy targeting ECS tasks.

---

`37-52`: **Bastion role defined correctly.**  
The IAM role for the bastion host correctly allows EC2 instances (using `ec2.amazonaws.com` as the service principal).

---

`56-59`: **IAM Instance Profile for Bastion.**  
The instance profile is correctly set up and associated with the bastion role.

---

`61-78`: **RDS access policy is well-scoped.**  
The policy grants only the necessary RDS actions for the specified database resource. Ensure that the variable `db_name` returns the expected identifier to form a valid ARN.

---

`80-95`: **Secrets access policy is appropriate.**  
The policy grants access to Secrets Manager for a specific secret ARN.

---

`138-142`: **SSM Policy Attachment is correctly configured.**  
Attaching the managed policy `AmazonSSMManagedInstanceCore` to the bastion role is correct and follows AWS best practices.

---

`144-148`: **RDS and Secrets policy attachments to processing role are correctly set.**  
Both the RDS and secrets policies are appropriately attached to the processing service role.

---

`150-154`: **Secrets policy attachment to API role is appropriate.**  
The API service role receives the necessary permissions for accessing secrets.

---

`156-160`: **ECR policy attachment to processing role is set up.**  
This ensures that the processing role has the necessary ECR permissions.

---

`168-172`: **RDS policy attachment to API role is appropriate.**  
Attaching the RDS access policy to the API role is properly configured.

---

`174-178`: **ECR policy attachment to API role is correctly configured.**  
The attachment ensures that the API role can access the ECR resources as needed.

---

`180-184`: **Logger policy attachment to processing role is correctly configured.**  
The processing role gains the necessary CloudWatch logging permissions through this attachment.

---

`186-190`: **Logger policy attachment to API role is correctly configured.**  
The API role is also granted CloudWatch log permissions.

</details>
<details>
<summary>deployment/environments/staging/main.tf (10)</summary>

`1-15`: **Terraform backend and provider configuration is well defined.**  
The S3 backend is appropriately configured with encryption, and the required provider block specifies the AWS provider with a fixed version.

---

`17-20`: **AWS provider block is straightforward.**  
Setting the AWS region (`us-east-2`) in the provider block is clear and consistent with the backend configuration.

---

`22-23`: **AWS Caller Identity data source is used effectively.**  
This data source provides the account ID and is later used to pass account-specific variables into other modules.

---

`24-28`: **Container Registry module integration is correct.**  
The module is properly sourced and the variable `app_name` is correctly passed.

---

`31-37`: **Networking module integration is appropriately configured.**  
Passing `app_environment`, `app_name`, and `region` helps ensure consistent networking configuration across resources.

---

`38-46`: **IAM module integration correctly passes required identifiers.**  
The integration passes important values like the account ID and `db_name` from the caller identity, ensuring that IAM resources are correctly scoped.

---

`47-58`: **Storage module is configured with essential database parameters and networking integrations.**  
All necessary database credentials and networking outputs (such as the RDS security group ID and subnets) are passed correctly.

---

`60-67`: **Bastion module is properly configured with networking and IAM outputs.**  
The module receives the subnet, instance profile name, and security group (from the networking module) required for a secure bastion setup.

---

`69-77`: **Load Balancer module setup is appropriate.**  
The VPC ID, public subnets, and security groups are passed to the module, ensuring a proper LB configuration.

---

`78-125`: **Compute module configuration is comprehensive and well-integrated.**  
All relevant variables—including repository URLs, service role ARNs, and environment variables for Hasura and database connections—are passed to the compute module. Double-check that sensitive information is handled securely outside of version control.

</details>
<details>
<summary>deployment/modules/compute/variables.tf (9)</summary>

`1-11`: **Basic compute module variables are defined.**  
Variables such as `region`, `app_name`, and `app_environment` are declared to ensure that the module can be instantiated with the proper context.

---

`12-21`: **Subnet configuration variables are clearly defined.**  
`public_subnets` and `private_subnets` are specified as lists of strings, ensuring correct subnet input for deploying resources.

---

`23-31`: **NODE_ENV and retry parameters are correctly declared.**  
Declaring environment variables and retry parameters as strings is proper for passing configuration to containerized applications.

---

`51-67`: **API service settings are well-defined.**  
The settings for `api_repository_url`, `api_image_tag`, `api_service_role_arn`, and `api_security_group_id` ensure that the API service can be correctly provisioned.

---

`69-73`: **Load balancer target group ARN is appropriately declared.**  
This variable will be used to integrate with the load balancer module.

---

`77-99`: **Processing service settings are clearly defined.**  
Variables for the processing repository URL, image tag, service role ARN, and security group ID are accurately specified.

---

`100-127`: **API environment variables for Datalayer Hasura are comprehensively declared.**  
The variables include the database URL, exposed port, and related configurations—providing clear context for the Hasura environment.

---

`129-181`: **Hasura telemetry, dev mode, and logging variables are correctly defined.**  
This block details settings for telemetry, development mode, internal errors, log types, and naming conventions with clear descriptions.

---

`196-242`: **Remaining variables for DATABASE_URL, INDEXER_GRAPHQL_URL, METADATA_SOURCE, PUBLIC_GATEWAY_URLS, PRICING_SOURCE, COINGECKO_API_KEY, COINGECKO_API_TYPE, and LOG_LEVEL are accurately defined.**  
Each variable is documented and typed, which supports robust configuration management for the compute module.

</details>
<details>
<summary>deployment/modules/compute/main.tf (4)</summary>

`1-4`: **Local variables for ECS configurations are well-defined.**  
The `locals` block neatly forms the CloudWatch log group name and container name using the app’s name and environment.

---

`6-78`: **ECS module configuration is comprehensive.**  
The ECS module from the Terraform AWS modules is used correctly to define the cluster settings, log group, and services. Note the dynamic creation of processing services using a for‑expression over `var.CHAINS`. Remember to verify that the `id` type in `CHAINS` is consistent (see earlier notes).

---

`81-141`: **API Task Definition is correctly set up.**  
The API task definition includes container definitions (with environment variables built via a loop), health checks, port mappings, and detailed log configurations. The use of `jsonencode` helps keep the JSON valid.

---

`143-234`: **Processing Task Definitions are dynamically created per chain.**  
Using a `for_each` loop to generate a task definition for each element in `var.CHAINS` is a solid design choice. The environment variables and log configuration are well-handled. Again, please verify that the `CHAINS` variable’s type (especially the `id` field) is consistent with your other modules.

</details>
<details>
<summary>deployment/README.md (8)</summary>

`1-2`: **Well-Structured Title Section**  
The header clearly introduces the deployment module, giving readers immediate context about the content of the document.

---

`3-7`: **Clear Overview Section**  
The overview succinctly describes the role of the deployment module and its reliance on Terraform for AWS resource management. This sets a solid context for the rest of the document.

---

`7-15`: **Informative "Getting Started" & Prerequisites**  
The "Getting Started" section along with the prerequisites list are well-written. They include links to the Terraform and AWS CLI downloads, ensuring that users install the required tools before proceeding.

---

`38-42`: **Terraform Initialization Step**  
The instructions for initializing the Terraform workspace using `terraform init` are straightforward and correctly isolated.

---

`44-48`: **Deployment Plan Review Step**  
The snippet demonstrating how to run `terraform plan` provides a clear instruction for reviewing the upcoming changes. This is essential for users to verify what Terraform intends to change before applying the configuration.

---

`50-54`: **Apply Changes Instruction**  
The directions to use `terraform apply` are concise and correctly formatted. This step is critical and is well-conveyed to the user.

---

`56-60`: **Infrastructure Teardown Instruction**  
The guide to destroying deployed infrastructure via `terraform destroy` is clear and adds a useful reversible step to the documentation.

---

`108-115`: **Detailed Docker Deployment Instructions for ECR**  
The final section provides a complete set of commands for deploying a Docker image to the ECR repository. The use of code blocks ensures that users can easily copy and execute the commands. Optionally, a brief explanation of each command (or links to relevant Docker/ECR documentation) might benefit less experienced users.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->

Comment on lines +1 to +3
output "bastion_public_ip" {
value = aws_instance.bastion.public_ip
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Mark the bastion public IP as sensitive.

The bastion host's public IP should be marked as sensitive to prevent it from being displayed in logs or outputs.

 output "bastion_public_ip" {
   value = aws_instance.bastion.public_ip
+  sensitive = true
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
output "bastion_public_ip" {
value = aws_instance.bastion.public_ip
}
output "bastion_public_ip" {
value = aws_instance.bastion.public_ip
sensitive = true
}

Comment on lines +28 to +36
resource "aws_lb_listener" "api_listener" {
load_balancer_arn = aws_lb.load_balancer.arn
port = 80
protocol = "HTTP"
default_action {
type = "forward"
target_group_arn = aws_lb_target_group.api_target_group.arn
}
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

⚠️ Potential issue

Listener Security – Consider Upgrading to TLS
The listener is currently configured to use HTTP on port 80. However, as noted by the static analysis hint (CKV_AWS_103), it is recommended to use at least TLS 1.2 for secure communications. If sensitive data is transmitted, consider updating the listener to use HTTPS with a valid certificate.

Suggested Diff (if switching to HTTPS):

-resource "aws_lb_listener" "api_listener" {
-  load_balancer_arn = aws_lb.load_balancer.arn
-  port              = 80
-  protocol          = "HTTP"
-  default_action {
-    type             = "forward"
-    target_group_arn = aws_lb_target_group.api_target_group.arn
-  }
-}
+resource "aws_lb_listener" "api_listener" {
+  load_balancer_arn = aws_lb.load_balancer.arn
+  port              = 443
+  protocol          = "HTTPS"
+  ssl_policy        = "ELBSecurityPolicy-TLS-1-2-2017-01"
+  certificate_arn   = var.certificate_arn  # Ensure this variable is defined with your certificate ARN
+  default_action {
+    type             = "forward"
+    target_group_arn = aws_lb_target_group.api_target_group.arn
+  }
+}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
resource "aws_lb_listener" "api_listener" {
load_balancer_arn = aws_lb.load_balancer.arn
port = 80
protocol = "HTTP"
default_action {
type = "forward"
target_group_arn = aws_lb_target_group.api_target_group.arn
}
}
resource "aws_lb_listener" "api_listener" {
load_balancer_arn = aws_lb.load_balancer.arn
port = 443
protocol = "HTTPS"
ssl_policy = "ELBSecurityPolicy-TLS-1-2-2017-01"
certificate_arn = var.certificate_arn # Ensure this variable is defined with your certificate ARN
default_action {
type = "forward"
target_group_arn = aws_lb_target_group.api_target_group.arn
}
}
🧰 Tools
🪛 Checkov (3.2.334)

[HIGH] 28-36: Ensure that load balancer is using at least TLS 1.2

(CKV_AWS_103)

Comment on lines +53 to +85
resource "aws_security_group" "rds" {

name = "${var.app_name}-${var.app_environment}-rds-sg"
vpc_id = module.vpc.vpc_id

# Allow access from private subnets (for processing service)
ingress {
from_port = 5432 # Default PostgreSQL port
to_port = 5432
protocol = "tcp"
cidr_blocks = module.vpc.private_subnets_cidr_blocks # Allow access from private subnets
}

# Allow access from public subnets (for API)
ingress {
from_port = 5432 # Default PostgreSQL port
to_port = 5432
protocol = "tcp"
cidr_blocks = module.vpc.public_subnets_cidr_blocks # Allow access from public subnets
}

egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}

tags = {
Name = "${var.app_name}-${var.app_environment}-rds-sg"
Environment = var.app_environment
}
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

RDS Security Group – Review Public Ingress Rule
The RDS security group allows ingress on port 5432 both from private and public subnets. While access from private subnets is typical for backend communication, granting access from public subnets can increase exposure to the internet. Please verify if this configuration is intentional; if not, restrict ingress to only trusted sources.

Comment on lines +1 to +23
# Directorio de dependencias locales de Terraform
.terraform/

# Archivos de estado de Terraform (contienen información sensible)
terraform.tfstate
terraform.tfstate.backup

# Logs y archivos de crash
crash.log

# Archivos de override (no versionables)
override.tf
override.tf.json
*_override.tf
*_override.tf.json

# Archivos de configuración local de Terraform CLI
.terraformrc
terraform.rc

# Archivos de variables sensibles
*.tfvars
*.tfvars.json
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i think this should be in english 😅 (hope Maradona isn't watching this from heaven)

Comment on lines +9 to +14
required_providers {
aws = {
source = "hashicorp/aws"
version = "5.84.0"
}
}
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should also pin or set a min version for Terraform itself

https://developer.hashicorp.com/terraform/tutorials/configuration-language/versions

@@ -0,0 +1,125 @@
terraform {
backend "s3" {
bucket = "gitcoin-datalayer-staging-terraform-state"
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

great that we use remote state 💯

Comment on lines +36 to +54
variable "RETRY_MAX_ATTEMPTS" {
description = "Retry max attempts"
type = string
}

variable "RETRY_BASE_DELAY_MS" {
description = "Retry base delay in milliseconds"
type = string
}

variable "RETRY_MAX_DELAY_MS" {
description = "Retry max delay in milliseconds"
type = string
}

variable "RETRY_FACTOR" {
description = "Retry factor"
type = string
}
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

shouldn't all of them be number?

Comment on lines +11 to +13
tags = {
Name = "${var.app_name}-${var.app_environment}-bastion"
}
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we could levarage a common tag for all resources (eg. Project = "DataLayer"), so it's easier to filter by it, wdyt?

Comment on lines +192 to +195
# {
# name = "INDEXER_ADMIN_SECRET"
# value = var.INDEXER_ADMIN_SECRET
# },
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is this supposed to be commented out?

Comment on lines +97 to +116
# ECR access policy
resource "aws_iam_policy" "ecr_access_policy" {
name = "${var.app_name}-${var.app_environment}-ECRAccessPolicy"

policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Effect = "Allow",
Action = [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage"
],
Resource = "*"
}
]
})
}
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

agree with the rabbit here

Comment on lines +124 to +125
from_port = 0
to_port = 65535
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

all ports is correct?

@0xkenj1
Copy link
Copy Markdown
Contributor Author

0xkenj1 commented Mar 5, 2025

Closed and opened #88

@0xkenj1 0xkenj1 closed this Mar 5, 2025
@thelostone-mc thelostone-mc deleted the feat/terraform-deployment branch March 20, 2025 16:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants