@@ -133,13 +133,60 @@ var ArenaScreen = (function() {
133133 if ( found ) return ; // Already have pending challenges loaded
134134 }
135135
136- // Fetch recent blocks to look for challenges targeting this user
136+ // Fetch recent blocks to look for challenges targeting this user.
137+ // Prefer Archive Mirror range events so the Arena does not have to make
138+ // thousands of live getBlock() calls and so thin indexed events work in
139+ // browsers with different VIZ RPC retention/latency.
137140 viz . api . getDynamicGlobalProperties ( function ( err , dgp ) {
138141 if ( err || ! dgp ) return ;
139142 var headBlock = dgp . head_block_number ;
140143 // Scan last 2400 blocks (~2 hours) so challenges aren't missed
141144 var startBlock = Math . max ( 1 , headBlock - 2400 ) ;
142- _scanBlocksForChallenges ( startBlock , headBlock , user , el ) ;
145+ _scanArchiveForChallenges ( startBlock , headBlock , user , el , function ( found ) {
146+ if ( found ) return ;
147+ _scanBlocksForChallenges ( startBlock , headBlock , user , el ) ;
148+ } ) ;
149+ } ) ;
150+ }
151+
152+ function _scanArchiveForChallenges ( startBlock , endBlock , user , el , done ) {
153+ done = done || function ( ) { } ;
154+ if ( typeof HistorySource === 'undefined' || ! HistorySource . getEventsRange ) {
155+ done ( false ) ;
156+ return ;
157+ }
158+ HistorySource . getEventsRange ( {
159+ protocol : VizMagicConfig . PROTOCOLS . VM ,
160+ start : startBlock ,
161+ end : endBlock ,
162+ limit : 1000
163+ } , function ( err , events ) {
164+ if ( err || ! events || ! events . length ) {
165+ done ( false ) ;
166+ return ;
167+ }
168+ var pendingChallenges = [ ] ;
169+ for ( var i = 0 ; i < events . length ; i ++ ) {
170+ var ev = events [ i ] || { } ;
171+ if ( ev . type !== VizMagicConfig . ACTION_TYPES . CHALLENGE ) continue ;
172+ var payload = ev . payload || { } ;
173+ var data = payload . d || ev . data || { } ;
174+ if ( ! data || data . target !== user ) continue ;
175+ var challenger = ev . sender || ev . account || '' ;
176+ if ( ! challenger && ev . accounts && ev . accounts . length ) challenger = ev . accounts [ 0 ] ;
177+ pendingChallenges . push ( {
178+ challenger : challenger ,
179+ blockNum : ev . blockNum || ev . block_num || 0 ,
180+ data : data ,
181+ strategyHash : data . strategy_hash
182+ } ) ;
183+ }
184+ if ( pendingChallenges . length > 0 ) {
185+ _showIncomingChallenges ( pendingChallenges , el , user ) ;
186+ done ( true ) ;
187+ return ;
188+ }
189+ done ( false ) ;
143190 } ) ;
144191 }
145192
0 commit comments