@@ -93,35 +93,36 @@ receipt_actions_prep AS (
9393)
9494/* Sourcing Latest Voting Power from Locks + Unlocks */
9595, voting_power_from_locks_unlocks AS (
96- SELECT
97- vplu.*
98- FROM (
99- SELECT
100- ra .block_timestamp
101- , ra .receipt_id
102- , COALESCE(CASE
103- WHEN safe_json_parse(REPLACE(ra .action_logs [1 ], ' EVENT_JSON:' , ' ' ))- >> ' error' IS NULL
104- THEN safe_json_parse(REPLACE(ra .action_logs [1 ], ' EVENT_JSON:' , ' ' ))- > ' data' - > 0 - >> ' account_id'
105- ELSE NULL
106- END
107- , ra .signer_account_id ) AS registered_voter_id
108- , CASE
109- WHEN safe_json_parse(REPLACE(ra .action_logs [1 ], ' EVENT_JSON:' , ' ' ))- >> ' error' IS NULL
110- THEN (safe_json_parse(REPLACE(ra .action_logs [1 ], ' EVENT_JSON:' , ' ' ))- > ' data' - > 0 - >> ' locked_near_balance' )::NUMERIC
111- ELSE NULL
112- END AS voting_power_from_locks_unlocks
113- , CASE
114- WHEN safe_json_parse(REPLACE(ra .action_logs [1 ], ' EVENT_JSON:' , ' ' ))- >> ' error' IS NULL
115- THEN (safe_json_parse(REPLACE(ra .action_logs [1 ], ' EVENT_JSON:' , ' ' ))- > ' data' - > 0 - >> ' timestamp' )::NUMERIC
116- ELSE NULL
117- END AS lockup_update_at_ns -- Timestamp (nanoseconds) when user locks or unlocks near
118- , ROW_NUMBER() OVER (PARTITION BY signer_account_id ORDER BY block_timestamp DESC ) AS row_num
119- FROM receipt_actions_prep AS ra
120- WHERE
121- ra .method_name = ' on_lockup_update'
122- ) AS vplu
123- WHERE
124- vplu .row_num = 1
96+ SELECT DISTINCT ON (rap .signer_account_id )
97+ rap .block_timestamp ,
98+ rap .receipt_id ,
99+ -- same semantics as before (prefer account_id from logs, fall back to signer)
100+ COALESCE(
101+ CASE
102+ WHEN (fastnear .safe_json_parse (replace(rap .action_logs [1 ], ' EVENT_JSON:' , ' ' )) - >> ' error' ) IS NULL
103+ THEN (fastnear .safe_json_parse (replace(rap .action_logs [1 ], ' EVENT_JSON:' , ' ' )) - > ' data' - > 0 - >> ' account_id' )
104+ ELSE NULL
105+ END,
106+ rap .signer_account_id
107+ ) AS registered_voter_id,
108+ CASE
109+ WHEN (fastnear .safe_json_parse (replace(rap .action_logs [1 ], ' EVENT_JSON:' , ' ' )) - >> ' error' ) IS NULL
110+ THEN ((fastnear .safe_json_parse (replace(rap .action_logs [1 ], ' EVENT_JSON:' , ' ' )) - > ' data' - > 0 - >> ' locked_near_balance' ))::numeric
111+ ELSE NULL
112+ END AS voting_power_from_locks_unlocks,
113+ CASE
114+ WHEN (fastnear .safe_json_parse (replace(rap .action_logs [1 ], ' EVENT_JSON:' , ' ' )) - >> ' error' ) IS NULL
115+ THEN ((fastnear .safe_json_parse (replace(rap .action_logs [1 ], ' EVENT_JSON:' , ' ' )) - > ' data' - > 0 - >> ' timestamp' ))::numeric
116+ ELSE NULL
117+ END AS lockup_update_at_ns,
118+ 1 AS row_num -- keep compatibility with downstream "WHERE row_num = 1"
119+ FROM receipt_actions_prep AS rap
120+ WHERE
121+ rap .method_name = ' on_lockup_update'
122+ ORDER BY
123+ rap .signer_account_id , -- DISTINCT ON key
124+ rap .block_timestamp DESC , -- "latest" first
125+ rap .receipt_id DESC -- deterministic tie-breaker
125126)
126127/* Sourcing Registered Voters from Deploy Lockup Event (Excluding dupes due to account already being registered) */
127128 -- Whenever a user registers to vote, there should always be a non-null storage deposit, aka, initial voting power amount.
0 commit comments