Skip to content

Conversation

@owencraston
Copy link
Contributor

@owencraston owencraston commented Dec 4, 2025

Description

  1. What is the reason for the change?
    The EVM address on the address list page was not checksummed while it was on on the home page. This is important for users so that their addresses match what they see in the ecosystem.
  2. What is the improvement/solution?
    Call the following formatting function.
/**
 * Normalize an address to a "safer" representation. The address might be returned as-is, if
 * there's no normalizer available.
 *
 * @param address - An address to normalize.
 * @returns The "safer" normalized address.
 */
export function normalizeSafeAddress(address: string): string {
  // NOTE: We assume that the overhead over checking the address format
  // at runtime is small
  return isEthAddress(address) ? toChecksumHexAddress(address) : address;
}

Open in GitHub Codespaces

Changelog

CHANGELOG entry: Fixed bug where the EVM addresses were not checksummed

Related issues

Fixes: https://consensyssoftware.atlassian.net/browse/MUL-1325

Manual testing steps

  1. Create/impor a wallet
  2. hover address list via the network icons below the account name
  3. notice the address for ETH
  4. click view all
  5. you will be taken to the address list
  6. verify that the addresses for the EVm networks are checksummed
  7. verify that copying the address results in a checksummed address
  8. verify that the qr code is checksummed
  9. verify that the non evm addresses are NOT checksummed

Screenshots/Recordings

Before

Screenshot 2025-12-03 at 11 54 18 PM Screenshot 2025-12-03 at 11 54 24 PM

After

Screenshot 2025-12-03 at 8 10 56 PM Screenshot 2025-12-03 at 8 10 48 PM Screenshot 2025-12-03 at 8 11 24 PM
Screen.Recording.2025-12-03.at.11.51.13.PM.mov

Pre-merge author checklist

Pre-merge reviewer checklist

  • I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed).
  • I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots.

Note

Checksums EVM addresses for display, copy, and search in the multichain address list while preserving non‑EVM formats, with accompanying tests.

  • UI
    • Use normalizeSafeAddress to provide a normalized address for MultichainAddressRow and for copy actions.
    • Search now matches against normalizedAddress in addition to network name.
    • Memoize normalizedAddress per item and render list using the normalized values.
    • Generalize sortByPriorityNetworks with a generic type.
  • Tests
    • Add tests verifying EVM addresses are checksummed for display/copy and searchable by checksummed form.
    • Confirm non‑EVM addresses (e.g., Bitcoin) remain unchanged.

Written by Cursor Bugbot for commit 221ffd6. This will update automatically on new commits. Configure here.

@owencraston owencraston requested a review from a team as a code owner December 4, 2025 04:08
@github-actions
Copy link
Contributor

github-actions bot commented Dec 4, 2025

CLA Signature Action: All authors have signed the CLA. You may need to manually re-run the blocking PR check if it doesn't pass in a few minutes.

@metamaskbot metamaskbot added the team-accounts-framework Accounts Framework team label Dec 4, 2025
@metamaskbot
Copy link
Collaborator

metamaskbot commented Dec 4, 2025

✨ Files requiring CODEOWNER review ✨

🔑 @MetaMask/accounts-engineers (2 files, +168 -13)
  • 📁 ui/
    • 📁 components/
      • 📁 multichain-accounts/
        • 📁 multichain-address-rows-list/
          • 📄 multichain-address-rows-list.test.tsx +148 -0
          • 📄 multichain-address-rows-list.tsx +20 -13

@github-actions github-actions bot added the size-S label Dec 4, 2025
@metamaskbot
Copy link
Collaborator

Builds ready [fc89638]
UI Startup Metrics (1255 ± 116 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup12551026157211613291472
load1050861134310411221234
domContentLoaded1043856133710211111226
domInteractive251588182282
firstPaint62591133643610691203
backgroundConnect21519325312221239
firstReactRender29206193153
getState3415115144062
initialActions104112
loadScripts8366581124989001011
setupStore1272741222
numNetworkReqs1157217561
BrowserifyPower User HomeuiStartup20511610254922222132457
load1034897145912910801350
domContentLoaded1023890144912810671342
domInteractive3117118213198
firstPaint5428514664079781265
backgroundConnect298203901168245760
firstReactRender53427575767
getState18414726223200226
initialActions102012
loadScripts80769312001238471136
setupStore1675381637
numNetworkReqs77641562273146
WebpackStandard HomeuiStartup8216961097858541014
load63456282469672779
domContentLoaded63055981769669774
domInteractive251497202288
firstPaint21186829147195587
backgroundConnect13570121336
firstReactRender2919162183138
getState271470113347
initialActions104112
loadScripts62755780768667772
setupStore1163851220
numNetworkReqs1057015557
WebpackPower User HomeuiStartup16011209238026218522106
load67858195094701901
domContentLoaded67057494294693894
domInteractive3218107223096
firstPaint280102942198283759
backgroundConnect1177719210101616
firstReactRender5844102106280
getState18514791176185235
initialActions105112
loadScripts66757294093691892
setupStore16967101542
numNetworkReqs77622322872151
FirefoxBrowserifyStandard HomeuiStartup12751059167613913691555
load1066914140810011201268
domContentLoaded1065914140810011201268
domInteractive56311882983104
firstPaint------
backgroundConnect43181943244124
firstReactRender22174852235
getState12612213927
initialActions102012
loadScripts104089913849110911229
setupStore11569101028
numNetworkReqs1256516662
BrowserifyPower User HomeuiStartup30892014490689739584668
load1399936267550213652534
domContentLoaded1399936267550313652534
domInteractive110311006113105262
firstPaint------
backgroundConnect3292213224184901200
firstReactRender66382663563138
getState312871286266358930
initialActions3071823
loadScripts1232920253833612602192
setupStore14461290232109713
numNetworkReqs74511342271123
WebpackStandard HomeuiStartup15181253195114216081805
load12601091154710513391471
domContentLoaded12601090154710513391471
domInteractive69282204186131
firstPaint------
backgroundConnect48222183352119
firstReactRender28217683040
getState147185191432
initialActions103122
loadScripts12341050152010312951446
setupStore155143191240
numNetworkReqs1256716760
WebpackPower User HomeuiStartup33172127575994642544771
load16351186295952518092763
domContentLoaded16351186295852518092763
domInteractive1623013222591221037
firstPaint------
backgroundConnect2452320053612151155
firstReactRender74373495368202
getState312801285285535895
initialActions2031323
loadScripts15261167286244215132555
setupStore885730133102307
numNetworkReqs75521422271124
📊 Page Load Benchmark Results

Current Commit: fc89638 | Date: 12/4/2025

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 1.03s (±50ms) 🟡 | historical mean value: 1.04s ⬇️ (historical data)
  • domContentLoaded-> current mean value: 716ms (±45ms) 🟢 | historical mean value: 723ms ⬇️ (historical data)
  • firstContentfulPaint-> current mean value: 76ms (±16ms) 🟢 | historical mean value: 78ms ⬇️ (historical data)

📈 Detailed Results

Metric Mean Std Dev Min Max P95 P99
pageLoadTime 1.03s 50ms 1.00s 1.43s 1.05s 1.43s
domContentLoaded 716ms 45ms 695ms 1.07s 740ms 1.07s
firstPaint 76ms 16ms 60ms 224ms 84ms 224ms
firstContentfulPaint 76ms 16ms 60ms 224ms 84ms 224ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 58 Bytes (0%)
  • ui: 210 Bytes (0%)
  • common: 20 Bytes (0%)

@github-actions github-actions bot added size-M and removed size-S labels Dec 4, 2025
@metamaskbot
Copy link
Collaborator

Builds ready [45938f5]
UI Startup Metrics (1220 ± 101 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup12201011155010112861376
load102385713338810651201
domContentLoaded101784913248710601195
domInteractive2615163242189
firstPaint4957912173769611112
backgroundConnect21419724510219236
firstReactRender28186883044
getState3616155234177
initialActions102111
loadScripts808647110585845979
setupStore1172841220
numNetworkReqs1156917562
BrowserifyPower User HomeuiStartup20221656277120421382405
load1051904149112811071337
domContentLoaded1039894146912810951332
domInteractive3217137223085
firstPaint6228815294219931347
backgroundConnect264211802114237592
firstReactRender544092105876
getState19014829627203256
initialActions103112
loadScripts82369412171258641121
setupStore17106591639
numNetworkReqs78631551975136
WebpackStandard HomeuiStartup798690106677827964
load62255088466651759
domContentLoaded61754687866645756
domInteractive2414108182182
firstPaint22371723155206629
backgroundConnect1054761224
firstReactRender26194663139
getState251275113143
initialActions102111
loadScripts61554487665643754
setupStore1062741119
numNetworkReqs1056615556
WebpackPower User HomeuiStartup15821188229626018062157
load682585108798697891
domContentLoaded674578108098689882
domInteractive35172593431114
firstPaint319871088230582807
backgroundConnect94758918323554
firstReactRender5947114106379
getState18315074362188251
initialActions103112
loadScripts671576107196686874
setupStore181057101644
numNetworkReqs79602402973141
FirefoxBrowserifyStandard HomeuiStartup13661124190818014531787
load1127966151111911751361
domContentLoaded1126966151111911751361
domInteractive76343515097174
firstPaint------
backgroundConnect55242494267140
firstReactRender23185152437
getState166216301046
initialActions102122
loadScripts1095948147910911521328
setupStore13670111341
numNetworkReqs1256817665
BrowserifyPower User HomeuiStartup31112040500193141204840
load14531020287355719742582
domContentLoaded14521020287355719732581
domInteractive123321041168115237
firstPaint------
backgroundConnect3162712614043801182
firstReactRender64342603667133
getState3228611972864261016
initialActions2133323
loadScripts1267991271640012472272
setupStore1406917199140686
numNetworkReqs76531422077122
WebpackStandard HomeuiStartup16011340233918516571991
load13051141157410013581498
domContentLoaded13051141157310013581498
domInteractive74292013994143
firstPaint------
backgroundConnect60193034572153
firstReactRender29208283041
getState157171201342
initialActions103122
loadScripts1272111315499213331428
setupStore2462614513142
numNetworkReqs1256617763
WebpackPower User HomeuiStartup31231974574293139164936
load15921081306746720782441
domContentLoaded15921081306646720782441
domInteractive112311066150109282
firstPaint------
backgroundConnect207251069254242927
firstReactRender64372393364148
getState252751297234282784
initialActions41548221
loadScripts15051065291141818522384
setupStore13041056219102785
numNetworkReqs75531382271122
📊 Page Load Benchmark Results

Current Commit: 45938f5 | Date: 12/4/2025

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 1.04s (±36ms) 🟡 | historical mean value: 1.04s ⬆️ (historical data)
  • domContentLoaded-> current mean value: 723ms (±34ms) 🟢 | historical mean value: 722ms ⬆️ (historical data)
  • firstContentfulPaint-> current mean value: 76ms (±10ms) 🟢 | historical mean value: 78ms ⬇️ (historical data)

📈 Detailed Results

Metric Mean Std Dev Min Max P95 P99
pageLoadTime 1.04s 36ms 1.01s 1.30s 1.07s 1.30s
domContentLoaded 723ms 34ms 700ms 977ms 749ms 977ms
firstPaint 76ms 10ms 60ms 164ms 84ms 164ms
firstContentfulPaint 76ms 10ms 60ms 164ms 84ms 164ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 180 Bytes (0%)
  • ui: 398 Bytes (0.01%)
  • common: 230 Bytes (0%)

@owencraston owencraston force-pushed the fix/checksummed-address-list-MUL-1325 branch from 45938f5 to 221ffd6 Compare December 4, 2025 19:14
@metamaskbot
Copy link
Collaborator

Builds ready [221ffd6]
UI Startup Metrics (1268 ± 107 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup12681020153310713481445
load106086113089711141236
domContentLoaded105485612969611091224
domInteractive2716103212386
firstPaint51085131440010051175
backgroundConnect21919928012225241
firstReactRender3118184183361
getState3615118184069
initialActions107112
loadScripts842654108692906994
setupStore1262741321
numNetworkReqs1156716560
BrowserifyPower User HomeuiStartup20641704260418221502512
load1037932151212010441351
domContentLoaded1023920150312110261342
domInteractive39182283437111
firstPaint5369115164149831357
backgroundConnect272208787124236627
firstReactRender5540102125986
getState19713769975206256
initialActions106112
loadScripts80970012801198141127
setupStore22877102443
numNetworkReqs1397127950198220
WebpackStandard HomeuiStartup828696109675857978
load64057188863681786
domContentLoaded63656688063678780
domInteractive2616123212285
firstPaint233100885169204685
backgroundConnect1056571117
firstReactRender27204053237
getState261483113442
initialActions104112
loadScripts63356487261675772
setupStore1163961323
numNetworkReqs1056315560
WebpackPower User HomeuiStartup15751262243123316132043
load66958293180692884
domContentLoaded65957692581676877
domInteractive36181502935119
firstPaint26788930180254695
backgroundConnect41764111617141
firstReactRender57437886372
getState17413123317181214
initialActions102012
loadScripts65657491679674867
setupStore21964112548
numNetworkReqs1606732060215283
FirefoxBrowserifyStandard HomeuiStartup13721074193717014691683
load1119928163810711741304
domContentLoaded1119923163810711741304
domInteractive63312373690129
firstPaint------
backgroundConnect53213764765142
firstReactRender23185252435
getState135205211024
initialActions102022
loadScripts108791115729511471231
setupStore155183231441
numNetworkReqs1156216661
BrowserifyPower User HomeuiStartup26501973447647127833916
load12301023259628712081815
domContentLoaded12301023259628712081815
domInteractive12334568114112473
firstPaint------
backgroundConnect155191197191135526
firstReactRender5838136146095
getState318601101253462873
initialActions2040426
loadScripts11881003245126411611712
setupStore17412914220189701
numNetworkReqs84591752780158
WebpackStandard HomeuiStartup15321288206114916131824
load12631064161411113421478
domContentLoaded12621064161411113421478
domInteractive60271713382129
firstPaint------
backgroundConnect50221592960108
firstReactRender27204242937
getState147159191426
initialActions103112
loadScripts12341049155810313011409
setupStore13596111235
numNetworkReqs1256816764
WebpackPower User HomeuiStartup30252112563385430444858
load15331182300047216352807
domContentLoaded15331182300047216342807
domInteractive148321130192123393
firstPaint------
backgroundConnect180321207228169934
firstReactRender61381342062104
getState312571628286485895
initialActions103122
loadScripts14661155280041215352704
setupStore1295789185126695
numNetworkReqs83612362781140
📊 Page Load Benchmark Results

Current Commit: 221ffd6 | Date: 12/4/2025

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 1.06s (±54ms) 🟡 | historical mean value: 1.05s ⬆️ (historical data)
  • domContentLoaded-> current mean value: 737ms (±52ms) 🟢 | historical mean value: 735ms ⬆️ (historical data)
  • firstContentfulPaint-> current mean value: 78ms (±10ms) 🟢 | historical mean value: 78ms ⬇️ (historical data)

📈 Detailed Results

Metric Mean Std Dev Min Max P95 P99
pageLoadTime 1.06s 54ms 1.02s 1.35s 1.09s 1.35s
domContentLoaded 737ms 52ms 707ms 1.02s 769ms 1.02s
firstPaint 78ms 10ms 64ms 164ms 88ms 164ms
firstContentfulPaint 78ms 10ms 64ms 164ms 88ms 164ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 58 Bytes (0%)
  • ui: 262 Bytes (0%)
  • common: 20 Bytes (0%)

Copy link
Contributor

@ccharly ccharly left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code LGTM (not manually tested)!

The only nit comment I would have would be to not use the as Record<string, unknown> and maybe using GROUP_MOCK_ID instead. However it seems the test are "bleeding" and this causes problem between all tests. That's ok, but I feel like something is wrong with the test setup!

@owencraston owencraston added this pull request to the merge queue Dec 4, 2025
Merged via the queue into main with commit 9d483dd Dec 4, 2025
176 checks passed
@owencraston owencraston deleted the fix/checksummed-address-list-MUL-1325 branch December 4, 2025 21:30
@github-actions github-actions bot locked and limited conversation to collaborators Dec 4, 2025
@metamaskbot metamaskbot added the release-13.13.0 Issue or pull request that will be included in release 13.13.0 label Dec 4, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

release-13.13.0 Issue or pull request that will be included in release 13.13.0 size-M team-accounts-framework Accounts Framework team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants