Skip to content

Conversation

V00D00-child
Copy link
Member

@V00D00-child V00D00-child commented Oct 9, 2025

Description

This PR expands on the gator permissions revocation feature. Enabling users to view/revoke gator permissions.

Manual testing steps

  1. In MM extension .metamaskrc file, ensure the following env values are set:
GATOR_PERMISSIONS_ENABLED=true
GATOR_PERMISSIONS_REVOCATION_ENABLED=true
  1. Go to this page, the All Permissions Page.
  2. Navigate through permissions until you arrive at the review page.
  3. Toggle the extendable card to see the permission details.
  4. Click revoke to trigger a transaction confirmation as a contract interaction with the DelegationManager contract.

Screenshots/Recordings

Before

review-permissions-before.mov

After

review-permissions-after.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

Introduces a review page listing gator token-transfer permissions with detailed per-item views and revoke actions, powered by new time/number utilities, selectors, and i18n strings.

  • UI (Gator Permissions):
    • Add ReviewGatorPermissionsPage to list token-transfer permissions per chain using ReviewGatorPermissionItem, with expand details and revoke action.
    • Export ReviewGatorPermissionItem from components/index.
    • Tweak PermissionsCellTooltip (remove theme prop).
  • Selectors:
    • Add getAggregatedGatorPermissionByChainId to fetch aggregated token-transfer permissions by chainId.
  • Shared libs:
    • New shared/lib/gator-permissions utilities:
      • time-utils (frequency key derivation, ms↔sec, per-period conversion, timestamp formatting, expiry extraction).
      • numbers-utils (hex-to-decimal string with decimals).
    • Re-export via index.
  • Constants:
    • Enhance shared/constants/time.ts with documentation comments.
  • i18n:
    • Add labels/strings for gator permission periods, labels, and unknown amounts in en and en_GB.
  • Tests/Snapshots:
    • Add unit tests for time/number utils and selectors; add component tests and snapshots for native/ERC20 stream/periodic and empty state.

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

@metamaskbot metamaskbot added the team-delegation MetaMask Delegation Team label Oct 9, 2025
@metamaskbot metamaskbot added the INVALID-PR-TEMPLATE PR's body doesn't match template label Oct 9, 2025
@metamaskbot
Copy link
Collaborator

metamaskbot commented Oct 9, 2025

✨ Files requiring CODEOWNER review ✨

👨‍🔧 @MetaMask/core-extension-ux (7 files, +2013 -8)
  • 📁 ui/
    • 📁 components/
      • 📁 multichain/
        • 📁 pages/
          • 📁 gator-permissions/
            • 📁 components/
              • 📁 __snapshots__/
                • 📄 review-gator-permission-item.test.tsx.snap +891 -0
                • 📄 index.ts +1 -0
                • 📄 permissions-cell-tooltip.tsx +0 -1
                • 📄 review-gator-permission-item.test.tsx +436 -0
                • 📄 review-gator-permission-item.tsx +569 -0
            • 📁 review-permissions/
              • 📁 __snapshots__/
                • 📄 review-gator-permissions-page.test.tsx.snap +20 -0
                • 📄 review-gator-permissions-page.tsx +96 -7

@metamaskbot
Copy link
Collaborator

📊 Page Load Benchmark Results

Current Commit: 7cf702e | Date: 10/9/2025

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 1.06s (±71ms) 🟡 | historical mean value: 1.05s ⬆️ (historical data)
  • domContentLoaded-> current mean value: 747ms (±68ms) 🟢 | historical mean value: 733ms ⬆️ (historical data)
  • firstContentfulPaint-> current mean value: 78ms (±13ms) 🟢 | historical mean value: 78ms ⬇️ (historical data)
📈 Detailed Results
Metric Mean Std Dev Min Max P95 P99
pageLoadTime 1.06s 71ms 1.02s 1.34s 1.27s 1.34s
domContentLoaded 747ms 68ms 713ms 1.02s 949ms 1.02s
firstPaint 78ms 13ms 60ms 184ms 88ms 184ms
firstContentfulPaint 78ms 13ms 60ms 184ms 88ms 184ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms

Results generated automatically by MetaMask CI

@metamaskbot
Copy link
Collaborator

Builds ready [7cf702e]
UI Startup Metrics (1212 ± 69 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyHomeuiStartup1212109514206912561345
load104795012426210821170
domContentLoaded104294612376210771164
domInteractive17134371641
firstPaint61971118842610501141
backgroundConnect2472342646251259
firstReactRender22184542230
getState1157381223
initialActions50538418
loadScripts79971098960834919
setupStore85202913
WebpackHomeuiStartup812690109471826974
load62757492763628775
domContentLoaded61956992063620769
domInteractive15115291443
firstPaint19452904197193704
backgroundConnect22113962631
firstReactRender26155993040
getState83223912
initialActions2021336
loadScripts61656790861618757
setupStore84122911
FirefoxBrowserifyHomeuiStartup13841209195212914281676
load1190106214218812601361
domContentLoaded1190106214218812591361
domInteractive1023328853104247
firstPaintNaNNaNNaNNaNNaNNaN
backgroundConnect2918113143266
firstReactRender28244843034
getState8320821626
initialActions4018418213
loadScripts1168104414008512401323
setupStore948511741
WebpackHomeuiStartup15111330190210815551745
load1320118415677913781470
domContentLoaded1319118315667913781470
domInteractive89303594794154
firstPaintNaNNaNNaNNaNNaNNaN
backgroundConnect3317123183475
firstReactRender342473123372
getState6310211514
initialActions40597216
loadScripts1294116415417713501444
setupStore12413317745
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: -19.92 KiB (-0.44%)
  • ui: 17.85 KiB (0.28%)
  • common: 20.66 KiB (0.25%)

@metamaskbot
Copy link
Collaborator

📊 Page Load Benchmark Results

Current Commit: e48f6ff | Date: 10/16/2025

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 1.05s (±72ms) 🟡 | historical mean value: 1.05s ⬇️ (historical data)
  • domContentLoaded-> current mean value: 736ms (±70ms) 🟢 | historical mean value: 737ms ⬇️ (historical data)
  • firstContentfulPaint-> current mean value: 76ms (±10ms) 🟢 | historical mean value: 77ms ⬇️ (historical data)
📈 Detailed Results
Metric Mean Std Dev Min Max P95 P99
pageLoadTime 1.05s 72ms 1.01s 1.32s 1.28s 1.32s
domContentLoaded 736ms 70ms 700ms 1.01s 951ms 1.01s
firstPaint 76ms 10ms 60ms 160ms 84ms 160ms
firstContentfulPaint 76ms 10ms 60ms 160ms 84ms 160ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms

Results generated automatically by MetaMask CI

@metamaskbot
Copy link
Collaborator

Builds ready [e48f6ff]
UI Startup Metrics (1245 ± 60 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyHomeuiStartup1245113714296012881343
load106596711765211071160
domContentLoaded105896211715110971154
domInteractive1913117141733
firstPaint61674119543710831148
backgroundConnect25424037514258266
firstReactRender2819110113244
getState18599122037
initialActions61325716
loadScripts81072193250851906
setupStore1263361324
WebpackHomeuiStartup825713105968840970
load63057890666635773
domContentLoaded62257288866628767
domInteractive15115071336
firstPaint18654894182182599
backgroundConnect2094772431
firstReactRender26166393139
getState841631114
initialActions3010249
loadScripts62057087764626759
setupStore951731114
FirefoxBrowserifyHomeuiStartup14201249192113314781692
load1195105614458812681356
domContentLoaded1194105614458812671356
domInteractive1023429555110251
firstPaintNaNNaNNaNNaNNaNNaN
backgroundConnect3422130163856
firstReactRender29255143038
getState12319325816
initialActions42355412
loadScripts1173103413828512461332
setupStore12661111050
WebpackHomeuiStartup16361435230715616612010
load13881247176510714271631
domContentLoaded13871247176510714271629
domInteractive1153139986105386
firstPaintNaNNaNNaNNaNNaNNaN
backgroundConnect3921142194371
firstReactRender372887133685
getState104124131017
initialActions51518425
loadScripts1361123016969913931602
setupStore156270301137
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: -19.85 KiB (-0.44%)
  • ui: 17.75 KiB (0.27%)
  • common: 21.33 KiB (0.25%)

@metamaskbot
Copy link
Collaborator

📊 Page Load Benchmark Results

Current Commit: 35b302c | Date: 10/16/2025

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 1.06s (±75ms) 🟡 | historical mean value: 1.05s ⬆️ (historical data)
  • domContentLoaded-> current mean value: 750ms (±86ms) 🟢 | historical mean value: 738ms ⬆️ (historical data)
  • firstContentfulPaint-> current mean value: 81ms (±42ms) 🟢 | historical mean value: 78ms ⬆️ (historical data)
📈 Detailed Results
Metric Mean Std Dev Min Max P95 P99
pageLoadTime 1.06s 75ms 1.01s 1.35s 1.30s 1.35s
domContentLoaded 750ms 86ms 700ms 1.30s 957ms 1.30s
firstPaint 81ms 42ms 60ms 496ms 88ms 496ms
firstContentfulPaint 81ms 42ms 60ms 496ms 88ms 496ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms

Results generated automatically by MetaMask CI

@metamaskbot
Copy link
Collaborator

Builds ready [35b302c]
UI Startup Metrics (1239 ± 68 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyHomeuiStartup1239111014376812871383
load106596212176011061168
domContentLoaded105995412145910981163
domInteractive18137591739
firstPaint605147121242910701161
backgroundConnect2522392717256264
firstReactRender25174962635
getState1555871724
initialActions50607617
loadScripts81270896358842926
setupStore953131015
WebpackHomeuiStartup8617271126808751086
load65459396885650917
domContentLoaded64558896183643906
domInteractive16115791445
firstPaint18657968188190652
backgroundConnect22105172635
firstReactRender27174073336
getState931731114
initialActions307245
loadScripts64258695081641895
setupStore1051531215
FirefoxBrowserifyHomeuiStartup14761301201112215101732
load1233109214738212701427
domContentLoaded1233109214728212691427
domInteractive100353705799248
firstPaintNaNNaNNaNNaNNaNNaN
backgroundConnect3622107143659
firstReactRender32265863345
getState94355921
initialActions62729525
loadScripts1209107514448112461388
setupStore166162251169
WebpackHomeuiStartup15661359219813716001841
load13431186171910414011548
domContentLoaded13431185171910414011548
domInteractive108313927899343
firstPaintNaNNaNNaNNaNNaNNaN
backgroundConnect3620119144251
firstReactRender33277883542
getState94699818
initialActions51638317
loadScripts1318116816909913691513
setupStore136111141138
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: -19.71 KiB (-0.44%)
  • ui: 15.83 KiB (0.24%)
  • common: 22.89 KiB (0.27%)

@V00D00-child V00D00-child changed the title feat: Add page to review gator permission granted to sites feat: Add page to review gator permission granted to sites Oct 17, 2025
@V00D00-child V00D00-child marked this pull request as ready for review October 17, 2025 19:20
@V00D00-child V00D00-child requested a review from a team as a code owner October 17, 2025 19:20
@V00D00-child V00D00-child added the no-changelog no-changelog Indicates no external facing user changes, therefore no changelog documentation needed label Oct 17, 2025
@metamaskbot
Copy link
Collaborator

📊 Page Load Benchmark Results

Current Commit: a2e9579 | Date: 10/17/2025

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 1.03s (±69ms) 🟡 | historical mean value: 1.05s ⬇️ (historical data)
  • domContentLoaded-> current mean value: 729ms (±67ms) 🟢 | historical mean value: 737ms ⬇️ (historical data)
  • firstContentfulPaint-> current mean value: 77ms (±13ms) 🟢 | historical mean value: 77ms ⬆️ (historical data)
📈 Detailed Results
Metric Mean Std Dev Min Max P95 P99
pageLoadTime 1.03s 69ms 993ms 1.30s 1.26s 1.30s
domContentLoaded 729ms 67ms 692ms 988ms 939ms 988ms
firstPaint 77ms 13ms 60ms 188ms 88ms 188ms
firstContentfulPaint 77ms 13ms 60ms 188ms 88ms 188ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms

Results generated automatically by MetaMask CI

@metamaskbot
Copy link
Collaborator

Builds ready [a2e9579]
UI Startup Metrics (1229 ± 50 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyHomeuiStartup1229110813535012681307
load105696711664810961135
domContentLoaded105096111614810821129
domInteractive18135481741
firstPaint675150117242510811135
backgroundConnect2522402838256265
firstReactRender25194352738
getState16583121834
initialActions50467616
loadScripts80571291047839885
setupStore1062641119
WebpackHomeuiStartup824707108972841952
load63257291474634806
domContentLoaded62456790573624797
domInteractive15115181435
firstPaint19156864179186595
backgroundConnect20104872534
firstReactRender2717110133134
getState942131115
initialActions3017348
loadScripts62256589571622787
setupStore1052431114
FirefoxBrowserifyHomeuiStartup15491295196212716171793
load1310109215099013831456
domContentLoaded1310109215089013831456
domInteractive1223539760131274
firstPaintNaNNaNNaNNaNNaNNaN
backgroundConnect41241382143100
firstReactRender28227282841
getState1054771030
initialActions41425410
loadScripts1282107414678813531422
setupStore166229311256
WebpackHomeuiStartup16701513226813917261940
load1418129416688214831580
domContentLoaded1418129416678214831579
domInteractive1143237771111349
firstPaintNaNNaNNaNNaNNaNNaN
backgroundConnect4222129214593
firstReactRender322391133476
getState114129171016
initialActions627512418
loadScripts1391126916077914551554
setupStore156215231250
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 5.48 KiB (0.12%)
  • ui: 29.64 KiB (0.46%)
  • common: 26.13 KiB (0.31%)

Copy link
Contributor

@ameliejyc ameliejyc left a comment

Choose a reason for hiding this comment

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

A few small comments but otherwise lgtm!

Comment on lines 156 to 167
/**
* Converts a hex value to a decimal value
*
* @param value - The hex value to convert
* @param decimals - The number of decimals to shift the value by
* @returns The decimal value
*/
const getDecimalizedHexValue = useCallback(
(value: Hex, decimals: number) =>
new Numeric(value, 16).toBase(10).shiftedBy(decimals).toString(),
[],
);
Copy link
Contributor

Choose a reason for hiding this comment

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

Looks like this function would benefit from living inside a number utils file and having its own tests. Or perhaps '@metamask/utils' also has something e.g. hexToNumber that could be useful.

Copy link
Member Author

Choose a reason for hiding this comment

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

I moved this function to a numbers util file under shared/lib/gator-permissions and added comprehensive test coverage.

Comment on lines 188 to 195
/**
* Returns the unknown token amount text
*
* @returns The unknown token amount text
*/
const getUnknownTokenAmountText = useCallback(() => {
return t('gatorPermissionUnknownTokenAmount');
}, [t]);
Copy link
Contributor

Choose a reason for hiding this comment

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

Seems like unnecessary overhead for such a simple function. t is stable and fast and you could probably just inline t('gatorPermissionUnknownTokenAmount') where you need it instead of adding this complexity

Copy link
Member Author

Choose a reason for hiding this comment

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

Good call out, I dropped this helper function in replacement of an inline call to t

Comment on lines 149 to 154
/**
* Handles the click event for the expand/collapse button
*/
const handleExpandClick = useCallback(() => {
setIsExpanded(!isExpanded);
}, [isExpanded]);
Copy link
Contributor

Choose a reason for hiding this comment

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

useCallback is useful to prevent triggering unnecessary re-renders when the function is being used in expensive and slow memoized components or useEffects. Here it's only being used in simple (I think) UI library components, so arguably isn't better than just doing:

const handleExpandClick = () => {
  setIsExpanded(!isExpanded);
};

Just something to bear in mind as often we add useCallbacks with good intentions but if there isn't a performance issue we're trying to solve, they often just add overhead with no real benefit.

Copy link
Member Author

Choose a reason for hiding this comment

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

Thanks for the insight. In this case, the handleExpandClick() is indeed simple and only toggles a stateful boolean value. I dropped useCallback.

@metamaskbot
Copy link
Collaborator

📊 Page Load Benchmark Results

Current Commit: 7e5a8a6 | Date: 10/23/2025

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 1.00s (±72ms) 🟡 | historical mean value: 1.05s ⬇️ (historical data)
  • domContentLoaded-> current mean value: 698ms (±70ms) 🟢 | historical mean value: 740ms ⬇️ (historical data)
  • firstContentfulPaint-> current mean value: 76ms (±13ms) 🟢 | historical mean value: 79ms ⬇️ (historical data)
📈 Detailed Results
Metric Mean Std Dev Min Max P95 P99
pageLoadTime 1.00s 72ms 958ms 1.30s 1.22s 1.30s
domContentLoaded 698ms 70ms 662ms 971ms 910ms 971ms
firstPaint 76ms 13ms 64ms 192ms 88ms 192ms
firstContentfulPaint 76ms 13ms 64ms 192ms 88ms 192ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms

Results generated automatically by MetaMask CI

@metamaskbot
Copy link
Collaborator

Builds ready [7e5a8a6]
UI Startup Metrics (1287 ± 75 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup1287115014517513451409
load110098012657311511222
domContentLoaded109391212587411461216
domInteractive20136092148
firstPaint70089127145011471210
backgroundConnect23722331711240254
firstReactRender2819113113142
getState22887122543
initialActions50557615
loadScripts862693102873916986
setupStore1062431116
BrowserifyPower User HomeuiStartup22111852371451026943714
load1162943211034815472110
domContentLoaded1155936209634715412096
domInteractive281462185562
firstPaint77119421005289812100
backgroundConnect26522563095252630
firstReactRender22202412224
getState20217528023207280
initialActions1428923689
loadScripts910718165030512901650
setupStore1283271132
WebpackStandard HomeuiStartup846725106859871955
load63358788952643755
domContentLoaded62458087051636737
domInteractive161272101440
firstPaint21754895205204622
backgroundConnect24124372835
firstReactRender27176093238
getState1252341417
initialActions3012246
loadScripts62157886049634726
setupStore1052731215
WebpackPower User HomeuiStartup17991432270641023882706
load74062710921649151092
domContentLoaded696613936119879936
domInteractive211362143662
firstPaint5049610233328911023
backgroundConnect12425379131295379
firstReactRender22193742137
getState18016224418181244
initialActions919222592
loadScripts692611925115868925
setupStore1661152615115
FirefoxBrowserifyStandard HomeuiStartup14741269185611615271730
load1249107614377412961380
domContentLoaded1249107614377412961379
domInteractive1183532051124275
firstPaint------
backgroundConnect44241422349101
firstReactRender25204642535
getState9411912816
initialActions6118720316
loadScripts1220105614167012661352
setupStore157251241328
BrowserifyPower User HomeuiStartup27052266410149429164101
load13921212177014514431770
domContentLoaded13911212177014514421770
domInteractive1305126960196269
firstPaint------
backgroundConnect24840903263423903
firstReactRender37265584155
getState1467118229164182
initialActions52143714
loadScripts1325117715399613971539
setupStore4071063171106
WebpackStandard HomeuiStartup16411432243213816591936
load1406126017579014421608
domContentLoaded1405126017569014411608
domInteractive1153441468112249
firstPaint------
backgroundConnect4526104165182
firstReactRender27214642937
getState113163201016
initialActions6113214417
loadScripts1377124117278814121565
setupStore15774101430
WebpackPower User HomeuiStartup31362600406543835054065
load17591427219024420482190
domContentLoaded17581426218924420482189
domInteractive1414824262220242
firstPaint------
backgroundConnect21341961238382961
firstReactRender42325685056
getState16010224543199245
initialActions722061320
loadScripts17011394214222419352142
setupStore25858164158

…with test coverage, and drop unnecessary usage of useCallback in ReviewGatorPermissionItem
cursor[bot]

This comment was marked as outdated.

@V00D00-child V00D00-child changed the title feat: Add page to review gator permission granted to sites feat: Add page to review gator permissions granted to sites Oct 23, 2025
@metamaskbot
Copy link
Collaborator

📊 Page Load Benchmark Results

Current Commit: 255d258 | Date: 10/23/2025

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 1.04s (±70ms) 🟡 | historical mean value: 1.05s ⬇️ (historical data)
  • domContentLoaded-> current mean value: 732ms (±67ms) 🟢 | historical mean value: 738ms ⬇️ (historical data)
  • firstContentfulPaint-> current mean value: 76ms (±13ms) 🟢 | historical mean value: 77ms ⬇️ (historical data)
📈 Detailed Results
Metric Mean Std Dev Min Max P95 P99
pageLoadTime 1.04s 70ms 1.00s 1.31s 1.27s 1.31s
domContentLoaded 732ms 67ms 696ms 994ms 940ms 994ms
firstPaint 76ms 13ms 60ms 192ms 84ms 192ms
firstContentfulPaint 76ms 13ms 60ms 192ms 84ms 192ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms

Results generated automatically by MetaMask CI

@metamaskbot
Copy link
Collaborator

Builds ready [255d258]
UI Startup Metrics (1258 ± 90 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup1258110617029013031411
load108294015238911261241
domContentLoaded107693515108811181233
domInteractive191487101937
firstPaint74272127443411051234
backgroundConnect2302182597235241
firstReactRender2817129123141
getState19779102236
initialActions60406716
loadScripts8527191286888961011
setupStore1062331115
BrowserifyPower User HomeuiStartup23441923420667828844206
load1184969182232016391822
domContentLoaded1175962181132016251811
domInteractive311572226272
firstPaint728191182251310091822
backgroundConnect30022510802022661080
firstReactRender23212622526
getState22118738745226387
initialActions1521032711103
loadScripts930737155729513481557
setupStore1282761227
WebpackStandard HomeuiStartup8537281118798711063
load65658593285669869
domContentLoaded64857992285661861
domInteractive161172101438
firstPaint20758925222185864
backgroundConnect22124382738
firstReactRender251686103133
getState1062431316
initialActions3015348
loadScripts64557791283658849
setupStore951931113
WebpackPower User HomeuiStartup17611321259341922842593
load75362312752079291275
domContentLoaded71960911541758771154
domInteractive201346103046
firstPaint4476211573848851157
backgroundConnect12320419142290419
firstReactRender21202822228
getState17911521822191218
initialActions30215321
loadScripts71460711421718671142
setupStore1463592335
FirefoxBrowserifyStandard HomeuiStartup14101262179010314631619
load1203106613797612581345
domContentLoaded1203106613797612581344
domInteractive1183535465113318
firstPaint------
backgroundConnect4022128194673
firstReactRender25204752542
getState745861014
initialActions41597315
loadScripts1178104813497512341323
setupStore1364781233
BrowserifyPower User HomeuiStartup28652424357538731573575
load14281264162210215191622
domContentLoaded14281264162110215181621
domInteractive1544228067222280
firstPaint------
backgroundConnect20436705195305705
firstReactRender422784144784
getState14910322130165221
initialActions16171202371
loadScripts1385124115809814841580
setupStore29773193973
WebpackStandard HomeuiStartup15961391223011916431840
load1372118017459614151538
domContentLoaded1372118017449614141538
domInteractive1123249373111351
firstPaint------
backgroundConnect4523117185180
firstReactRender3022147152964
getState10415120814
initialActions6112316340
loadScripts1343116017189313841514
setupStore1366191233
WebpackPower User HomeuiStartup30112404385146735983851
load16671381205219518242052
domContentLoaded16671381205219518242052
domInteractive1314028768192287
firstPaint------
backgroundConnect27733946341788946
firstReactRender392876124476
getState1507822445192224
initialActions512261022
loadScripts16041347190715817461907
setupStore5062487766248

const year = date.getFullYear();

return `${month}/${day}/${year}`;
};
Copy link

Choose a reason for hiding this comment

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

Bug: UTC Timestamp Formatting Issue

The convertTimestampToReadableDate function uses local timezone methods (getMonth, getDate, getFullYear) to format a UTC Unix timestamp. This can cause dates to display incorrectly for users in non-UTC timezones.

Fix in Cursor Fix in Web

@metamaskbot
Copy link
Collaborator

📊 Page Load Benchmark Results

Current Commit: 21c316f | Date: 10/23/2025

📄 Localhost MetaMask Test Dapp

Samples: 100

Summary

  • pageLoadTime-> current mean value: 1.05s (±72ms) 🟡 | historical mean value: 1.05s ⬆️ (historical data)
  • domContentLoaded-> current mean value: 738ms (±70ms) 🟢 | historical mean value: 735ms ⬆️ (historical data)
  • firstContentfulPaint-> current mean value: 77ms (±11ms) 🟢 | historical mean value: 77ms ⬇️ (historical data)
📈 Detailed Results
Metric Mean Std Dev Min Max P95 P99
pageLoadTime 1.05s 72ms 1.01s 1.34s 1.28s 1.34s
domContentLoaded 738ms 70ms 699ms 1.01s 956ms 1.01s
firstPaint 77ms 11ms 60ms 168ms 84ms 168ms
firstContentfulPaint 77ms 11ms 60ms 168ms 84ms 168ms
largestContentfulPaint 0ms 0ms 0ms 0ms 0ms 0ms

Results generated automatically by MetaMask CI

@metamaskbot
Copy link
Collaborator

Builds ready [21c316f]
UI Startup Metrics (1259 ± 83 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyStandard HomeuiStartup1259112114718313141418
load107995712988111351255
domContentLoaded107291112858111271247
domInteractive201382111746
firstPaint54487128343010661172
backgroundConnect23422134113236251
firstReactRender27167193245
getState1988292134
initialActions61336617
loadScripts8466841066818991021
setupStore1062531016
BrowserifyPower User HomeuiStartup22441799317443527733174
load1201952202034816132020
domContentLoaded1189945199834416041998
domInteractive36161163160116
firstPaint739174201055110382010
backgroundConnect27922859799262597
firstReactRender25195182551
getState19414422021211220
initialActions16275223775
loadScripts947718163431913711634
setupStore1282741227
WebpackStandard HomeuiStartup8667461194768831006
load64759796371649790
domContentLoaded64059095570642778
domInteractive161286111439
firstPaint20562958212189746
backgroundConnect23133862835
firstReactRender27174273336
getState1252741517
initialActions3014248
loadScripts63758894468640768
setupStore1051531214
WebpackPower User HomeuiStartup18261363246136223302461
load76162712441869641244
domContentLoaded72061510871418561087
domInteractive231473163573
firstPaint4757310903458601090
backgroundConnect12932471130273471
firstReactRender23203232332
getState1777926938184269
initialActions1017321373
loadScripts71561310761378451076
setupStore3062055427205
FirefoxBrowserifyStandard HomeuiStartup15211299186311715881758
load1287109515138213551418
domContentLoaded1286109515138213551417
domInteractive1203734156123274
firstPaint------
backgroundConnect4325115164973
firstReactRender26215162740
getState833651017
initialActions618011416
loadScripts1259107714927913221378
setupStore178172201448
BrowserifyPower User HomeuiStartup28632412411049131314110
load14751279196420016021964
domContentLoaded14751279196420016021964
domInteractive1634138479211384
firstPaint------
backgroundConnect2524113963702871396
firstReactRender39275184651
getState1958353397214533
initialActions9256131356
loadScripts14001251182615115291826
setupStore35883256583
WebpackStandard HomeuiStartup16711504211012417061950
load1426124916489614931629
domContentLoaded1425124916489614931629
domInteractive1202544778115368
firstPaint------
backgroundConnect4926121215698
firstReactRender322386143080
getState124177221043
initialActions4166838
loadScripts1396123116169414361600
setupStore1365261418
WebpackPower User HomeuiStartup28782527367734631173677
load16181388195620319081956
domContentLoaded16171388195520319081955
domInteractive1263925760180257
firstPaint------
backgroundConnect13633602151134602
firstReactRender45281152151115
getState1798336865217368
initialActions1711172828117
loadScripts15731346190118718151901
setupStore5462055484205

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

INVALID-PR-TEMPLATE PR's body doesn't match template no-changelog no-changelog Indicates no external facing user changes, therefore no changelog documentation needed size-XL team-delegation MetaMask Delegation Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants