Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
a5b5b73
refactor: audit-driven surgical cleanup (dead code, React keys, CI, s…
jinglescode May 1, 2026
5777084
chore(ci): gate typecheck/test/build; add dependabot
jinglescode May 10, 2026
ed321fe
fix(build): lazy-init mainnet provider; remove global sideEffects:false
jinglescode May 10, 2026
074ac9a
feat(server): AuditLog table, DB indexes, security hardening, observa…
jinglescode May 10, 2026
749c593
refactor(wallet-flow): stable signerIds for React keys; tripwire test
jinglescode May 10, 2026
c9fb61b
chore(ui): a11y skip-link, useMemo transaction parse, cleanup deletions
jinglescode May 10, 2026
a634525
fix(wallet-assets): show actual IPFS NFT image instead of hardcoded CID
jinglescode May 10, 2026
f6d9cfe
chore(proxy): remove three write-only useState declarations
jinglescode May 10, 2026
9e4eed1
Merge pull request #236 from MeshJS/fix/build-ssr-provider
jinglescode May 10, 2026
56ed3b4
Merge pull request #237 from MeshJS/feat/server-hardening-and-audit-log
jinglescode May 10, 2026
8303f89
Merge pull request #235 from MeshJS/chore/ci-and-deps
jinglescode May 10, 2026
94cd08e
Merge pull request #247 from MeshJS/refactor/wallet-flow-shared
jinglescode May 10, 2026
c376851
Merge pull request #249 from MeshJS/chore/ui-cleanup-and-hooks
jinglescode May 10, 2026
4ff1d0a
Merge pull request #240 from MeshJS/fix/wallet-assets-ipfs-image
jinglescode May 10, 2026
2d8b5ef
Merge pull request #241 from MeshJS/chore/remove-dead-proxy-state
jinglescode May 10, 2026
39a0c9b
chore: remove Nostr chat system
jinglescode May 10, 2026
80fbe91
Merge pull request #253 from MeshJS/chore/remove-chat-system
jinglescode May 10, 2026
a02ad79
feat: agent onboarding, governance overview, wallet transfer, ballot UX
QSchlegel May 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
open-pull-requests-limit: 5
groups:
mesh-sdk:
patterns:
- "@meshsdk/*"
next:
patterns:
- "next"
- "next-*"
- "@next/*"
prisma:
patterns:
- "prisma"
- "@prisma/*"
trpc:
patterns:
- "@trpc/*"
types:
patterns:
- "@types/*"
update-types:
- "minor"
- "patch"
labels:
- "dependencies"

- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "monthly"
labels:
- "dependencies"
- "ci"
47 changes: 47 additions & 0 deletions .github/workflows/pr-checks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: PR Checks

on:
pull_request:
branches: [main]
push:
branches: [main]

concurrency:
group: pr-checks-${{ github.ref }}
cancel-in-progress: true

jobs:
checks:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'

- name: Install dependencies
run: npm ci

- name: Generate Prisma client
run: npx prisma generate

# Lint stays non-blocking until the rule set is cleaned up; tracked separately.
- name: Lint
run: npm run lint
continue-on-error: true

# Typecheck, test, and build are gates — failures must fail the PR.
- name: Type check
run: npx tsc --noEmit

- name: Test
run: npm run test:ci

- name: Build
run: npm run build
env:
SKIP_ENV_VALIDATION: 'true'
11 changes: 5 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ A comprehensive, enterprise-grade multi-signature wallet solution built on Carda
- Secure multi-sig staking operations

### Collaboration
- Real-time Nostr-based chat
- Discord integration for notifications
- Signer verification via message signing
- Automated transaction alerts
Expand Down Expand Up @@ -188,11 +187,11 @@ graph TD
### Database Schema
```prisma
model User {
id String @id @default(cuid())
address String @unique
stakeAddress String @unique
nostrKey String @unique
discordId String @default("")
id String @id @default(cuid())
address String @unique
stakeAddress String @unique
nostrKey String? @unique
discordId String @default("")
}

model Wallet {
Expand Down
5 changes: 5 additions & 0 deletions jest.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,11 @@ export default {
},
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/src/$1',
'\\.(css|less|scss|sass)$': '<rootDir>/src/__tests__/__mocks__/styleMock.cjs',
},
transformIgnorePatterns: [
'/node_modules/(?!(superjson|copy-anything|is-what|@trpc|@meshsdk|@noble|@sidan-lab|nanoid|jose|uuid)/)',
],
collectCoverageFrom: [
'src/**/*.{ts,tsx}',
'!src/**/*.d.ts',
Expand All @@ -28,6 +32,7 @@ export default {
coverageProvider: 'v8',
coverageDirectory: 'coverage',
coverageReporters: ['text', 'lcov', 'html'],
setupFiles: ['<rootDir>/src/__tests__/setupEnv.cjs'],
setupFilesAfterEnv: ['<rootDir>/src/__tests__/setup.ts'],
testTimeout: 10000,
verbose: true,
Expand Down
33 changes: 30 additions & 3 deletions next.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,16 @@ const config = {
layers: true,
};

// Optimize tree-shaking by ensuring proper module resolution
// Optimize tree-shaking by ensuring proper module resolution.
// Note: do NOT set `sideEffects: false` globally — it tells webpack that
// every file is side-effect-free, which silently strips CSS imports,
// polyfills, and other modules that exist purely for their side effects.
// Per-package sideEffects flags in package.json are the correct surface.
config.optimization = {
...config.optimization,
usedExports: true,
sideEffects: false,
};

// Handle CommonJS modules that don't support named exports
config.resolve = {
...config.resolve,
Expand All @@ -75,6 +78,30 @@ const config = {

// External packages for server components to avoid bundling issues
serverExternalPackages: ["@fabianbormann/cardano-peer-connect"],

async rewrites() {
return [
{ source: "/llms.txt", destination: "/api/llms-txt" },
];
},

// Basic security headers applied to all routes.
// NOTE: Content-Security-Policy and Strict-Transport-Security are intentionally
// omitted — CSP would break inline scripts/styles and HSTS locks browsers to
// HTTPS for max-age and should only be enabled after team review.
async headers() {
return [
{
source: '/:path*',
headers: [
{ key: 'X-Frame-Options', value: 'SAMEORIGIN' },
{ key: 'X-Content-Type-Options', value: 'nosniff' },
{ key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' },
{ key: 'Permissions-Policy', value: 'camera=(), microphone=(), geolocation=()' },
],
},
];
},
};

// Bundle analyzer - only enable when ANALYZE env var is set
Expand Down
Loading