feat(dashboard): add the services row to the panel - #2128
Conversation
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
chore: version packages
…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>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
1 Skipped Deployment
|
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>
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>
- 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
🎨 UI Review
Services row
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 |
🎨 UI Review
No findings. This also resolves the open question from #2127's review — see below. Validated against Figma — no change needed
Mobile
Generated by Claude Code |
🎨 UI Review
Panel — Services rowValidated against Figma — no change needed
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 |
There was a problem hiding this comment.
💡 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".
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>
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
|
Superseded by #2137, which combines the whole panel v2.1 stack into a single PR against dev. |
There was a problem hiding this comment.
💡 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".
| const run = this.runEnactment(action, proposalId).finally(() => { | ||
| this.inflight.delete(key); | ||
| }); |
There was a problem hiding this comment.
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 👍 / 👎.
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 byBulletDividerdots, withTalk to us →to/contacton 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 --noEmitclean ·eslintclean · 527 tests / 54 suites pass · rendered locally at 1440px (screenshot of the whole page shared with Bruno).