diff --git a/.github/workflows/README.md b/.github/workflows/README.md
new file mode 100644
index 0000000..120f81c
--- /dev/null
+++ b/.github/workflows/README.md
@@ -0,0 +1,36 @@
+# CI/CD Workflow
+
+This directory contains GitHub Actions workflows for automated testing and validation.
+
+## CI / Validation Workflow (`.github/workflows/test.yml`)
+
+**Purpose**: Prevents regressions by running all test suites and linting on every pull request to main.
+
+**Triggers**:
+
+- Pull requests targeting the `main` branch
+
+**What it does**:
+
+1. **Setup**: Installs Rust (stable) and Node.js (v20) with dependency caching
+2. **Dependency Installation**: Uses `npm install` for both backend and frontend
+3. **Code Quality**: Runs linting on both backend and frontend (if configured)
+4. **Backend Tests**: Runs `npm test` in `/backend` (Vitest + TypeScript)
+5. **Frontend Tests**: Runs `npm test --if-present` in `/frontend` (no test framework configured yet)
+6. **Smart Contract Tests**: Runs `cargo test` in `/contracts` (Rust)
+
+**Failure Behavior**:
+
+- Workflow fails if any test or linting step fails
+- Blocks PR merge until all checks pass
+- Uses `--if-present` to avoid failures when test scripts are missing
+
+**Requirements for Contributors**:
+
+- Ensure lint and test scripts are properly configured in `package.json`
+- Tests must pass in all directories where they exist
+- New dependencies should be added to respective `package.json` files
+- Backend uses Vitest, frontend has no test framework configured yet
+- react-hot-toast is available as a root dependency
+
+**Note**: The workflow uses `continue-on-error: false` to ensure strict validation - any failure will prevent the PR from being merged.
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
new file mode 100644
index 0000000..01660c9
--- /dev/null
+++ b/.github/workflows/test.yml
@@ -0,0 +1,68 @@
+name: CI / Validation
+
+on:
+ pull_request:
+ branches: [main]
+
+jobs:
+ test:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Install Rust
+ uses: dtolnay/rust-toolchain@stable
+ with:
+ toolchain: stable
+
+ - name: Install Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: "20"
+ cache: "npm"
+
+ - name: Cache Rust dependencies
+ uses: actions/cache@v4
+ with:
+ path: |
+ ~/.cargo/registry
+ ~/.cargo/git
+ contracts/target
+ key: ${{ runner.os }}-cargo-${{ hashFiles('contracts/**/Cargo.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-cargo-
+
+ - name: Install backend dependencies
+ run: npm install
+ working-directory: ./backend
+
+ - name: Install frontend dependencies
+ run: npm install
+ working-directory: ./frontend
+
+ - name: Run linting (backend)
+ run: npm run lint --if-present
+ working-directory: ./backend
+ continue-on-error: false
+
+ - name: Run linting (frontend)
+ run: npm run lint --if-present
+ working-directory: ./frontend
+ continue-on-error: false
+
+ - name: Run Rust tests
+ run: cargo test
+ working-directory: ./contracts
+ continue-on-error: false
+
+ - name: Run backend tests
+ run: npm test
+ working-directory: ./backend
+ continue-on-error: false
+
+ - name: Run frontend tests
+ run: npm test
+ working-directory: ./frontend
+ continue-on-error: false
diff --git a/backend/package.json b/backend/package.json
index e61b139..de75230 100644
--- a/backend/package.json
+++ b/backend/package.json
@@ -40,6 +40,9 @@
"@types/cors": "^2.8.19",
"@types/express": "^5.0.6",
"@types/node": "^25.2.3",
+
+ "@types/supertest": "^6.0.3",
+
"@types/pg": "^8.16.0",
"@types/supertest": "^7.2.0",
"@types/swagger-jsdoc": "^6.0.4",
diff --git a/backend/tsconfig.json b/backend/tsconfig.json
index cfba994..2f81df9 100644
--- a/backend/tsconfig.json
+++ b/backend/tsconfig.json
@@ -43,4 +43,4 @@
"src/**/*",
"tests/**/*"
]
-}
\ No newline at end of file
+}
diff --git a/frontend/__tests__/setup.ts b/frontend/__tests__/setup.ts
new file mode 100644
index 0000000..d0de870
--- /dev/null
+++ b/frontend/__tests__/setup.ts
@@ -0,0 +1 @@
+import "@testing-library/jest-dom";
diff --git a/frontend/app/layout.tsx b/frontend/app/layout.tsx
index f92b217..288f6b5 100644
--- a/frontend/app/layout.tsx
+++ b/frontend/app/layout.tsx
@@ -2,13 +2,11 @@ import type { Metadata } from "next";
import { IBM_Plex_Mono, Sora } from "next/font/google";
import React from "react";
-import "./globals.css";
-import { WalletProvider } from "@/context/wallet-context";
-import { Toaster } from "react-hot-toast";
import { ThemeProvider } from "@/context/theme-provider";
-import { Banner } from "@/components/ui/Banner";
-import bannerConfig from "@/lib/banner.config";
+import { WalletProvider } from "@/context/wallet-context";
import Link from "next/link";
+import { Toaster } from "react-hot-toast";
+import "./globals.css";
const sora = Sora({
variable: "--font-display",
@@ -41,44 +39,50 @@ export default function RootLayout({
enableSystem={false}
disableTransitionOnChange
>
-
-
-
-
-
- FlowFi
-
-
-
-
-
-
- {children}
-
+
+
+
+
+
+ FlowFi
+
+
+
+
+
+
+ {children}
+