Description
Users who received AZTEC tokens via Token Vaults (ATPs) and deposited them into Governance through their Staker contract have their voting power attributed to the Staker address, not their wallet. The aztec-gov dashboard currently queries powerNow(userWallet) which returns 0 for these users, so they see 0 voting power and cannot vote — despite having tokens locked in Governance.
This is a UI-only gap: the Staker contract already exposes voteInGovernance(proposalId, amount, support) that proxies votes to Governance using the staker's deposited balance.
Scope
- Discover a user's stakers via the staking dashboard indexer (
GET /api/atp/holdings?beneficiary={userAddress}) behind a NEXT_PUBLIC_STAKING_INDEXER_URL env var.
- Query
powerNow(stakerAddress) for each discovered staker and include it in the user's total voting power.
- Route votes cast against staker-attributed power through
Staker.voteInGovernance(...) instead of Governance.vote(...).
- Surface a "Staked Positions" breakdown in the voting power UI.
Files touched
- Modify:
src/lib/contracts.ts, src/hooks/useVotingPower.ts, src/hooks/useVote.ts, src/components/governance/VotingPowerPanel.tsx, src/components/governance/ActionPanel.tsx
- Add:
src/hooks/useUserStakers.ts, src/lib/staker-abi.ts (governance-related Staker ABI extracted from staking-dashboard's ATPWithdrawableAndClaimableStaker.ts)
Benefit (The "Why")
ATP recipients who staked into Governance are currently locked out of voting in the aztec-gov dashboard, even though they hold eligible voting power on-chain. Closing this gap restores their ability to participate in governance, brings the dashboard to parity with the protocol's actual voting rules, and removes a silent source of disenfranchisement for a meaningful cohort of token holders.
Acceptance Criteria
Description
Users who received AZTEC tokens via Token Vaults (ATPs) and deposited them into Governance through their Staker contract have their voting power attributed to the Staker address, not their wallet. The aztec-gov dashboard currently queries
powerNow(userWallet)which returns 0 for these users, so they see 0 voting power and cannot vote — despite having tokens locked in Governance.This is a UI-only gap: the Staker contract already exposes
voteInGovernance(proposalId, amount, support)that proxies votes to Governance using the staker's deposited balance.Scope
GET /api/atp/holdings?beneficiary={userAddress}) behind aNEXT_PUBLIC_STAKING_INDEXER_URLenv var.powerNow(stakerAddress)for each discovered staker and include it in the user's total voting power.Staker.voteInGovernance(...)instead ofGovernance.vote(...).Files touched
src/lib/contracts.ts,src/hooks/useVotingPower.ts,src/hooks/useVote.ts,src/components/governance/VotingPowerPanel.tsx,src/components/governance/ActionPanel.tsxsrc/hooks/useUserStakers.ts,src/lib/staker-abi.ts(governance-related Staker ABI extracted from staking-dashboard'sATPWithdrawableAndClaimableStaker.ts)Benefit (The "Why")
ATP recipients who staked into Governance are currently locked out of voting in the aztec-gov dashboard, even though they hold eligible voting power on-chain. Closing this gap restores their ability to participate in governance, brings the dashboard to parity with the protocol's actual voting rules, and removes a silent source of disenfranchisement for a meaningful cohort of token holders.
Acceptance Criteria
VotingPowerPanelandActionPanelincludes both direct-deposit power and the sum ofpowerNow(stakerAddress)across all discovered stakers.voteInGovernance(proposalId, amount, support)(notGovernance.vote).NEXT_PUBLIC_STAKING_INDEXER_URL, defaulting to the production indexer URL when unset.