From ed06926ac5baca77914c3088ac97f4ccfa1fd463 Mon Sep 17 00:00:00 2001 From: Howard Braham Date: Thu, 22 Jun 2023 21:00:40 -0700 Subject: [PATCH 01/52] chore(tools): update geckodriver to 4.0.4 (#19558) --- package.json | 2 +- yarn.lock | 319 +++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 246 insertions(+), 75 deletions(-) diff --git a/package.json b/package.json index fae1202fe..021cad8ac 100644 --- a/package.json +++ b/package.json @@ -466,7 +466,7 @@ "fast-glob": "^3.2.2", "fs-extra": "^8.1.0", "ganache": "^v7.0.4", - "geckodriver": "^3.2.0", + "geckodriver": "^4.0.4", "gh-pages": "^5.0.0", "globby": "^11.0.4", "gulp": "^4.0.2", diff --git a/yarn.lock b/yarn.lock index 7e19652e3..927c8c3d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8651,6 +8651,18 @@ __metadata: languageName: node linkType: hard +"@wdio/logger@npm:^8.6.6": + version: 8.11.0 + resolution: "@wdio/logger@npm:8.11.0" + dependencies: + chalk: ^5.1.2 + loglevel: ^1.6.0 + loglevel-plugin-prefix: ^0.8.4 + strip-ansi: ^7.1.0 + checksum: b62d0db074240a993c72d95793606d4fa7890fcbebdff5e344bf5c7be90f8189e94432056c1fbb5e636a74b0f036a8a1d88af6c04e4c01e436e9dfab7048f638 + languageName: node + linkType: hard + "@webassemblyjs/ast@npm:1.11.6, @webassemblyjs/ast@npm:^1.11.5": version: 1.11.6 resolution: "@webassemblyjs/ast@npm:1.11.6" @@ -9209,13 +9221,6 @@ __metadata: languageName: node linkType: hard -"adm-zip@npm:0.5.9": - version: 0.5.9 - resolution: "adm-zip@npm:0.5.9" - checksum: 4909bc04119fdd5e8f8ba43826e50623e5c427cf0a939c809d4f9456a6a03c6aa0544e82088739de9ba16b7649f71b99ccbbddc7b2c38bd6143f9c4726cc7ed9 - languageName: node - linkType: hard - "aes-js@npm:3.0.0": version: 3.0.0 resolution: "aes-js@npm:3.0.0" @@ -9246,6 +9251,15 @@ __metadata: languageName: node linkType: hard +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0": + version: 7.1.0 + resolution: "agent-base@npm:7.1.0" + dependencies: + debug: ^4.3.4 + checksum: f7828f991470a0cc22cb579c86a18cbae83d8a3cbed39992ab34fc7217c4d126017f1c74d0ab66be87f71455318a8ea3e757d6a37881b8d0f2a2c6aa55e5418f + languageName: node + linkType: hard + "agentkeepalive@npm:^4.2.1": version: 4.2.1 resolution: "agentkeepalive@npm:4.2.1" @@ -10617,7 +10631,7 @@ __metadata: languageName: node linkType: hard -"big-integer@npm:^1.6.44, big-integer@npm:^1.6.48": +"big-integer@npm:^1.6.17, big-integer@npm:^1.6.44, big-integer@npm:^1.6.48": version: 1.6.51 resolution: "big-integer@npm:1.6.51" checksum: 3d444173d1b2e20747e2c175568bedeebd8315b0637ea95d75fd27830d3b8e8ba36c6af40374f36bdaea7b5de376dcada1b07587cb2a79a928fccdb6e6e3c518 @@ -10666,6 +10680,16 @@ __metadata: languageName: node linkType: hard +"binary@npm:~0.3.0": + version: 0.3.0 + resolution: "binary@npm:0.3.0" + dependencies: + buffers: ~0.1.1 + chainsaw: ~0.1.0 + checksum: b4699fda9e2c2981e74a46b0115cf0d472eda9b68c0e9d229ef494e92f29ce81acf0a834415094cffcc340dfee7c4ef8ce5d048c65c18067a7ed850323f777af + languageName: node + linkType: hard + "bindings@npm:^1.3.0, bindings@npm:^1.5.0": version: 1.5.0 resolution: "bindings@npm:1.5.0" @@ -10738,13 +10762,20 @@ __metadata: languageName: node linkType: hard -"bluebird@npm:3.7.2, bluebird@npm:^3.5.2, bluebird@npm:^3.7.2": +"bluebird@npm:^3.5.2, bluebird@npm:^3.7.2": version: 3.7.2 resolution: "bluebird@npm:3.7.2" checksum: 869417503c722e7dc54ca46715f70e15f4d9c602a423a02c825570862d12935be59ed9c7ba34a9b31f186c017c23cac6b54e35446f8353059c101da73eac22ef languageName: node linkType: hard +"bluebird@npm:~3.4.1": + version: 3.4.7 + resolution: "bluebird@npm:3.4.7" + checksum: bffa9dee7d3a41ab15c4f3f24687b49959b4e64e55c058a062176feb8ccefc2163414fb4e1a0f3053bf187600936509660c3ebd168fd9f0e48c7eba23b019466 + languageName: node + linkType: hard + "bn.js@npm:4.11.6": version: 4.11.6 resolution: "bn.js@npm:4.11.6" @@ -11348,6 +11379,13 @@ __metadata: languageName: node linkType: hard +"buffer-indexof-polyfill@npm:~1.0.0": + version: 1.0.2 + resolution: "buffer-indexof-polyfill@npm:1.0.2" + checksum: fbfb2d69c6bb2df235683126f9dc140150c08ac3630da149913a9971947b667df816a913b6993bc48f4d611999cb99a1589914d34c02dccd2234afda5cb75bbc + languageName: node + linkType: hard + "buffer-xor@npm:^1.0.3": version: 1.0.3 resolution: "buffer-xor@npm:1.0.3" @@ -11395,6 +11433,13 @@ __metadata: languageName: node linkType: hard +"buffers@npm:~0.1.1": + version: 0.1.1 + resolution: "buffers@npm:0.1.1" + checksum: ad6f8e483efab39cefd92bdc04edbff6805e4211b002f4d1cfb70c6c472a61cc89fb18c37bcdfdd4ee416ca096e9ff606286698a7d41a18b539bac12fd76d4d5 + languageName: node + linkType: hard + "bufferutil@npm:4.0.5": version: 4.0.5 resolution: "bufferutil@npm:4.0.5" @@ -11781,6 +11826,15 @@ __metadata: languageName: node linkType: hard +"chainsaw@npm:~0.1.0": + version: 0.1.0 + resolution: "chainsaw@npm:0.1.0" + dependencies: + traverse: ">=0.3.0 <0.4" + checksum: 22a96b9fb0cd9fb20813607c0869e61817d1acc81b5d455cc6456b5e460ea1dd52630e0f76b291cf8294bfb6c1fc42e299afb52104af9096242699d6d3aa6d3e + languageName: node + linkType: hard + "chalk@npm:4.1.2, chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" @@ -11812,6 +11866,13 @@ __metadata: languageName: node linkType: hard +"chalk@npm:^5.1.2": + version: 5.2.0 + resolution: "chalk@npm:5.2.0" + checksum: 03d8060277de6cf2fd567dc25fcf770593eb5bb85f460ce443e49255a30ff1242edd0c90a06a03803b0466ff0687a939b41db1757bec987113e83de89a003caa + languageName: node + linkType: hard + "change-case@npm:3.0.2": version: 3.0.2 resolution: "change-case@npm:3.0.2" @@ -13368,6 +13429,13 @@ __metadata: languageName: node linkType: hard +"data-uri-to-buffer@npm:^4.0.0": + version: 4.0.1 + resolution: "data-uri-to-buffer@npm:4.0.1" + checksum: 0d0790b67ffec5302f204c2ccca4494f70b4e2d940fea3d36b09f0bb2b8539c2e86690429eb1f1dc4bcc9e4df0644193073e63d9ee48ac9fce79ec1506e4aa4c + languageName: node + linkType: hard + "data-urls@npm:^3.0.2": version: 3.0.2 resolution: "data-urls@npm:3.0.2" @@ -13513,6 +13581,13 @@ __metadata: languageName: node linkType: hard +"decamelize@npm:^6.0.0": + version: 6.0.0 + resolution: "decamelize@npm:6.0.0" + checksum: 0066bc30798ec11e01adf0c19ad975caef86545d4bb6f70cfb90b7eb8e3cbf7974cf774ac2e6ea2586e4e07b1f654bfecc4e772c42128a79a89f8584fc546753 + languageName: node + linkType: hard + "decimal.js@npm:^10.2.0, decimal.js@npm:^10.3.1": version: 10.4.0 resolution: "decimal.js@npm:10.4.0" @@ -17021,6 +17096,16 @@ __metadata: languageName: node linkType: hard +"fetch-blob@npm:^3.1.2, fetch-blob@npm:^3.1.4": + version: 3.2.0 + resolution: "fetch-blob@npm:3.2.0" + dependencies: + node-domexception: ^1.0.0 + web-streams-polyfill: ^3.0.3 + checksum: f19bc28a2a0b9626e69fd7cf3a05798706db7f6c7548da657cbf5026a570945f5eeaedff52007ea35c8bcd3d237c58a20bf1543bc568ab2422411d762dd3d5bf + languageName: node + linkType: hard + "fetch-ponyfill@npm:^7.1.0": version: 7.1.0 resolution: "fetch-ponyfill@npm:7.1.0" @@ -17630,6 +17715,15 @@ __metadata: languageName: node linkType: hard +"formdata-polyfill@npm:^4.0.10": + version: 4.0.10 + resolution: "formdata-polyfill@npm:4.0.10" + dependencies: + fetch-blob: ^3.1.2 + checksum: 82a34df292afadd82b43d4a740ce387bc08541e0a534358425193017bf9fb3567875dc5f69564984b1da979979b70703aa73dee715a17b6c229752ae736dd9db + languageName: node + linkType: hard + "forwarded@npm:0.2.0": version: 0.2.0 resolution: "forwarded@npm:0.2.0" @@ -17816,6 +17910,18 @@ __metadata: languageName: node linkType: hard +"fstream@npm:^1.0.12": + version: 1.0.12 + resolution: "fstream@npm:1.0.12" + dependencies: + graceful-fs: ^4.1.2 + inherits: ~2.0.0 + mkdirp: ">=0.5 0" + rimraf: 2 + checksum: e6998651aeb85fd0f0a8a68cec4d05a3ada685ecc4e3f56e0d063d0564a4fc39ad11a856f9020f926daf869fc67f7a90e891def5d48e4cadab875dc313094536 + languageName: node + linkType: hard + "ftp@npm:^0.3.10": version: 0.3.10 resolution: "ftp@npm:0.3.10" @@ -17945,18 +18051,21 @@ __metadata: languageName: node linkType: hard -"geckodriver@npm:^3.2.0": - version: 3.2.0 - resolution: "geckodriver@npm:3.2.0" +"geckodriver@npm:^4.0.4": + version: 4.0.4 + resolution: "geckodriver@npm:4.0.4" dependencies: - adm-zip: 0.5.9 - bluebird: 3.7.2 - got: 11.8.5 - https-proxy-agent: 5.0.1 - tar: 6.1.11 + "@wdio/logger": ^8.6.6 + decamelize: ^6.0.0 + http-proxy-agent: ^7.0.0 + https-proxy-agent: ^7.0.0 + node-fetch: ^3.3.1 + tar-fs: ^2.1.1 + unzipper: ^0.10.14 + which: ^3.0.1 bin: - geckodriver: bin/geckodriver - checksum: fe196312c97927be943aa97f2343ba15a6fb612b51a1e8ea96c0c8c6e8d50c81d33517e604e3db3777ada28bb9f5b0dad7e822ca4e841f16375a8f1d77df08ae + geckodriver: bin/geckodriver.js + checksum: ac286037afaf87eec77804bf61a457f7f38d0e226134f514ad72fc07e85df12ae0a308053987e3495dbf57a0e7b19f33c42e55b10581dcfd7729055b2346efc2 languageName: node linkType: hard @@ -18547,25 +18656,6 @@ __metadata: languageName: node linkType: hard -"got@npm:11.8.5": - version: 11.8.5 - resolution: "got@npm:11.8.5" - dependencies: - "@sindresorhus/is": ^4.0.0 - "@szmarczak/http-timer": ^4.0.5 - "@types/cacheable-request": ^6.0.1 - "@types/responselike": ^1.0.0 - cacheable-lookup: ^5.0.3 - cacheable-request: ^7.0.2 - decompress-response: ^6.0.0 - http2-wrapper: ^1.0.0-beta.5.2 - lowercase-keys: ^2.0.0 - p-cancelable: ^2.0.0 - responselike: ^2.0.0 - checksum: 2de8a1bbda4e9b6b2b72b2d2100bc055a59adc1740529e631f61feb44a8b9a1f9f8590941ed9da9df0090b6d6d0ed8ffee94cd9ac086ec3409b392b33440f7d2 - languageName: node - linkType: hard - "got@npm:^11.8.5": version: 11.8.6 resolution: "got@npm:11.8.6" @@ -18604,7 +18694,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.0.0, graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.1.9, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.3, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.0.0, graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.1.9, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.2, graceful-fs@npm:^4.2.3, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 @@ -19471,6 +19561,16 @@ __metadata: languageName: node linkType: hard +"http-proxy-agent@npm:^7.0.0": + version: 7.0.0 + resolution: "http-proxy-agent@npm:7.0.0" + dependencies: + agent-base: ^7.1.0 + debug: ^4.3.4 + checksum: 48d4fac997917e15f45094852b63b62a46d0c8a4f0b9c6c23ca26d27b8df8d178bed88389e604745e748bd9a01f5023e25093722777f0593c3f052009ff438b6 + languageName: node + linkType: hard + "http-signature@npm:~1.2.0": version: 1.2.0 resolution: "http-signature@npm:1.2.0" @@ -19509,7 +19609,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:5, https-proxy-agent@npm:5.0.1, https-proxy-agent@npm:^5.0.0, https-proxy-agent@npm:^5.0.1": +"https-proxy-agent@npm:5, https-proxy-agent@npm:^5.0.0, https-proxy-agent@npm:^5.0.1": version: 5.0.1 resolution: "https-proxy-agent@npm:5.0.1" dependencies: @@ -19529,6 +19629,16 @@ __metadata: languageName: node linkType: hard +"https-proxy-agent@npm:^7.0.0": + version: 7.0.0 + resolution: "https-proxy-agent@npm:7.0.0" + dependencies: + agent-base: ^7.0.2 + debug: 4 + checksum: c1365f5202b6a9c5c5fb1e6718e941254c2782bc51e8c57b1a7cacdccf1017278224434c963dfcdbdd4a3147a29c97d782316fabeef4e099968a627049de3347 + languageName: node + linkType: hard + "human-signals@npm:^1.1.1": version: 1.1.1 resolution: "human-signals@npm:1.1.1" @@ -19781,7 +19891,7 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.1, inherits@npm:~2.0.3, inherits@npm:~2.0.4": +"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.0, inherits@npm:~2.0.1, inherits@npm:~2.0.3, inherits@npm:~2.0.4": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 @@ -23218,6 +23328,13 @@ __metadata: languageName: node linkType: hard +"listenercount@npm:~1.0.1": + version: 1.0.1 + resolution: "listenercount@npm:1.0.1" + checksum: 0f1c9077cdaf2ebc16473c7d72eb7de6d983898ca42500f03da63c3914b6b312dd5f7a90d2657691ea25adf3fe0ac5a43226e8b2c673fd73415ed038041f4757 + languageName: node + linkType: hard + "livereload-js@npm:^2.3.0": version: 2.4.0 resolution: "livereload-js@npm:2.4.0" @@ -23451,7 +23568,14 @@ __metadata: languageName: node linkType: hard -"loglevel@npm:^1.8.0, loglevel@npm:^1.8.1": +"loglevel-plugin-prefix@npm:^0.8.4": + version: 0.8.4 + resolution: "loglevel-plugin-prefix@npm:0.8.4" + checksum: 5fe0632fa04263e083f87204107a06aa53e40a3537e08752539f5c0fd9a0ef112fe9ba6bdaed791502156c67a4ff7993a2b2871404615f0163f4c49649c362e4 + languageName: node + linkType: hard + +"loglevel@npm:^1.6.0, loglevel@npm:^1.8.0, loglevel@npm:^1.8.1": version: 1.8.1 resolution: "loglevel@npm:1.8.1" checksum: a1a62db40291aaeaef2f612334c49e531bff71cc1d01a2acab689ab80d59e092f852ab164a5aedc1a752fdc46b7b162cb097d8a9eb2cf0b299511106c29af61d @@ -24478,7 +24602,7 @@ __metadata: fs-extra: ^8.1.0 fuse.js: ^3.2.0 ganache: ^v7.0.4 - geckodriver: ^3.2.0 + geckodriver: ^4.0.4 gh-pages: ^5.0.0 globalthis: ^1.0.1 globby: ^11.0.4 @@ -25327,7 +25451,7 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.4, mkdirp@npm:^0.5.5, mkdirp@npm:^0.5.6": +"mkdirp@npm:>=0.5 0, mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.4, mkdirp@npm:^0.5.5, mkdirp@npm:^0.5.6": version: 0.5.6 resolution: "mkdirp@npm:0.5.6" dependencies: @@ -25930,6 +26054,13 @@ __metadata: languageName: node linkType: hard +"node-domexception@npm:^1.0.0": + version: 1.0.0 + resolution: "node-domexception@npm:1.0.0" + checksum: ee1d37dd2a4eb26a8a92cd6b64dfc29caec72bff5e1ed9aba80c294f57a31ba4895a60fd48347cf17dd6e766da0ae87d75657dfd1f384ebfa60462c2283f5c7f + languageName: node + linkType: hard + "node-fetch-native@npm:^1.0.2": version: 1.1.1 resolution: "node-fetch-native@npm:1.1.1" @@ -25951,6 +26082,17 @@ __metadata: languageName: node linkType: hard +"node-fetch@npm:^3.3.1": + version: 3.3.1 + resolution: "node-fetch@npm:3.3.1" + dependencies: + data-uri-to-buffer: ^4.0.0 + fetch-blob: ^3.1.4 + formdata-polyfill: ^4.0.10 + checksum: 62145fd3ba4770a76110bc31fdc0054ab2f5442b5ce96e9c4b39fc9e94a3d305560eec76e1165d9259eab866e02a8eecf9301062bb5dfc9f08a4d08b69d223dd + languageName: node + linkType: hard + "node-forge@npm:^1.2.1": version: 1.3.0 resolution: "node-forge@npm:1.3.0" @@ -30379,6 +30521,17 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:2, rimraf@npm:^2.2.8, rimraf@npm:^2.6.1": + version: 2.7.1 + resolution: "rimraf@npm:2.7.1" + dependencies: + glob: ^7.1.3 + bin: + rimraf: ./bin.js + checksum: cdc7f6eacb17927f2a075117a823e1c5951792c6498ebcce81ca8203454a811d4cf8900314154d3259bb8f0b42ab17f67396a8694a54cae3283326e57ad250cd + languageName: node + linkType: hard + "rimraf@npm:2.6.3, rimraf@npm:~2.6.2": version: 2.6.3 resolution: "rimraf@npm:2.6.3" @@ -30390,17 +30543,6 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:^2.2.8, rimraf@npm:^2.6.1": - version: 2.7.1 - resolution: "rimraf@npm:2.7.1" - dependencies: - glob: ^7.1.3 - bin: - rimraf: ./bin.js - checksum: cdc7f6eacb17927f2a075117a823e1c5951792c6498ebcce81ca8203454a811d4cf8900314154d3259bb8f0b42ab17f67396a8694a54cae3283326e57ad250cd - languageName: node - linkType: hard - "rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" @@ -31161,7 +31303,7 @@ __metadata: languageName: node linkType: hard -"setimmediate@npm:^1.0.5": +"setimmediate@npm:^1.0.5, setimmediate@npm:~1.0.4": version: 1.0.5 resolution: "setimmediate@npm:1.0.5" checksum: c9a6f2c5b51a2dabdc0247db9c46460152ffc62ee139f3157440bd48e7c59425093f42719ac1d7931f054f153e2d26cf37dfeb8da17a794a58198a2705e527fd @@ -32284,12 +32426,12 @@ __metadata: languageName: node linkType: hard -"strip-ansi@npm:^7.0.1": - version: 7.0.1 - resolution: "strip-ansi@npm:7.0.1" +"strip-ansi@npm:^7.0.1, strip-ansi@npm:^7.1.0": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" dependencies: ansi-regex: ^6.0.1 - checksum: 257f78fa433520e7f9897722731d78599cb3fce29ff26a20a5e12ba4957463b50a01136f37c43707f4951817a75e90820174853d6ccc240997adc5df8f966039 + checksum: 859c73fcf27869c22a4e4d8c6acfe690064659e84bef9458aa6d13719d09ca88dcfd40cbf31fd0be63518ea1a643fe070b4827d353e09533a5b0b9fd4553d64d languageName: node linkType: hard @@ -32790,20 +32932,6 @@ __metadata: languageName: node linkType: hard -"tar@npm:6.1.11": - version: 6.1.11 - resolution: "tar@npm:6.1.11" - dependencies: - chownr: ^2.0.0 - fs-minipass: ^2.0.0 - minipass: ^3.0.0 - minizlib: ^2.1.1 - mkdirp: ^1.0.3 - yallist: ^4.0.0 - checksum: a04c07bb9e2d8f46776517d4618f2406fb977a74d914ad98b264fc3db0fe8224da5bec11e5f8902c5b9bcb8ace22d95fbe3c7b36b8593b7dfc8391a25898f32f - languageName: node - linkType: hard - "tar@npm:^4": version: 4.4.19 resolution: "tar@npm:4.4.19" @@ -33280,6 +33408,13 @@ __metadata: languageName: node linkType: hard +"traverse@npm:>=0.3.0 <0.4": + version: 0.3.9 + resolution: "traverse@npm:0.3.9" + checksum: 982982e4e249e9bbf063732a41fe5595939892758524bbef5d547c67cdf371b13af72b5434c6a61d88d4bb4351d6dabc6e22d832e0d16bc1bc684ef97a1cc59e + languageName: node + linkType: hard + "tree-kill@npm:^1.2.2": version: 1.2.2 resolution: "tree-kill@npm:1.2.2" @@ -34183,6 +34318,24 @@ __metadata: languageName: node linkType: hard +"unzipper@npm:^0.10.14": + version: 0.10.14 + resolution: "unzipper@npm:0.10.14" + dependencies: + big-integer: ^1.6.17 + binary: ~0.3.0 + bluebird: ~3.4.1 + buffer-indexof-polyfill: ~1.0.0 + duplexer2: ~0.1.4 + fstream: ^1.0.12 + graceful-fs: ^4.2.2 + listenercount: ~1.0.1 + readable-stream: ~2.3.6 + setimmediate: ~1.0.4 + checksum: b46ae9a72e4b4c224be6a8f46447dd7cb3761a59450827e869747c4564a8f555f877fc19c7e3b5d146127a7dd3e2ffea186116682f6646e64479f99dd23565bc + languageName: node + linkType: hard + "upath@npm:2.0.1": version: 2.0.1 resolution: "upath@npm:2.0.1" @@ -34932,6 +35085,13 @@ __metadata: languageName: node linkType: hard +"web-streams-polyfill@npm:^3.0.3": + version: 3.2.1 + resolution: "web-streams-polyfill@npm:3.2.1" + checksum: b119c78574b6d65935e35098c2afdcd752b84268e18746606af149e3c424e15621b6f1ff0b42b2676dc012fc4f0d313f964b41a4b5031e525faa03997457da02 + languageName: node + linkType: hard + "web3-provider-engine@npm:^16.0.3": version: 16.0.5 resolution: "web3-provider-engine@npm:16.0.5" @@ -35269,6 +35429,17 @@ __metadata: languageName: node linkType: hard +"which@npm:^3.0.1": + version: 3.0.1 + resolution: "which@npm:3.0.1" + dependencies: + isexe: ^2.0.0 + bin: + node-which: bin/which.js + checksum: adf720fe9d84be2d9190458194f814b5e9015ae4b88711b150f30d0f4d0b646544794b86f02c7ebeec1db2029bc3e83a7ff156f542d7521447e5496543e26890 + languageName: node + linkType: hard + "wide-align@npm:^1.1.0, wide-align@npm:^1.1.2, wide-align@npm:^1.1.5": version: 1.1.5 resolution: "wide-align@npm:1.1.5" From ce3855f520c32f0f8b1524b5f4800863c40ff269 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3nio=20Regadas?= Date: Fri, 23 Jun 2023 10:53:00 +0100 Subject: [PATCH 02/52] adds MMI name to the manifest name (#19617) --- development/build/manifest.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/development/build/manifest.js b/development/build/manifest.js index da0683e3b..b3079f806 100644 --- a/development/build/manifest.js +++ b/development/build/manifest.js @@ -135,9 +135,12 @@ function createManifestTasks({ .trim() .substring(0, 8); - manifest.name = `MetaMask ${capitalize( - buildType, - )}${mv3Str}${lavamoatStr}${snowStr}`; + const buildName = + buildType === 'mmi' + ? `MetaMask Institutional ${mv3Str}${lavamoatStr}${snowStr}` + : `MetaMask ${capitalize(buildType)}${mv3Str}${lavamoatStr}${snowStr}`; + + manifest.name = buildName; manifest.description = `${environment} build from git id: ${gitRevisionStr}`; } From adc02dd534e8176f8a8f306b0847c11b9684c55c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3nio=20Regadas?= Date: Fri, 23 Jun 2023 10:54:04 +0100 Subject: [PATCH 03/52] adds MMI blue fox svg (#19632) --- .../ui/metafox-logo/horizontal-logo.js | 174 ++++++++++++++++++ 1 file changed, 174 insertions(+) diff --git a/ui/components/ui/metafox-logo/horizontal-logo.js b/ui/components/ui/metafox-logo/horizontal-logo.js index 2229bffb4..c76c63854 100644 --- a/ui/components/ui/metafox-logo/horizontal-logo.js +++ b/ui/components/ui/metafox-logo/horizontal-logo.js @@ -701,6 +701,180 @@ export default function MetaFoxHorizontalLogo({ className }) { ); + case 'mmi': + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); default: return ( Date: Fri, 23 Jun 2023 10:54:59 +0100 Subject: [PATCH 04/52] fixes the stake a portfolio icons not showing (#19633) --- app/build-types/mmi/images/icons/stake.svg | 17 +++-------------- .../app/wallet-overview/eth-overview.js | 4 ++-- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/app/build-types/mmi/images/icons/stake.svg b/app/build-types/mmi/images/icons/stake.svg index e6b1ce7c6..54c6762e3 100644 --- a/app/build-types/mmi/images/icons/stake.svg +++ b/app/build-types/mmi/images/icons/stake.svg @@ -1,14 +1,3 @@ - - - - - - - - - - \ No newline at end of file + + + diff --git a/ui/components/app/wallet-overview/eth-overview.js b/ui/components/app/wallet-overview/eth-overview.js index 2d026a78c..d49e7ff83 100644 --- a/ui/components/app/wallet-overview/eth-overview.js +++ b/ui/components/app/wallet-overview/eth-overview.js @@ -96,7 +96,7 @@ const EthOverview = ({ className }) => { <> } + Icon={} label={t('stake')} onClick={() => { stakingEvent(); @@ -109,7 +109,7 @@ const EthOverview = ({ className }) => { + } label={t('portfolio')} onClick={() => { From 80bfb5b501a8a8d96a3e24e0ba28e1f093ca5482 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3nio=20Regadas?= Date: Fri, 23 Jun 2023 10:55:31 +0100 Subject: [PATCH 05/52] [MMI] rearrange mmi account menu options (#19635) * adds the portfolio dashboard option and compliance to the global menu * undo change --- .../account-list-menu/account-list-menu.js | 107 +++++---------- .../multichain/global-menu/global-menu.js | 123 ++++++++++++++---- 2 files changed, 124 insertions(+), 106 deletions(-) diff --git a/ui/components/multichain/account-list-menu/account-list-menu.js b/ui/components/multichain/account-list-menu/account-list-menu.js index 1461c8a83..40d6b9df6 100644 --- a/ui/components/multichain/account-list-menu/account-list-menu.js +++ b/ui/components/multichain/account-list-menu/account-list-menu.js @@ -3,12 +3,12 @@ import PropTypes from 'prop-types'; import { useHistory } from 'react-router-dom'; import Fuse from 'fuse.js'; import { useDispatch, useSelector } from 'react-redux'; -import Box from '../../ui/box/box'; import { IconName, ButtonLink, TextFieldSearch, Text, + Box, } from '../../component-library'; import { AccountListItem, CreateAccount, ImportAccount } from '..'; import { @@ -19,12 +19,6 @@ import { import { useI18nContext } from '../../../hooks/useI18nContext'; import { MetaMetricsContext } from '../../../contexts/metametrics'; import Popover from '../../ui/popover'; -///: BEGIN:ONLY_INCLUDE_IN(build-mmi) -import { - getMmiPortfolioEnabled, - getMmiPortfolioUrl, -} from '../../../selectors/institutional/selectors'; -///: END:ONLY_INCLUDE_IN import { getSelectedAccount, getMetaMaskAccountsOrdered, @@ -41,7 +35,6 @@ import { CONNECT_HARDWARE_ROUTE, ///: BEGIN:ONLY_INCLUDE_IN(build-mmi) CUSTODY_ACCOUNT_ROUTE, - COMPLIANCE_FEATURE_ROUTE, ///: END:ONLY_INCLUDE_IN } from '../../../helpers/constants/routes'; import { getEnvironmentType } from '../../../../app/scripts/lib/util'; @@ -58,11 +51,6 @@ export const AccountListMenu = ({ onClose }) => { const dispatch = useDispatch(); const inputRef = useRef(); - ///: BEGIN:ONLY_INCLUDE_IN(build-mmi) - const mmiPortfolioUrl = useSelector(getMmiPortfolioUrl); - const mmiPortfolioEnabled = useSelector(getMmiPortfolioEnabled); - ///: END:ONLY_INCLUDE_IN - const [searchQuery, setSearchQuery] = useState(''); const [actionMode, setActionMode] = useState(''); @@ -233,7 +221,7 @@ export const AccountListMenu = ({ onClose }) => { {t('importAccount')} - + { > {t('hardwareWallet')} - { - ///: BEGIN:ONLY_INCLUDE_IN(build-mmi) - <> - { - dispatch(toggleAccountMenu()); - trackEvent({ - category: MetaMetricsEventCategory.Navigation, - event: - MetaMetricsEventName.UserClickedConnectCustodialAccount, - }); - if (getEnvironmentType() === ENVIRONMENT_TYPE_POPUP) { - global.platform.openExtensionInBrowser( - CUSTODY_ACCOUNT_ROUTE, - ); - } else { - history.push(CUSTODY_ACCOUNT_ROUTE); - } - }} - > - {t('connectCustodialAccountMenu')} - - {mmiPortfolioEnabled && ( - { - dispatch(toggleAccountMenu()); - trackEvent({ - category: MetaMetricsEventCategory.Navigation, - event: - MetaMetricsEventName.UserClickedPortfolioButton, - }); - window.open(mmiPortfolioUrl, '_blank'); - }} - > - {t('portfolioDashboard')} - - )} - { - dispatch(toggleAccountMenu()); - trackEvent({ - category: MetaMetricsEventCategory.Navigation, - event: MetaMetricsEventName.UserClickedCompliance, - }); - if (getEnvironmentType() === ENVIRONMENT_TYPE_POPUP) { - global.platform.openExtensionInBrowser( - COMPLIANCE_FEATURE_ROUTE, - ); - } else { - history.push(COMPLIANCE_FEATURE_ROUTE); - } - }} - > - {t('compliance')} - - - ///: END:ONLY_INCLUDE_IN - } + { + ///: BEGIN:ONLY_INCLUDE_IN(build-mmi) + + { + dispatch(toggleAccountMenu()); + trackEvent({ + category: MetaMetricsEventCategory.Navigation, + event: + MetaMetricsEventName.UserClickedConnectCustodialAccount, + }); + if (getEnvironmentType() === ENVIRONMENT_TYPE_POPUP) { + global.platform.openExtensionInBrowser( + CUSTODY_ACCOUNT_ROUTE, + ); + } else { + history.push(CUSTODY_ACCOUNT_ROUTE); + } + }} + > + {t('connectCustodialAccountMenu')} + + + ///: END:ONLY_INCLUDE_IN + } ) : null} diff --git a/ui/components/multichain/global-menu/global-menu.js b/ui/components/multichain/global-menu/global-menu.js index 71d8dc6ae..6d813aa72 100644 --- a/ui/components/multichain/global-menu/global-menu.js +++ b/ui/components/multichain/global-menu/global-menu.js @@ -9,6 +9,9 @@ import { ///: BEGIN:ONLY_INCLUDE_IN(snaps) NOTIFICATIONS_ROUTE, ///: END:ONLY_INCLUDE_IN(snaps) + ///: BEGIN:ONLY_INCLUDE_IN(build-mmi) + COMPLIANCE_FEATURE_ROUTE, + ///: END:ONLY_INCLUDE_IN } from '../../../helpers/constants/routes'; import { lockMetamask } from '../../../store/actions'; import { useI18nContext } from '../../../hooks/useI18nContext'; @@ -20,7 +23,12 @@ import { } from '../../component-library'; import { Menu, MenuItem } from '../../ui/menu'; import { getEnvironmentType } from '../../../../app/scripts/lib/util'; -import { ENVIRONMENT_TYPE_FULLSCREEN } from '../../../../shared/constants/app'; +import { + ENVIRONMENT_TYPE_FULLSCREEN, + ///: BEGIN:ONLY_INCLUDE_IN(build-mmi) + ENVIRONMENT_TYPE_POPUP, + ///: END:ONLY_INCLUDE_IN +} from '../../../../shared/constants/app'; import { SUPPORT_LINK } from '../../../../shared/lib/ui-utils'; ///: BEGIN:ONLY_INCLUDE_IN(build-beta,build-flask) import { SUPPORT_REQUEST_LINK } from '../../../helpers/constants/common'; @@ -33,6 +41,12 @@ import { MetaMetricsContextProp, } from '../../../../shared/constants/metametrics'; import { getPortfolioUrl } from '../../../helpers/utils/portfolio'; +///: BEGIN:ONLY_INCLUDE_IN(build-mmi) +import { + getMmiPortfolioEnabled, + getMmiPortfolioUrl, +} from '../../../selectors/institutional/selectors'; +///: END:ONLY_INCLUDE_IN import { getMetaMetricsId, ///: BEGIN:ONLY_INCLUDE_IN(snaps) @@ -61,6 +75,10 @@ export const GlobalMenu = ({ closeMenu, anchorElement }) => { const hasUnapprovedTransactions = useSelector( (state) => Object.keys(state.metamask.unapprovedTxs).length > 0, ); + ///: BEGIN:ONLY_INCLUDE_IN(build-mmi) + const mmiPortfolioUrl = useSelector(getMmiPortfolioUrl); + const mmiPortfolioEnabled = useSelector(getMmiPortfolioEnabled); + ///: END:ONLY_INCLUDE_IN ///: BEGIN:ONLY_INCLUDE_IN(snaps) const unreadNotificationsCount = useSelector(getUnreadNotificationsCount); @@ -93,34 +111,83 @@ export const GlobalMenu = ({ closeMenu, anchorElement }) => { > {t('connectedSites')} - { - const portfolioUrl = getPortfolioUrl('', 'ext', metaMetricsId); - global.platform.openTab({ - url: portfolioUrl, - }); - trackEvent( - { - category: MetaMetricsEventCategory.Home, - event: MetaMetricsEventName.PortfolioLinkClicked, - properties: { - url: portfolioUrl, - location: 'Global Menu', + + { + ///: BEGIN:ONLY_INCLUDE_IN(build-mmi) + <> + {mmiPortfolioEnabled && ( + { + trackEvent({ + category: MetaMetricsEventCategory.Navigation, + event: MetaMetricsEventName.UserClickedPortfolioButton, + }); + window.open(mmiPortfolioUrl, '_blank'); + closeMenu(); + }} + data-testid="global-menu-mmi-portfolio" + > + {t('portfolioDashboard')} + + )} + + { + trackEvent({ + category: MetaMetricsEventCategory.Navigation, + event: MetaMetricsEventName.UserClickedCompliance, + }); + if (getEnvironmentType() === ENVIRONMENT_TYPE_POPUP) { + global.platform.openExtensionInBrowser( + COMPLIANCE_FEATURE_ROUTE, + ); + } else { + history.push(COMPLIANCE_FEATURE_ROUTE); + } + }} + data-testid="global-menu-mmi-compliance" + > + {t('compliance')} + + + ///: END:ONLY_INCLUDE_IN + } + + { + ///: BEGIN:ONLY_INCLUDE_IN(build-main,build-beta,build-flask) + { + const portfolioUrl = getPortfolioUrl('', 'ext', metaMetricsId); + global.platform.openTab({ + url: portfolioUrl, + }); + trackEvent( + { + category: MetaMetricsEventCategory.Home, + event: MetaMetricsEventName.PortfolioLinkClicked, + properties: { + url: portfolioUrl, + location: 'Global Menu', + }, }, - }, - { - contextPropsIntoEventProperties: [ - MetaMetricsContextProp.PageTitle, - ], - }, - ); - closeMenu(); - }} - data-testid="global-menu-portfolio" - > - {t('portfolioView')} - + { + contextPropsIntoEventProperties: [ + MetaMetricsContextProp.PageTitle, + ], + }, + ); + closeMenu(); + }} + data-testid="global-menu-portfolio" + > + {t('portfolioView')} + + ///: END:ONLY_INCLUDE_IN + } + {getEnvironmentType() === ENVIRONMENT_TYPE_FULLSCREEN ? null : ( Date: Fri, 23 Jun 2023 17:28:41 +0530 Subject: [PATCH 06/52] removed portfolio link from wallet view (#19716) * removed portfolio link from wallet view * removed unused code * updated test * updated spec file * updated test --- test/e2e/tests/portfolio-site.spec.js | 4 +- .../app/wallet-overview/eth-overview.js | 44 +------------------ .../app/wallet-overview/eth-overview.test.js | 2 +- 3 files changed, 4 insertions(+), 46 deletions(-) diff --git a/test/e2e/tests/portfolio-site.spec.js b/test/e2e/tests/portfolio-site.spec.js index 2bdb413d5..93e0d0877 100644 --- a/test/e2e/tests/portfolio-site.spec.js +++ b/test/e2e/tests/portfolio-site.spec.js @@ -26,7 +26,7 @@ describe('Portfolio site', function () { await driver.press('#password', driver.Key.ENTER); // Click Portfolio site - await driver.clickElement('[data-testid="home__portfolio-site"]'); + await driver.clickElement('[data-testid="eth-overview-portfolio"]'); await driver.waitUntilXWindowHandles(2); const windowHandles = await driver.getAllWindowHandles(); await driver.switchToWindowWithTitle('E2E Test Dapp', windowHandles); @@ -34,7 +34,7 @@ describe('Portfolio site', function () { // Verify site assert.equal( await driver.getCurrentUrl(), - 'http://127.0.0.1:8080/?metamaskEntry=ext&metametricsId=null', + 'http://127.0.0.1:8080/?metamaskEntry=ext_portfolio_button&metametricsId=null', ); }, ); diff --git a/ui/components/app/wallet-overview/eth-overview.js b/ui/components/app/wallet-overview/eth-overview.js index d49e7ff83..e5726f2d8 100644 --- a/ui/components/app/wallet-overview/eth-overview.js +++ b/ui/components/app/wallet-overview/eth-overview.js @@ -36,7 +36,6 @@ import IconButton from '../../ui/icon-button'; import { isHardwareKeyring } from '../../../helpers/utils/hardware'; import { MetaMetricsContext } from '../../../contexts/metametrics'; import { - MetaMetricsContextProp, MetaMetricsEventCategory, MetaMetricsEventName, MetaMetricsSwapsEventSource, @@ -44,12 +43,7 @@ import { import Spinner from '../../ui/spinner'; import { startNewDraftTransaction } from '../../../ducks/send'; import { AssetType } from '../../../../shared/constants/transaction'; -import { - ButtonIcon, - ButtonIconSize, - Icon, - IconName, -} from '../../component-library'; +import { Icon, IconName } from '../../component-library'; import { IconColor } from '../../../helpers/constants/design-system'; import useRamps from '../../../hooks/experiences/useRamps'; import { getPortfolioUrl } from '../../../helpers/utils/portfolio'; @@ -156,42 +150,6 @@ const EthOverview = ({ className }) => { {balanceIsCached ? ( * ) : null} - { - ///: BEGIN:ONLY_INCLUDE_IN(build-main,build-beta,build-flask) - { - const portfolioUrl = getPortfolioUrl( - '', - 'ext', - metaMetricsId, - ); - global.platform.openTab({ - url: portfolioUrl, - }); - trackEvent( - { - category: MetaMetricsEventCategory.Home, - event: MetaMetricsEventName.PortfolioLinkClicked, - properties: { - url: portfolioUrl, - }, - }, - { - contextPropsIntoEventProperties: [ - MetaMetricsContextProp.PageTitle, - ], - }, - ); - }} - /> - ///: END:ONLY_INCLUDE_IN - } {showFiat && balance && ( { const store = configureMockStore([thunk])(mockStore); const ETH_OVERVIEW_BUY = 'eth-overview-buy'; const ETH_OVERVIEW_BRIDGE = 'eth-overview-bridge'; - const ETH_OVERVIEW_PORTFOLIO = 'home__portfolio-site'; + const ETH_OVERVIEW_PORTFOLIO = 'eth-overview-portfolio'; const ETH_OVERVIEW_PRIMARY_CURRENCY = 'eth-overview__primary-currency'; const ETH_OVERVIEW_SECONDARY_CURRENCY = 'eth-overview__secondary-currency'; From 3b9fd435fbe5334b79b463c35f619a421c29ddee Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Fri, 23 Jun 2023 09:50:36 -0230 Subject: [PATCH 07/52] Validate LavaMoat policies on each PR (#19703) * Validate LavaMoat policies on each PR The LavaMoat policies are now validated on every PR. This makes it easier to validate policy changes, as they should always correspond with the changes made in the PR (unlike today, when they could be due to a change in platform or a previous PR). Closes #19680 * Update LavaMoat policies --------- Co-authored-by: MetaMask Bot --- .circleci/config.yml | 9 ---- lavamoat/build-system/policy.json | 71 ++++--------------------------- 2 files changed, 8 insertions(+), 72 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index e26983022..9d2c27b46 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -30,12 +30,6 @@ rc_branch_only: &rc_branch_only only: - /^Version-v(\d+)[.](\d+)[.](\d+)/ -rc_or_master_branch_only: &rc_or_master_branch_only - filters: - branches: - only: - - /^Version-v(\d+)[.](\d+)[.](\d+)|master/ - workflows: test_and_release: jobs: @@ -57,15 +51,12 @@ workflows: requires: - prep-deps - validate-lavamoat-allow-scripts: - <<: *rc_or_master_branch_only requires: - prep-deps - validate-lavamoat-policy-build: - <<: *rc_or_master_branch_only requires: - prep-deps - validate-lavamoat-policy-webapp: - <<: *rc_or_master_branch_only matrix: parameters: build-type: [main, beta, flask, mmi, desktop] diff --git a/lavamoat/build-system/policy.json b/lavamoat/build-system/policy.json index 89e2820e1..9ee988092 100644 --- a/lavamoat/build-system/policy.json +++ b/lavamoat/build-system/policy.json @@ -980,7 +980,6 @@ "packages": { "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>are-we-there-yet": true, "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge": true, - "@storybook/addon-mdx-gfm>@storybook/node-logger>npmlog>console-control-strings": true, "@storybook/react>@storybook/node-logger>npmlog>console-control-strings": true, "nyc>yargs>set-blocking": true } @@ -1009,9 +1008,6 @@ "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge>aproba": true, "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge>string-width": true, "@lavamoat/allow-scripts>@npmcli/run-script>node-gyp>npmlog>gauge>strip-ansi": true, - "@storybook/addon-mdx-gfm>@storybook/node-logger>npmlog>console-control-strings": true, - "@storybook/addon-mdx-gfm>@storybook/node-logger>npmlog>gauge>has-unicode": true, - "@storybook/addon-mdx-gfm>@storybook/node-logger>npmlog>gauge>wide-align": true, "@storybook/react>@storybook/node-logger>npmlog>console-control-strings": true, "@storybook/react>@storybook/node-logger>npmlog>gauge>has-unicode": true, "@storybook/react>@storybook/node-logger>npmlog>gauge>wide-align": true, @@ -1137,33 +1133,11 @@ "@metamask/jazzicon>color>color-convert>color-name": true } }, - "@sentry/cli>mkdirp": { - "builtin": { - "fs": true, - "path.dirname": true, - "path.resolve": true - } - }, "@storybook/addon-knobs>qs": { "packages": { "string.prototype.matchall>side-channel": true } }, - "@storybook/addon-mdx-gfm>@storybook/node-logger>npmlog>gauge>has-unicode": { - "builtin": { - "os.type": true - }, - "globals": { - "process.env.LANG": true, - "process.env.LC_ALL": true, - "process.env.LC_CTYPE": true - } - }, - "@storybook/addon-mdx-gfm>@storybook/node-logger>npmlog>gauge>wide-align": { - "packages": { - "yargs>string-width": true - } - }, "@storybook/core>@storybook/core-server>x-default-browser>default-browser-id>untildify>os-homedir": { "builtin": { "os.homedir": true @@ -4895,20 +4869,9 @@ }, "packages": { "@storybook/core>@storybook/core-server>x-default-browser>default-browser-id>untildify>os-homedir": true, - "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>osenv>os-homedir": true, "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>osenv>os-tmpdir": true } }, - "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>osenv>os-homedir": { - "builtin": { - "os.homedir": true - }, - "globals": { - "process.env": true, - "process.getuid": true, - "process.platform": true - } - }, "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>osenv>os-tmpdir": { "globals": { "process.env.SystemRoot": true, @@ -4930,34 +4893,9 @@ "setTimeout": true }, "packages": { - "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob": true, "nyc>glob": true } }, - "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob": { - "builtin": { - "assert": true, - "events.EventEmitter": true, - "fs": true, - "path.join": true, - "path.resolve": true, - "util": true - }, - "globals": { - "console.error": true, - "process.cwd": true, - "process.nextTick": true, - "process.platform": true - }, - "packages": { - "eslint>minimatch": true, - "gulp-watch>path-is-absolute": true, - "nyc>glob>fs.realpath": true, - "nyc>glob>inflight": true, - "pump>once": true, - "pumpify>inherits": true - } - }, "gulp-watch>chokidar>fsevents>node-pre-gyp>semver": { "globals": { "console": true, @@ -8246,7 +8184,14 @@ "path.dirname": true }, "packages": { - "@sentry/cli>mkdirp": true + "stylelint>file-entry-cache>flat-cache>write>mkdirp": true + } + }, + "stylelint>file-entry-cache>flat-cache>write>mkdirp": { + "builtin": { + "fs": true, + "path.dirname": true, + "path.resolve": true } }, "stylelint>global-modules": { From ad3140c9490e0a5fed562172f4206ca15ee0dec2 Mon Sep 17 00:00:00 2001 From: Gauthier Petetin Date: Fri, 23 Jun 2023 09:27:49 -0300 Subject: [PATCH 08/52] fix(action): add required permissions to remove labels (#19728) --- .github/workflows/remove-labels-after-pr-closed.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/remove-labels-after-pr-closed.yml b/.github/workflows/remove-labels-after-pr-closed.yml index 17845f6fe..20a8d1630 100644 --- a/.github/workflows/remove-labels-after-pr-closed.yml +++ b/.github/workflows/remove-labels-after-pr-closed.yml @@ -9,6 +9,9 @@ on: jobs: cleanup: runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write steps: - name: Remove labels From b86326b4bf44ef6744f8015395dd1cfb85bd3ce9 Mon Sep 17 00:00:00 2001 From: Brad Decker Date: Fri, 23 Jun 2023 09:48:44 -0500 Subject: [PATCH 09/52] signature approved metrics e2e test (#19628) --- test/e2e/helpers.js | 14 + test/e2e/metrics/signature-approved.spec.js | 323 ++++++++++++++++++++ test/e2e/run-all.js | 1 + 3 files changed, 338 insertions(+) create mode 100644 test/e2e/metrics/signature-approved.spec.js diff --git a/test/e2e/helpers.js b/test/e2e/helpers.js index 040ed2166..42a8ba657 100644 --- a/test/e2e/helpers.js +++ b/test/e2e/helpers.js @@ -674,6 +674,19 @@ async function terminateServiceWorker(driver) { await driver.closeWindowHandle(serviceWorkerTab); } +/** + * This method assumes the extension is open, the dapp is open and waits for a + * third window handle to open (the notification window). Once it does it + * switches to the new window. + * + * @param {WebDriver} driver + */ +async function switchToNotificationWindow(driver) { + await driver.waitUntilXWindowHandles(3); + const windowHandles = await driver.getAllWindowHandles(); + await driver.switchToWindowWithTitle('MetaMask Notification', windowHandles); +} + module.exports = { DAPP_URL, DAPP_ONE_URL, @@ -720,4 +733,5 @@ module.exports = { switchToWindow, sleepSeconds, terminateServiceWorker, + switchToNotificationWindow, }; diff --git a/test/e2e/metrics/signature-approved.spec.js b/test/e2e/metrics/signature-approved.spec.js new file mode 100644 index 000000000..88a61131a --- /dev/null +++ b/test/e2e/metrics/signature-approved.spec.js @@ -0,0 +1,323 @@ +const { strict: assert } = require('assert'); +const { + defaultGanacheOptions, + switchToNotificationWindow, + withFixtures, + regularDelayMs, + openDapp, + unlockWallet, +} = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); + +/** + * mocks the segment api multiple times for specific payloads that we expect to + * see when these tests are run. In this case we are looking for + * 'Signature Requested' and 'Signature Received'. Do not use the constants + * from the metrics constants files, because if these change we want a strong + * indicator to our data team that the shape of data will change. + * + * @param {import('mockttp').Mockttp} mockServer + * @returns {Promise[]} + */ +async function mockSegment(mockServer) { + return [ + await mockServer + .forPost('https://api.segment.io/v1/batch') + .withJsonBodyIncluding({ + batch: [{ type: 'track', event: 'Signature Requested' }], + }) + .thenCallback(() => { + return { + statusCode: 200, + }; + }), + await mockServer + .forPost('https://api.segment.io/v1/batch') + .withJsonBodyIncluding({ + batch: [{ type: 'track', event: 'Signature Approved' }], + }) + .thenCallback(() => { + return { + statusCode: 200, + }; + }), + ]; +} + +/** + * Some signing methods have extra security that requires the user to click a + * button to validate that they have verified the details. This method handles + * performing the necessary steps to click that button. + * + * @param {WebDriver} driver + */ +async function validateContractDetails(driver) { + const verifyContractDetailsButton = await driver.findElement( + '.signature-request-content__verify-contract-details', + ); + + verifyContractDetailsButton.click(); + await driver.clickElement({ text: 'Got it', tag: 'button' }); + + // Approve signing typed data + await driver.clickElement('[data-testid="signature-request-scroll-button"]'); + await driver.delay(regularDelayMs); +} + +/** + * This method handles clicking the sign button on signature confrimation + * screen. + * + * @param {WebDriver} driver + */ +async function clickSignOnSignatureConfirmation(driver) { + await driver.clickElement({ text: 'Sign', tag: 'button' }); + await driver.waitUntilXWindowHandles(2); + await driver.getAllWindowHandles(); +} + +/** + * This method handles getting the mocked requests to the segment server + * + * @param {WebDriver} driver + * @param {import('mockttp').Mockttp} mockedEndpoints + * @returns {import('mockttp/dist/pluggable-admin').MockttpClientResponse[]} + */ +async function getEventPayloads(driver, mockedEndpoints) { + await driver.wait(async () => { + let isPending = true; + for (const mockedEndpoint of mockedEndpoints) { + isPending = await mockedEndpoint.isPending(); + } + return isPending === false; + }, 10000); + const mockedRequests = []; + for (const mockedEndpoint of mockedEndpoints) { + mockedRequests.push(...(await mockedEndpoint.getSeenRequests())); + } + return mockedRequests.map((req) => req.body.json.batch).flat(); +} + +describe('Signature Approved Event', function () { + it('Successfully tracked for signTypedData_v4', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withMetaMetricsController({ + metaMetricsId: 'fake-metrics-id', + participateInMetaMetrics: true, + }) + .build(), + defaultGanacheOptions, + title: this.test.title, + testSpecificMock: mockSegment, + }, + async ({ driver, mockedEndpoint: mockedEndpoints }) => { + await driver.navigate(); + await unlockWallet(driver); + await openDapp(driver); + + // creates a sign typed data signature request + await driver.clickElement('#signTypedDataV4'); + await switchToNotificationWindow(driver); + await validateContractDetails(driver); + await clickSignOnSignatureConfirmation(driver); + const events = await getEventPayloads(driver, mockedEndpoints); + assert.deepStrictEqual(events[0].properties, { + signature_type: 'eth_signTypedData_v4', + category: 'inpage_provider', + locale: 'en', + chain_id: '0x539', + environment_type: 'background', + }); + assert.deepStrictEqual(events[1].properties, { + signature_type: 'eth_signTypedData_v4', + category: 'inpage_provider', + locale: 'en', + chain_id: '0x539', + environment_type: 'background', + }); + }, + ); + }); + it('Successfully tracked for signTypedData_v3', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withMetaMetricsController({ + metaMetricsId: 'fake-metrics-id', + participateInMetaMetrics: true, + }) + .build(), + defaultGanacheOptions, + title: this.test.title, + testSpecificMock: mockSegment, + }, + async ({ driver, mockedEndpoint: mockedEndpoints }) => { + await driver.navigate(); + await unlockWallet(driver); + await openDapp(driver); + + // creates a sign typed data signature request + await driver.clickElement('#signTypedDataV3'); + await switchToNotificationWindow(driver); + await validateContractDetails(driver); + await clickSignOnSignatureConfirmation(driver); + const events = await getEventPayloads(driver, mockedEndpoints); + assert.deepStrictEqual(events[0].properties, { + signature_type: 'eth_signTypedData_v3', + category: 'inpage_provider', + locale: 'en', + chain_id: '0x539', + environment_type: 'background', + }); + assert.deepStrictEqual(events[1].properties, { + signature_type: 'eth_signTypedData_v3', + category: 'inpage_provider', + locale: 'en', + chain_id: '0x539', + environment_type: 'background', + }); + }, + ); + }); + it('Successfully tracked for signTypedData', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withMetaMetricsController({ + metaMetricsId: 'fake-metrics-id', + participateInMetaMetrics: true, + }) + .build(), + defaultGanacheOptions, + title: this.test.title, + testSpecificMock: mockSegment, + }, + async ({ driver, mockedEndpoint: mockedEndpoints }) => { + await driver.navigate(); + await unlockWallet(driver); + await openDapp(driver); + + // creates a sign typed data signature request + await driver.clickElement('#signTypedData'); + await switchToNotificationWindow(driver); + await clickSignOnSignatureConfirmation(driver); + const events = await getEventPayloads(driver, mockedEndpoints); + assert.deepStrictEqual(events[0].properties, { + signature_type: 'eth_signTypedData', + category: 'inpage_provider', + locale: 'en', + chain_id: '0x539', + environment_type: 'background', + }); + assert.deepStrictEqual(events[1].properties, { + signature_type: 'eth_signTypedData', + category: 'inpage_provider', + locale: 'en', + chain_id: '0x539', + environment_type: 'background', + }); + }, + ); + }); + it('Successfully tracked for personalSign', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withMetaMetricsController({ + metaMetricsId: 'fake-metrics-id', + participateInMetaMetrics: true, + }) + .build(), + defaultGanacheOptions, + title: this.test.title, + testSpecificMock: mockSegment, + }, + async ({ driver, mockedEndpoint: mockedEndpoints }) => { + await driver.navigate(); + await unlockWallet(driver); + await openDapp(driver); + + // creates a sign typed data signature request + await driver.clickElement('#personalSign'); + await switchToNotificationWindow(driver); + await clickSignOnSignatureConfirmation(driver); + const events = await getEventPayloads(driver, mockedEndpoints); + assert.deepStrictEqual(events[0].properties, { + signature_type: 'personal_sign', + category: 'inpage_provider', + locale: 'en', + chain_id: '0x539', + environment_type: 'background', + }); + assert.deepStrictEqual(events[1].properties, { + signature_type: 'personal_sign', + category: 'inpage_provider', + locale: 'en', + chain_id: '0x539', + environment_type: 'background', + }); + }, + ); + }); + it('Successfully tracked for eth_sign', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withPreferencesController({ + disabledRpcMethodPreferences: { + eth_sign: true, + }, + }) + .withMetaMetricsController({ + metaMetricsId: 'fake-metrics-id', + participateInMetaMetrics: true, + }) + .build(), + defaultGanacheOptions, + title: this.test.title, + testSpecificMock: mockSegment, + }, + async ({ driver, mockedEndpoint: mockedEndpoints }) => { + await driver.navigate(); + await unlockWallet(driver); + await openDapp(driver); + + // creates a sign typed data signature request + await driver.clickElement('#ethSign'); + await switchToNotificationWindow(driver); + await driver.delay(regularDelayMs); + await driver.clickElement('[data-testid="page-container-footer-next"]'); + await driver.clickElement( + '.signature-request-warning__footer__sign-button', + ); + const events = await getEventPayloads(driver, mockedEndpoints); + assert.deepStrictEqual(events[0].properties, { + signature_type: 'eth_sign', + category: 'inpage_provider', + locale: 'en', + chain_id: '0x539', + environment_type: 'background', + }); + assert.deepStrictEqual(events[1].properties, { + signature_type: 'eth_sign', + category: 'inpage_provider', + locale: 'en', + chain_id: '0x539', + environment_type: 'background', + }); + }, + ); + }); +}); diff --git a/test/e2e/run-all.js b/test/e2e/run-all.js index af5849b37..d045233e5 100644 --- a/test/e2e/run-all.js +++ b/test/e2e/run-all.js @@ -72,6 +72,7 @@ async function main() { ...(await getTestPathsForTestDir(testDir)), ...(await getTestPathsForTestDir(path.join(__dirname, 'swaps'))), ...(await getTestPathsForTestDir(path.join(__dirname, 'nft'))), + ...(await getTestPathsForTestDir(path.join(__dirname, 'metrics'))), path.join(__dirname, 'metamask-ui.spec.js'), ]; From 365c1e32d262e45138b06f149dec81607359376b Mon Sep 17 00:00:00 2001 From: weizman Date: Fri, 23 Jun 2023 18:25:24 +0300 Subject: [PATCH 10/52] Integrate Snow with LavaMoat scuttling protection (#17969) --- app/scripts/use-snow.js | 19 +++- development/build/index.js | 7 +- lavamoat/build-system/policy.json | 100 ++++++++------------- package.json | 6 +- yarn.lock | 141 ++++++++++++++---------------- 5 files changed, 126 insertions(+), 147 deletions(-) diff --git a/app/scripts/use-snow.js b/app/scripts/use-snow.js index 11b01d78d..868db4e36 100644 --- a/app/scripts/use-snow.js +++ b/app/scripts/use-snow.js @@ -1,8 +1,21 @@ +/* +NOTICE: +This Snow + LavaMoat scuttling integration is currently being used +with an experimental API (https://github.com/LavaMoat/LavaMoat/pull/462). +Changing this code must be done cautiously to avoid breaking the app! +*/ + // eslint-disable-next-line import/unambiguous (function () { const log = console.log.bind(console); - const msg = 'SNOW INTERCEPTED NEW WINDOW CREATION IN METAMASK APP: '; - window.top.SNOW((win) => { - log(msg, win, win?.frameElement); + const msg = + 'Snow detected a new realm creation attempt in MetaMask. Performing scuttling on new realm.'; + Object.defineProperty(window.top, 'SCUTTLER', { + value: (realm, scuttle) => { + window.top.SNOW((win) => { + log(msg, win); + scuttle(win); + }, realm); + }, }); })(); diff --git a/development/build/index.js b/development/build/index.js index 33051f5a3..84ee91040 100755 --- a/development/build/index.js +++ b/development/build/index.js @@ -147,8 +147,11 @@ async function defineAndRunBuildTasks() { // build lavamoat runtime file await lavapack.buildRuntime({ - scuttleGlobalThis: applyLavaMoat && shouldScuttle, - scuttleGlobalThisExceptions, + scuttleGlobalThis: { + enabled: applyLavaMoat && shouldScuttle, + scuttlerName: 'SCUTTLER', + exceptions: scuttleGlobalThisExceptions, + }, }); } diff --git a/lavamoat/build-system/policy.json b/lavamoat/build-system/policy.json index 9ee988092..98fd8942c 100644 --- a/lavamoat/build-system/policy.json +++ b/lavamoat/build-system/policy.json @@ -168,9 +168,13 @@ }, "@babel/eslint-parser": { "builtin": { - "path": true + "module": true, + "path": true, + "worker_threads": true }, "globals": { + "__dirname": true, + "process.cwd": true, "process.versions": true }, "packages": { @@ -1045,17 +1049,18 @@ "globals": { "__dirname": true, "__filename.slice": true, + "console.warn": true, "process.cwd": true, "setTimeout": true }, "packages": { "@lavamoat/lavapack>combine-source-map": true, - "@lavamoat/lavapack>lavamoat-core": true, + "@lavamoat/lavapack>convert-source-map": true, "@lavamoat/lavapack>readable-stream": true, "@lavamoat/lavapack>umd": true, "browserify>JSONStream": true, "lavamoat>json-stable-stringify": true, - "nyc>convert-source-map": true, + "lavamoat>lavamoat-core": true, "through2": true } }, @@ -1082,26 +1087,12 @@ "@lavamoat/lavapack>combine-source-map>inline-source-map>source-map": true } }, - "@lavamoat/lavapack>lavamoat-core": { - "builtin": { - "events": true, - "fs.existsSync": true, - "fs.readFileSync": true, - "fs.writeFileSync": true, - "path.extname": true, - "path.join": true - }, + "@lavamoat/lavapack>convert-source-map": { "globals": { - "__dirname": true, - "console.error": true, - "console.warn": true, - "define": true - }, - "packages": { - "lavamoat>json-stable-stringify": true, - "lavamoat>lavamoat-core>merge-deep": true, - "lavamoat>lavamoat-tofu": true, - "nyc>process-on-spawn>fromentries": true + "Buffer": true, + "atob": true, + "btoa": true, + "value": true } }, "@lavamoat/lavapack>readable-stream": { @@ -2858,12 +2849,12 @@ "eslint-plugin-react>estraverse": true, "eslint-plugin-react>jsx-ast-utils": true, "eslint-plugin-react>object.entries": true, + "eslint-plugin-react>object.fromentries": true, "eslint-plugin-react>object.hasown": true, "eslint-plugin-react>object.values": true, "eslint-plugin-react>resolve": true, "eslint-plugin-react>semver": true, "eslint>minimatch": true, - "lavamoat>object.fromentries": true, "prop-types": true, "string.prototype.matchall": true } @@ -2923,6 +2914,13 @@ "string.prototype.matchall>es-abstract": true } }, + "eslint-plugin-react>object.fromentries": { + "packages": { + "globalthis>define-properties": true, + "string.prototype.matchall>call-bind": true, + "string.prototype.matchall>es-abstract": true + } + }, "eslint-plugin-react>object.hasown": { "packages": { "string.prototype.matchall>es-abstract": true @@ -2984,6 +2982,9 @@ "util": true }, "globals": { + "__filename": true, + "process.cwd": true, + "process.emitWarning": true, "process.platform": true }, "packages": { @@ -6141,8 +6142,8 @@ "setTimeout": true }, "packages": { + "@lavamoat/lavapack": true, "duplexify": true, - "lavamoat-browserify>@lavamoat/lavapack": true, "lavamoat-browserify>browser-resolve": true, "lavamoat-browserify>concat-stream": true, "lavamoat-browserify>readable-stream": true, @@ -6152,37 +6153,6 @@ "lavamoat>lavamoat-core": true } }, - "lavamoat-browserify>@lavamoat/lavapack": { - "builtin": { - "assert": true, - "buffer.Buffer.from": true, - "fs.promises.readFile": true, - "fs.promises.writeFile": true, - "fs.readFileSync": true, - "path.join": true, - "path.relative": true - }, - "globals": { - "__dirname": true, - "process.cwd": true, - "setTimeout": true - }, - "packages": { - "@lavamoat/lavapack>combine-source-map": true, - "@lavamoat/lavapack>umd": true, - "browserify>JSONStream": true, - "lavamoat-browserify>@lavamoat/lavapack>through2": true, - "lavamoat-browserify>readable-stream": true, - "lavamoat>json-stable-stringify": true, - "lavamoat>lavamoat-core": true, - "nyc>convert-source-map": true - } - }, - "lavamoat-browserify>@lavamoat/lavapack>through2": { - "packages": { - "lavamoat-browserify>readable-stream": true - } - }, "lavamoat-browserify>browser-resolve": { "builtin": { "fs.readFile": true, @@ -6319,8 +6289,7 @@ "packages": { "lavamoat>json-stable-stringify": true, "lavamoat>lavamoat-core>merge-deep": true, - "lavamoat>lavamoat-tofu": true, - "nyc>process-on-spawn>fromentries": true + "lavamoat>lavamoat-tofu": true } }, "lavamoat>lavamoat-core>merge-deep": { @@ -6396,13 +6365,6 @@ "depcheck>@babel/traverse": true } }, - "lavamoat>object.fromentries": { - "packages": { - "globalthis>define-properties": true, - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>es-abstract": true - } - }, "lodash": { "globals": { "define": true @@ -8623,6 +8585,12 @@ "jsdom>request>is-typedarray": true } }, + "superstruct": { + "globals": { + "console.warn": true, + "define": true + } + }, "terser": { "globals": { "Buffer": true, @@ -8981,6 +8949,7 @@ }, "globals": { "Error": true, + "__dirname": true, "console": true, "process": true }, @@ -8995,6 +8964,9 @@ } }, "yargs>cliui": { + "globals": { + "process": true + }, "packages": { "eslint>strip-ansi": true, "yargs>cliui>wrap-ansi": true, diff --git a/package.json b/package.json index 021cad8ac..eb17e8b69 100644 --- a/package.json +++ b/package.json @@ -371,7 +371,7 @@ "@babel/register": "^7.5.5", "@ethersproject/bignumber": "^5.7.0", "@lavamoat/allow-scripts": "^2.0.3", - "@lavamoat/lavapack": "^5.0.0", + "@lavamoat/lavapack": "^5.2.0", "@metamask/auto-changelog": "^2.1.0", "@metamask/eslint-config": "^9.0.0", "@metamask/eslint-config-jest": "^9.0.0", @@ -494,8 +494,8 @@ "jsdom": "^11.2.0", "junit-report-merger": "^4.0.0", "koa": "^2.7.0", - "lavamoat": "^6.3.0", - "lavamoat-browserify": "^15.5.0", + "lavamoat": "^7.1.0", + "lavamoat-browserify": "^15.7.0", "lavamoat-viz": "^6.0.9", "lockfile-lint": "^4.9.6", "loose-envify": "^1.4.0", diff --git a/yarn.lock b/yarn.lock index 927c8c3d1..10aeefc01 100644 --- a/yarn.lock +++ b/yarn.lock @@ -80,7 +80,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.18.6, @babel/code-frame@npm:^7.21.4": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.18.6, @babel/code-frame@npm:^7.21.4": version: 7.21.4 resolution: "@babel/code-frame@npm:7.21.4" dependencies: @@ -445,7 +445,7 @@ __metadata: languageName: node linkType: hard -"@babel/highlight@npm:^7.10.4, @babel/highlight@npm:^7.18.6": +"@babel/highlight@npm:^7.18.6": version: 7.18.6 resolution: "@babel/highlight@npm:7.18.6" dependencies: @@ -3532,35 +3532,19 @@ __metadata: languageName: node linkType: hard -"@lavamoat/lavapack@npm:^3.3.0": - version: 3.3.0 - resolution: "@lavamoat/lavapack@npm:3.3.0" +"@lavamoat/lavapack@npm:^5.2.0": + version: 5.2.0 + resolution: "@lavamoat/lavapack@npm:5.2.0" dependencies: JSONStream: ^1.3.5 combine-source-map: ^0.8.0 - convert-source-map: ^1.7.0 - json-stable-stringify: ^1.0.1 - lavamoat-core: ^12.4.0 + convert-source-map: ^2.0.0 + json-stable-stringify: ^1.0.2 + lavamoat-core: ^14.2.0 readable-stream: ^3.6.0 through2: ^4.0.2 umd: ^3.0.3 - checksum: 77f6588d38d53f0feba1856de409829969dc3592b9b4d1e722fd395a1eabae6a8983648e2929ef9243fd6ead6919683cb87e65433325601bafabcf8b46dc83be - languageName: node - linkType: hard - -"@lavamoat/lavapack@npm:^5.0.0": - version: 5.0.0 - resolution: "@lavamoat/lavapack@npm:5.0.0" - dependencies: - JSONStream: ^1.3.5 - combine-source-map: ^0.8.0 - convert-source-map: ^1.7.0 - json-stable-stringify: ^1.0.1 - lavamoat-core: ^14.0.0 - readable-stream: ^3.6.0 - through2: ^4.0.2 - umd: ^3.0.3 - checksum: 93b60ced99a23a87f83bf354f6996029757ea76d6b92e8b4b874ef50224515feda47dadd62cdda88c53e703111ddf36a8ef8f19c682e85ad4218f709a4081dbd + checksum: c98bcc310de38b4ad2ce2aeafb69ba293a1083f6683a9f120aef2e187501620f5241361da2966fa07bcb57d004037b0ccf556325364f44c1c021c949fb87e45d languageName: node linkType: hard @@ -12858,6 +12842,13 @@ __metadata: languageName: node linkType: hard +"convert-source-map@npm:^1.9.0": + version: 1.9.0 + resolution: "convert-source-map@npm:1.9.0" + checksum: dc55a1f28ddd0e9485ef13565f8f756b342f9a46c4ae18b843fe3c30c675d058d6a4823eff86d472f187b176f0adf51ea7b69ea38be34be4a63cbbf91b0593c8 + languageName: node + linkType: hard + "convert-source-map@npm:^2.0.0": version: 2.0.0 resolution: "convert-source-map@npm:2.0.0" @@ -22988,24 +22979,23 @@ __metadata: languageName: node linkType: hard -"lavamoat-browserify@npm:^15.5.0": - version: 15.5.0 - resolution: "lavamoat-browserify@npm:15.5.0" +"lavamoat-browserify@npm:^15.7.0": + version: 15.7.0 + resolution: "lavamoat-browserify@npm:15.7.0" dependencies: - "@babel/code-frame": ^7.16.7 "@lavamoat/aa": ^3.1.0 - "@lavamoat/lavapack": ^3.3.0 + "@lavamoat/lavapack": ^5.2.0 browser-resolve: ^2.0.0 concat-stream: ^2.0.0 - convert-source-map: ^1.8.0 + convert-source-map: ^1.9.0 duplexify: ^4.1.1 json-stable-stringify: ^1.0.1 - lavamoat-core: ^12.4.0 + lavamoat-core: ^14.2.0 pify: ^4.0.1 readable-stream: ^3.6.0 - source-map: ^0.7.3 + source-map: ^0.7.4 through2: ^3.0.0 - checksum: b9d4ccbe6dd09aa63145f89f99f0b3ac269930a5e419cc836659f8c6a7e26b78d2dd3722e44055e6436d2334b044c348895f512d134ee8b5dc4ee87adc890b6f + checksum: 7832820c688439c699d4b99ef6860ff4cab67003e20fad4194e847873bfe3f2d3a4caea3229e61bd0e9e35ca384e2aa5f39ce1370a43b1bdd9c9bca8c226d080 languageName: node linkType: hard @@ -23022,27 +23012,14 @@ __metadata: languageName: node linkType: hard -"lavamoat-core@npm:^12.3.0, lavamoat-core@npm:^12.4.0": - version: 12.4.0 - resolution: "lavamoat-core@npm:12.4.0" +"lavamoat-core@npm:^14.2.0": + version: 14.2.0 + resolution: "lavamoat-core@npm:14.2.0" dependencies: - fromentries: ^1.2.0 - json-stable-stringify: ^1.0.1 + json-stable-stringify: ^1.0.2 lavamoat-tofu: ^6.0.2 - merge-deep: ^3.0.2 - checksum: 432a8968035370feb51e50f35306e7f85015e3b56440dbd41b6d3eec7f4bc82c3d1f16c6a627549df2665499c49bcb6e55fa697bccc6839bac1de12804019c1d - languageName: node - linkType: hard - -"lavamoat-core@npm:^14.0.0": - version: 14.0.0 - resolution: "lavamoat-core@npm:14.0.0" - dependencies: - fromentries: ^1.2.0 - json-stable-stringify: ^1.0.1 - lavamoat-tofu: ^6.0.2 - merge-deep: ^3.0.2 - checksum: 16c2402aceba339ab25b830d476e95078edc1c978ef2623497ecb07f6b5eb8241541f67755a06cf3562680c1834b69d7e86ca421848b670378ad4fb0d62923ad + merge-deep: ^3.0.3 + checksum: 2f254c85a466561393a9ad0b8bcd8ff93b7b195d2f820f89be452348559f3fa689260887dcf4af3d605bc7ddb8fef2637ca7d5bfe1b7f565050aca172b9733d6 languageName: node linkType: hard @@ -23072,26 +23049,25 @@ __metadata: languageName: node linkType: hard -"lavamoat@npm:^6.3.0": - version: 6.4.0 - resolution: "lavamoat@npm:6.4.0" +"lavamoat@npm:^7.1.0": + version: 7.1.0 + resolution: "lavamoat@npm:7.1.0" dependencies: - "@babel/code-frame": ^7.10.4 - "@babel/highlight": ^7.10.4 + "@babel/code-frame": ^7.21.4 + "@babel/highlight": ^7.18.6 "@lavamoat/aa": ^3.1.0 bindings: ^1.5.0 htmlescape: ^1.1.1 - json-stable-stringify: ^1.0.1 - lavamoat-core: ^12.3.0 + json-stable-stringify: ^1.0.2 + lavamoat-core: ^14.2.0 lavamoat-tofu: ^6.0.2 - node-gyp-build: ^4.2.3 - object.fromentries: ^2.0.2 - resolve: ^1.17.0 - yargs: ^16.0.0 + node-gyp-build: ^4.6.0 + resolve: ^1.22.3 + yargs: ^17.7.2 bin: lavamoat: src/cli.js lavamoat-run-command: src/run-command.js - checksum: 5a058b0b62fa4d6baa477775dc03433c0064e7ab0f14f4a540aa033154c3484cd9b59ec66e2968e387087c24531b09cbd6a70a3a11f4b52e3b4519cd3672c54c + checksum: 57414b6d434eaf07ad2875ebb5a79453da7d9c377ed19e604a73f66772bf61a40abfb747bc7e0bc5a4808b0debf3a228dc9069eb87dc772b4d615b11d4e91d34 languageName: node linkType: hard @@ -24309,7 +24285,7 @@ __metadata: languageName: node linkType: hard -"merge-deep@npm:^3.0.2": +"merge-deep@npm:^3.0.2, merge-deep@npm:^3.0.3": version: 3.0.3 resolution: "merge-deep@npm:3.0.3" dependencies: @@ -24411,7 +24387,7 @@ __metadata: "@keystonehq/bc-ur-registry-eth": ^0.19.1 "@keystonehq/metamask-airgapped-keyring": ^0.13.1 "@lavamoat/allow-scripts": ^2.0.3 - "@lavamoat/lavapack": ^5.0.0 + "@lavamoat/lavapack": ^5.2.0 "@lavamoat/snow": ^1.5.0 "@material-ui/core": ^4.11.0 "@metamask-institutional/custody-controller": 0.2.6 @@ -24638,8 +24614,8 @@ __metadata: junit-report-merger: ^4.0.0 koa: ^2.7.0 labeled-stream-splicer: ^2.0.2 - lavamoat: ^6.3.0 - lavamoat-browserify: ^15.5.0 + lavamoat: ^7.1.0 + lavamoat-browserify: ^15.7.0 lavamoat-viz: ^6.0.9 localforage: ^1.9.0 lockfile-lint: ^4.9.6 @@ -26111,14 +26087,14 @@ __metadata: languageName: node linkType: hard -"node-gyp-build@npm:^4.2.0, node-gyp-build@npm:^4.2.2, node-gyp-build@npm:^4.2.3, node-gyp-build@npm:^4.3.0": - version: 4.5.0 - resolution: "node-gyp-build@npm:4.5.0" +"node-gyp-build@npm:^4.2.0, node-gyp-build@npm:^4.2.2, node-gyp-build@npm:^4.3.0, node-gyp-build@npm:^4.6.0": + version: 4.6.0 + resolution: "node-gyp-build@npm:4.6.0" bin: node-gyp-build: bin.js node-gyp-build-optional: optional.js node-gyp-build-test: build-test.js - checksum: d888bae0fb88335f69af1b57a2294a931c5042f36e413d8d364c992c9ebfa0b96ffe773179a5a2c8f04b73856e8634e09cce108dbb9804396d3cc8c5455ff2db + checksum: 25d78c5ef1f8c24291f4a370c47ba52fcea14f39272041a90a7894cd50d766f7c8cb8fb06c0f42bf6f69b204b49d9be3c8fc344aac09714d5bdb95965499eb15 languageName: node linkType: hard @@ -26631,7 +26607,7 @@ __metadata: languageName: node linkType: hard -"object.fromentries@npm:^2.0.2, object.fromentries@npm:^2.0.5": +"object.fromentries@npm:^2.0.5": version: 2.0.6 resolution: "object.fromentries@npm:2.0.6" dependencies: @@ -35874,7 +35850,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:17.7.1, yargs@npm:^17.0.1, yargs@npm:^17.3.1": +"yargs@npm:17.7.1": version: 17.7.1 resolution: "yargs@npm:17.7.1" dependencies: @@ -35908,6 +35884,21 @@ __metadata: languageName: node linkType: hard +"yargs@npm:^17.0.1, yargs@npm:^17.3.1, yargs@npm:^17.7.2": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: ^8.0.1 + escalade: ^3.1.1 + get-caller-file: ^2.0.5 + require-directory: ^2.1.1 + string-width: ^4.2.3 + y18n: ^5.0.5 + yargs-parser: ^21.1.1 + checksum: 73b572e863aa4a8cbef323dd911d79d193b772defd5a51aab0aca2d446655216f5002c42c5306033968193bdbf892a7a4c110b0d77954a7fdf563e653967b56a + languageName: node + linkType: hard + "yargs@npm:^4.7.1": version: 4.8.1 resolution: "yargs@npm:4.8.1" From 34375a57e558853aab95fe35d5f278aa52b66636 Mon Sep 17 00:00:00 2001 From: Ariella Vu <20778143+digiwand@users.noreply.github.com> Date: Fri, 23 Jun 2023 20:08:22 +0200 Subject: [PATCH 11/52] Security Provider cleanup (#19694) * security-prov: isFlaggedSecurityProviderResponse * security-prov: create shared/modules/util * security prov: rn isFlagged -> isSuspcious - util fn returns true if response is not verified and flagged * security prov: add util test and support undefined param * security prov: reorg util fn - no logic changes --- shared/constants/security-provider.ts | 13 ++++++++ .../modules/security-provider.utils.test.ts | 30 +++++++++++++++++++ shared/modules/security-provider.utils.ts | 19 ++++++++++++ ...onfirm-page-container-content.component.js | 11 +++---- ...m-page-container-content.component.test.js | 4 +-- ...urity-provider-banner-message.constants.js | 5 ---- .../security-provider-banner-message.js | 6 ++-- .../security-provider-banner-message.test.js | 14 ++++----- .../signature-request-original.component.js | 10 ++----- .../signature-request-original.test.js | 4 +-- .../signature-request-siwe.js | 11 +++---- .../signature-request.component.js | 10 ++----- .../signature-request.component.test.js | 8 ++--- .../confirm-approve-content.component.js | 11 +++---- ui/pages/token-allowance/token-allowance.js | 10 ++----- 15 files changed, 100 insertions(+), 66 deletions(-) create mode 100644 shared/constants/security-provider.ts create mode 100644 shared/modules/security-provider.utils.test.ts create mode 100644 shared/modules/security-provider.utils.ts delete mode 100644 ui/components/app/security-provider-banner-message/security-provider-banner-message.constants.js diff --git a/shared/constants/security-provider.ts b/shared/constants/security-provider.ts new file mode 100644 index 000000000..1862e8181 --- /dev/null +++ b/shared/constants/security-provider.ts @@ -0,0 +1,13 @@ +/** + * @typedef {object} SecurityProviderMessageSeverity + * @property {0} NOT_MALICIOUS - Indicates message is not malicious + * @property {1} MALICIOUS - Indicates message is malicious + * @property {2} NOT_SAFE - Indicates message is not safe + */ + +/** @type {SecurityProviderMessageSeverity} */ +export const SECURITY_PROVIDER_MESSAGE_SEVERITY = { + NOT_MALICIOUS: 0, + MALICIOUS: 1, + NOT_SAFE: 2, +}; diff --git a/shared/modules/security-provider.utils.test.ts b/shared/modules/security-provider.utils.test.ts new file mode 100644 index 000000000..c32ea7d38 --- /dev/null +++ b/shared/modules/security-provider.utils.test.ts @@ -0,0 +1,30 @@ +import { SECURITY_PROVIDER_MESSAGE_SEVERITY } from '../constants/security-provider'; +import { isSuspiciousResponse } from './security-provider.utils'; + +describe('security-provider util', () => { + describe('isSuspiciousResponse', () => { + it('should return false if the response does not exist', () => { + const result = isSuspiciousResponse(undefined); + expect(result).toBeFalsy(); + }); + + it('should return false when flagAsDangerous exists and is not malicious', () => { + const result = isSuspiciousResponse({ + flagAsDangerous: SECURITY_PROVIDER_MESSAGE_SEVERITY.NOT_MALICIOUS, + }); + expect(result).toBeFalsy(); + }); + + it('should return true when flagAsDangerous exists and is malicious or not safe', () => { + const result = isSuspiciousResponse({ + flagAsDangerous: SECURITY_PROVIDER_MESSAGE_SEVERITY.NOT_SAFE, + }); + expect(result).toBeTruthy(); + }); + + it('should return true if the response exists but is empty', () => { + const result = isSuspiciousResponse({}); + expect(result).toBeTruthy(); + }); + }); +}); diff --git a/shared/modules/security-provider.utils.ts b/shared/modules/security-provider.utils.ts new file mode 100644 index 000000000..3c341b4aa --- /dev/null +++ b/shared/modules/security-provider.utils.ts @@ -0,0 +1,19 @@ +import { Json } from '@metamask/utils'; +import { SECURITY_PROVIDER_MESSAGE_SEVERITY } from '../constants/security-provider'; + +export function isSuspiciousResponse( + securityProviderResponse: Record | undefined, +): boolean { + if (!securityProviderResponse) { + return false; + } + + const isFlagged = + securityProviderResponse.flagAsDangerous !== undefined && + securityProviderResponse.flagAsDangerous !== + SECURITY_PROVIDER_MESSAGE_SEVERITY.NOT_MALICIOUS; + + const isNotVerified = Object.keys(securityProviderResponse).length === 0; + + return isFlagged || isNotVerified; +} diff --git a/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js index fd0651e13..713cd9293 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js +++ b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js @@ -10,8 +10,9 @@ import { INSUFFICIENT_FUNDS_ERROR_KEY } from '../../../../helpers/constants/erro import Typography from '../../../ui/typography'; import { TypographyVariant } from '../../../../helpers/constants/design-system'; +import { isSuspiciousResponse } from '../../../../../shared/modules/security-provider.utils'; import SecurityProviderBannerMessage from '../../security-provider-banner-message/security-provider-banner-message'; -import { SECURITY_PROVIDER_MESSAGE_SEVERITIES } from '../../security-provider-banner-message/security-provider-banner-message.constants'; + import { ConfirmPageContainerSummary, ConfirmPageContainerWarning } from '.'; export default class ConfirmPageContainerContent extends Component { @@ -214,15 +215,11 @@ export default class ConfirmPageContainerContent extends Component { {ethGasPriceWarning && ( )} - {(txData?.securityProviderResponse?.flagAsDangerous !== undefined && - txData?.securityProviderResponse?.flagAsDangerous !== - SECURITY_PROVIDER_MESSAGE_SEVERITIES.NOT_MALICIOUS) || - (txData?.securityProviderResponse && - Object.keys(txData.securityProviderResponse).length === 0) ? ( + {isSuspiciousResponse(txData?.securityProviderResponse) && ( - ) : null} + )} { @@ -155,7 +155,7 @@ describe('Confirm Page Container Content', () => { it('should not render SecurityProviderBannerMessage component when flagAsDangerous is not malicious', () => { props.txData.securityProviderResponse = { - flagAsDangerous: SECURITY_PROVIDER_MESSAGE_SEVERITIES.NOT_MALICIOUS, + flagAsDangerous: SECURITY_PROVIDER_MESSAGE_SEVERITY.NOT_MALICIOUS, }; const { queryByText } = renderWithProvider( diff --git a/ui/components/app/security-provider-banner-message/security-provider-banner-message.constants.js b/ui/components/app/security-provider-banner-message/security-provider-banner-message.constants.js deleted file mode 100644 index fc30d0b5c..000000000 --- a/ui/components/app/security-provider-banner-message/security-provider-banner-message.constants.js +++ /dev/null @@ -1,5 +0,0 @@ -export const SECURITY_PROVIDER_MESSAGE_SEVERITIES = { - NOT_MALICIOUS: 0, - MALICIOUS: 1, - NOT_SAFE: 2, -}; diff --git a/ui/components/app/security-provider-banner-message/security-provider-banner-message.js b/ui/components/app/security-provider-banner-message/security-provider-banner-message.js index 71c928edd..fdaba451f 100644 --- a/ui/components/app/security-provider-banner-message/security-provider-banner-message.js +++ b/ui/components/app/security-provider-banner-message/security-provider-banner-message.js @@ -6,9 +6,9 @@ import { Size, TextVariant, } from '../../../helpers/constants/design-system'; +import { SECURITY_PROVIDER_MESSAGE_SEVERITY } from '../../../../shared/constants/security-provider'; import { I18nContext } from '../../../../.storybook/i18n'; import { BannerAlert, ButtonLink, Text } from '../../component-library'; -import { SECURITY_PROVIDER_MESSAGE_SEVERITIES } from './security-provider-banner-message.constants'; export default function SecurityProviderBannerMessage({ securityProviderResponse, @@ -21,7 +21,7 @@ export default function SecurityProviderBannerMessage({ if ( securityProviderResponse.flagAsDangerous === - SECURITY_PROVIDER_MESSAGE_SEVERITIES.MALICIOUS + SECURITY_PROVIDER_MESSAGE_SEVERITY.MALICIOUS ) { messageTitle = securityProviderResponse.reason_header === '' @@ -34,7 +34,7 @@ export default function SecurityProviderBannerMessage({ severity = SEVERITIES.DANGER; } else if ( securityProviderResponse.flagAsDangerous === - SECURITY_PROVIDER_MESSAGE_SEVERITIES.NOT_SAFE + SECURITY_PROVIDER_MESSAGE_SEVERITY.NOT_SAFE ) { messageTitle = t('requestMayNotBeSafe'); messageText = t('requestMayNotBeSafeError'); diff --git a/ui/components/app/security-provider-banner-message/security-provider-banner-message.test.js b/ui/components/app/security-provider-banner-message/security-provider-banner-message.test.js index 4fd21f7e9..f131fad16 100644 --- a/ui/components/app/security-provider-banner-message/security-provider-banner-message.test.js +++ b/ui/components/app/security-provider-banner-message/security-provider-banner-message.test.js @@ -2,8 +2,8 @@ import { fireEvent } from '@testing-library/react'; import React from 'react'; import configureMockStore from 'redux-mock-store'; import { renderWithProvider } from '../../../../test/lib/render-helpers'; +import { SECURITY_PROVIDER_MESSAGE_SEVERITY } from '../../../../shared/constants/security-provider'; import SecurityProviderBannerMessage from './security-provider-banner-message'; -import { SECURITY_PROVIDER_MESSAGE_SEVERITIES } from './security-provider-banner-message.constants'; describe('Security Provider Banner Message', () => { const store = configureMockStore()({}); @@ -12,7 +12,7 @@ describe('Security Provider Banner Message', () => { it('should render SecurityProviderBannerMessage component properly when flagAsDangerous is malicious', () => { const securityProviderResponse = { - flagAsDangerous: SECURITY_PROVIDER_MESSAGE_SEVERITIES.MALICIOUS, + flagAsDangerous: SECURITY_PROVIDER_MESSAGE_SEVERITY.MALICIOUS, reason: 'Approval is to an unverified smart contract known for stealing NFTs in the past.', reason_header: 'This could be a scam', @@ -34,7 +34,7 @@ describe('Security Provider Banner Message', () => { it('should render SecurityProviderBannerMessage component properly when flagAsDangerous is not safe', () => { const securityProviderResponse = { - flagAsDangerous: SECURITY_PROVIDER_MESSAGE_SEVERITIES.NOT_SAFE, + flagAsDangerous: SECURITY_PROVIDER_MESSAGE_SEVERITY.NOT_SAFE, reason: 'Some reason...', reason_header: 'Some reason header...', }; @@ -99,7 +99,7 @@ describe('Security Provider Banner Message', () => { it('should navigate to the OpenSea web page when clicked on the OpenSea button', () => { const securityProviderResponse = { - flagAsDangerous: SECURITY_PROVIDER_MESSAGE_SEVERITIES.NOT_SAFE, + flagAsDangerous: SECURITY_PROVIDER_MESSAGE_SEVERITY.NOT_SAFE, reason: 'Some reason...', reason_header: 'Some reason header...', }; @@ -122,7 +122,7 @@ describe('Security Provider Banner Message', () => { it('should render SecurityProviderBannerMessage component properly, with predefined reason message, when a request is malicious and there is no reason given', () => { const securityProviderResponse = { - flagAsDangerous: SECURITY_PROVIDER_MESSAGE_SEVERITIES.MALICIOUS, + flagAsDangerous: SECURITY_PROVIDER_MESSAGE_SEVERITY.MALICIOUS, reason: '', reason_header: 'Some reason header...', }; @@ -145,7 +145,7 @@ describe('Security Provider Banner Message', () => { it('should render SecurityProviderBannerMessage component properly, with predefined reason_header message, when a request is malicious and there is no reason header given', () => { const securityProviderResponse = { - flagAsDangerous: SECURITY_PROVIDER_MESSAGE_SEVERITIES.MALICIOUS, + flagAsDangerous: SECURITY_PROVIDER_MESSAGE_SEVERITY.MALICIOUS, reason: 'Some reason...', reason_header: '', }; @@ -166,7 +166,7 @@ describe('Security Provider Banner Message', () => { it('should render SecurityProviderBannerMessage component properly, with predefined reason and reason_header messages, when a request is malicious and there are no reason and reason header given', () => { const securityProviderResponse = { - flagAsDangerous: SECURITY_PROVIDER_MESSAGE_SEVERITIES.MALICIOUS, + flagAsDangerous: SECURITY_PROVIDER_MESSAGE_SEVERITY.MALICIOUS, reason: '', reason_header: '', }; diff --git a/ui/components/app/signature-request-original/signature-request-original.component.js b/ui/components/app/signature-request-original/signature-request-original.component.js index 4b72ea529..b61bcf79e 100644 --- a/ui/components/app/signature-request-original/signature-request-original.component.js +++ b/ui/components/app/signature-request-original/signature-request-original.component.js @@ -13,6 +13,7 @@ import { ///: END:ONLY_INCLUDE_IN } from '../../../helpers/utils/util'; import { stripHexPrefix } from '../../../../shared/modules/hexstring-utils'; +import { isSuspiciousResponse } from '../../../../shared/modules/security-provider.utils'; import Button from '../../ui/button'; import SiteOrigin from '../../ui/site-origin'; import Typography from '../../ui/typography/typography'; @@ -32,7 +33,6 @@ import { } from '../../../helpers/constants/design-system'; import ConfirmPageContainerNavigation from '../confirm-page-container/confirm-page-container-navigation'; import SecurityProviderBannerMessage from '../security-provider-banner-message/security-provider-banner-message'; -import { SECURITY_PROVIDER_MESSAGE_SEVERITIES } from '../security-provider-banner-message/security-provider-banner-message.constants'; ///: BEGIN:ONLY_INCLUDE_IN(build-mmi) import { Icon, IconName, Text } from '../../component-library'; import Box from '../../ui/box/box'; @@ -133,15 +133,11 @@ export default class SignatureRequestOriginal extends Component { return (
- {(txData?.securityProviderResponse?.flagAsDangerous !== undefined && - txData?.securityProviderResponse?.flagAsDangerous !== - SECURITY_PROVIDER_MESSAGE_SEVERITIES.NOT_MALICIOUS) || - (txData?.securityProviderResponse && - Object.keys(txData.securityProviderResponse).length === 0) ? ( + {isSuspiciousResponse(txData?.securityProviderResponse) && ( - ) : null} + )} { ///: BEGIN:ONLY_INCLUDE_IN(build-mmi) diff --git a/ui/components/app/signature-request-original/signature-request-original.test.js b/ui/components/app/signature-request-original/signature-request-original.test.js index d9c136a86..030451514 100644 --- a/ui/components/app/signature-request-original/signature-request-original.test.js +++ b/ui/components/app/signature-request-original/signature-request-original.test.js @@ -3,10 +3,10 @@ import configureMockStore from 'redux-mock-store'; import { fireEvent, screen } from '@testing-library/react'; import { act } from 'react-dom/test-utils'; import { MESSAGE_TYPE } from '../../../../shared/constants/app'; +import { SECURITY_PROVIDER_MESSAGE_SEVERITY } from '../../../../shared/constants/security-provider'; import mockState from '../../../../test/data/mock-state.json'; import { renderWithProvider } from '../../../../test/lib/render-helpers'; import configureStore from '../../../store/store'; -import { SECURITY_PROVIDER_MESSAGE_SEVERITIES } from '../security-provider-banner-message/security-provider-banner-message.constants'; import { resolvePendingApproval, rejectPendingApproval, @@ -168,7 +168,7 @@ describe('SignatureRequestOriginal', () => { it('should not render SecurityProviderBannerMessage component when flagAsDangerous is not malicious', () => { props.txData.securityProviderResponse = { - flagAsDangerous: SECURITY_PROVIDER_MESSAGE_SEVERITIES.NOT_MALICIOUS, + flagAsDangerous: SECURITY_PROVIDER_MESSAGE_SEVERITY.NOT_MALICIOUS, }; render(); diff --git a/ui/components/app/signature-request-siwe/signature-request-siwe.js b/ui/components/app/signature-request-siwe/signature-request-siwe.js index 33529e300..ddd4319e5 100644 --- a/ui/components/app/signature-request-siwe/signature-request-siwe.js +++ b/ui/components/app/signature-request-siwe/signature-request-siwe.js @@ -19,6 +19,7 @@ import { unconfirmedMessagesHashSelector, } from '../../../selectors'; import { getAccountByAddress, valuesFor } from '../../../helpers/utils/util'; +import { isSuspiciousResponse } from '../../../../shared/modules/security-provider.utils'; import { formatMessageParams } from '../../../../shared/modules/siwe'; import { clearConfirmTransaction } from '../../../ducks/confirm-transaction/confirm-transaction.duck'; @@ -35,7 +36,6 @@ import { } from '../../../store/actions'; import SecurityProviderBannerMessage from '../security-provider-banner-message/security-provider-banner-message'; -import { SECURITY_PROVIDER_MESSAGE_SEVERITIES } from '../security-provider-banner-message/security-provider-banner-message.constants'; import ConfirmPageContainerNavigation from '../confirm-page-container/confirm-page-container-navigation'; import { getMostRecentOverviewPage } from '../../../ducks/history/history'; import LedgerInstructionField from '../ledger-instruction-field'; @@ -78,12 +78,9 @@ export default function SignatureRequestSIWE({ txData }) { const [hasAgreedToDomainWarning, setHasAgreedToDomainWarning] = useState(false); - const showSecurityProviderBanner = - (txData?.securityProviderResponse?.flagAsDangerous !== undefined && - txData?.securityProviderResponse?.flagAsDangerous !== - SECURITY_PROVIDER_MESSAGE_SEVERITIES.NOT_MALICIOUS) || - (txData?.securityProviderResponse && - Object.keys(txData.securityProviderResponse).length === 0); + const showSecurityProviderBanner = isSuspiciousResponse( + txData?.securityProviderResponse, + ); const onSign = useCallback(async () => { try { diff --git a/ui/components/app/signature-request/signature-request.component.js b/ui/components/app/signature-request/signature-request.component.js index d03cf9fa8..8b6f1eaff 100644 --- a/ui/components/app/signature-request/signature-request.component.js +++ b/ui/components/app/signature-request/signature-request.component.js @@ -31,10 +31,10 @@ import { } from '../../../helpers/constants/design-system'; import NetworkAccountBalanceHeader from '../network-account-balance-header'; import { Numeric } from '../../../../shared/modules/Numeric'; +import { isSuspiciousResponse } from '../../../../shared/modules/security-provider.utils'; import { EtherDenomination } from '../../../../shared/constants/common'; import ConfirmPageContainerNavigation from '../confirm-page-container/confirm-page-container-navigation'; import SecurityProviderBannerMessage from '../security-provider-banner-message/security-provider-banner-message'; -import { SECURITY_PROVIDER_MESSAGE_SEVERITIES } from '../security-provider-banner-message/security-provider-banner-message.constants'; import { formatCurrency } from '../../../helpers/utils/confirm-tx.util'; import { getValueFromWeiHex } from '../../../../shared/modules/conversion.utils'; ///: BEGIN:ONLY_INCLUDE_IN(build-mmi) @@ -284,15 +284,11 @@ export default class SignatureRequest extends PureComponent { />
- {(txData?.securityProviderResponse?.flagAsDangerous !== undefined && - txData?.securityProviderResponse?.flagAsDangerous !== - SECURITY_PROVIDER_MESSAGE_SEVERITIES.NOT_MALICIOUS) || - (txData?.securityProviderResponse && - Object.keys(txData.securityProviderResponse).length === 0) ? ( + {isSuspiciousResponse(txData?.securityProviderResponse) && ( - ) : null} + )} { ///: BEGIN:ONLY_INCLUDE_IN(build-mmi) diff --git a/ui/components/app/signature-request/signature-request.component.test.js b/ui/components/app/signature-request/signature-request.component.test.js index eebae4d46..81f18932a 100644 --- a/ui/components/app/signature-request/signature-request.component.test.js +++ b/ui/components/app/signature-request/signature-request.component.test.js @@ -3,7 +3,7 @@ import { fireEvent } from '@testing-library/react'; import configureMockStore from 'redux-mock-store'; import mockState from '../../../../test/data/mock-state.json'; import { renderWithProvider } from '../../../../test/lib/render-helpers'; -import { SECURITY_PROVIDER_MESSAGE_SEVERITIES } from '../security-provider-banner-message/security-provider-banner-message.constants'; +import { SECURITY_PROVIDER_MESSAGE_SEVERITY } from '../../../../shared/constants/security-provider'; import SignatureRequest from './signature-request.component'; const baseProps = { @@ -308,8 +308,7 @@ describe('Signature Request Component', () => { txData={{ msgParams, securityProviderResponse: { - flagAsDangerous: - SECURITY_PROVIDER_MESSAGE_SEVERITIES.NOT_MALICIOUS, + flagAsDangerous: SECURITY_PROVIDER_MESSAGE_SEVERITY.NOT_MALICIOUS, }, }} unapprovedMessagesCount={2} @@ -345,8 +344,7 @@ describe('Signature Request Component', () => { txData={{ msgParams, securityProviderResponse: { - flagAsDangerous: - SECURITY_PROVIDER_MESSAGE_SEVERITIES.NOT_MALICIOUS, + flagAsDangerous: SECURITY_PROVIDER_MESSAGE_SEVERITY.NOT_MALICIOUS, }, }} unapprovedMessagesCount={2} diff --git a/ui/pages/confirm-approve/confirm-approve-content/confirm-approve-content.component.js b/ui/pages/confirm-approve/confirm-approve-content/confirm-approve-content.component.js index c25e097fc..12f07dd94 100644 --- a/ui/pages/confirm-approve/confirm-approve-content/confirm-approve-content.component.js +++ b/ui/pages/confirm-approve/confirm-approve-content/confirm-approve-content.component.js @@ -12,7 +12,6 @@ import SimulationErrorMessage from '../../../components/ui/simulation-error-mess import EditGasFeeButton from '../../../components/app/edit-gas-fee-button'; import MultiLayerFeeMessage from '../../../components/app/multilayer-fee-message'; import SecurityProviderBannerMessage from '../../../components/app/security-provider-banner-message/security-provider-banner-message'; -import { SECURITY_PROVIDER_MESSAGE_SEVERITIES } from '../../../components/app/security-provider-banner-message/security-provider-banner-message.constants'; import { BLOCK_SIZES, JustifyContent, @@ -24,6 +23,8 @@ import { } from '../../../helpers/constants/design-system'; import { ConfirmPageContainerWarning } from '../../../components/app/confirm-page-container/confirm-page-container-content'; import LedgerInstructionField from '../../../components/app/ledger-instruction-field'; +import { isSuspiciousResponse } from '../../../../shared/modules/security-provider.utils'; + import { TokenStandard } from '../../../../shared/constants/transaction'; import { CHAIN_IDS, TEST_CHAINS } from '../../../../shared/constants/network'; import ContractDetailsModal from '../../../components/app/modals/contract-details-modal/contract-details-modal'; @@ -594,15 +595,11 @@ export default class ConfirmApproveContent extends Component { 'confirm-approve-content--full': showFullTxDetails, })} > - {(txData?.securityProviderResponse?.flagAsDangerous !== undefined && - txData?.securityProviderResponse?.flagAsDangerous !== - SECURITY_PROVIDER_MESSAGE_SEVERITIES.NOT_MALICIOUS) || - (txData?.securityProviderResponse && - Object.keys(txData.securityProviderResponse).length === 0) ? ( + {isSuspiciousResponse(txData?.securityProviderResponse) && ( - ) : null} + )} {warning && (
diff --git a/ui/pages/token-allowance/token-allowance.js b/ui/pages/token-allowance/token-allowance.js index a6634ed8f..28fef706f 100644 --- a/ui/pages/token-allowance/token-allowance.js +++ b/ui/pages/token-allowance/token-allowance.js @@ -57,11 +57,11 @@ import { MAX_TOKEN_ALLOWANCE_AMOUNT, NUM_W_OPT_DECIMAL_COMMA_OR_DOT_REGEX, } from '../../../shared/constants/tokens'; +import { isSuspiciousResponse } from '../../../shared/modules/security-provider.utils'; import { ConfirmPageContainerNavigation } from '../../components/app/confirm-page-container'; import { useSimulationFailureWarning } from '../../hooks/useSimulationFailureWarning'; import SimulationErrorMessage from '../../components/ui/simulation-error-message'; import LedgerInstructionField from '../../components/app/ledger-instruction-field/ledger-instruction-field'; -import { SECURITY_PROVIDER_MESSAGE_SEVERITIES } from '../../components/app/security-provider-banner-message/security-provider-banner-message.constants'; import SecurityProviderBannerMessage from '../../components/app/security-provider-banner-message/security-provider-banner-message'; import { Text, Icon, IconName } from '../../components/component-library'; @@ -273,15 +273,11 @@ export default function TokenAllowance({ - {(txData?.securityProviderResponse?.flagAsDangerous !== undefined && - txData?.securityProviderResponse?.flagAsDangerous !== - SECURITY_PROVIDER_MESSAGE_SEVERITIES.NOT_MALICIOUS) || - (txData?.securityProviderResponse && - Object.keys(txData.securityProviderResponse).length === 0) ? ( + {isSuspiciousResponse(txData?.securityProviderResponse) && ( - ) : null} + )} Date: Fri, 23 Jun 2023 17:43:52 -0230 Subject: [PATCH 12/52] Update LavaMoat policies (#19744) Update LavaMoat policies to match what CI expects. --- lavamoat/browserify/beta/policy.json | 6 ++++++ lavamoat/browserify/desktop/policy.json | 6 ++++++ lavamoat/browserify/flask/policy.json | 6 ++++++ lavamoat/browserify/main/policy.json | 6 ++++++ lavamoat/browserify/mmi/policy.json | 6 ++++++ lavamoat/build-system/policy.json | 16 ++++++++-------- 6 files changed, 38 insertions(+), 8 deletions(-) diff --git a/lavamoat/browserify/beta/policy.json b/lavamoat/browserify/beta/policy.json index 494ce3924..88b3d6176 100644 --- a/lavamoat/browserify/beta/policy.json +++ b/lavamoat/browserify/beta/policy.json @@ -4490,6 +4490,12 @@ "string.prototype.matchall>regexp.prototype.flags>functions-have-names": true } }, + "superstruct": { + "globals": { + "console.warn": true, + "define": true + } + }, "uuid": { "globals": { "crypto": true, diff --git a/lavamoat/browserify/desktop/policy.json b/lavamoat/browserify/desktop/policy.json index fafcfcc40..a2a64b3ac 100644 --- a/lavamoat/browserify/desktop/policy.json +++ b/lavamoat/browserify/desktop/policy.json @@ -5148,6 +5148,12 @@ "string.prototype.matchall>regexp.prototype.flags>functions-have-names": true } }, + "superstruct": { + "globals": { + "console.warn": true, + "define": true + } + }, "terser>source-map-support>buffer-from": { "packages": { "browserify>buffer": true diff --git a/lavamoat/browserify/flask/policy.json b/lavamoat/browserify/flask/policy.json index fafcfcc40..a2a64b3ac 100644 --- a/lavamoat/browserify/flask/policy.json +++ b/lavamoat/browserify/flask/policy.json @@ -5148,6 +5148,12 @@ "string.prototype.matchall>regexp.prototype.flags>functions-have-names": true } }, + "superstruct": { + "globals": { + "console.warn": true, + "define": true + } + }, "terser>source-map-support>buffer-from": { "packages": { "browserify>buffer": true diff --git a/lavamoat/browserify/main/policy.json b/lavamoat/browserify/main/policy.json index 494ce3924..88b3d6176 100644 --- a/lavamoat/browserify/main/policy.json +++ b/lavamoat/browserify/main/policy.json @@ -4490,6 +4490,12 @@ "string.prototype.matchall>regexp.prototype.flags>functions-have-names": true } }, + "superstruct": { + "globals": { + "console.warn": true, + "define": true + } + }, "uuid": { "globals": { "crypto": true, diff --git a/lavamoat/browserify/mmi/policy.json b/lavamoat/browserify/mmi/policy.json index 6f388ca84..bb82f34b7 100644 --- a/lavamoat/browserify/mmi/policy.json +++ b/lavamoat/browserify/mmi/policy.json @@ -4711,6 +4711,12 @@ "string.prototype.matchall>regexp.prototype.flags>functions-have-names": true } }, + "superstruct": { + "globals": { + "console.warn": true, + "define": true + } + }, "uuid": { "globals": { "crypto": true, diff --git a/lavamoat/build-system/policy.json b/lavamoat/build-system/policy.json index 98fd8942c..a615563a8 100644 --- a/lavamoat/build-system/policy.json +++ b/lavamoat/build-system/policy.json @@ -1124,6 +1124,13 @@ "@metamask/jazzicon>color>color-convert>color-name": true } }, + "@sentry/cli>mkdirp": { + "builtin": { + "fs": true, + "path.dirname": true, + "path.resolve": true + } + }, "@storybook/addon-knobs>qs": { "packages": { "string.prototype.matchall>side-channel": true @@ -8146,14 +8153,7 @@ "path.dirname": true }, "packages": { - "stylelint>file-entry-cache>flat-cache>write>mkdirp": true - } - }, - "stylelint>file-entry-cache>flat-cache>write>mkdirp": { - "builtin": { - "fs": true, - "path.dirname": true, - "path.resolve": true + "@sentry/cli>mkdirp": true } }, "stylelint>global-modules": { From 1c7c89abcb0b54da7e1f8980268f3c95508f37fe Mon Sep 17 00:00:00 2001 From: Dhruv <79097544+dhruvv173@users.noreply.github.com> Date: Sat, 24 Jun 2023 03:08:40 +0530 Subject: [PATCH 13/52] Replacing deprecated constants & creating stories (#19686) * Replacing deprecated constants & creating stories * updating snapshot --- .../confirm-gas-display.stories.js | 19 ++++++++++ .../connected-account-permissions.stories.js | 25 +++++++++++++ .../compliance-details.test.js.snap | 16 ++++----- .../compliance-details/compliance-details.js | 35 +++++++++---------- .../product-tour-popover.js | 14 ++++---- 5 files changed, 76 insertions(+), 33 deletions(-) create mode 100644 ui/components/app/confirm-gas-display/confirm-gas-display.stories.js create mode 100644 ui/components/app/connected-accounts-permissions/connected-account-permissions.stories.js diff --git a/ui/components/app/confirm-gas-display/confirm-gas-display.stories.js b/ui/components/app/confirm-gas-display/confirm-gas-display.stories.js new file mode 100644 index 000000000..a8def4fc4 --- /dev/null +++ b/ui/components/app/confirm-gas-display/confirm-gas-display.stories.js @@ -0,0 +1,19 @@ +import React from 'react'; +import ConfirmGasDisplay from './confirm-gas-display'; + +export default { + title: 'Components/App/ConfirmGasDisplay', + component: ConfirmGasDisplay, + argTypes: { + userAcknowledgedGasMissing: { + control: 'boolean', + }, + }, + args: { + userAcknowledgedGasMissing: true, + }, +}; + +export const DefaultStory = (args) => ; + +DefaultStory.storyName = 'Default'; diff --git a/ui/components/app/connected-accounts-permissions/connected-account-permissions.stories.js b/ui/components/app/connected-accounts-permissions/connected-account-permissions.stories.js new file mode 100644 index 000000000..228abcc97 --- /dev/null +++ b/ui/components/app/connected-accounts-permissions/connected-account-permissions.stories.js @@ -0,0 +1,25 @@ +import React from 'react'; +import ConnectedAccountsPermissions from './connected-accounts-permissions'; + +export default { + title: 'Components/App/ConnectedAccountsPermissions', + component: ConnectedAccountsPermissions, + argTypes: { + permission: { + control: 'array', + }, + }, + args: { + permissions: [ + { key: 'permission1' }, + { key: 'permission2' }, + { key: 'permission3' }, + ], + }, +}; + +export const DefaultStory = (args) => ( + +); + +DefaultStory.storyName = 'Default'; diff --git a/ui/components/institutional/compliance-details/__snapshots__/compliance-details.test.js.snap b/ui/components/institutional/compliance-details/__snapshots__/compliance-details.test.js.snap index bd4b24a02..36420ca9f 100644 --- a/ui/components/institutional/compliance-details/__snapshots__/compliance-details.test.js.snap +++ b/ui/components/institutional/compliance-details/__snapshots__/compliance-details.test.js.snap @@ -3,10 +3,10 @@ exports[`ComplianceDetails should render correctly 1`] = `