@@ -234,3 +234,109 @@ fn test_associate_evm_key_using_wrong_hash_function() {
234234 ) ;
235235 } ) ;
236236}
237+
238+ #[ test]
239+ fn test_associate_evm_key_rate_limit_exceeded ( ) {
240+ new_test_ext ( 1 ) . execute_with ( || {
241+ let netuid = NetUid :: from ( 1 ) ;
242+
243+ let tempo: u16 = 2 ;
244+ let modality: u16 = 2 ;
245+ add_network ( netuid, tempo, modality) ;
246+ System :: set_block_number ( EvmKeyAssociateRateLimit :: get ( ) ) ;
247+
248+ let coldkey = U256 :: from ( 1 ) ;
249+ let hotkey = U256 :: from ( 2 ) ;
250+ SubtensorModule :: create_account_if_non_existent ( & coldkey, & hotkey) ;
251+
252+ register_ok_neuron ( netuid, hotkey, coldkey, 0 ) ;
253+
254+ let pair = ecdsa:: Pair :: generate ( ) . 0 ;
255+ let public = pair. public ( ) ;
256+ let evm_key = public_to_evm_key ( & public) ;
257+ let block_number = frame_system:: Pallet :: < Test > :: block_number ( ) ;
258+ let hashed_block_number = keccak_256 ( block_number. encode ( ) . as_ref ( ) ) ;
259+ let hotkey_bytes = hotkey. encode ( ) ;
260+
261+ let message = [ hotkey_bytes. as_ref ( ) , hashed_block_number. as_ref ( ) ] . concat ( ) ;
262+ let signature = sign_evm_message ( & pair, message) ;
263+
264+ // First association should succeed
265+ assert_ok ! ( SubtensorModule :: associate_evm_key(
266+ RuntimeOrigin :: signed( hotkey) ,
267+ netuid,
268+ evm_key,
269+ block_number,
270+ signature. clone( ) ,
271+ ) ) ;
272+
273+ System :: set_block_number ( System :: block_number ( ) + 1 ) ;
274+ let block_number = frame_system:: Pallet :: < Test > :: block_number ( ) ;
275+ let hashed_block_number = keccak_256 ( block_number. encode ( ) . as_ref ( ) ) ;
276+ let hotkey_bytes = hotkey. encode ( ) ;
277+ let message = [ hotkey_bytes. as_ref ( ) , hashed_block_number. as_ref ( ) ] . concat ( ) ;
278+ let signature = sign_evm_message ( & pair, message) ;
279+
280+ // Second association should fail due to rate limit
281+ assert_noop ! (
282+ SubtensorModule :: associate_evm_key(
283+ RuntimeOrigin :: signed( hotkey) ,
284+ netuid,
285+ evm_key,
286+ block_number,
287+ signature. clone( ) ,
288+ ) ,
289+ Error :: <Test >:: EvmKeyAssociateRateLimitExceeded
290+ ) ;
291+
292+ System :: set_block_number ( System :: block_number ( ) + EvmKeyAssociateRateLimit :: get ( ) ) ;
293+ let block_number = frame_system:: Pallet :: < Test > :: block_number ( ) ;
294+ let hashed_block_number = keccak_256 ( block_number. encode ( ) . as_ref ( ) ) ;
295+ let hotkey_bytes = hotkey. encode ( ) ;
296+ let message = [ hotkey_bytes. as_ref ( ) , hashed_block_number. as_ref ( ) ] . concat ( ) ;
297+ let signature = sign_evm_message ( & pair, message) ;
298+
299+ assert_ok ! ( SubtensorModule :: associate_evm_key(
300+ RuntimeOrigin :: signed( hotkey) ,
301+ netuid,
302+ evm_key,
303+ block_number,
304+ signature. clone( ) ,
305+ ) ) ;
306+ } ) ;
307+ }
308+
309+ #[ test]
310+ fn test_associate_evm_key_uid_not_found ( ) {
311+ new_test_ext ( 1 ) . execute_with ( || {
312+ let netuid = NetUid :: from ( 1 ) ;
313+
314+ let tempo: u16 = 2 ;
315+ let modality: u16 = 2 ;
316+
317+ add_network ( netuid, tempo, modality) ;
318+
319+ let hotkey = U256 :: from ( 2 ) ;
320+
321+ let pair = ecdsa:: Pair :: generate ( ) . 0 ;
322+ let public = pair. public ( ) ;
323+ let evm_key = public_to_evm_key ( & public) ;
324+ let block_number = frame_system:: Pallet :: < Test > :: block_number ( ) ;
325+ let hashed_block_number = keccak_256 ( block_number. encode ( ) . as_ref ( ) ) ;
326+ let hotkey_bytes = hotkey. encode ( ) ;
327+
328+ let message = [ hotkey_bytes. as_ref ( ) , hashed_block_number. as_ref ( ) ] . concat ( ) ;
329+ let signature = sign_evm_message ( & pair, message) ;
330+
331+ assert_noop ! (
332+ SubtensorModule :: associate_evm_key(
333+ RuntimeOrigin :: signed( hotkey) ,
334+ netuid,
335+ evm_key,
336+ block_number,
337+ signature. clone( ) ,
338+ ) ,
339+ Error :: <Test >:: NonAssociatedColdKey
340+ ) ;
341+ } ) ;
342+ }
0 commit comments