Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
237 commits
Select commit Hold shift + click to select a range
ce7aa93
feat: Implement the publishBatch hook for smart transactions (#31267)
dan437 Mar 27, 2025
4f94697
chore(remote-mode): add getIsRemoteModeEnabled selector (#31334)
matallui Mar 27, 2025
428fb6f
feat: gas fee token toast (#31338)
matthewwalsh0 Mar 27, 2025
23314e3
feat: add metamaskbot codeowner announcement (#30668)
hmalik88 Mar 27, 2025
69c802f
refactor: migrate to @metamask/bridge-controller (#31059)
micaelae Mar 27, 2025
3c68f3f
fix: Confirmation responsiveness inconsistencies (redesign, Snaps, mu…
digiwand Mar 27, 2025
9f34bfe
fix: missing non-evm account modal bottom border-radius (#31374)
digiwand Mar 28, 2025
4ffc264
fix: flaky test `Switching between account from different networks Cr…
seaona Mar 28, 2025
0e3a38e
fix: flaky test `Swaps - notifications tests notifications for slippa…
seaona Mar 28, 2025
38fc088
fix: flaky test `Settings - general tab validate "मानक हिन्दी" langua…
seaona Mar 28, 2025
1b6bf0d
fix: cp-12.15.0 support link in EIP-5792 cancel request modal. (#31386)
jpuri Mar 28, 2025
ad4fa0b
chore: Updating @metamask/user-operation-controller to version 31.0.0…
jpuri Mar 28, 2025
12505e7
feat: fetch asset metadata on search (#31258)
micaelae Mar 28, 2025
4644e1e
fix: cp-12.16.0 Follow up on the publishBatch hook (#31401)
dan437 Mar 28, 2025
1e33e5f
fix: balance and token icons are unavailable when the bridge page is …
micaelae Mar 28, 2025
e83da5d
chore: add workflow_dispatch to security-code-scanner (#30620)
metamaskbot Mar 28, 2025
1e87559
test: fix mocha vs jest type conflicts in test files (#31049)
dbrans Mar 28, 2025
ca38751
revert(snaps): Revert breaking changes from #31058 (#31391)
GuillaumeRx Mar 28, 2025
b5a236e
fix: cp-12.15.0 remove sentry cdn url from sentry script (#31360)
davidmurdoch Mar 28, 2025
cce5a8b
test: rename double and triple ganache references (#31385)
seaona Mar 28, 2025
15c324f
chore: updating font family from euclid to centra (#31303)
georgewrmarshall Mar 28, 2025
11a9d98
style: Update tabs color, hover and animations (#30907)
amandaye0h Mar 28, 2025
c1c8fd6
fix: token name sort (#31302)
gambinish Mar 28, 2025
478ec43
style: Update color of values to text-default (#30886)
amandaye0h Mar 28, 2025
108263d
fix: cp-12.15.0 Prevent fullscreen UI from opening every startup (#31…
Gudahtt Mar 28, 2025
aa1b09a
fix: should not auto-close notification window if loaded in a tab (#3…
dbrans Mar 30, 2025
1bef1aa
refactor: migrate tokenRates controller to modular controller init (#…
salimtb Mar 31, 2025
1bb5fae
fix: simulation of type-4 transactions (#31335)
matthewwalsh0 Mar 31, 2025
453944e
test: MMQA-224 add test eth to weth (#31278)
racitores Mar 31, 2025
2890d6a
fix: handle array image edge cases (#30494)
Prithpal-Sooriya Mar 31, 2025
96baf2c
test: add mock to fix privacy test flakiness (#31429)
chloeYue Mar 31, 2025
8611ef9
test: migrate NFT tests to Typescript and Page object modal (#31396)
chloeYue Mar 31, 2025
56a90ac
chore: move Snap component tests into their own files (#31361)
hmalik88 Mar 31, 2025
5d953bf
feat: add new way to customize the Snap account creation flow (#31285)
ccharly Mar 31, 2025
a4505cb
fix: 31266 qr device sign transaction issue (#31366)
dawnseeker8 Mar 31, 2025
a09b683
chore: temporarily ignore `@solana/web3.js (deprecation)` (#31467)
seaona Apr 1, 2025
ca2454a
fix: `test-e2e-chrome-vault-decryption` job (#31425)
seaona Apr 1, 2025
3f55503
fix: srp toast message (#31312)
montelaidev Apr 1, 2025
6049a87
fix: fix button disabled for long tokenId (#31359)
sahar-fehri Apr 1, 2025
adb4c76
fix: hide accounts by default in reveal srp flow (#31395)
montelaidev Apr 1, 2025
b1470f7
fix: cp-12.16.0 show solana fiat values (#31417)
micaelae Apr 1, 2025
ca191f5
chore: default account name visibility/width (#31202)
zone-live Apr 1, 2025
9904055
chore: bump accounts dependencies (#31433)
ccharly Apr 1, 2025
e79c555
test: rename more ganache old references (#31470)
seaona Apr 1, 2025
fbfe5c4
Merge origin/main into master-sync
MajorLift Apr 1, 2025
2524890
feat: updating popup width of extension from 357px to 400px (#31443)
georgewrmarshall Apr 1, 2025
ea26a04
fix: Add `enableTxParamsGasFeeUpdates` to `true` in `TransactionContr…
OGPoyraz Apr 1, 2025
1e8171c
chore: sync `master` with `main` `v12.14.2` -> `v12.15.0` (#31495)
Gudahtt Apr 1, 2025
ebd5018
refactor: multichain activity tab (#31439)
darioAnongba Apr 1, 2025
32c83a0
feat: webpack chrome e2e on gha (#31363)
itsyoboieltr Apr 1, 2025
be16836
fix: codeowners file name `.yarnrc.yml` (#31487)
seaona Apr 2, 2025
523d163
fix: Fix `useTransactionGasFeeEstimate` to calculate gas estimate pro…
OGPoyraz Apr 2, 2025
82f5b3e
fix: hide balance alert if selected gas fee token (#31497)
matthewwalsh0 Apr 2, 2025
cff756f
feat: (MMS-2076) create solana account without redirecting (#31493)
ghgoodreau Apr 2, 2025
b25310e
chore: update node-pty (#31500)
HowardBraham Apr 2, 2025
fa4734f
feat: update native balance by address (#31510)
salimtb Apr 2, 2025
75dbb54
feat(solana): update add account from network picker (#31358)
PatrykLucka Apr 2, 2025
4ce6dd0
test: Add E2E coverage for transactions insights on more types of tra…
hjetpoluru Apr 2, 2025
0ffbccc
test: migrate account permission e2e tests to Typescript and Page obj…
chloeYue Apr 2, 2025
1ca4b62
fix(snaps): Update balance display in `AssetSelector` (#31428)
GuillaumeRx Apr 2, 2025
5378984
fix: activity tab aggregated amount (#31514)
darioAnongba Apr 2, 2025
e27827c
chore: Remove PortfolioView feature flags (#31501)
gambinish Apr 2, 2025
13af71d
feat: add runway api (#31524)
itsyoboieltr Apr 2, 2025
6a04903
chore: adding mm poly font files and making it available via css (#31…
georgewrmarshall Apr 2, 2025
7e4d45c
chore: mms-1799 unverified token (#31462)
GustavoRSSilva Apr 3, 2025
5101585
fix: notification details event (#31526)
Prithpal-Sooriya Apr 3, 2025
103a3ec
feat: Add clear functionality to SRP import error banner (#30673)
PatrykLucka Apr 3, 2025
cf778c3
fix: select first gas fee token automatically (#31508)
matthewwalsh0 Apr 3, 2025
fd46286
chore: remove preference to enable incoming transaction polling for n…
jpuri Apr 3, 2025
80dde72
fix: should not show NonContractAddressAlert for auth request (#31503)
jpuri Apr 3, 2025
acab3e9
fix: unscrollable Remove Snap modal dialog (#31413)
digiwand Apr 3, 2025
e96f851
test: removing some entries from live request allowlist by adding mis…
seaona Apr 3, 2025
64eb2fa
fix: prevent multiple account creations in the same flow. (#31543)
montelaidev Apr 3, 2025
bb1b8d9
feat: for batch transaction simulation section approve rows should be…
jpuri Apr 3, 2025
996034d
fix: For batch transactions sum total of gas needed for all transacti…
jpuri Apr 3, 2025
e6f22c6
fix: small amounts on activity tab (#31563)
darioAnongba Apr 3, 2025
a73a129
fix: cp-12.16.0 fix send trx send title (#31559)
salimtb Apr 3, 2025
c884c5c
chore: Add XRPL EVM Testnet network (#31533)
gambinish Apr 3, 2025
2fbcc7f
feat: multichain tokens import (#31201)
salimtb Apr 3, 2025
d0445ca
Merge origin/main into master-sync
MajorLift Apr 3, 2025
ecbd9a5
chore: Sync `main` with `master`, `v12.15.0` -> `v12.15.1` (#31581)
Gudahtt Apr 3, 2025
633dea3
chore: Update Soneium logo (#31573)
gambinish Apr 4, 2025
21ad1c0
fix: sanitizeTestTitle (#31574)
itsyoboieltr Apr 4, 2025
3a466cc
test: eip7702 setup and upgrade+batch simple spec (#31234)
seaona Apr 4, 2025
79384cc
fix: cp-12.16.0 add gasless metrics (#31560)
matthewwalsh0 Apr 4, 2025
6d41786
fix: Prevent overflow in from Snaps UI header in confirmations (#31595)
FrederikBolding Apr 4, 2025
25f4fa8
fix: workaround for first party snap account name suggestion (#31542)
montelaidev Apr 4, 2025
7ac85a7
feat: fetch user balance for transaction's network (#31441)
jpuri Apr 4, 2025
4fb6775
test: Migrate dapp interaction e2e tests to Typescript and Page objec…
chloeYue Apr 4, 2025
26bbdd9
feat: escape / sanitize signTypedData update (#31377)
digiwand Apr 4, 2025
f0c9325
fix: flaky test `MetaMask onboarding should not prevent network reque…
seaona Apr 4, 2025
f08855a
fix: flaky test `Request Queueing chainId proxy sync should preserve …
seaona Apr 4, 2025
5971f45
fix: flaky test Multichain API Call wallet_createSession (#31603)
seaona Apr 4, 2025
8fa1420
New Crowdin translations by Github Action (#30815)
metamaskbot Apr 4, 2025
a4179bc
fix: cp-12.15.2 Allow `verifyingContract` to be omitted from EIP-712 …
Gudahtt Apr 4, 2025
ead2b41
test: fix failing ppom e2e (#31645)
pnarayanaswamy Apr 7, 2025
6f57e1d
fix: multichain swap transaction to show from amount (#31592)
aganglada Apr 7, 2025
09095c2
feat(institutional-snap): pre-install institutional snap (#31531)
shane-t Apr 7, 2025
8c066ff
feat: cp-12.15.2 add icon image for `Lens` network (#31638)
wantedsystem Apr 7, 2025
9751219
fix: fix NFT balance in send flow (#31239)
sahar-fehri Apr 7, 2025
66e067b
feat: require network client ID when adding transactions (#31456)
matthewwalsh0 Apr 7, 2025
39dffea
fix: wrap long asset names (#31657)
bergarces Apr 7, 2025
0cda8af
feat: cp-12.16.0 remove OneKey device from hardware selection page (#…
Akaryatrh Apr 7, 2025
d33a947
fix: cp-12.16.0 bump "@metamask/smart-transactions-controller": "^16.…
dan437 Apr 7, 2025
90d01d0
fix: nftController with modular init pattern (#31658)
sahar-fehri Apr 7, 2025
a4c36b3
fix: nftDetectionController with new initialization pattern (#31674)
sahar-fehri Apr 7, 2025
8a52f49
style: Update font weights for balance, price and other headers (#31624)
amandaye0h Apr 7, 2025
93e257d
style: Remove shadow from toast (#31618)
amandaye0h Apr 7, 2025
1158dca
style: Update color for no balance and generic avatars (#30891)
amandaye0h Apr 7, 2025
405e1ea
feat: (MMS-2106) supports copying block explorer link in bridge page …
ghgoodreau Apr 7, 2025
441d246
fix: switch-ethereun-chain not passing rejectApprovalRequestsForOrigi…
jpuri Apr 8, 2025
ceb7d49
chore: Add e2e for network add / switch scenario when there are pendi…
jpuri Apr 8, 2025
56441b3
test: ensure `foundryup` works when bin path contains a space charact…
davidmurdoch Apr 8, 2025
ea0b60c
fix: improve fetching nft details for custom contracts (#31432)
sahar-fehri Apr 8, 2025
ac9c6f5
chore: remove MMI hooks and upgrade transaction controller (#31597)
shane-t Apr 8, 2025
ae92326
fix: Update blockaid friction modal copy (#31475)
vinistevam Apr 8, 2025
2e5287c
feat: Sol 208 extension asset details UI (#31407)
xavier-brochard Apr 8, 2025
c2ae623
fix(snaps): Fix type issue with assets metadata (#31696)
GuillaumeRx Apr 8, 2025
9a485df
fix: CI for external contributions (#31566)
itsyoboieltr Apr 8, 2025
5f8f6b5
fix: Revert "feat(14507): improve error message for failed txn in act…
dbrans Apr 8, 2025
0c6beac
fix: update assets contract controller modular controller init (#31681)
sahar-fehri Apr 8, 2025
f14b583
fix: solana modal auto focus fix (#31713)
zone-live Apr 8, 2025
036a2db
Merge origin/main into master-sync
dbrans Apr 8, 2025
3568beb
fix: cp-12.16.0 include networkClientId in stx submitSignedTransactio…
micaelae Apr 8, 2025
0e36ec7
fix: remove-duplicated-alerts (#31695)
GustavoRSSilva Apr 8, 2025
c94a404
chore: master sync (after v12.15.2) (#31720)
Gudahtt Apr 8, 2025
4860701
fix: cp-12.16.0 HW wallet confirmation warning for bridge (#31679)
micaelae Apr 8, 2025
46b63ae
feat: fix srp list padding (#31697)
PatrykLucka Apr 8, 2025
82ee0c9
fix: add solana modal title (#31660)
PatrykLucka Apr 8, 2025
945e2cb
feat(remote-mode): add feature slide (#31463)
matallui Apr 8, 2025
27cee10
fix: Update routes callbacks per react-perf's warnings (#31019)
darkwing Apr 8, 2025
cbb4877
style: Update alignment and hover effect for token cell (#31615)
amandaye0h Apr 8, 2025
aefbd60
fix: carousel e2e test (#31756)
stanleyyconsensys Apr 9, 2025
68e0557
fix: update Keystone keyring package to v0.15.2 (#31690)
dawnseeker8 Apr 9, 2025
0bb08ab
feat(solana): update add account from opt in solana (#31387)
PatrykLucka Apr 9, 2025
34e885b
fix: show account balances for selected XChain swap destination addre…
micaelae Apr 9, 2025
aad69ea
chore: Bump profile-sync-controller (#31771)
FrederikBolding Apr 9, 2025
9915b9c
fix: improvements in page to revert smart account to EOA account (#31…
jpuri Apr 9, 2025
01b666d
fix: dark mode styling and spacing (#31661)
montelaidev Apr 9, 2025
eb45577
feat(institutional-snap): manage institutional snaps preference and a…
shane-t Apr 9, 2025
4bb91c2
fix: Add `displayAvatar` prop to Snap `AddressInput` component (#31746)
hmalik88 Apr 9, 2025
d990dfb
chore: add logs and a few mock missed (#31698)
racitores Apr 9, 2025
ccd3cbc
feat: add setting to dismiss prompt to enable smart contract (#31609)
jpuri Apr 9, 2025
ab3f9ad
ci: turn on skip-allow-scripts to save time (#31330)
HowardBraham Apr 9, 2025
1ac236b
fix: update function name in 077-supplement-for-088.ts (#29971)
Teng-Web3 Apr 9, 2025
853f5a8
chore: add icon image for Plume network (#31712)
wantedsystem Apr 9, 2025
17b9874
fix: Failed to construct URL: Invalid URL at new URL (#31502)
Teng-Web3 Apr 9, 2025
3ab2865
feat: SIP-26 Integration (#29887)
jiexi Apr 9, 2025
1f8d01a
feat: adds deeply liquid stablecoin slippage value of 0.5 (#31744)
ghgoodreau Apr 9, 2025
1afb03a
feat(institutional-snap-controller): Institutional Snap transaction h…
shane-t Apr 9, 2025
f9f2747
fix: missing solana fiat values in XChain swaps page (#31686)
micaelae Apr 9, 2025
70fc2ea
fix: import srp error handling and style (#31662)
montelaidev Apr 9, 2025
d27e110
fix: import srp error handling and style (#31662)
montelaidev Apr 10, 2025
603b661
chore: Updating Text component "body" font sizes (#31494)
georgewrmarshall Apr 10, 2025
fe55e11
chore: Bump Snaps packages (#31693)
FrederikBolding Apr 10, 2025
0afd3d9
feat: Add splash page for smart account upgrade (#31765)
jpuri Apr 10, 2025
c947756
fix: prevents unintended second redirection to activity tab (#31822)
ghgoodreau Apr 10, 2025
58c4b1a
fix: Swap to ethereum string (#31715)
GustavoRSSilva Apr 10, 2025
7cb48f6
chore: sol-267 remove pill for snap accounts (#31716)
zone-live Apr 10, 2025
dae58e6
test: add spec `signs message with verifyingContract field missing` (…
seaona Apr 10, 2025
cfb4686
chore: update solana snap to 1.18.1 (#31819)
shane-t Apr 10, 2025
5aa0423
fix: cp-12.17.0 upgrade @metamask/eth-ledger-bridge-keyring to fix th…
dawnseeker8 Apr 10, 2025
ba60bb3
test: fix flaky speed up and cancel transaction tests (#31561)
pnarayanaswamy Apr 10, 2025
8c177b8
fix(swap/bridge): move to activity tab before transaction (#31505)
aganglada Apr 10, 2025
b206ed2
fix: Prevent double filtering of tokens (#31742)
darkwing Apr 10, 2025
497a8a5
feat: support gasless transactions via EIP-7702 (#31593)
matthewwalsh0 Apr 10, 2025
a82ff0b
fix: #30115: Hide import key error (#31129)
darkwing Apr 10, 2025
a498e20
chore: cp-12.16.0 Add default platform for suggested key (#31812)
Gudahtt Apr 10, 2025
b9ef23e
fix: Display "🦊 Smart contract" in "interacting with" row for batch t…
vinistevam Apr 10, 2025
43f2014
bump semvar version to 12.17.0
metamaskbot Apr 10, 2025
96e2292
feat: Solana Wallet Standard (#31705) (#31847)
adonesky1 Apr 10, 2025
47e32bc
cherry-pick 12.17.0: enable review permissions for non EVM networks (…
jiexi Apr 10, 2025
04d6e73
cherry-pick(v12.17.0): Transaction list fixes (#31874)
aganglada Apr 11, 2025
7db980d
(cherry-pick) chore: enable multi-srp (#31849)
shane-t Apr 11, 2025
e77417e
add version line in changelog.md file (#31891)
benjisclowder Apr 11, 2025
01260b3
Update Attributions
metamaskbot Apr 11, 2025
31da2a5
add extra version lines (#31896)
benjisclowder Apr 11, 2025
ac6b736
fix: filter NFTs on send flow (#31850)
sahar-fehri Apr 10, 2025
3a2927f
merge CHANGELOG.md from Version-v12.16.0
dbrans Apr 11, 2025
bbe56e0
record conflict resolution with empty merge commit: Merge remote-trac…
dbrans Apr 11, 2025
bcf8ec7
(cherry-pick) feat: add discover solana accounts (#31931)
PatrykLucka Apr 14, 2025
ec614e5
Merge remote-tracking branch 'origin/master' into v12.17.0-merge-in-v…
dbrans Apr 14, 2025
4f3973b
feat: cp-12.16.0 extend sweepstakes (#31900)
vinnyhoward Apr 11, 2025
669ebd2
Merge pull request #31898 from MetaMask/v12.17.0-merge-in-v12.16.0
Gudahtt Apr 14, 2025
c40c8b8
chore(runway): cherry-pick fix: cp-12.17.0 fix clean up fiat conversi…
runway-github[bot] Apr 15, 2025
ee9e9cb
chore: cherry-pick to v12.17.0 Solana opt-in modal (#31969)
zone-live Apr 15, 2025
31bfde7
chore(runway): cherry-pick fix: cp-12.16.1 fix display nft full image…
runway-github[bot] Apr 15, 2025
9879979
cherry-pick(12.17): Bump institutional snap (#31996)
shane-t Apr 15, 2025
ffac050
chore(runway): cherry-pick build: beta build should run on all PRs (#…
runway-github[bot] Apr 16, 2025
ea3c792
chore: cherry-pick to v12.17.0 Solana snap update (#32004)
zone-live Apr 16, 2025
7e6f552
Update Attributions
metamaskbot Apr 16, 2025
19e88cf
chore(runway): cherry-pick 94554d7 (#32072)
runway-github[bot] Apr 17, 2025
d0a02de
chore: 2nd cherry-pick to v12.17.0 Solana snap update (#32054)
zone-live Apr 17, 2025
c3a5770
chore(runway): cherry-pick fix: cp-12.17.0 - Center buttons in wider …
runway-github[bot] Apr 17, 2025
6e0f4c2
chore(runway): cherry-pick feat: Add "Create Solana Account" in conne…
runway-github[bot] Apr 17, 2025
4d2bd16
feat: bump multichain-api-client 0.2.0 (#32104) (#32113)
jiexi Apr 18, 2025
48730c7
feat: cp-12.17.0 - add Solana devnet (#32116)
gantunesr Apr 18, 2025
ce56c1e
feat: bump `@metamask/providers` to `^21.0.0` (#31056) (#32124)
jiexi Apr 18, 2025
d38a77d
cherry-pick: fix(snaps): Temporarily replace `withKeyring` in `Multic…
adonesky1 Apr 18, 2025
e520c61
feat: cp-12.17.0 support version 2.0.0 of EIP-5792 (#31913) (#32144)
matthewwalsh0 Apr 21, 2025
1157766
fix: cp-12.17.0 cherry-pick auto create solana account after ondboard…
PatrykLucka Apr 21, 2025
2d3e1a2
chore(runway): cherry-pick fix: cp-12.17.0 Fix remove nft (#32118)
runway-github[bot] Apr 21, 2025
b86cc59
Merge branch 'master' into chore/v12.17.0/250421-resolve-merge-confli…
MajorLift Apr 21, 2025
c868487
Move changelog Unreleased entries under `12.17.0` heading
MajorLift Apr 21, 2025
ccafa2d
Update Attributions
metamaskbot Apr 21, 2025
a8a8a50
Resolve hidden merge conflict due to concurrent update of `ui/pages/c…
MajorLift Apr 21, 2025
cc4d839
Merge branch 'Version-v12.17.0' into chore/v12.17.0/250421-resolve-me…
MajorLift Apr 21, 2025
1711af1
Fix merge corruptions in changelog
MajorLift Apr 21, 2025
5418e91
Linter fix
MajorLift Apr 21, 2025
101116d
chore(runway): cherry-pick fix: cp-12.17.0 missing swap rates (#32148)
runway-github[bot] Apr 22, 2025
795e263
Merge pull request #32146 from MetaMask/chore/v12.17.0/250421-resolve…
Gudahtt Apr 23, 2025
a9ac677
chore: Ignore SES and babel vulnerability in `yarn audit` (#32184) cp…
DDDDDanica Apr 23, 2025
6ae0181
Update Attributions
metamaskbot Apr 23, 2025
438d077
chore: bump Solana wallet snap version to 1.24.0 (#32198) cp-12.17.0 …
aganglada Apr 23, 2025
601d54c
Update Attributions
metamaskbot Apr 23, 2025
5133d84
chore(runway): cherry-pick fix: cp-12.17.0 clamp search token results…
runway-github[bot] Apr 24, 2025
6610cb9
cherry pick: cp-12.17.0 feat: Use chainId / networkClientId from a tr…
dan437 Apr 24, 2025
f88104a
chore(runway): cherry-pick fix: cp-12.17.0 mms-2255 double high cost …
runway-github[bot] Apr 24, 2025
d4f9a09
fix: cp-12.17.0 batch check with missing RPCs (#32237) (#32238)
matthewwalsh0 Apr 24, 2025
7e05b8c
chore: update institutional snap to 1.3.1 cp-12.17.0 (#32208) cp-12.1…
DDDDDanica Apr 24, 2025
de44d4e
chore(runway): cherry-pick chore(snaps): Bump Snaps packages cp-12.17…
runway-github[bot] Apr 24, 2025
fb59d1e
Update Attributions
metamaskbot Apr 24, 2025
cd3cca2
Update Attributions
metamaskbot Apr 24, 2025
3e7e9b9
chore: ignore react-router audit (#32256) (#32263)
DDDDDanica Apr 24, 2025
11ab625
chore: Bump `@metamask/snaps-controllers` to `^11.2.2` (#32196) cp-12…
DDDDDanica Apr 25, 2025
c00c720
cherry-pick fix MMS-2313: removes duplicate generic label for insuffi…
ghgoodreau Apr 25, 2025
7fe4cbd
cherry-pick(12.17): SRP pills cp-12.17.0 (#32243)
shane-t Apr 25, 2025
bbc4ca5
chore(runway): cherry-pick fix: cp-12.17.0 #31910 token no decimals …
runway-github[bot] Apr 25, 2025
ce3d478
fix: cp-12.17.0 bump `@metamask/eth-ledger-bridge-keyring` to `^11.0.…
DDDDDanica Apr 25, 2025
0810442
fix: Nonce editing cp-12.17.0 (#32244) (#32276)
DDDDDanica Apr 25, 2025
474b052
chore: v12.17.0 changelog (#32172)
MajorLift Apr 25, 2025
c29517f
Update Attributions
metamaskbot Apr 25, 2025
b8f35aa
fix: cp-12.17.0 bump `@metamask/keyring-controller` from `^21.0.3` to…
DDDDDanica Apr 25, 2025
95864ba
Update Attributions
metamaskbot Apr 25, 2025
8e86618
fix: provide better native token names when bridging and swapping rem…
DDDDDanica Apr 25, 2025
2ac078c
Merge remote-tracking branch 'origin/master' into chore/master-sync-1…
DDDDDanica Apr 28, 2025
2621ca2
Merge pull request #32348 from MetaMask/chore/master-sync-12.16.2
Gudahtt Apr 28, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 2 additions & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -857,7 +857,8 @@ jobs:
command: |
TESTFILES=$(circleci tests glob "test/e2e/playwright/swap/**/*.spec.ts")
echo "$TESTFILES"
echo "$TESTFILES" | timeout 20m circleci tests run --command="xvfb-run xargs yarn playwright test --project=swap" verbose
echo "$TESTFILES" | timeout 20m circleci tests run --command="xvfb-run xargs yarn playwright test --project=swap" verbose || true
# above line makes it never fail, and these tests are going away soon
no_output_timeout: 10m
- slack/notify:
event: fail
Expand Down
2 changes: 1 addition & 1 deletion .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -137,5 +137,5 @@ ui/components/ui/deprecated-networks @MetaMask/metamask-assets
ui/components/ui/nft-collection-image @MetaMask/metamask-assets

# Extension Platform
yarnrc.yml @MetaMask/extension-platform
.yarnrc.yml @MetaMask/extension-platform
test/e2e/mock-e2e-allowlist.js @MetaMask/extension-platform
281 changes: 281 additions & 0 deletions .github/scripts/identify-codeowners.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,281 @@
import * as core from '@actions/core';
import { context, getOctokit } from '@actions/github';
import { GitHub } from '@actions/github/lib/utils';
import { retrievePullRequestFiles } from './shared/pull-request';
import micromatch from 'micromatch';

type TeamFiles = Record<string, string[]>;

type TeamEmojis = {
[team: string]: string;
}

type CodeOwnerRule = {
pattern: string;
owners: string[];
}

// Team emoji mappings
const teamEmojis: TeamEmojis = {
'@MetaMask/extension-devs': '🧩',
'@MetaMask/policy-reviewers': '📜',
'@MetaMask/supply-chain': '🔗',
'@MetaMask/snaps-devs': '🫰',
'@MetaMask/extension-security-team': '🔒',
'@MetaMask/extension-privacy-reviewers': '🕵️',
'@MetaMask/confirmations': '✅',
'@MetaMask/design-system-engineers': '🎨',
'@MetaMask/notifications': '🔔',
'@MetaMask/identity': '🪪',
'@MetaMask/accounts-engineers': '🔑',
'@MetaMask/swaps-engineers': '🔄',
'@MetaMask/ramp': '📈',
'@MetaMask/wallet-ux': '🖥️',
'@MetaMask/metamask-assets': '💎',
};

main().catch((error: Error): void => {
console.error(error);
process.exit(1);
});

async function main(): Promise<void> {
const PR_COMMENT_TOKEN = process.env.PR_COMMENT_TOKEN;
if (!PR_COMMENT_TOKEN) {
core.setFailed('PR_COMMENT_TOKEN not found');
process.exit(1);
}

// Initialise octokit, required to call Github API
const octokit: InstanceType<typeof GitHub> = getOctokit(PR_COMMENT_TOKEN);


const owner = context.repo.owner;
const repo = context.repo.repo;
const prNumber = context.payload.pull_request?.number;
if (!prNumber) {
core.setFailed('Pull request number not found');
process.exit(1);
}

// Get the changed files in the PR
const changedFiles = await retrievePullRequestFiles(octokit, owner, repo, prNumber);

// Read and parse the CODEOWNERS file
const codeownersContent = await getCodeownersContent(octokit, owner, repo);
const codeowners = parseCodeowners(codeownersContent);

// Match files to codeowners
const fileOwners = matchFilesToCodeowners(changedFiles, codeowners);

// Group files by team
const teamFiles = groupFilesByTeam(fileOwners);

// If no teams need to review, don't create or update comments
if (Object.keys(teamFiles).length === 0) {
console.log('No files requiring codeowner review, skipping comment');

// Check for existing bot comment and delete it if it exists
// (in case previous version of PR had files requiring review)
await deleteExistingComment(octokit, owner, repo, prNumber);
return;
}

// Create the comment body
const commentBody = createCommentBody(teamFiles, teamEmojis);

// Check for an existing comment and update or create as needed
await updateOrCreateComment(octokit, owner, repo, prNumber, commentBody);
}

async function getCodeownersContent(
octokit: InstanceType<typeof GitHub>,
owner: string,
repo: string
): Promise<string> {
try {
const response = await octokit.rest.repos.getContent({
owner,
repo,
path: '.github/CODEOWNERS',
headers: {
'accept': 'application/vnd.github.raw',
},
});

if (response) {
return response.data as unknown as string;
}

throw new Error('Failed to get CODEOWNERS file content');
} catch (error) {
throw new Error(`Failed to get CODEOWNERS file: ${error instanceof Error ? error.message : String(error)}`);
}
}

function parseCodeowners(content: string): CodeOwnerRule[] {
return content
.split('\n')
.filter(line => line.trim() && !line.startsWith('#'))
.map(line => {
const [pattern, ...owners] = line.trim().split(/\s+/);
return { pattern, owners };
});
}

function matchFilesToCodeowners(files: string[], codeowners: CodeOwnerRule[]): Map<string, Set<string>> {
const fileOwners: Map<string, Set<string>> = new Map();

files.forEach(file => {
for (const { pattern, owners } of codeowners) {
if (isFileMatchingPattern(file, pattern)) {
// Not breaking here to allow for multiple patterns to match the same file
// i.e. if a directory is owned by one team, but specific files within that directory
// are also owned by another team, the file will be added to both teams
const ownerSet = fileOwners.get(file);
if (!ownerSet) {
fileOwners.set(file, new Set(owners));
} else {
owners.forEach((owner) => ownerSet.add(owner));
}
}
}
});

return fileOwners;
}

function isFileMatchingPattern(file: string, pattern: string): boolean {
// Case 1: Pattern explicitly ends with a slash (e.g., "docs/")
if (pattern.endsWith('/')) {
return micromatch.isMatch(file, `${pattern}**`);
}

// Case 2: Pattern doesn't end with a file extension - treat as directory
if (!pattern.match(/\.[^/]*$/)) {
// Treat as directory - match this path and everything under it
return micromatch.isMatch(file, `${pattern}/**`);
}

// Case 3: Pattern with file extension or already has wildcards
return micromatch.isMatch(file, pattern);
}

function groupFilesByTeam(fileOwners: Map<string, Set<string>>): TeamFiles {
const teamFiles: TeamFiles = {};

fileOwners.forEach((owners, file) => {
owners.forEach(owner => {
if (!teamFiles[owner]) {
teamFiles[owner] = [];
}
teamFiles[owner].push(file);
});
});

// Sort files within each team for consistent ordering
Object.values(teamFiles).forEach(files => files.sort());

return teamFiles;
}

function createCommentBody(teamFiles: TeamFiles, teamEmojis: TeamEmojis): string {
let commentBody = `<!-- METAMASK-CODEOWNERS-BOT -->\n✨ Files requiring CODEOWNER review ✨\n---\n`;

// Sort teams for consistent ordering
const allOwners = Object.keys(teamFiles);

const teamOwners = allOwners.filter(owner => owner.startsWith('@MetaMask/'));
const individualOwners = allOwners.filter(owner => !owner.startsWith('@MetaMask/'));

const sortFn = (a, b) => a.toLowerCase().localeCompare(b.toLowerCase());
const sortedTeamOwners = teamOwners.sort(sortFn);
const sortedIndividualOwners = individualOwners.sort(sortFn);

const sortedOwners= [...sortedTeamOwners, ...sortedIndividualOwners];

sortedOwners.forEach(team => {
const emoji = teamEmojis[team] || '👨‍🔧';
commentBody += `${emoji} ${team}\n`;
teamFiles[team].forEach(file => {
commentBody += `- \`${file}\`\n`;
});
commentBody += '\n';
});

return commentBody;
}

async function deleteExistingComment(
octokit: InstanceType<typeof GitHub>,
owner: string,
repo: string,
prNumber: number
): Promise<void> {
// Get existing comments
const { data: comments } = await octokit.rest.issues.listComments({
owner,
repo,
issue_number: prNumber,
});

const botComment = comments.find(comment =>
comment.body?.includes('<!-- METAMASK-CODEOWNERS-BOT -->')
);

if (botComment) {
// Delete the existing comment
await octokit.rest.issues.deleteComment({
owner,
repo,
comment_id: botComment.id,
});

console.log('Deleted existing codeowners comment');
}
}

async function updateOrCreateComment(
octokit: InstanceType<typeof GitHub>,
owner: string,
repo: string,
prNumber: number,
commentBody: string
): Promise<void> {
// Get existing comments
const { data: comments } = await octokit.rest.issues.listComments({
owner,
repo,
issue_number: prNumber,
});

const botComment = comments.find(comment =>
comment.body?.includes('<!-- METAMASK-CODEOWNERS-BOT -->')
);

if (botComment) {
// Simple text comparison is sufficient since we control both sides
if (botComment.body !== commentBody) {
await octokit.rest.issues.updateComment({
owner,
repo,
comment_id: botComment.id,
body: commentBody,
});

console.log('Updated existing codeowners comment');
} else {
console.log('No changes to codeowners, skipping comment update');
}
} else {
// Create new comment
await octokit.rest.issues.createComment({
owner,
repo,
issue_number: prNumber,
body: commentBody,
});

console.log('Created new codeowners comment');
}
}
23 changes: 23 additions & 0 deletions .github/scripts/shared/pull-request.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,3 +67,26 @@ export async function retrievePullRequest(

return pullRequest;
}

/**
* Retrieves files changed in a specific pull request
* @param octokit GitHub API client
* @param repoOwner Repository owner (e.g., "MetaMask")
* @param repoName Repository name (e.g., "metamask-extension")
* @param prNumber Pull request number
* @returns Array of filenames that were changed in the PR
*/
export async function retrievePullRequestFiles(
octokit: InstanceType<typeof GitHub>,
repoOwner: string,
repoName: string,
prNumber: number,
): Promise<string[]> {
const response = await octokit.rest.pulls.listFiles({
owner: repoOwner,
repo: repoName,
pull_number: prNumber,
});

return response.data.map((file) => file.filename);
}
1 change: 1 addition & 0 deletions .github/workflows/add-release-label.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ jobs:
with:
is-high-risk-environment: false
fetch-depth: 0 # This is needed to checkout all branches
skip-allow-scripts: true

- name: Get the next semver version
id: get-next-semver-version
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/add-team-label.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,12 @@ on:
pull_request:
types:
- opened
- reopened
- synchronize

jobs:
add-team-label:
if: ${{ !github.event.pull_request.head.repo.fork }}
uses: metamask/github-tools/.github/workflows/add-team-label.yml@18af6e4b56a18230d1792480e249ebc50b324927
secrets:
TEAM_LABEL_TOKEN: ${{ secrets.TEAM_LABEL_TOKEN }}
Loading
Loading