Skip to content

Commit 336c2a3

Browse files
adonesky1jieximetamaskbot
authored
fix: hotfix network version / unresponsive network inpage … (#30114)
…provider (#30111) <!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> Previously the inpage provider would withhold events for chainChanged events (and property value updates, i.e. window.ethereum.chainId and .networkVersion) when the dapp's network was changed to an rpc endpoint that was unresponsive or did not support net_version. The dapp would instead receive a disconnect event. Now the inpage provider always emits chainChanged and networkChanged events (and exposes the correct values on window.ethereum.chainId and .networkVersion) when the selected network for the dapp has changed regardless of if the network being changed to is responsive or if it supports net_version requests. It does this by having the wallet send a loading for networkVersion when it cannot be resolved (same behavior as before) AND a new isConnected property in the metamask_getProviderState request and metamask_chainChanged events (these are different from the events emittted by window.ethereum). isConnected is derived from whether the NetworkController.state.networkMetadata[].status value is the Available constant. [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/30109?quickstart=1) See: #29936 Providers patch from commit (d919ab6b): MetaMask/providers#404 ``` window.ethereum.on('accountsChanged', (data) => console.log('accountsChanged', data)) window.ethereum.on('chainChanged', (data) => console.log('chainChanged', data)) window.ethereum.on('networkChanged', (data) => console.log('networkChanged', data)) window.ethereum.on('connect', (data) => console.log('connect', data)) window.ethereum.on('disconnect', (data) => console.log('disconnect', data)) ``` 1. Go to a webpage. Enter the following in console 2. Change to Linea, see that the correct values are emitted for the `chainChanged` and `networkChanged` events 3. Change to Sepolia, see that the correct values are emitted for the `chainChanged` and `networkChanged` events 4. Change to a network that is non-responsive, see that `chainChanged` emits with the correct chainId, but `networkChanged` emits with a null value, AND there is a `disconnect` event emitted 5. Change back to a working network, see that the correct values are emitted for the `chainChanged` and `networkChanged` events, AND there is a `connect` event emitted with the new chainId 6. Do the same above with a responsive network that does not have `net_version` implemented. Se that the correct values are emitted for the `chainChanged`, that `networkChanged` emits null, and that there is no `disconnect` event emitted <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> <!-- [screenshots/recordings] --> ![Screenshot 2025-02-04 at 8 34 13 AM](https://github.com/user-attachments/assets/f6558363-f848-445a-811e-d1a052a4e6c0) ![Screenshot 2025-02-04 at 8 39 33 AM](https://github.com/user-attachments/assets/12bff524-bb3c-4bf8-b4d2-c6a01ce63b33) - [ ] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [ ] I've completed the PR template to the best of my ability - [ ] I’ve included tests if applicable - [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [ ] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. - [ ] 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. <!-- Please submit this PR as a draft initially. Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once. --> ## **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? 2. What is the improvement/solution? --> [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/30114?quickstart=1) ## **Related issues** Fixes: ## **Manual testing steps** 1. Go to this page... 2. 3. ## **Screenshots/Recordings** <!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. --> ### **Before** <!-- [screenshots/recordings] --> ### **After** <!-- [screenshots/recordings] --> ## **Pre-merge author checklist** - [ ] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [ ] I've completed the PR template to the best of my ability - [ ] I’ve included tests if applicable - [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [ ] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. ## **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. --------- Co-authored-by: jiexi <[email protected]> Co-authored-by: MetaMask Bot <[email protected]>
1 parent 93ef626 commit 336c2a3

File tree

8 files changed

+1060
-51
lines changed

8 files changed

+1060
-51
lines changed

.yarn/patches/@metamask-providers-npm-19.0.0-3d962c6f1a.patch

+764
Large diffs are not rendered by default.

app/scripts/metamask-controller.js

+8-3
Original file line numberDiff line numberDiff line change
@@ -3116,11 +3116,11 @@ export default class MetamaskController extends EventEmitter {
31163116
if (chains.length > 0 && !chains.includes(currentChainIdForOrigin)) {
31173117
const networkClientId =
31183118
this.networkController.findNetworkClientIdByChainId(chains[0]);
3119+
this.networkController.setActiveNetwork(networkClientId);
31193120
this.selectedNetworkController.setNetworkClientIdForDomain(
31203121
origin,
31213122
networkClientId,
31223123
);
3123-
this.networkController.setActiveNetwork(networkClientId);
31243124
}
31253125
}
31263126
},
@@ -3327,12 +3327,13 @@ export default class MetamaskController extends EventEmitter {
33273327
const publicConfigStore = new ObservableStore();
33283328

33293329
const selectPublicState = async ({ isUnlocked }) => {
3330-
const { chainId, networkVersion } = await this.getProviderNetworkState();
3330+
const { chainId, networkVersion, isConnected } =
3331+
await this.getProviderNetworkState();
33313332

33323333
return {
33333334
isUnlocked,
33343335
chainId,
3335-
networkVersion: networkVersion ?? 'loading',
3336+
networkVersion: isConnected ? networkVersion : 'loading',
33363337
};
33373338
};
33383339

@@ -3406,9 +3407,13 @@ export default class MetamaskController extends EventEmitter {
34063407
this.deprecatedNetworkVersions[networkClientId] = networkVersion;
34073408
}
34083409

3410+
const metadata =
3411+
this.networkController.state.networksMetadata[networkClientId];
3412+
34093413
return {
34103414
chainId,
34113415
networkVersion: networkVersion ?? 'loading',
3416+
isConnected: metadata?.status === NetworkStatus.Available,
34123417
};
34133418
}
34143419

lavamoat/browserify/beta/policy.json

+50-5
Original file line numberDiff line numberDiff line change
@@ -1417,9 +1417,24 @@
14171417
},
14181418
"@metamask/json-rpc-engine": {
14191419
"packages": {
1420+
"@metamask/json-rpc-engine>@metamask/utils": true,
14201421
"@metamask/rpc-errors": true,
1421-
"@metamask/safe-event-emitter": true,
1422-
"@metamask/utils": true
1422+
"@metamask/safe-event-emitter": true
1423+
}
1424+
},
1425+
"@metamask/json-rpc-engine>@metamask/utils": {
1426+
"globals": {
1427+
"TextDecoder": true,
1428+
"TextEncoder": true
1429+
},
1430+
"packages": {
1431+
"@metamask/utils>@metamask/superstruct": true,
1432+
"@metamask/utils>@scure/base": true,
1433+
"@metamask/utils>pony-cause": true,
1434+
"@noble/hashes": true,
1435+
"browserify>buffer": true,
1436+
"nock>debug": true,
1437+
"semver": true
14231438
}
14241439
},
14251440
"@metamask/json-rpc-middleware-stream": {
@@ -1428,11 +1443,26 @@
14281443
"setTimeout": true
14291444
},
14301445
"packages": {
1446+
"@metamask/json-rpc-middleware-stream>@metamask/utils": true,
14311447
"@metamask/safe-event-emitter": true,
1432-
"@metamask/utils": true,
14331448
"readable-stream": true
14341449
}
14351450
},
1451+
"@metamask/json-rpc-middleware-stream>@metamask/utils": {
1452+
"globals": {
1453+
"TextDecoder": true,
1454+
"TextEncoder": true
1455+
},
1456+
"packages": {
1457+
"@metamask/utils>@metamask/superstruct": true,
1458+
"@metamask/utils>@scure/base": true,
1459+
"@metamask/utils>pony-cause": true,
1460+
"@noble/hashes": true,
1461+
"browserify>buffer": true,
1462+
"nock>debug": true,
1463+
"semver": true
1464+
}
1465+
},
14361466
"@metamask/keyring-api": {
14371467
"globals": {
14381468
"URL": true
@@ -2276,8 +2306,23 @@
22762306
},
22772307
"@metamask/rpc-errors": {
22782308
"packages": {
2279-
"@metamask/rpc-errors>fast-safe-stringify": true,
2280-
"@metamask/utils": true
2309+
"@metamask/rpc-errors>@metamask/utils": true,
2310+
"@metamask/rpc-errors>fast-safe-stringify": true
2311+
}
2312+
},
2313+
"@metamask/rpc-errors>@metamask/utils": {
2314+
"globals": {
2315+
"TextDecoder": true,
2316+
"TextEncoder": true
2317+
},
2318+
"packages": {
2319+
"@metamask/utils>@metamask/superstruct": true,
2320+
"@metamask/utils>@scure/base": true,
2321+
"@metamask/utils>pony-cause": true,
2322+
"@noble/hashes": true,
2323+
"browserify>buffer": true,
2324+
"nock>debug": true,
2325+
"semver": true
22812326
}
22822327
},
22832328
"@metamask/rpc-methods-flask>nanoid": {

lavamoat/browserify/flask/policy.json

+50-5
Original file line numberDiff line numberDiff line change
@@ -1417,9 +1417,24 @@
14171417
},
14181418
"@metamask/json-rpc-engine": {
14191419
"packages": {
1420+
"@metamask/json-rpc-engine>@metamask/utils": true,
14201421
"@metamask/rpc-errors": true,
1421-
"@metamask/safe-event-emitter": true,
1422-
"@metamask/utils": true
1422+
"@metamask/safe-event-emitter": true
1423+
}
1424+
},
1425+
"@metamask/json-rpc-engine>@metamask/utils": {
1426+
"globals": {
1427+
"TextDecoder": true,
1428+
"TextEncoder": true
1429+
},
1430+
"packages": {
1431+
"@metamask/utils>@metamask/superstruct": true,
1432+
"@metamask/utils>@scure/base": true,
1433+
"@metamask/utils>pony-cause": true,
1434+
"@noble/hashes": true,
1435+
"browserify>buffer": true,
1436+
"nock>debug": true,
1437+
"semver": true
14231438
}
14241439
},
14251440
"@metamask/json-rpc-middleware-stream": {
@@ -1428,11 +1443,26 @@
14281443
"setTimeout": true
14291444
},
14301445
"packages": {
1446+
"@metamask/json-rpc-middleware-stream>@metamask/utils": true,
14311447
"@metamask/safe-event-emitter": true,
1432-
"@metamask/utils": true,
14331448
"readable-stream": true
14341449
}
14351450
},
1451+
"@metamask/json-rpc-middleware-stream>@metamask/utils": {
1452+
"globals": {
1453+
"TextDecoder": true,
1454+
"TextEncoder": true
1455+
},
1456+
"packages": {
1457+
"@metamask/utils>@metamask/superstruct": true,
1458+
"@metamask/utils>@scure/base": true,
1459+
"@metamask/utils>pony-cause": true,
1460+
"@noble/hashes": true,
1461+
"browserify>buffer": true,
1462+
"nock>debug": true,
1463+
"semver": true
1464+
}
1465+
},
14361466
"@metamask/keyring-api": {
14371467
"globals": {
14381468
"URL": true
@@ -2276,8 +2306,23 @@
22762306
},
22772307
"@metamask/rpc-errors": {
22782308
"packages": {
2279-
"@metamask/rpc-errors>fast-safe-stringify": true,
2280-
"@metamask/utils": true
2309+
"@metamask/rpc-errors>@metamask/utils": true,
2310+
"@metamask/rpc-errors>fast-safe-stringify": true
2311+
}
2312+
},
2313+
"@metamask/rpc-errors>@metamask/utils": {
2314+
"globals": {
2315+
"TextDecoder": true,
2316+
"TextEncoder": true
2317+
},
2318+
"packages": {
2319+
"@metamask/utils>@metamask/superstruct": true,
2320+
"@metamask/utils>@scure/base": true,
2321+
"@metamask/utils>pony-cause": true,
2322+
"@noble/hashes": true,
2323+
"browserify>buffer": true,
2324+
"nock>debug": true,
2325+
"semver": true
22812326
}
22822327
},
22832328
"@metamask/rpc-methods-flask>nanoid": {

lavamoat/browserify/main/policy.json

+50-5
Original file line numberDiff line numberDiff line change
@@ -1417,9 +1417,24 @@
14171417
},
14181418
"@metamask/json-rpc-engine": {
14191419
"packages": {
1420+
"@metamask/json-rpc-engine>@metamask/utils": true,
14201421
"@metamask/rpc-errors": true,
1421-
"@metamask/safe-event-emitter": true,
1422-
"@metamask/utils": true
1422+
"@metamask/safe-event-emitter": true
1423+
}
1424+
},
1425+
"@metamask/json-rpc-engine>@metamask/utils": {
1426+
"globals": {
1427+
"TextDecoder": true,
1428+
"TextEncoder": true
1429+
},
1430+
"packages": {
1431+
"@metamask/utils>@metamask/superstruct": true,
1432+
"@metamask/utils>@scure/base": true,
1433+
"@metamask/utils>pony-cause": true,
1434+
"@noble/hashes": true,
1435+
"browserify>buffer": true,
1436+
"nock>debug": true,
1437+
"semver": true
14231438
}
14241439
},
14251440
"@metamask/json-rpc-middleware-stream": {
@@ -1428,11 +1443,26 @@
14281443
"setTimeout": true
14291444
},
14301445
"packages": {
1446+
"@metamask/json-rpc-middleware-stream>@metamask/utils": true,
14311447
"@metamask/safe-event-emitter": true,
1432-
"@metamask/utils": true,
14331448
"readable-stream": true
14341449
}
14351450
},
1451+
"@metamask/json-rpc-middleware-stream>@metamask/utils": {
1452+
"globals": {
1453+
"TextDecoder": true,
1454+
"TextEncoder": true
1455+
},
1456+
"packages": {
1457+
"@metamask/utils>@metamask/superstruct": true,
1458+
"@metamask/utils>@scure/base": true,
1459+
"@metamask/utils>pony-cause": true,
1460+
"@noble/hashes": true,
1461+
"browserify>buffer": true,
1462+
"nock>debug": true,
1463+
"semver": true
1464+
}
1465+
},
14361466
"@metamask/keyring-api": {
14371467
"globals": {
14381468
"URL": true
@@ -2276,8 +2306,23 @@
22762306
},
22772307
"@metamask/rpc-errors": {
22782308
"packages": {
2279-
"@metamask/rpc-errors>fast-safe-stringify": true,
2280-
"@metamask/utils": true
2309+
"@metamask/rpc-errors>@metamask/utils": true,
2310+
"@metamask/rpc-errors>fast-safe-stringify": true
2311+
}
2312+
},
2313+
"@metamask/rpc-errors>@metamask/utils": {
2314+
"globals": {
2315+
"TextDecoder": true,
2316+
"TextEncoder": true
2317+
},
2318+
"packages": {
2319+
"@metamask/utils>@metamask/superstruct": true,
2320+
"@metamask/utils>@scure/base": true,
2321+
"@metamask/utils>pony-cause": true,
2322+
"@noble/hashes": true,
2323+
"browserify>buffer": true,
2324+
"nock>debug": true,
2325+
"semver": true
22812326
}
22822327
},
22832328
"@metamask/rpc-methods-flask>nanoid": {

lavamoat/browserify/mmi/policy.json

+50-5
Original file line numberDiff line numberDiff line change
@@ -1509,9 +1509,24 @@
15091509
},
15101510
"@metamask/json-rpc-engine": {
15111511
"packages": {
1512+
"@metamask/json-rpc-engine>@metamask/utils": true,
15121513
"@metamask/rpc-errors": true,
1513-
"@metamask/safe-event-emitter": true,
1514-
"@metamask/utils": true
1514+
"@metamask/safe-event-emitter": true
1515+
}
1516+
},
1517+
"@metamask/json-rpc-engine>@metamask/utils": {
1518+
"globals": {
1519+
"TextDecoder": true,
1520+
"TextEncoder": true
1521+
},
1522+
"packages": {
1523+
"@metamask/utils>@metamask/superstruct": true,
1524+
"@metamask/utils>@scure/base": true,
1525+
"@metamask/utils>pony-cause": true,
1526+
"@noble/hashes": true,
1527+
"browserify>buffer": true,
1528+
"nock>debug": true,
1529+
"semver": true
15151530
}
15161531
},
15171532
"@metamask/json-rpc-middleware-stream": {
@@ -1520,11 +1535,26 @@
15201535
"setTimeout": true
15211536
},
15221537
"packages": {
1538+
"@metamask/json-rpc-middleware-stream>@metamask/utils": true,
15231539
"@metamask/safe-event-emitter": true,
1524-
"@metamask/utils": true,
15251540
"readable-stream": true
15261541
}
15271542
},
1543+
"@metamask/json-rpc-middleware-stream>@metamask/utils": {
1544+
"globals": {
1545+
"TextDecoder": true,
1546+
"TextEncoder": true
1547+
},
1548+
"packages": {
1549+
"@metamask/utils>@metamask/superstruct": true,
1550+
"@metamask/utils>@scure/base": true,
1551+
"@metamask/utils>pony-cause": true,
1552+
"@noble/hashes": true,
1553+
"browserify>buffer": true,
1554+
"nock>debug": true,
1555+
"semver": true
1556+
}
1557+
},
15281558
"@metamask/keyring-api": {
15291559
"globals": {
15301560
"URL": true
@@ -2368,8 +2398,23 @@
23682398
},
23692399
"@metamask/rpc-errors": {
23702400
"packages": {
2371-
"@metamask/rpc-errors>fast-safe-stringify": true,
2372-
"@metamask/utils": true
2401+
"@metamask/rpc-errors>@metamask/utils": true,
2402+
"@metamask/rpc-errors>fast-safe-stringify": true
2403+
}
2404+
},
2405+
"@metamask/rpc-errors>@metamask/utils": {
2406+
"globals": {
2407+
"TextDecoder": true,
2408+
"TextEncoder": true
2409+
},
2410+
"packages": {
2411+
"@metamask/utils>@metamask/superstruct": true,
2412+
"@metamask/utils>@scure/base": true,
2413+
"@metamask/utils>pony-cause": true,
2414+
"@noble/hashes": true,
2415+
"browserify>buffer": true,
2416+
"nock>debug": true,
2417+
"semver": true
23732418
}
23742419
},
23752420
"@metamask/rpc-methods-flask>nanoid": {

package.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,8 @@
251251
"secp256k1@npm:^4.0.1": "4.0.4",
252252
"secp256k1@npm:4.0.2": "4.0.4",
253253
"secp256k1@npm:4.0.3": "4.0.4",
254-
"undici@npm:5.28.4": "5.28.5"
254+
"undici@npm:5.28.4": "5.28.5",
255+
"@metamask/providers@npm:^18.3.1": "patch:@metamask/providers@npm%3A19.0.0#~/.yarn/patches/@metamask-providers-npm-19.0.0-3d962c6f1a.patch"
255256
},
256257
"dependencies": {
257258
"@babel/runtime": "patch:@babel/runtime@npm%3A7.25.9#~/.yarn/patches/@babel-runtime-npm-7.25.9-fe8c62510a.patch",
@@ -332,7 +333,7 @@
332333
"@metamask/ppom-validator": "0.36.0",
333334
"@metamask/preinstalled-example-snap": "^0.2.0",
334335
"@metamask/profile-sync-controller": "^3.1.1",
335-
"@metamask/providers": "^18.2.0",
336+
"@metamask/providers": "patch:@metamask/providers@npm%3A19.0.0#~/.yarn/patches/@metamask-providers-npm-19.0.0-3d962c6f1a.patch",
336337
"@metamask/queued-request-controller": "^7.0.1",
337338
"@metamask/rate-limit-controller": "^6.0.0",
338339
"@metamask/remote-feature-flag-controller": "^1.1.0",

0 commit comments

Comments
 (0)