From 61ba77772e4001a06fb8d4921e20af5c6a48258d Mon Sep 17 00:00:00 2001 From: adamsoffer Date: Mon, 2 Mar 2026 13:20:20 -0500 Subject: [PATCH] fix: compare poll endBlock against L1 block number instead of L2 on Arbitrum Poll tally handlers compared poll.endBlock (L1 scale, ~24M) against event.block.number (L2 scale, ~437M), causing the "poll ended" check to always pass. This prevented voteStake from updating after the initial vote, so stake changes (rewards, bonding, unbonding) during an active poll were never reflected in the tally. Replace event.block.number with getBlockNum() (which calls roundsManager.blockNum() and returns the L1 block number on Arbitrum) so both sides of the comparison are on the same scale. Co-Authored-By: Claude Opus 4.6 --- src/mappings/pollTallyHandlers.ts | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/mappings/pollTallyHandlers.ts b/src/mappings/pollTallyHandlers.ts index 9db2f7b..4643e72 100644 --- a/src/mappings/pollTallyHandlers.ts +++ b/src/mappings/pollTallyHandlers.ts @@ -35,11 +35,15 @@ export function updatePollTallyOnReward(event: Reward): void { let poll = Poll.load(pollAddress); // Return if poll is no longer active - if (!poll || poll.endBlock.lt(event.block.number)) { + // Use getBlockNum() (L1 block number) instead of event.block.number (L2 block + // number) since poll.endBlock is set from the contract's block.number which + // returns L1 block numbers on Arbitrum + let blockNum = getBlockNum(); + if (!poll || poll.endBlock.lt(blockNum)) { return; } - let round = createOrLoadRound(getBlockNum()); + let round = createOrLoadRound(blockNum); let voteId = makeVoteId(delegator.id, poll.id); let vote = createOrLoadVote(voteId); let transcoder = createOrLoadTranscoder( @@ -82,7 +86,10 @@ export function updatePollTallyOnBond(event: Bond): void { let poll = Poll.load(pollAddress); // Return if poll is no longer active - if (!poll || poll.endBlock.lt(event.block.number)) { + // Use getBlockNum() (L1 block number) instead of event.block.number (L2 block + // number) since poll.endBlock is set from the contract's block.number which + // returns L1 block numbers on Arbitrum + if (!poll || poll.endBlock.lt(getBlockNum())) { return; } @@ -209,11 +216,15 @@ function updatePollTally(event: T): void { let updateTally = false; // Return if poll is no longer active - if (!poll || poll.endBlock.lt(event.block.number)) { + // Use getBlockNum() (L1 block number) instead of event.block.number (L2 block + // number) since poll.endBlock is set from the contract's block.number which + // returns L1 block numbers on Arbitrum + let blockNum = getBlockNum(); + if (!poll || poll.endBlock.lt(blockNum)) { return; } - let round = createOrLoadRound(getBlockNum()); + let round = createOrLoadRound(blockNum); let voterAddress = dataSource.context().getString("voter"); let voteId = makeVoteId(voterAddress, pollAddress); let vote = createOrLoadVote(voteId);