@@ -3,9 +3,9 @@ import BigNumber from 'bignumber.js';
33import BN from 'bn.js' ;
44import nock from 'nock' ;
55
6- import { FakeProvider } from '../../../tests/fake-provider' ;
76import { MAX_SAFE_CHAIN_ID } from './constants' ;
87import * as util from './util' ;
8+ import { FakeProvider } from '../../../tests/fake-provider' ;
99
1010const VALID = '4e1fF7229BDdAf0A73DF183a88d9c3a04cc975e0' ;
1111const SOME_API = 'https://someapi.com' ;
@@ -320,6 +320,52 @@ describe('util', () => {
320320 it ( 'should return the input untouched if it is null' , ( ) => {
321321 expect ( util . toChecksumHexAddress ( null ) ) . toBeNull ( ) ;
322322 } ) ;
323+
324+ it ( 'should memoize results for same input' , ( ) => {
325+ const testAddress = '4e1ff7229bddaf0a73df183a88d9c3a04cc975e0' ;
326+
327+ // Call the function multiple times with the same input
328+ const result1 = util . toChecksumHexAddress ( testAddress ) ;
329+ const result2 = util . toChecksumHexAddress ( testAddress ) ;
330+ const result3 = util . toChecksumHexAddress ( testAddress ) ;
331+
332+ // All results should be identical
333+ expect ( result1 ) . toBe ( '0x4e1fF7229BDdAf0A73DF183a88d9c3a04cc975e0' ) ;
334+ expect ( result2 ) . toBe ( result1 ) ;
335+ expect ( result3 ) . toBe ( result1 ) ;
336+ } ) ;
337+
338+ it ( 'should return different results for different inputs but still memoize each' , ( ) => {
339+ const testAddress1 = '4e1ff7229bddaf0a73df183a88d9c3a04cc975e0' ;
340+ const testAddress2 = '742d35cc6ba4c0a2b7e8b4c0b1b0c2b2b2b2b2b2' ;
341+
342+ // Call with first address multiple times
343+ const result1a = util . toChecksumHexAddress ( testAddress1 ) ;
344+ const result1b = util . toChecksumHexAddress ( testAddress1 ) ;
345+
346+ // Call with second address multiple times
347+ const result2a = util . toChecksumHexAddress ( testAddress2 ) ;
348+ const result2b = util . toChecksumHexAddress ( testAddress2 ) ;
349+
350+ // Results for same address should be identical
351+ expect ( result1b ) . toBe ( result1a ) ;
352+ expect ( result2b ) . toBe ( result2a ) ;
353+
354+ // Results for different addresses should be different
355+ expect ( result1a ) . not . toBe ( result2a ) ;
356+ } ) ;
357+
358+ it ( 'should memoize based on complete argument signature' , ( ) => {
359+ const testAddress = '4e1ff7229bddaf0a73df183a88d9c3a04cc975e0' ;
360+
361+ // Call with string argument
362+ const result1 = util . toChecksumHexAddress ( testAddress ) ;
363+ const result2 = util . toChecksumHexAddress ( testAddress ) ;
364+
365+ // Both should be memoized and return the same result
366+ expect ( result2 ) . toBe ( result1 ) ;
367+ expect ( result1 ) . toBe ( '0x4e1fF7229BDdAf0A73DF183a88d9c3a04cc975e0' ) ;
368+ } ) ;
323369 } ) ;
324370
325371 describe ( 'isValidHexAddress' , ( ) => {
@@ -336,6 +382,83 @@ describe('util', () => {
336382 false ,
337383 ) ;
338384 } ) ;
385+
386+ it ( 'should memoize results for same input' , ( ) => {
387+ const validAddress = '4e1fF7229BDdAf0A73DF183a88d9c3a04cc975e0' ;
388+
389+ // Call the function multiple times with the same input
390+ const result1 = util . isValidHexAddress ( validAddress ) ;
391+ const result2 = util . isValidHexAddress ( validAddress ) ;
392+ const result3 = util . isValidHexAddress ( validAddress ) ;
393+
394+ // All results should be identical
395+ expect ( result1 ) . toBe ( true ) ;
396+ expect ( result2 ) . toBe ( result1 ) ;
397+ expect ( result3 ) . toBe ( result1 ) ;
398+ } ) ;
399+
400+ it ( 'should memoize results for same input with options' , ( ) => {
401+ const validAddress = '4e1fF7229BDdAf0A73DF183a88d9c3a04cc975e0' ;
402+ const options = { allowNonPrefixed : true } ;
403+
404+ // Call the function multiple times with the same input and options
405+ const result1 = util . isValidHexAddress ( validAddress , options ) ;
406+ const result2 = util . isValidHexAddress ( validAddress , options ) ;
407+ const result3 = util . isValidHexAddress ( validAddress , options ) ;
408+
409+ // All results should be identical
410+ expect ( result1 ) . toBe ( true ) ;
411+ expect ( result2 ) . toBe ( result1 ) ;
412+ expect ( result3 ) . toBe ( result1 ) ;
413+ } ) ;
414+
415+ it ( 'should return different results for different option combinations' , ( ) => {
416+ const addressWithoutPrefix = '4e1fF7229BDdAf0A73DF183a88d9c3a04cc975e0' ;
417+
418+ // Call with different options
419+ const result1 = util . isValidHexAddress ( addressWithoutPrefix , {
420+ allowNonPrefixed : true ,
421+ } ) ;
422+ const result2 = util . isValidHexAddress ( addressWithoutPrefix , {
423+ allowNonPrefixed : false ,
424+ } ) ;
425+
426+ // Should return different results for different options
427+ expect ( result1 ) . toBe ( true ) ;
428+ expect ( result2 ) . toBe ( false ) ;
429+
430+ // But calling again with same options should return memoized results
431+ const result1Again = util . isValidHexAddress ( addressWithoutPrefix , {
432+ allowNonPrefixed : true ,
433+ } ) ;
434+ const result2Again = util . isValidHexAddress ( addressWithoutPrefix , {
435+ allowNonPrefixed : false ,
436+ } ) ;
437+
438+ expect ( result1Again ) . toBe ( result1 ) ;
439+ expect ( result2Again ) . toBe ( result2 ) ;
440+ } ) ;
441+
442+ it ( 'should handle memoization with different address inputs' , ( ) => {
443+ const validAddress = '4e1fF7229BDdAf0A73DF183a88d9c3a04cc975e0' ;
444+ const invalidAddress = '0x00' ;
445+
446+ // Call with valid address multiple times
447+ const validResult1 = util . isValidHexAddress ( validAddress ) ;
448+ const validResult2 = util . isValidHexAddress ( validAddress ) ;
449+
450+ // Call with invalid address multiple times
451+ const invalidResult1 = util . isValidHexAddress ( invalidAddress ) ;
452+ const invalidResult2 = util . isValidHexAddress ( invalidAddress ) ;
453+
454+ // Results for same address should be identical
455+ expect ( validResult2 ) . toBe ( validResult1 ) ;
456+ expect ( invalidResult2 ) . toBe ( invalidResult1 ) ;
457+
458+ // Results should be correct
459+ expect ( validResult1 ) . toBe ( true ) ;
460+ expect ( invalidResult1 ) . toBe ( false ) ;
461+ } ) ;
339462 } ) ;
340463
341464 it ( 'messageHexToString' , ( ) => {
0 commit comments