Skip to content

Conversation

@hmalik88
Copy link
Contributor

@hmalik88 hmalik88 commented Jul 17, 2025

Description

Write a short description of the changes included in this pull request, also include relevant motivation and context. Have in mind the following questions:

  1. What is the reason for the change? To align the explorer button text with the name of the actual explorer tied to the account.
  2. What is the improvement/solution? Add a function that returns the correct text based on account type.

Manual testing steps

  1. Build from this branch.
  2. Navigate to a solana account or evm account's address qr code page.
  3. Observe that the explorer button's text is either "View on Etherscan" or "View on Solscan"

Screenshots/Recordings

Before

image

After

Screen.Recording.2025-07-17.at.3.20.49.PM.mov
Screen.Recording.2025-07-17.at.3.20.12.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.

@hmalik88 hmalik88 requested a review from a team as a code owner July 17, 2025 19:25
@hmalik88 hmalik88 added the no-changelog no-changelog Indicates no external facing user changes, therefore no changelog documentation needed label Jul 17, 2025
@github-actions
Copy link
Contributor

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 team-accounts-framework Accounts Framework team INVALID-PR-TEMPLATE PR's body doesn't match template labels Jul 17, 2025
@metamaskbot
Copy link
Collaborator

metamaskbot commented Jul 17, 2025

✨ Files requiring CODEOWNER review ✨

🔑 @MetaMask/accounts-engineers (3 files, +20 -7)
  • 📁 test/
    • 📁 e2e/
      • 📁 tests/
        • 📁 multichain-accounts/
          • 📄 account-details.spec.ts +1 -1
  • 📁 ui/
    • 📁 pages/
      • 📁 multichain-accounts/
        • 📁 address-qr-code/
          • 📄 address-qr-code.test.tsx +6 -5
          • 📄 address-qr-code.tsx +13 -1

@metamaskbot
Copy link
Collaborator

❌ test-e2e-chrome-api-specs failed. View the html report here.

cursor[bot]

This comment was marked as outdated.

@metamaskbot
Copy link
Collaborator

Builds ready [ea9824d]
UI Startup Metrics (1275 ± 67 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyHomeuiStartup1275112915906713141374
load109194914456511251182
domContentLoaded108494514376411191160
domInteractive19145091644
firstPaint61279144344710931148
backgroundConnect21219732813214224
firstReactRender20154362037
getState1042971524
initialActions40769216
loadScripts878739123262916954
setupStore74323712
WebpackHomeuiStartup23521983280412924132512
load18651427230315119342130
domContentLoaded18571419229315119242123
domInteractive1912130181566
firstPaint1496237861174290
backgroundConnect46114597531276
firstReactRender1688836376182340
getState154257311425
initialActions8221421619
loadScripts18521411228215119202111
setupStore1364161625
FirefoxBrowserifyHomeuiStartup15181334212214515731824
load1302117816159313431471
domContentLoaded1302117816149313421470
domInteractive1143851381108304
firstPaintNaNNaNNaNNaNNaNNaN
backgroundConnect2915130182968
firstReactRender29216593056
getState15322338747
initialActions517010325
loadScripts1279115615659213201447
setupStore12318123850
WebpackHomeuiStartup17421449235717918052152
load14881253208514115621806
domContentLoaded14881252208514115621806
domInteractive98353735899278
firstPaintNaNNaNNaNNaNNaNNaN
backgroundConnect3016164192766
firstReactRender52426655660
getState113260261023
initialActions41668321
loadScripts14641235205813715411762
setupStore14428436834
Benchmark value 1275 exceeds gate value 1234 for chrome browserify home mean uiStartup
Benchmark value 1092 exceeds gate value 1070 for chrome browserify home mean load
Benchmark value 1085 exceeds gate value 1061 for chrome browserify home mean domContentLoaded
Benchmark value 213 exceeds gate value 10 for chrome browserify home mean backgroundConnect
Benchmark value 4 exceeds gate value 1 for chrome browserify home mean initialActions
Benchmark value 879 exceeds gate value 830 for chrome browserify home mean loadScripts
Benchmark value 1374 exceeds gate value 1365 for chrome browserify home p95 uiStartup
Benchmark value 44 exceeds gate value 41 for chrome browserify home p95 domInteractive
Benchmark value 224 exceeds gate value 18 for chrome browserify home p95 backgroundConnect
Benchmark value 16 exceeds gate value 1.2 for chrome browserify home p95 initialActions
Benchmark value 954 exceeds gate value 940 for chrome browserify home p95 loadScripts
Benchmark value 2352 exceeds gate value 2192 for chrome webpack home mean uiStartup
Benchmark value 1866 exceeds gate value 1711 for chrome webpack home mean load
Benchmark value 1857 exceeds gate value 1704 for chrome webpack home mean domContentLoaded
Benchmark value 47 exceeds gate value 40 for chrome webpack home mean backgroundConnect
Benchmark value 8 exceeds gate value 7 for chrome webpack home mean initialActions
Benchmark value 1853 exceeds gate value 1699 for chrome webpack home mean loadScripts
Benchmark value 2513 exceeds gate value 2454 for chrome webpack home p95 uiStartup
Benchmark value 2130 exceeds gate value 2030 for chrome webpack home p95 load
Benchmark value 2124 exceeds gate value 2005 for chrome webpack home p95 domContentLoaded
Benchmark value 66 exceeds gate value 57 for chrome webpack home p95 domInteractive
Benchmark value 276 exceeds gate value 90 for chrome webpack home p95 backgroundConnect
Benchmark value 19 exceeds gate value 7 for chrome webpack home p95 initialActions
Benchmark value 2111 exceeds gate value 1970 for chrome webpack home p95 loadScripts
Benchmark value 1518 exceeds gate value 1405 for firefox browserify home mean uiStartup
Benchmark value 1303 exceeds gate value 1245 for firefox browserify home mean load
Benchmark value 1303 exceeds gate value 1239 for firefox browserify home mean domContentLoaded
Benchmark value 115 exceeds gate value 110 for firefox browserify home mean domInteractive
Benchmark value 30 exceeds gate value 25 for firefox browserify home mean backgroundConnect
Benchmark value 29 exceeds gate value 25 for firefox browserify home mean firstReactRender
Benchmark value 16 exceeds gate value 11 for firefox browserify home mean getState
Benchmark value 6 exceeds gate value 1 for firefox browserify home mean initialActions
Benchmark value 1279 exceeds gate value 1230 for firefox browserify home mean loadScripts
Benchmark value 13 exceeds gate value 9 for firefox browserify home mean setupStore
Benchmark value 1824 exceeds gate value 1660 for firefox browserify home p95 uiStartup
Benchmark value 304 exceeds gate value 195 for firefox browserify home p95 domInteractive
Benchmark value 56 exceeds gate value 55 for firefox browserify home p95 firstReactRender
Benchmark value 47 exceeds gate value 24 for firefox browserify home p95 getState
Benchmark value 25 exceeds gate value 2 for firefox browserify home p95 initialActions
Benchmark value 50 exceeds gate value 27 for firefox browserify home p95 setupStore
Benchmark value 1742 exceeds gate value 1615 for firefox webpack home mean uiStartup
Benchmark value 1489 exceeds gate value 1380 for firefox webpack home mean load
Benchmark value 1488 exceeds gate value 1380 for firefox webpack home mean domContentLoaded
Benchmark value 30 exceeds gate value 26 for firefox webpack home mean backgroundConnect
Benchmark value 52 exceeds gate value 38 for firefox webpack home mean firstReactRender
Benchmark value 5 exceeds gate value 1 for firefox webpack home mean initialActions
Benchmark value 1465 exceeds gate value 1360 for firefox webpack home mean loadScripts
Benchmark value 15 exceeds gate value 13 for firefox webpack home mean setupStore
Benchmark value 2152 exceeds gate value 1935 for firefox webpack home p95 uiStartup
Benchmark value 1806 exceeds gate value 1660 for firefox webpack home p95 load
Benchmark value 1806 exceeds gate value 1660 for firefox webpack home p95 domContentLoaded
Benchmark value 278 exceeds gate value 156 for firefox webpack home p95 domInteractive
Benchmark value 66 exceeds gate value 49 for firefox webpack home p95 backgroundConnect
Benchmark value 60 exceeds gate value 50 for firefox webpack home p95 firstReactRender
Benchmark value 21 exceeds gate value 2 for firefox webpack home p95 initialActions
Benchmark value 1762 exceeds gate value 1630 for firefox webpack home p95 loadScripts
Benchmark value 34 exceeds gate value 28 for firefox webpack home p95 setupStore
Sum of mean exceeds: 1757ms | Sum of p95 exceeds: 2030.8ms
Sum of all benchmark exceeds: 3787.8ms

Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 38 Bytes (0%)
  • ui: 209 Bytes (0%)
  • common: 117 Bytes (0%)

@metamaskbot
Copy link
Collaborator

Builds ready [35c713c]
UI Startup Metrics (1252 ± 56 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyHomeuiStartup1252111013815612921342
load107897611965011151153
domContentLoaded107196811905011051148
domInteractive18135381636
firstPaint68693119943910991159
backgroundConnect2082002397210225
firstReactRender21144662233
getState1045591132
initialActions40498317
loadScripts87076999450903945
setupStore74183712
WebpackHomeuiStartup23671829282715224692571
load18741378222416219682150
domContentLoaded18671370222116119622143
domInteractive1812112141653
firstPaint181641768175195318
backgroundConnect36113125231156
firstReactRender1798842179216349
getState164286371420
initialActions12220130740
loadScripts18601365221816019572131
setupStore1363551523
FirefoxBrowserifyHomeuiStartup14681270190812714941783
load1271111516009413131453
domContentLoaded1271111416009413131453
domInteractive1113647576108309
firstPaintNaNNaNNaNNaNNaNNaN
backgroundConnect2612107132654
firstReactRender292163113057
getState12318326846
initialActions408411214
loadScripts1249110015789112921431
setupStore12416621746
WebpackHomeuiStartup18201544267323819182368
load15241307220317716151892
domContentLoaded15241307220317716151891
domInteractive106356219497327
firstPaintNaNNaNNaNNaNNaNNaN
backgroundConnect37183054036100
firstReactRender53417065765
getState143279301138
initialActions9017423760
loadScripts14971276215916715931811
setupStore2252574613110
Benchmark value 1252 exceeds gate value 1234 for chrome browserify home mean uiStartup
Benchmark value 1079 exceeds gate value 1070 for chrome browserify home mean load
Benchmark value 1072 exceeds gate value 1061 for chrome browserify home mean domContentLoaded
Benchmark value 208 exceeds gate value 10 for chrome browserify home mean backgroundConnect
Benchmark value 4 exceeds gate value 1 for chrome browserify home mean initialActions
Benchmark value 871 exceeds gate value 830 for chrome browserify home mean loadScripts
Benchmark value 225 exceeds gate value 18 for chrome browserify home p95 backgroundConnect
Benchmark value 17 exceeds gate value 1.2 for chrome browserify home p95 initialActions
Benchmark value 945 exceeds gate value 940 for chrome browserify home p95 loadScripts
Benchmark value 2368 exceeds gate value 2192 for chrome webpack home mean uiStartup
Benchmark value 1875 exceeds gate value 1711 for chrome webpack home mean load
Benchmark value 1868 exceeds gate value 1704 for chrome webpack home mean domContentLoaded
Benchmark value 12 exceeds gate value 7 for chrome webpack home mean initialActions
Benchmark value 1861 exceeds gate value 1699 for chrome webpack home mean loadScripts
Benchmark value 2572 exceeds gate value 2454 for chrome webpack home p95 uiStartup
Benchmark value 2150 exceeds gate value 2030 for chrome webpack home p95 load
Benchmark value 2144 exceeds gate value 2005 for chrome webpack home p95 domContentLoaded
Benchmark value 156 exceeds gate value 90 for chrome webpack home p95 backgroundConnect
Benchmark value 40 exceeds gate value 7 for chrome webpack home p95 initialActions
Benchmark value 2131 exceeds gate value 1970 for chrome webpack home p95 loadScripts
Benchmark value 1469 exceeds gate value 1405 for firefox browserify home mean uiStartup
Benchmark value 1271 exceeds gate value 1245 for firefox browserify home mean load
Benchmark value 1271 exceeds gate value 1239 for firefox browserify home mean domContentLoaded
Benchmark value 111 exceeds gate value 110 for firefox browserify home mean domInteractive
Benchmark value 26 exceeds gate value 25 for firefox browserify home mean backgroundConnect
Benchmark value 30 exceeds gate value 25 for firefox browserify home mean firstReactRender
Benchmark value 12 exceeds gate value 11 for firefox browserify home mean getState
Benchmark value 5 exceeds gate value 1 for firefox browserify home mean initialActions
Benchmark value 1250 exceeds gate value 1230 for firefox browserify home mean loadScripts
Benchmark value 12 exceeds gate value 9 for firefox browserify home mean setupStore
Benchmark value 1783 exceeds gate value 1660 for firefox browserify home p95 uiStartup
Benchmark value 309 exceeds gate value 195 for firefox browserify home p95 domInteractive
Benchmark value 57 exceeds gate value 55 for firefox browserify home p95 firstReactRender
Benchmark value 46 exceeds gate value 24 for firefox browserify home p95 getState
Benchmark value 14 exceeds gate value 2 for firefox browserify home p95 initialActions
Benchmark value 46 exceeds gate value 27 for firefox browserify home p95 setupStore
Benchmark value 1821 exceeds gate value 1615 for firefox webpack home mean uiStartup
Benchmark value 1525 exceeds gate value 1380 for firefox webpack home mean load
Benchmark value 1524 exceeds gate value 1380 for firefox webpack home mean domContentLoaded
Benchmark value 107 exceeds gate value 100 for firefox webpack home mean domInteractive
Benchmark value 37 exceeds gate value 26 for firefox webpack home mean backgroundConnect
Benchmark value 54 exceeds gate value 38 for firefox webpack home mean firstReactRender
Benchmark value 10 exceeds gate value 1 for firefox webpack home mean initialActions
Benchmark value 1497 exceeds gate value 1360 for firefox webpack home mean loadScripts
Benchmark value 22 exceeds gate value 13 for firefox webpack home mean setupStore
Benchmark value 2368 exceeds gate value 1935 for firefox webpack home p95 uiStartup
Benchmark value 1892 exceeds gate value 1660 for firefox webpack home p95 load
Benchmark value 1891 exceeds gate value 1660 for firefox webpack home p95 domContentLoaded
Benchmark value 327 exceeds gate value 156 for firefox webpack home p95 domInteractive
Benchmark value 100 exceeds gate value 49 for firefox webpack home p95 backgroundConnect
Benchmark value 65 exceeds gate value 50 for firefox webpack home p95 firstReactRender
Benchmark value 38 exceeds gate value 32 for firefox webpack home p95 getState
Benchmark value 60 exceeds gate value 2 for firefox webpack home p95 initialActions
Benchmark value 1811 exceeds gate value 1630 for firefox webpack home p95 loadScripts
Benchmark value 110 exceeds gate value 28 for firefox webpack home p95 setupStore
Sum of mean exceeds: 1792ms | Sum of p95 exceeds: 2616.8ms
Sum of all benchmark exceeds: 4408.8ms

Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 38 Bytes (0%)
  • ui: 209 Bytes (0%)
  • common: 117 Bytes (0%)

PatrykLucka
PatrykLucka previously approved these changes Jul 18, 2025
Copy link

@cursor cursor bot left a comment

Choose a reason for hiding this comment

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

Bug: Block Explorer Button Text Mismatch

The getExplorerButtonText function hardcodes block explorer names (e.g., "Etherscan" for EVM, "Solscan" for Solana) based solely on account type. This creates a mismatch with the actual block explorer URL, which is dynamically determined by the current network. For example, a Polygon account will display "View on Etherscan" but link to Polygonscan. The button text should dynamically reflect the actual block explorer for the current network, which is available via multichainNetwork.blockExplorerUrls.

ui/pages/multichain-accounts/address-qr-code/address-qr-code.tsx#L72-L82

const getExplorerButtonText = (): string => {
switch (getAccountTypeCategory(account)) {
case 'evm':
return t('viewAddressOnExplorer', ['Etherscan']);
case 'solana':
return t('viewAddressOnExplorer', ['Solscan']);
default:
return t('viewOnExplorer');
}
};

Fix in CursorFix in Web


Was this report helpful? Give feedback by reacting with 👍 or 👎

@metamaskbot
Copy link
Collaborator

Builds ready [16b328d]
UI Startup Metrics (1229 ± 55 ms)
PlatformBuildTypePageMetricMean (ms)Min (ms)Max (ms)Std Dev (ms)P 75 (ms)P 95 (ms)
ChromeBrowserifyHomeuiStartup1229113613895512631335
load105593412395510891150
domContentLoaded104892612365510811144
domInteractive17134871637
firstPaint64077116342610521129
backgroundConnect20719228110209225
firstReactRender2113137132132
getState1047191329
initialActions40768215
loadScripts848725103155881942
setupStore73274715
WebpackHomeuiStartup23731834270914024662591
load18741375217713819602074
domContentLoaded18651368216713819522066
domInteractive191294151560
firstPaint180601901187186335
backgroundConnect3310290453071
firstReactRender1818940685204373
getState1033151320
initialActions10222430631
loadScripts18611364215713819502057
setupStore226225401737
FirefoxBrowserifyHomeuiStartup14891311213815815411833
load12841150189010813121494
domContentLoaded12841150188910813121494
domInteractive1233658792112339
firstPaintNaNNaNNaNNaNNaNNaN
backgroundConnect2815218222667
firstReactRender27206372834
getState12217929737
initialActions40579318
loadScripts1260113116839812791454
setupStore13419227739
WebpackHomeuiStartup17701510426530318302151
load14981302398528215461803
domContentLoaded14971301398528215461803
domInteractive12234268126496323
firstPaintNaNNaNNaNNaNNaNNaN
backgroundConnect3019155173159
firstReactRender52427065662
getState162283361538
initialActions9127530928
loadScripts14741282395328015221765
setupStore144256271339
Benchmark value 207 exceeds gate value 10 for chrome browserify home mean backgroundConnect
Benchmark value 4 exceeds gate value 1 for chrome browserify home mean initialActions
Benchmark value 848 exceeds gate value 830 for chrome browserify home mean loadScripts
Benchmark value 226 exceeds gate value 18 for chrome browserify home p95 backgroundConnect
Benchmark value 15 exceeds gate value 1.2 for chrome browserify home p95 initialActions
Benchmark value 942 exceeds gate value 940 for chrome browserify home p95 loadScripts
Benchmark value 2374 exceeds gate value 2192 for chrome webpack home mean uiStartup
Benchmark value 1875 exceeds gate value 1711 for chrome webpack home mean load
Benchmark value 1866 exceeds gate value 1704 for chrome webpack home mean domContentLoaded
Benchmark value 11 exceeds gate value 7 for chrome webpack home mean initialActions
Benchmark value 1861 exceeds gate value 1699 for chrome webpack home mean loadScripts
Benchmark value 2592 exceeds gate value 2454 for chrome webpack home p95 uiStartup
Benchmark value 2074 exceeds gate value 2030 for chrome webpack home p95 load
Benchmark value 2066 exceeds gate value 2005 for chrome webpack home p95 domContentLoaded
Benchmark value 60 exceeds gate value 57 for chrome webpack home p95 domInteractive
Benchmark value 335 exceeds gate value 334 for chrome webpack home p95 firstPaint
Benchmark value 373 exceeds gate value 370 for chrome webpack home p95 firstReactRender
Benchmark value 31 exceeds gate value 7 for chrome webpack home p95 initialActions
Benchmark value 2057 exceeds gate value 1970 for chrome webpack home p95 loadScripts
Benchmark value 1489 exceeds gate value 1405 for firefox browserify home mean uiStartup
Benchmark value 1285 exceeds gate value 1245 for firefox browserify home mean load
Benchmark value 1284 exceeds gate value 1239 for firefox browserify home mean domContentLoaded
Benchmark value 123 exceeds gate value 110 for firefox browserify home mean domInteractive
Benchmark value 28 exceeds gate value 25 for firefox browserify home mean backgroundConnect
Benchmark value 27 exceeds gate value 25 for firefox browserify home mean firstReactRender
Benchmark value 13 exceeds gate value 11 for firefox browserify home mean getState
Benchmark value 5 exceeds gate value 1 for firefox browserify home mean initialActions
Benchmark value 1261 exceeds gate value 1230 for firefox browserify home mean loadScripts
Benchmark value 13 exceeds gate value 9 for firefox browserify home mean setupStore
Benchmark value 1833 exceeds gate value 1660 for firefox browserify home p95 uiStartup
Benchmark value 339 exceeds gate value 195 for firefox browserify home p95 domInteractive
Benchmark value 37 exceeds gate value 24 for firefox browserify home p95 getState
Benchmark value 18 exceeds gate value 2 for firefox browserify home p95 initialActions
Benchmark value 39 exceeds gate value 27 for firefox browserify home p95 setupStore
Benchmark value 1771 exceeds gate value 1615 for firefox webpack home mean uiStartup
Benchmark value 1498 exceeds gate value 1380 for firefox webpack home mean load
Benchmark value 1498 exceeds gate value 1380 for firefox webpack home mean domContentLoaded
Benchmark value 122 exceeds gate value 100 for firefox webpack home mean domInteractive
Benchmark value 30 exceeds gate value 26 for firefox webpack home mean backgroundConnect
Benchmark value 52 exceeds gate value 38 for firefox webpack home mean firstReactRender
Benchmark value 16 exceeds gate value 15 for firefox webpack home mean getState
Benchmark value 10 exceeds gate value 1 for firefox webpack home mean initialActions
Benchmark value 1475 exceeds gate value 1360 for firefox webpack home mean loadScripts
Benchmark value 14 exceeds gate value 13 for firefox webpack home mean setupStore
Benchmark value 2151 exceeds gate value 1935 for firefox webpack home p95 uiStartup
Benchmark value 1803 exceeds gate value 1660 for firefox webpack home p95 load
Benchmark value 1803 exceeds gate value 1660 for firefox webpack home p95 domContentLoaded
Benchmark value 323 exceeds gate value 156 for firefox webpack home p95 domInteractive
Benchmark value 59 exceeds gate value 49 for firefox webpack home p95 backgroundConnect
Benchmark value 62 exceeds gate value 50 for firefox webpack home p95 firstReactRender
Benchmark value 38 exceeds gate value 32 for firefox webpack home p95 getState
Benchmark value 28 exceeds gate value 2 for firefox webpack home p95 initialActions
Benchmark value 1765 exceeds gate value 1630 for firefox webpack home p95 loadScripts
Benchmark value 39 exceeds gate value 28 for firefox webpack home p95 setupStore
Sum of mean exceeds: 1678ms | Sum of p95 exceeds: 1811.8ms
Sum of all benchmark exceeds: 3489.8ms

Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 38 Bytes (0%)
  • ui: 235 Bytes (0%)
  • common: 104 Bytes (0%)

@hmalik88 hmalik88 added this pull request to the merge queue Jul 19, 2025
Merged via the queue into main with commit 77bfb3a Jul 19, 2025
145 checks passed
@hmalik88 hmalik88 deleted the hm/mul-384 branch July 19, 2025 00:40
@github-actions github-actions bot locked and limited conversation to collaborators Jul 19, 2025
@metamaskbot metamaskbot added the release-13.1.0 Issue or pull request that will be included in release 13.1.0 label Jul 19, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

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 release-13.1.0 Issue or pull request that will be included in release 13.1.0 team-accounts-framework Accounts Framework team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants