Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
143 commits
Select commit Hold shift + click to select a range
a441683
fix(indexer): redact RPC URLs in logs (#695)
fewensa Apr 16, 2026
ca55135
build(deps): bump dompurify in the npm_and_yarn group across 1 direct…
dependabot[bot] Apr 16, 2026
efb5fef
Move auth token to HttpOnly cookie (#697)
fewensa Apr 16, 2026
05d390a
Strengthen SIWE server-side context validation (#696)
fewensa Apr 17, 2026
50d12a9
Add SIWE nonce and login abuse controls (#698)
fewensa Apr 17, 2026
732996f
Add cached ENS lookup fallback (#700)
fewensa Apr 20, 2026
765738d
fix(web): route ENS lookups through API (#701)
fewensa Apr 22, 2026
aa5b4f6
Prefer ENS RPC before DeGov API fallback (#702)
fewensa Apr 22, 2026
4bd021c
Release `v1.1.1` (#703)
fewensa Apr 23, 2026
91bfe8a
chore(deps): consolidate dependabot upgrades (#716)
fewensa May 13, 2026
51fca4b
build(deps-dev): bump postcss (#719)
dependabot[bot] May 13, 2026
42534eb
build(deps): bump the npm_and_yarn group across 1 directory with 4 up…
dependabot[bot] May 19, 2026
80632e1
build(deps): bump the npm_and_yarn group across 1 directory with 2 up…
dependabot[bot] May 19, 2026
02c0934
feat(indexer): add configurable onchain power mode (#715)
fewensa May 20, 2026
a5949d1
Release `v2.0.0` (#722)
fewensa May 20, 2026
4a307e7
Add WORKFLOW.md with repository policy and command guidelines (#725)
fewensa May 28, 2026
be1d247
chore(workflow): remove repository policy file (#726)
fewensa May 28, 2026
a4c5024
chore(indexer): remove sqd indexer shell (#728)
fewensa Jun 2, 2026
cca4aea
Define Rust technical conventions for the Datalens-native DeGov index…
fewensa Jun 2, 2026
932d7ba
docs(spec): define datalens indexer architecture contract (#729)
fewensa Jun 2, 2026
1c6a501
Define Datalens DAO compatibility and preflight policy (#736)
fewensa Jun 2, 2026
9b53751
Define canonical Postgres schema ownership for the Datalens indexer f…
fewensa Jun 2, 2026
d0449c8
feat(indexer): add datalens client foundation (#738)
fewensa Jun 2, 2026
0b96e0f
chore(repo): reorganize apps layout (#739)
fewensa Jun 2, 2026
c22f46d
feat(indexer): add datalens checkpoint model (#740)
fewensa Jun 2, 2026
3f2bc2c
HBX-249: Normalize raw EVM logs for deterministic replay (#741)
fewensa Jun 2, 2026
550b7f3
HBX-248: Implement EVM log query planning for DAO contracts (#742)
fewensa Jun 2, 2026
85ff4fd
HBX-250: Implement Datalens ABI event decoding
fewensa Jun 2, 2026
2e992b2
HBX-266: Define ChainTool onchain read planning
fewensa Jun 2, 2026
3e52e16
HBX-255: Integrate Datalens onchain power refresh
fewensa Jun 2, 2026
2624520
HBX-251: Implement Datalens proposal projection pipeline
fewensa Jun 2, 2026
3707c86
HBX-252: Implement Datalens vote projection pipeline
fewensa Jun 2, 2026
0a7fd0a
HBX-254: Implement Datalens timelock projection pipeline
fewensa Jun 2, 2026
d115c38
HBX-253: Implement Datalens token projection pipeline
fewensa Jun 2, 2026
9372950
HBX-267: Preserve proposal metadata behavior
fewensa Jun 2, 2026
fc731ce
HBX-256: Implement Datalens indexer runner
fewensa Jun 2, 2026
b7721c8
HBX-257: Update Datalens runtime packaging
fewensa Jun 2, 2026
1fd8469
HBX-268: Migrate Datalens diagnostic scripts
fewensa Jun 2, 2026
90fd8a6
HBX-259: Add Datalens indexer integration tests
fewensa Jun 2, 2026
63c83ec
HBX-258: Add deterministic Datalens fixtures
fewensa Jun 2, 2026
18be110
HBX-260: Add v4 parity audit
fewensa Jun 2, 2026
bda0470
HBX-261: Add Tally onchain validation
fewensa Jun 2, 2026
1204e0d
HBX-262: Prepare Datalens staging deployment path
fewensa Jun 2, 2026
341c657
HBX-264: Document Datalens indexer observability
fewensa Jun 2, 2026
43f5090
HBX-263: Add Datalens production migration runbook
fewensa Jun 2, 2026
8de26e8
fix(indexer): align datalens staging contract (#761)
fewensa Jun 2, 2026
6e43405
fix(indexer): run Datalens projection batches (#762)
fewensa Jun 2, 2026
cd86c00
fix(indexer): implement onchain refresh worker runtime (#763)
fewensa Jun 2, 2026
e3f89fc
fix(indexer): normalize datalens query rows (#764)
fewensa Jun 2, 2026
d97f4fe
fix(indexer): persist token projection parity tables (#765)
fewensa Jun 2, 2026
ce19a1d
feat(indexer): integrate datalens lisk parity stack
fewensa Jun 3, 2026
7cdf1e0
Serve GraphiQL on a dedicated indexer path (#777)
fewensa Jun 3, 2026
4f8addc
refactor(indexer): move runtime tests out of src (#778)
fewensa Jun 3, 2026
d2de084
refactor(indexer): split graphql and postgres store modules (#779)
fewensa Jun 3, 2026
6153533
refactor(indexer): organize runtime modules (#780)
fewensa Jun 3, 2026
56dddb6
feat(indexer): load config files (#781)
fewensa Jun 3, 2026
07c62cc
refactor(indexer): move fixtures under test support (#782)
fewensa Jun 3, 2026
1f64edb
refactor(indexer): use sqlx init migration (#783)
fewensa Jun 3, 2026
a3aebb9
refactor(indexer): move schema smoke checks to rust (#784)
fewensa Jun 3, 2026
96eb993
fix(indexer): harden projection state scope for unified indexing (#785)
fewensa Jun 3, 2026
fbd8579
feat(indexer): add scoped graphql context
fewensa Jun 3, 2026
d62839a
feat(indexer): support latest target height
fewensa Jun 3, 2026
bf8802d
feat(indexer): add native indexer status graphql
fewensa Jun 3, 2026
02e9eb2
feat(indexer): support rpc chains for onchain refresh
fewensa Jun 3, 2026
9c9ff19
docs(indexer): update unified deployment model (#790)
fewensa Jun 3, 2026
e1a78e8
fix(web): use native indexer status (#791)
fewensa Jun 3, 2026
ea86f80
fix(indexer): remove squid status bridge (#792)
fewensa Jun 3, 2026
0cfa095
refactor(indexer): remove top-level re-export shims (#793)
fewensa Jun 3, 2026
be3d9bf
chore(indexer): add production dao example config (#794)
fewensa Jun 3, 2026
a0ad5b7
fix(indexer): resolve latest height via Datalens head API
fewensa Jun 3, 2026
97da169
fix(indexer): use Datalens SDK retry for log queries
fewensa Jun 3, 2026
b88bd36
perf(indexer): merge DAO Datalens log queries
fewensa Jun 3, 2026
a673a99
perf(indexer): cache token delegate mapping writes
fewensa Jun 3, 2026
4c56773
feat(indexer): add adaptive Datalens chunk observability
fewensa Jun 3, 2026
275a136
fix(indexer): update Datalens SDK REST query contract
fewensa Jun 3, 2026
e9e1918
fix(indexer): split datalens provider-limit ranges
fewensa Jun 3, 2026
26e7a6e
fix(indexer): handle duplicate log source addresses (#802)
fewensa Jun 3, 2026
b5b72c3
feat(indexer): report configured range progress
fewensa Jun 6, 2026
50f8776
feat(indexer): ensure datalens warmup on startup
fewensa Jun 6, 2026
bd9c1ea
feat(indexer): add datalens warmup effectiveness logs
fewensa Jun 6, 2026
3aa5a1f
feat(indexer): add bounded onchain refresh ticks
fewensa Jun 6, 2026
68cd1f8
feat(indexer): add cache-aware adaptive chunks
fewensa Jun 6, 2026
b6428d5
feat(indexer): add datalens query concurrency limits
fewensa Jun 6, 2026
9094f5a
fix(indexer): keep datalens warmup non-blocking
fewensa Jun 6, 2026
03a5353
perf(indexer): improve datalens sync throughput
fewensa Jun 6, 2026
e3373af
fix(indexer): survive transient datalens pass failures (#811)
fewensa Jun 7, 2026
6bb3eab
Enforce safe final indexing for DeGov indexer (#812)
fewensa Jun 7, 2026
263ed4f
feat(indexer): add provisional overlay schema (#813)
fewensa Jun 7, 2026
c63cd40
Add provisional Datalens worker boundary (#814)
fewensa Jun 7, 2026
f747d42
feat(indexer): add live power overlay path (#815)
fewensa Jun 7, 2026
d122fa9
feat(indexer): add live proposal overlay
fewensa Jun 7, 2026
2f141cc
feat(indexer): add provisional cleanup boundary
fewensa Jun 7, 2026
3d5d82e
fix(indexer): refresh v4 parity fixture snapshot
fewensa Jun 7, 2026
f0ca940
perf(indexer): batch onchain refresh task upserts
fewensa Jun 7, 2026
c312a03
fix(indexer): recover all-mode jobs and relax cache fill sizing
fewensa Jun 8, 2026
834c9c8
fix(indexer): keep all-mode transient datalens errors retrying (#821)
fewensa Jun 8, 2026
1d6779e
fix(indexer): apply datalens chain read refreshes (#822)
fewensa Jun 9, 2026
8233aac
fix(indexer): optimize proposal onchain enrichment (#823)
fewensa Jun 9, 2026
7ab50d1
fix(indexer): make bounded all-mode scheduling fair
fewensa Jun 9, 2026
3efbbab
fix(indexer): restore ENS GraphQL parity (#825)
fewensa Jun 9, 2026
2bfda16
fix(indexer): restore proposal title compatibility
fewensa Jun 9, 2026
b1b5359
perf(indexer): batch ENS onchain refresh
fewensa Jun 9, 2026
721417e
fix(indexer): optimize ENS onchain refresh batching
fewensa Jun 9, 2026
0096895
fix(indexer): dedupe onchain refresh task upserts (#829)
fewensa Jun 9, 2026
a39830c
fix(indexer): bound datalens query waits
fewensa Jun 9, 2026
9fbacea
fix(indexer): defer dense onchain refresh enqueue (#831)
fewensa Jun 9, 2026
53ea215
fix(indexer): bound Datalens query gate waits
fewensa Jun 9, 2026
56e7328
perf(indexer): batch token contributor ensures (#833)
fewensa Jun 9, 2026
83dba45
fix(indexer): smooth ENS onchain refresh backlog
fewensa Jun 9, 2026
f44ce36
perf(indexer): dedupe dense token projection metadata (#835)
fewensa Jun 9, 2026
0046eab
perf(indexer): optimize dense token projection writes (#836)
fewensa Jun 9, 2026
141821a
fix(indexer): cap onchain refresh tick batches (#837)
fewensa Jun 9, 2026
219177a
fix(indexer): dedupe ENS refresh state writes (#838)
fewensa Jun 9, 2026
3cebc3c
fix(indexer): rollback failed runner transactions (#839)
fewensa Jun 9, 2026
6e44b6c
fix(indexer): inherit onchain refresh run budget
fewensa Jun 9, 2026
5dc24bf
fix(indexer): index delegate rolling metadata lookup (#840)
fewensa Jun 9, 2026
bfa6718
fix(indexer): batch dense token contributor updates
fewensa Jun 9, 2026
6175913
fix(indexer): configure onchain refresh deferred drain
fewensa Jun 9, 2026
62a05a1
fix(indexer): scope inline onchain refresh ticks (#845)
fewensa Jun 9, 2026
9d496f7
perf(indexer): batch onchain refresh RPC reads (#844)
fewensa Jun 9, 2026
84360f5
fix(indexer): chunk onchain refresh DB apply (#846)
fewensa Jun 9, 2026
063d78d
fix(indexer): align ENS proposal fields
fewensa Jun 10, 2026
d4488f4
fix(indexer): correct ENS delegate edge power
fewensa Jun 10, 2026
ab210e0
fix(indexer): reconcile delegate relation power from balance (#849)
fewensa Jun 10, 2026
94f7f86
fix(indexer): align ENS proposal parity (#850)
fewensa Jun 10, 2026
3737955
fix(indexer): split transient Datalens chunks (#851)
fewensa Jun 10, 2026
5786134
fix(indexer): allow transient splits to single block (#852)
fewensa Jun 10, 2026
123fc9c
perf(indexer): batch token delegate snapshot writes (#853)
fewensa Jun 10, 2026
e881fb7
perf(indexer): batch ENS token delegate writes (#854)
fewensa Jun 10, 2026
5755952
perf(indexer): speed up delegate rolling preload
fewensa Jun 10, 2026
fdd9152
fix(indexer): grow provider-fill chunk sizes
fewensa Jun 10, 2026
6bd9b1a
fix(indexer): normalize bracket proposal titles (#857)
fewensa Jun 10, 2026
a7d63f2
fix(indexer): reset requeued refresh attempts
fewensa Jun 10, 2026
917d864
fix(indexer): allow datalens retry after timeout
fewensa Jun 10, 2026
5cac3a3
fix(indexer): align openrouter title prompt
fewensa Jun 10, 2026
78aabec
fix(indexer): add proposal title refresh command (#862)
fewensa Jun 10, 2026
e8e11fe
fix(indexer): update openrouter default model (#863)
fewensa Jun 10, 2026
6b9a868
fix(indexer): add proposal reference field refresh
fewensa Jun 10, 2026
4877f9c
fix(indexer): align delegate relation power metadata
fewensa Jun 10, 2026
fdc2dd1
fix(indexer): repair delegate mapping power updates
fewensa Jun 10, 2026
447b96c
fix(indexer): align ENS proposal parity fields (#867)
fewensa Jun 10, 2026
bfd1d44
fix(graphql): replace connections with pages
fewensa Jun 10, 2026
7cebae0
Merge branch 'main' into degov-original
Sigri44 Jun 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
9 changes: 5 additions & 4 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@
.env
.git
node_modules
packages/*/node_modules
packages/web/.next
packages/indexer/.data
packages/indexer/lib
apps/*/node_modules
apps/web/.next
apps/indexer/.data
apps/indexer/target
target
coverage
.turbo
.pnpm-store
Expand Down
103 changes: 102 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
@@ -1,7 +1,108 @@

# Database and local service ports.
DEGOV_DB_PORT=5432
DEGOV_DB_PASSWORD=password
DEGOV_DB_NAME=postgres
DEGOV_INDEXER_DATABASE_URL=postgresql://postgres:password@localhost:5432/indexer
DEGOV_INDEXER_CONFIG_FILE=apps/indexer/indexer.example.yml
# all runs every daoCode in DEGOV_INDEXER_CONFIG_FILE. Set DEGOV_INDEXER_DAO_CODE only to filter a debug run.
DEGOV_INDEXER_CONTRACT_SET_MODE=all
DEGOV_INDEXER_DAO_CODE=
# Use latest for production durable-head tracking; numeric heights are for debug or bounded test runs.
DEGOV_INDEXER_TARGET_HEIGHT=latest
DEGOV_INDEXER_RUN_ONCE=false
DEGOV_INDEXER_POLL_INTERVAL_MS=10000
DEGOV_INDEXER_PORT=4350
# Local host command endpoint for `pnpm run indexer:graphql`.
DEGOV_INDEXER_GRAPHQL_ENDPOINT=http://127.0.0.1:4350/degov-demo-dao/graphql
DEGOV_INDEXER_GRAPHQL_BIND_ADDRESS=0.0.0.0:4350
DEGOV_INDEXER_GRAPHQL_PATH=/degov-demo-dao/graphql
# Compose uses service DNS for web-local-indexer builds.
DEGOV_INDEXER_GRAPHQL_INTERNAL_ENDPOINT=http://indexer-graphql:4350/graphql
# Local web builds can bake this into public/degov.yml.
DEGOV_CONFIG_INDEXER_ENDPOINT=http://127.0.0.1:4350/degov-demo-dao/graphql

# Datalens-native indexer.
# Keep DATALENS_ENDPOINT as the service base URL for SDK REST and native endpoints.
DATALENS_ENDPOINT=https://datalens.ringdao.com
DATALENS_APPLICATION=degov-live
DATALENS_TOKEN=
DATALENS_TIMEOUT_SECONDS=60
DATALENS_FINALITY=durable_only
DATALENS_CHAIN_FAMILY=evm
DATALENS_CHAIN_NAME=darwinia
DATALENS_CHAIN_ID=46
DATALENS_DATASET_FAMILY=evm
DATALENS_DATASET_NAME=logs
DATALENS_QUERY_BLOCK_RANGE_LIMIT=1000
# Prefer DEGOV_INDEXER_CONFIG_FILE for multi-chain contract sets. DATALENS_CHAINS_JSON is retained only for legacy single-env runs.
DATALENS_CHAINS_JSON=
DATALENS_GOVERNOR_ADDRESS=
DATALENS_GOVERNOR_TOKEN_ADDRESS=
DATALENS_GOVERNOR_TOKEN_STANDARD=ERC20
DATALENS_TIMELOCK_ADDRESS=

# Onchain refresh worker.
# Set true only with rpc.chains urlEnv variables or legacy DEGOV_ONCHAIN_REFRESH_RPC_URL configured.
DEGOV_ONCHAIN_REFRESH_WORKER_ENABLED=false
# Referenced by apps/indexer/indexer.example.yml rpc.chains.
ETHEREUM_RPC_URL=
LISK_RPC_URL=
DARWINIA_RPC_URL=
BASE_RPC_URL=
ARBITRUM_RPC_URL=
# Legacy single-chain fallback when rpc.chains is not configured.
DEGOV_ONCHAIN_REFRESH_RPC_URL=
DEGOV_ONCHAIN_REFRESH_RUN_ONCE=false

# Number of pending refresh tasks processed per batch.
DEGOV_ONCHAIN_REFRESH_BATCH_SIZE=100
# Maximum number of successful refresh tasks applied in one DB transaction chunk.
# Keep at or below 1000 unless DB apply paths are verified for larger batches.
DEGOV_INDEXER_ONCHAIN_REFRESH_APPLY_BATCH_SIZE=1000
# Number of deferred refresh candidates materialized before each worker claim.
# Increase with BATCH_SIZE/TICK_MAX_TASKS during dense sync, for example 1000.
DEGOV_ONCHAIN_REFRESH_DEFERRED_DRAIN_BATCH_SIZE=100
DEGOV_ONCHAIN_REFRESH_MAX_ATTEMPTS=3

# Number of known accounts scanned per reconcile seed pass.
DEGOV_ONCHAIN_REFRESH_RECONCILE_SEED_BATCH_SIZE=100

# Read-plan chunk size for future multicall grouping.
DEGOV_ONCHAIN_REFRESH_MULTICALL_CHUNK_SIZE=100

# Number of accounts refreshed concurrently inside one batch.
DEGOV_ONCHAIN_REFRESH_CONCURRENCY=1
DEGOV_ONCHAIN_REFRESH_CURRENT_POWER_METHOD=getVotes

# Bounded onchain refresh ticks during Datalens indexer chunk sync.
# Disabled by default; enable only when RPC URLs are configured.
DEGOV_INDEXER_ONCHAIN_REFRESH_TICK_ENABLED=false
# Total task budget per indexer tick.
DEGOV_INDEXER_ONCHAIN_REFRESH_TICK_MAX_TASKS=10
# Optional per worker run/claim budget inside one tick.
# Leave commented to inherit MAX_TASKS; uncommenting pins the per-run cap.
# DEGOV_INDEXER_ONCHAIN_REFRESH_TICK_MAX_TASKS_PER_RUN=10
DEGOV_INDEXER_ONCHAIN_REFRESH_TICK_MAX_DURATION_MS=500
DEGOV_INDEXER_ONCHAIN_REFRESH_TICK_MIN_BLOCKS=100

# Number of batches processed before the worker sleeps again.
DEGOV_ONCHAIN_REFRESH_MAX_BATCHES_PER_POLL=1

# If the indexer is further behind than this, only reconcile tasks are processed.
DEGOV_ONCHAIN_REFRESH_MAX_SYNC_LAG_BLOCKS=1000

# Worker polling interval after a pass with no more immediate work.
DEGOV_ONCHAIN_REFRESH_POLL_INTERVAL_MS=10000

# Delay before newly created event refresh tasks become claimable.
DEGOV_ONCHAIN_REFRESH_DEBOUNCE_MS=120000

# Advisory-lock TTL for serializing worker writes with indexer writes.
DEGOV_ONCHAIN_REFRESH_LOCK_TTL_MS=300000
DEGOV_ONCHAIN_REFRESH_RETRY_DELAY_MS=30000
DEGOV_ONCHAIN_REFRESH_REQUEST_TIMEOUT_MS=15000

# Web app.
DEGOV_WEB_PORT=3000
DEGOV_WEB_INDEXER_PORT=3001
DEGOV_WEB_JWT_SECRET=your-secrets
34 changes: 26 additions & 8 deletions .github/workflows/check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,24 +28,42 @@ jobs:
check-indexer:
name: Check indexer
runs-on: ubuntu-latest
services:
postgres:
image: postgres:17-alpine
env:
POSTGRES_DB: datalens_test
POSTGRES_PASSWORD: datalens
POSTGRES_USER: datalens
ports:
- 5432:5432
options: >-
--health-cmd "pg_isready -U datalens -d datalens_test"
--health-interval 5s
--health-timeout 5s
--health-retries 10
env:
DEGOV_INDEXER_TEST_DATABASE_URL: postgresql://datalens:datalens@localhost:5432/datalens_test
steps:
- uses: actions/checkout@v5

- uses: pnpm/action-setup@v4
with:
version: 10.32.1

- name: Setup NodeJS
uses: actions/setup-node@v5
with:
node-version: 22
cache: pnpm
package-manager-cache: false

- name: Setup Rust
uses: dtolnay/rust-toolchain@stable

- name: Check build
run: |
pnpm install --filter @degov/indexer... --frozen-lockfile
pnpm --filter @degov/indexer build
pnpm --filter @degov/indexer test
cargo build --locked -p degov-datalens-indexer
cd apps/indexer
node ./scripts/check-rust-conventions.mjs
cargo test --locked
node ./scripts/check-rust-conventions.test.mjs
node ./scripts/compatibility-preflight.test.mjs

check-config:
name: Check Config
Expand Down
5 changes: 5 additions & 0 deletions .github/workflows/deploy-dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@ jobs:
steps:
- uses: actions/checkout@v5

- name: Prepare Vercel root directory
run: |
mkdir -p packages
cp -a apps/web packages/web

- uses: darwinia-network/devops/actions/smart-vercel@main
name: Deploy degov
with:
Expand Down
5 changes: 5 additions & 0 deletions .github/workflows/deploy-prd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@ jobs:
steps:
- uses: actions/checkout@v5

- name: Prepare Vercel root directory
run: |
mkdir -p packages
cp -a apps/web packages/web

- uses: darwinia-network/devops/actions/smart-vercel@main
name: Deploy degov
with:
Expand Down
142 changes: 0 additions & 142 deletions .github/workflows/indexer-accuracy-audit.yml

This file was deleted.

2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,7 @@ dist-ssr
.data
.agentdocs
.pnpm-store
/target/

.env
apps/indexer/indexer.yml
Loading
Loading