Skip to content

feat(dashboard): add the services row to the panel - #2128

Closed
brunod-e wants to merge 33 commits into
feat/panel-v2.1-use-it-nowfrom
feat/panel-v2.1-services-row
Closed

feat(dashboard): add the services row to the panel#2128
brunod-e wants to merge 33 commits into
feat/panel-v2.1-use-it-nowfrom
feat/panel-v2.1-services-row

Conversation

@brunod-e

Copy link
Copy Markdown
Collaborator

Part 6/6 of the Panel v2.1 stack (DEV-1148). Base: feat/panel-v2.1-use-it-now (#2127).

What changes

Section 6 of the spec — the compact row that closes the page:

  • ServicesRow.tsx (new) — SERVICES BY BLOCKFUL (BadgeIcon + shield) followed by the service lines separated by BulletDivider dots, with Talk to us → to /contact on the right. Wraps on mobile.

Figma: 3633:96848.

With this the full spec flow is on the page: hero → latest finding → monitored DAOs → track record → use it now → services → footer.

Verification

tsc --noEmit clean · eslint clean · 527 tests / 54 suites pass · rendered locally at 1440px (screenshot of the whole page shared with Bruno).

brunod-e and others added 15 commits August 11, 2026 10:07
WalletConnect's HTTP connection rejects relative rpcMap URLs, so every
pairing broke right after session approval. Prefix the proxy path with
the browser origin; during SSR the transports are never called.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rpc-url

fix(dashboard): make the RPC proxy URL absolute for WalletConnect
…oints

ENS DAO proposals stall after passing because queue() and execute() on
the Governor are permissionless but nobody pays the gas. These endpoints
let the relayer sponsor those transactions on demand: callable manually
today, and by an automated trigger (e.g. the notification system) later.

Given a proposalId, the relayer fetches the execution args from the
Anticapture API (GET /proposals/{id}), proves they belong to that
proposal via the governor's hashProposal (the API stays untrusted),
checks on-chain state (Succeeded for queue; Queued past its eta for
execute), guards the wallet balance, simulates, then broadcasts.

The endpoints are only registered when ANTICAPTURE_API_URL is set.

The e2e forks mainnet one block before a real proposal's ProposalQueued
tx and replays its lifecycle through the HTTP endpoints — no voting-
period mining, so it runs in ~15s on any RPC serving recent state
(verified against rpc.mevblocker.io).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Drops the feature-flag conditional: the queue/execute endpoints are
always registered, consistent with how the app treats the rest of its
config. Deployments must set ANTICAPTURE_API_URL before their next
deploy or env validation fails at boot.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ected fetch

msw is the monorepo's convention for HTTP-service unit tests (see
apps/api dune/coingecko/treasury tests) and was already in the relayer's
devDependencies; AnticaptureProposalSource now uses global fetch with no
injection seam.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Unit tests use the repo's stub-factory pattern (createStubChain/
  createStubSigner/createService, as in relay.test.ts) instead of
  bespoke fake classes with mutable knobs.
- EnactmentChainReader now extends the shared ChainReader type instead
  of redefining its overlap.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A single compact row closing the page: the Blockful service lines and a
link to the contact page.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ProposalEnactmentService now depends on a domain-level GovernorGateway
(hashProposal/state/proposalEta/blockTimestamp/balanceOf/simulate/
waitForReceipt) instead of a raw viem reader, following the
IChainStateService precedent. ViemGovernorGateway owns all ABI plumbing
and is exercised for real by the e2e.

Unit-test stubs collapse to plain Partial<GovernorGateway> overrides —
no viem generics, no casts, no functionName switch.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The Railway image builds with `pnpm --filter ... build`, which bypasses
turbo's codegen dependency, so @anticapture/client's gitignored
generated/ sources were missing. Run codegen explicitly with the same
ARG wiring infra/mcp-server already uses.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Aug 13, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
anticapture-storybook Ready Ready Preview Aug 19, 2026 10:38pm
1 Skipped Deployment
Project Deployment Actions Updated (UTC)
anticapture Ignored Ignored Aug 19, 2026 10:38pm

Request Review

brunod-e and others added 2 commits August 13, 2026 19:25
Same BadgeIcon default as the use it now cards: without iconVariant the
shield rendered in the inverted near-black rather than the badge's
secondary grey.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
brunod-e and others added 2 commits August 14, 2026 12:54
Every block on the panel sat 8px from the next, so Track record and Use it now
ran into the block above them. Figma spaces the three top-level blocks 32px
apart and keeps 8px inside each, so the inner wrappers now hold the tight gap
and the page holds the section rhythm.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
LeonardoVieira1630 and others added 4 commits August 14, 2026 13:23
- Join concurrent duplicate queue/execute requests into one in-flight
  broadcast so the mempool window cannot double-spend relayer gas.
- Check receipt status: a mined-but-reverted tx is now a 409
  TRANSACTION_REVERTED instead of a 200; cap the receipt wait at 60s and
  still return the hash on timeout (the tx was broadcast).
- Map simulation reverts to 409 SIMULATION_FAILED carrying only the
  short revert reason (full RPC messages can embed the provider URL).
- Reorder guards: cheap on-chain state/eta checks run before the
  Anticapture API fetch, and an unknown-to-the-governor id is a 404.
- Hash descriptions with stringToBytes so hex-looking text is treated
  as UTF-8; cap DecimalUint256 input at 78 digits and maxUint256.
- Expose the governor address on GovernorGateway instead of duplicating
  it in the service config; rename balanceOf to ethBalance.
- Dockerfile: codegen from ANTICAPTURE_API_URL only — interpolating the
  preview env's gateful deadlocks fresh PR environments, whose gateful
  health gate requires this relayer to already be up.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The runtime ANTICAPTURE_API_URL points at gateful over Railway's private
network, which builders cannot reach — codegen died with "fetch failed".
Give the build its own ANTICAPTURE_SPEC_URL arg defaulting to the public
dev gateful domain.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Cap the receipt wait at 15s: Gateful aborts proxied requests at 30s,
  so a longer wait turned an already-broadcast transaction into a
  gateway failure and a circuit-breaker hit.
- Map viem's InsufficientFundsError on send to 503 RELAYER_LOW_BALANCE,
  mirroring RelayService — the minBalanceWei guard cannot see the
  actual gas estimate.
- Add the @anticapture/gateful changeset: the new /{dao}/relay/queue
  and /{dao}/relay/execute paths are public Gateful API surface.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…points

feat(relayer): POST /relay/queue and /relay/execute proposal endpoints
@brunod-e
brunod-e marked this pull request as ready for review August 14, 2026 18:22

Copy link
Copy Markdown
Collaborator

🎨 UI Review

Automated review · Spec: DEV-1148 (Panel v2.1) · Figma frame referenced: 3633:96848
⚠️ Same config gap as the rest of this stack — Figma MCP couldn't resolve this file's frames and ClickUp was rate-limited this run. Reviewed via diff + repo conventions + UX-expert evaluation only.


Services row

  • Minor: gap-x-[7px] between the bullet dots and service labels is an arbitrary, off-scale spacing value (the repo's spacing scale steps in 4px increments). If 7px is Figma-accurate, leave it; otherwise snap to gap-2 (8px). (apps/dashboard/features/panel/components/ServicesRow.tsx)
  • The PanelSection gap restructuring (32px between the three page blocks, 8px inside each) matches the code comment's stated intent and reads consistently across breakpoints in the diff.

Findings: 1 total — 0 must-fix, 1 nice-to-have

This closes out the Panel v2.1 stack (parts 1–6). Cross-PR items worth a final pass once merged: the touch-target and API-key-copy items flagged in parts 4 and 5.


Generated by Claude Code

Copy link
Copy Markdown
Collaborator

🎨 UI Review

Automated review · Figma: 🛰️ Product Design — services-row · Spec: DEV-1148
⚠️ ClickUp is rate-limited for this run (~19h cooldown) — spec text cross-check and task image attachments were skipped. ⚠️ The anticapture (dashboard) Vercel preview is Ignored for this PR stack — only Storybook deployed. Review is grounded in Figma + diff only.


No findings. This also resolves the open question from #2127's review — see below.

Validated against Figma — no change needed

  • The PanelSection.tsx regrouping (gap-5 lg:gap-2 inner wrappers, gap-5 lg:gap-8 outer) matches the Figma page rhythm exactly: walking the Maind BodyTrack RecordUsage Prompt frame y-offsets in the file gives 32px between each of the three top-level blocks and 8px between the elements inside each — precisely what lg:gap-8 (outer) / lg:gap-2 (inner) produce. This also confirms the gap between UseItNowSection and ServicesRow is the right 8px, closing the item flagged in feat(dashboard): add the use it now section to the panel #2127.
  • ServicesRow padding (p-3 = 12px) and the header-group-to-list gap (lg:gap-4 = 16px) match blocks/padding-xlg and blocks/inner-gap-md.
  • The 7px gaps around each BulletDivider (via the nested gap-x-[7px] wrappers) reproduce Figma's dot-spacing exactly.
  • Label typography (text-alternative-xs, mono, uppercase, tracking-wider) matches the Figma type style used consistently across the other Panel v2.1 sections.
  • DefaultLink (highlight/sm + ChevronRight) for "Talk to us" matches the Figma Code Connect mapping.

Mobile

flex-col stacking with flex-wrap on the services list is a reasonable responsive default; no mobile Figma frame was provided to check against.


Generated by Claude Code

Copy link
Copy Markdown
Collaborator

🎨 UI Review

Automated review · Figma: 🛰️ Product-Design — Services Row · Spec (DEV-1148) · Preview: only anticapture-storybook deployed for this branch — no live dashboard preview, diff + Figma review only.
⚠️ ClickUp API is rate-limited for this run, so the task's attachments/comments weren't pulled independently.


Panel — Services row

Validated against Figma — no change needed

  • p-3 (12px) outer padding, gap-1.5 (6px) badge→label, lg:gap-4 (16px) header→services list, and gap-x-[7px] between service items — every spacing value matches the Figma frame's literal pixel values.
  • Service list copy ("Security audits", "Calldata review", "Front-end package", "Consulting & research") and the "Talk to us" CTA match Figma word for word.
  • BulletDivider between items correctly reuses the DS "Divider / Dot" component instead of a hand-rolled separator.
  • ServicesRow's new spacing role in PanelSection.tsx (32px between the hero/table, track-record, and use-it-now/services blocks, 8px inside each) matches the comment's own stated Figma rhythm — the wrapping divs are a clean way to keep that without fighting the page's outer gap.

No must-fix or nice-to-have findings — this is a pixel-accurate implementation of the last section in the stack.


Generated by Claude Code

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ba5d1cde0f

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread apps/dashboard/features/panel/components/ServicesRow.tsx Outdated
brunod-e and others added 3 commits August 17, 2026 12:27
Each label carries a leading bullet and the list is pulled left by that
lead-in inside an overflow-hidden wrapper, so a bullet landing at a
wrapped line start is clipped instead of reading as a list marker.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
brunod-e and others added 3 commits August 18, 2026 20:19
Serve the Gitcoin whitelabel from gitcoin.gov.blockful.io and let Gitcoin
join ENS and Shutter as a DAO you can draft, publish, vote on, queue and
execute proposals for.

Gitcoin's "GTC Governor Bravo" is an OZ governor under the hood (hash
proposal ids, GovernorCountingSimple tallies), so the existing OZ propose,
castVote, queue and execute paths work unchanged; enabling proposal
creation is a config change. govPlatform now points at Anticapture rather
than Tally, matching ENS and Shutter.

Validated end to end on an anvil mainnet fork with the governance fork
test: propose via submitProposalRequest, for/against/abstain votes from
impersonated top delegates with exact tally matches, then queue and
execute through the 2-day timelock.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
feat(dashboard): enable the Gitcoin whitelabel with full governance
@brunod-e

Copy link
Copy Markdown
Collaborator Author

Superseded by #2137, which combines the whole panel v2.1 stack into a single PR against dev.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e388432725

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +72 to +74
const run = this.runEnactment(action, proposalId).finally(() => {
this.inflight.delete(key);
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Retain timed-out transactions in the dedup set

When transaction inclusion takes longer than the 15-second receipt timeout, runEnactment resolves successfully with a still-pending hash and this finally immediately removes the dedup entry. A subsequent caller can therefore observe the proposal's unchanged actionable state and broadcast a second transaction; after the first transaction succeeds, the duplicate reverts and burns relayer gas. Keep the action locked until the pending transaction is confirmed or the on-chain proposal state changes.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants