Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
131 commits
Select commit Hold shift + click to select a range
584b8cd
wip
AugustoL Nov 29, 2025
5d06f82
Update logo URL in README.md
AugustoL Nov 29, 2025
85a775a
Update GitHub Pages URL in README
AugustoL Nov 30, 2025
f0f23d6
Update biome scripts
MatiasOS Nov 30, 2025
2076bc8
Make biome happy :)
MatiasOS Nov 30, 2025
298199f
Claude: Add biome directives
MatiasOS Nov 30, 2025
74d1d2b
Docs: Add githook explainer
MatiasOS Nov 30, 2025
33751c1
Add biome to GH Actions
MatiasOS Dec 1, 2025
12dfab5
Add check script
MatiasOS Dec 1, 2025
663ca8f
Fix/ignore all biome warnings
MatiasOS Dec 1, 2025
5cb57c0
feat:Add subscriptions page
AugustoL Dec 1, 2025
19c9a5c
fix:Fix PR preview deployment for fork PRs
AugustoL Dec 1, 2025
e38be19
Merge pull request #76 from MatiasOS/65-define-coding-rules
AugustoL Dec 1, 2025
06d308b
Merge remote-tracking branch 'openscan-explorer/dev' into add-subscri…
AugustoL Dec 1, 2025
368c60f
feat(networks): load network configs from external metadata repository
AugustoL Dec 1, 2025
458035b
fix(networks): resolve race condition preventing networks from displa…
AugustoL Dec 1, 2025
0e7345a
feat(contracts): add OpenScanPayment contract with tests
AugustoL Dec 1, 2025
35091cc
chore(deps): add @openzeppelin/contracts dependency
AugustoL Dec 1, 2025
03cbd9c
fix: Change colour of input parameters on write function
AugustoL Dec 1, 2025
3111598
feat(devtools): add Message Signer to signatures section
AugustoL Dec 2, 2025
daa717c
fix(devtools): add message type toggle to Signature Inspector
AugustoL Dec 2, 2025
687358d
feat(address): show decoded function names in transaction table
AugustoL Dec 2, 2025
7d536d9
Merge pull request #77 from AugustoL/add-subscriptions-page
AugustoL Dec 2, 2025
2a9a955
feat(tx): decode input data and events for verified contracts
AugustoL Dec 2, 2025
a2a7748
Merge pull request #78 from AugustoL/networks-from-metadata
AugustoL Dec 2, 2025
9989912
config: add OpenScanPayment contract address constant
AugustoL Dec 2, 2025
a68ad6d
Merge remote-tracking branch 'openscan-explorer/dev' into add-payment…
AugustoL Dec 2, 2025
af186af
feat(subscriptions): add payment help images and update navbar icon
AugustoL Dec 2, 2025
93c26a0
Merge remote-tracking branch 'openscan-explorer/dev' into add-ens-dom…
AugustoL Dec 2, 2025
1298549
Merge openscan-explorer/dev into add-ens-domains
AugustoL Dec 2, 2025
a75c8ce
refactor: extract search logic into useSearch hook
AugustoL Dec 2, 2025
0a3b460
fix: resolve biome linting and accessibility issues
AugustoL Dec 2, 2025
a6c0954
Merge pull request #79 from AugustoL/add-payment-contract
AugustoL Dec 4, 2025
5b0366d
Merge branch 'dev' into add-ens-domains
AugustoL Dec 4, 2025
6a8d6fc
refactor: rename chain to network and reorganize page structure
AugustoL Dec 4, 2025
b443254
Merge pull request #80 from AugustoL/add-ens-domains
AugustoL Dec 4, 2025
edc005f
Merge branch 'dev' into refactor-network-home
AugustoL Dec 4, 2025
dd86a20
fix:npm run check errors
AugustoL Dec 4, 2025
d0e3cb3
refactor: reorganize page components into dedicated directories
AugustoL Dec 4, 2025
f059ba7
Merge pull request #81 from AugustoL/refactor-network-home
AugustoL Dec 4, 2025
35e9888
feat: add supporters page
AugustoL Dec 4, 2025
e598f0e
feat: add profile pages for networks, apps, and organizations
AugustoL Dec 4, 2025
d77198f
Merge pull request #82 from AugustoL/refactor-pages
AugustoL Dec 4, 2025
0a8d12a
fix: update MetadataService for new explorer-metadata structure
AugustoL Dec 4, 2025
cf99bd2
fix: combine PR preview build and deploy for fork PR support
AugustoL Dec 5, 2025
b35b802
fix: use dynamic publicPath for assets in index.html
AugustoL Dec 5, 2025
f543c64
refactor: move AddressDisplay inline styles to CSS classes
AugustoL Dec 5, 2025
68e65a6
feat: refactor address page with type-based display components
AugustoL Dec 5, 2025
1066620
chore: remove deprecated AddressDisplay.tsx
AugustoL Dec 5, 2025
78b1b1b
feat: add NFT token detail pages for ERC721 and ERC1155
AugustoL Dec 5, 2025
a1cbd56
fix: lint fixes
AugustoL Dec 6, 2025
a1091c1
Merge pull request #83 from AugustoL/supporters-profile-pages
AugustoL Dec 6, 2025
82d5f47
Merge pull request #84 from AugustoL/refactor-address-page
AugustoL Dec 6, 2025
7de8fd4
feat: Update and add rules to claude.md
AugustoL Dec 8, 2025
603f530
chore: change default dev server port to 3030
AugustoL Dec 8, 2025
e93e84e
feat: add theme toggle to navbar and reorganize footer
AugustoL Dec 8, 2025
ebebf1b
feat: add page titles to devtools and settings pages
AugustoL Dec 8, 2025
b3e5c53
refactor: use rainbowkit styles from package instead of local copy
AugustoL Dec 8, 2025
c1fd9f8
refactor: migrate CSS to theme variables and remove .light-theme over…
AugustoL Dec 8, 2025
c8a0020
fix(ui): Update colours to match better the theme changes
AugustoL Dec 9, 2025
3074d7d
feat(ui): Small changes in block view
AugustoL Dec 9, 2025
a448f43
feat(ui): show contract bytecode always for contracts
AugustoL Dec 9, 2025
35327d6
fix: lint fixes
AugustoL Dec 9, 2025
ef03309
refactor(css): migrate hardcoded colors to theme variables
AugustoL Dec 9, 2025
b43a044
fix(theme): make theme toggle a direct light/dark switch
AugustoL Dec 9, 2025
77152bb
refactor(css): replace remaining hardcoded colors with theme variables
AugustoL Dec 9, 2025
295c621
feat(ui): wrap settings and devtools in page-card container
AugustoL Dec 9, 2025
5ac660e
feat(ui): rmeove light theme overrides
AugustoL Dec 9, 2025
99a8dec
refactor(css): simplify block-display-card to share page-card styles
AugustoL Dec 9, 2025
25170b0
refactor(css): consolidate duplicate styles and create base utilities
AugustoL Dec 9, 2025
a3ffdf1
Merge pull request #86 from AugustoL/refactor-ui
AugustoL Dec 10, 2025
2ca11e4
biome: Dont lint unsorted imports
MatiasOS Dec 9, 2025
750ce6c
network-connectors: Remove dead code
MatiasOS Dec 9, 2025
63cde80
adapters: Add EVM, BNB, Optimism
MatiasOS Dec 9, 2025
71bb4a2
dataService: Update hook and service
MatiasOS Dec 9, 2025
830b1dc
NetworkBlockIndicator: Use RpcClient from explorer-network-connector
MatiasOS Dec 9, 2025
8a93c57
Update new dataService in all pages
MatiasOS Dec 9, 2025
1d93cb7
Add Polygon adapter
MatiasOS Dec 9, 2025
773f4ba
Update module bundler
MatiasOS Dec 9, 2025
18b3d85
Add Base adapter
MatiasOS Dec 9, 2025
3a22630
Add arbitrum adapter
MatiasOS Dec 9, 2025
22e1c12
Add explorer-network-connectors
MatiasOS Dec 9, 2025
e603df8
Add Sepolia using EVMAdapter
MatiasOS Dec 9, 2025
0573567
Add BNB Testnet
MatiasOS Dec 10, 2025
8e60684
chore: Bump explorer-network-connectors to 0.0.2
MatiasOS Dec 10, 2025
f6a3748
Merge pull request #85 from MatiasOS/60-update-network-connectors
MatiasOS Dec 10, 2025
93b55b4
feat(e2e): add Playwright E2E tests for block, transaction, and addre…
AugustoL Dec 10, 2025
99ec198
fix(e2e): update transaction tests to use hash-indexed fixtures
AugustoL Dec 10, 2025
4bb1dee
fix(e2e): run tests in headless mode by default
AugustoL Dec 10, 2025
03b1ef9
test(e2e): add comprehensive ERC721/ERC1155 and token detail tests
AugustoL Dec 10, 2025
ee7b76f
test(e2e): add comprehensive BAYC token detail tests
AugustoL Dec 10, 2025
1acf7ea
docs: add E2E tests section to README
AugustoL Dec 11, 2025
1c1987a
docs:update readme
AugustoL Dec 11, 2025
3a43927
fix: fix index redirection on error page
AugustoL Dec 11, 2025
722b4a7
feat: add home page search bar with ENS support
AugustoL Dec 11, 2025
5d75ee3
feat: add subdomain routing system
AugustoL Dec 11, 2025
4419ba3
feat: inject Hardhat network in development mode
AugustoL Dec 11, 2025
a032d5d
Merge pull request #88 from AugustoL/add-e2e-tests
AugustoL Dec 11, 2025
a064764
feat: show all subdomain networks in navbar dropdown
AugustoL Dec 11, 2025
0352787
chore: bump explorer-network-connectors to 0.1.0
AugustoL Dec 11, 2025
e48afa9
Merge pull request #89 from AugustoL/add-home-search
AugustoL Dec 12, 2025
0727332
fix: address critical code issues from code review
AugustoL Dec 12, 2025
8dc6af2
fix: improve type safety in core types
AugustoL Dec 12, 2025
8387688
perf: memoize AppContext value and callbacks
AugustoL Dec 12, 2025
f5941d5
perf: memoize ENSService instances in hooks
AugustoL Dec 12, 2025
f317277
style: fix CSS duplication and add responsive design
AugustoL Dec 12, 2025
0d66c3d
style: replace inline styles with CSS classes and custom properties
AugustoL Dec 12, 2025
cd5e616
chore: add GitHub issue template for bug reports
AugustoL Dec 12, 2025
9a34397
feat: add Report a Bug link in footer
AugustoL Dec 12, 2025
493d0d7
style: improve settings page layout
AugustoL Dec 12, 2025
cca7575
feat: add drag-and-drop reordering and delete for RPC endpoints
AugustoL Dec 12, 2025
40fd2a1
feat: add fetch RPCs from Chainlist button
AugustoL Dec 13, 2025
d48ee9f
fix: resolve RPC delete and drag state management issues
AugustoL Dec 15, 2025
66b41f9
feat(about): redesign page with vision, principles, and GitHub stats
AugustoL Dec 15, 2025
ea73d77
Merge pull request #92 from AugustoL/minor-fixes
AugustoL Dec 15, 2025
8e0bece
Merge branch 'dev' into about-page
AugustoL Dec 15, 2025
aa9c970
Merge pull request #93 from AugustoL/improve-rpc-config
MatiasOS Dec 15, 2025
f67ea69
Merge pull request #94 from AugustoL/about-page
MatiasOS Dec 16, 2025
42c809f
fix: Normalize block number handling across adapters
MatiasOS Dec 18, 2025
ecb02cf
fix: skip subdomain redirect for Netlify and GitHub Pages URLs
AugustoL Dec 18, 2025
771d366
Merge pull request #95 from MatiasOS/fix-blocks-display
MatiasOS Dec 18, 2025
2dc12e6
Merge pull request #96 from AugustoL/fix-subdomian-netlify
AugustoL Dec 18, 2025
a306cb2
fix: Don't include 'wss://' urls from chainList
MatiasOS Dec 18, 2025
6c0344c
feat: Limit maximum RPCs used by parallel strategy
MatiasOS Dec 18, 2025
121e1b4
docs: add contributing guide and PR template
AugustoL Dec 19, 2025
ba9e556
Merge pull request #97 from MatiasOS/add-max-rpcs-to-parallel-strategy
MatiasOS Dec 19, 2025
3182177
refactor: use local networks.json instead of fetching from metadata
AugustoL Dec 19, 2025
a5d6a8d
Merge pull request #102 from AugustoL/refactor/networks-metadata
AugustoL Dec 23, 2025
2add9ce
Merge pull request #101 from AugustoL/docs/add-contributing
AugustoL Dec 23, 2025
6d95f50
fix(navbar): properly redirect from dropdown
MatiasOS Dec 24, 2025
2017ea0
Merge pull request #105 from MatiasOS/router/fix-navbar-dropdown-navi…
MatiasOS Dec 29, 2025
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
33 changes: 33 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
---
name: Bug Report
about: Report a bug or unexpected behavior
title: "[BUG] "
labels: bug
assignees: ''
---

## Description
A clear and concise description of the bug.

## Steps to Reproduce
1. Go to '...'
2. Click on '...'
3. Scroll down to '...'
4. See error

## Expected Behavior
What you expected to happen.

## Actual Behavior
What actually happened.

## Screenshots
If applicable, add screenshots to help explain your problem.

## Environment
- **Browser**: [e.g., Chrome 120, Firefox 121]
- **OS**: [e.g., Windows 11, macOS 14, Ubuntu 22.04]
- **Network**: [e.g., Ethereum Mainnet, Arbitrum, Localhost]

## Additional Context
Add any other context about the problem here.
37 changes: 37 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
## Description

<!-- Brief description of the changes in this PR -->

## Related Issue

<!-- Link to the related issue (e.g., Closes #123) -->

## Type of Change

- [ ] Bug fix
- [ ] New feature
- [ ] Documentation update
- [ ] Refactoring
- [ ] Performance improvement
- [ ] Other (please describe):

## Changes Made

<!-- List the main changes made in this PR -->

## Screenshots (if applicable)

<!-- Add screenshots to help explain your changes -->

## Checklist

- [ ] I have run `npm run format:fix` and `npm run lint:fix`
- [ ] I have run `npm run typecheck` with no errors
- [ ] I have run tests with `npm run test:run`
- [ ] I have tested my changes locally
- [ ] I have updated documentation if needed
- [ ] My code follows the project's architecture patterns

## Additional Notes

<!-- Any additional information that reviewers should know -->
35 changes: 18 additions & 17 deletions .github/workflows/deploy-pr-preview.yml
Original file line number Diff line number Diff line change
@@ -1,28 +1,29 @@
name: Deploy PR Preview to Netlify
name: Build and Deploy PR Preview

on:
workflow_dispatch:
pull_request:
pull_request_target:
types: [opened, synchronize, reopened]

permissions:
contents: read
pull-requests: write

jobs:
deploy-preview:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
- name: Checkout PR head
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'npm'
cache-dependency-path: './package-lock.json'

- name: Update npm to v11
run: npm install -g npm@11

Expand All @@ -36,34 +37,34 @@ jobs:
publish-dir: './dist'
production-deploy: false
github-token: ${{ secrets.GITHUB_TOKEN }}
deploy-message: "PR Preview - ${{ github.event.pull_request.title || github.ref_name }}"
alias: pr-${{ github.event.pull_request.number || github.run_id }}
deploy-message: "PR Preview #${{ github.event.pull_request.number }}"
alias: pr-${{ github.event.pull_request.number }}
enable-pull-request-comment: false
enable-commit-comment: false
env:
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}

- name: Comment PR with Preview URL
if: github.event_name == 'pull_request'
uses: actions/github-script@v7
with:
script: |
const prNumber = ${{ github.event.pull_request.number }};
const deployUrl = '${{ steps.netlify.outputs.deploy-url }}';
const body = `🚀 **Preview:** ${deployUrl}\n📝 **Commit:** \`${{ github.sha }}\``;
const body = `🚀 **Preview:** ${deployUrl}\n📝 **Commit:** \`${{ github.event.pull_request.head.sha }}\``;

// Find existing comment
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
issue_number: prNumber,
});
const botComment = comments.find(comment =>
comment.user.type === 'Bot' &&

const botComment = comments.find(comment =>
comment.user.type === 'Bot' &&
comment.body.includes('Preview:')
);

if (botComment) {
await github.rest.issues.updateComment({
owner: context.repo.owner,
Expand All @@ -75,7 +76,7 @@ jobs:
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
issue_number: prNumber,
body: body
});
}
42 changes: 42 additions & 0 deletions .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
name: E2E Tests

on:
pull_request:
branches: [dev]
workflow_dispatch:

jobs:
e2e:
runs-on: ubuntu-latest
timeout-minutes: 15

steps:
- uses: actions/checkout@v4

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

- name: Install dependencies
run: npm ci

- name: Install Playwright browsers
run: npx playwright install --with-deps chromium

- name: Build application
run: npm run build

- name: Run E2E tests
run: npm run test:e2e
env:
CI: true

- name: Upload test results
uses: actions/upload-artifact@v4
if: failure()
with:
name: playwright-report
path: playwright-report/
retention-days: 7
20 changes: 20 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
name: Lint

on:
push:
pull_request:

jobs:
lint:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Checkout
uses: actions/checkout@v5
with:
persist-credentials: false
- name: Setup Biome
uses: biomejs/setup-biome@v2
- name: Run Biome
run: biome ci .
8 changes: 7 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,10 @@ ehthumbs.db
.Trashes

# Dev files
src/config/dev.json
src/config/dev.json

# Playwright
/test-results/
/playwright-report/
/blob-report/
/playwright/.cache/
70 changes: 64 additions & 6 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ OpenScan is a trustless, open-source, standalone web-app and multi-chain blockch

```bash
npm start
# Runs on http://localhost:3000
# Runs on http://localhost:3030
```

### Build for Production
Expand All @@ -28,10 +28,20 @@ npm run build
npm run typecheck
```

### Formatting
### Formatting and Linting

```bash
# Check formatting (dry run)
npm run format

# Fix formatting issues automatically
npm run format:fix

# Check linting issues (dry run)
npm run lint

# Fix linting issues automatically
npm run lint:fix
```

### Test Environment with Local Node
Expand Down Expand Up @@ -79,11 +89,11 @@ OpenScan follows a layered architecture with clear separation between data fetch
- Returns `DataWithMetadata<T>` when using parallel strategy, containing:
- `data`: The primary result (from first successful provider)
- `metadata`: Optional RPCMetadata with all provider responses, hashes, and inconsistency flags
- 30-second in-memory cache keyed by `chainId:type:identifier`
- 30-second in-memory cache keyed by `networkId:type:identifier`
- Supports trace operations (debug_traceTransaction, etc.) for localhost networks only

5. **Hook Layer** (`hooks/`) - React integration
- `useDataService(chainId)`: Creates DataService instance with strategy from settings
- `useDataService(networkId)`: Creates DataService instance with strategy from settings
- `useProviderSelection`: Manages user's selected RPC provider in parallel mode
- `useSelectedData`: Extracts data from specific provider based on user selection

Expand Down Expand Up @@ -166,8 +176,56 @@ OpenScan includes special support for localhost development:
## Code Style

- **Biome** for formatting and linting (config: `biome.json`)
- Line width: 100 characters
- Indentation: 2 spaces
- Scope: `src/**/*.ts`, `src/**/*.tsx`, `src/**/*.json` (excludes CSS files)
- Enabled rules: All recommended Biome linting rules
- Use `npm run format:fix` to auto-format code before committing
- Use `npm run lint:fix` to auto-fix linting issues (max 1024 diagnostics shown)
- **TypeScript** with strict mode (`noImplicitAny`, `noImplicitReturns`, `noUncheckedIndexedAccess`)
- **React 19** with functional components and hooks
- **CSS** All styles should be on `src/styles` folder, avoid using in line component styles.

## Coding Standards and Workflow

### Before Committing Code

ALWAYS run these commands before committing to ensure code quality:

```bash
# 1. Fix formatting issues
npm run format:fix

# 2. Fix linting issues
npm run lint:fix

# 3. Verify type safety
npm run typecheck

# 4. Run tests (if applicable)
npm run test:run
```

### Commits

- Follow the convetional commit standard v1.0.0
- Commit without claude attribution

### Code Quality Requirements

- All code must pass Biome formatting and linting checks
- All TypeScript code must pass type checking with zero errors
- Follow the 100-character line width limit
- Use 2-space indentation consistently
- Adhere to Biome's recommended linting rules
- Keep documentation up to date.

### When Claude Code Modifies Files

- Run `npm run format:fix` and `npm run lint:fix` after making changes
- Address any remaining linting warnings that cannot be auto-fixed
- Ensure TypeScript compilation succeeds with `npm run typecheck`
- Do not commit code with formatting, linting, or type errors

## Important Patterns

Expand All @@ -187,9 +245,9 @@ OpenScan includes special support for localhost development:

### When Working with Cache

- Cache keys format: `${chainId}:${type}:${identifier}`
- Cache keys format: `${networkId}:${type}:${identifier}`
- Don't cache "latest" block queries
- Clear cache when switching networks using `clearCacheForChain(chainId)`
- Clear cache when switching networks using `clearCacheForChain(networkId)`
- Default timeout: 30 seconds

### RPC Strategy Switching
Expand Down
Loading