From 6309ebcdc6b55a09463a6e1598c962c0976e5404 Mon Sep 17 00:00:00 2001 From: heisenberg Date: Tue, 15 Oct 2024 12:42:20 +0800 Subject: [PATCH] feat: enable clear signing with ledger, close #446 --- apps/mobile/package.json | 2 +- packages/eth-keyring-ledger/package.json | 4 +- .../eth-keyring-ledger/src/LedgerKeyring.ts | 78 +++---- yarn.lock | 220 ++++++++++++------ 4 files changed, 184 insertions(+), 120 deletions(-) diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 075944441..51fdd0500 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -51,7 +51,7 @@ "@ethereumjs/tx": "5.1.0", "@ethereumjs/util": "^9.0.1", "@gorhom/bottom-sheet": "alpha", - "@ledgerhq/react-native-hw-transport-ble": "6.33.2", + "@ledgerhq/react-native-hw-transport-ble": "6.33.4", "@metamask/abi-utils": "2.0.2", "@metamask/eth-sig-util": "5.1.0", "@ngraveio/bc-ur": "1.1.6", diff --git a/packages/eth-keyring-ledger/package.json b/packages/eth-keyring-ledger/package.json index 4f4722b25..ad2452343 100644 --- a/packages/eth-keyring-ledger/package.json +++ b/packages/eth-keyring-ledger/package.json @@ -31,8 +31,8 @@ "test:watch": "jest --watch" }, "dependencies": { - "@ledgerhq/hw-app-eth": "6.29.9", - "@ledgerhq/hw-transport": "^6.30.3", + "@ledgerhq/hw-app-eth": "6.40.0", + "@ledgerhq/hw-transport": "6.31.4", "@rabby-wallet/base-utils": "workspace:^", "@rabby-wallet/keyring-utils": "workspace:^", "eth-sig-util": "^3.0.1", diff --git a/packages/eth-keyring-ledger/src/LedgerKeyring.ts b/packages/eth-keyring-ledger/src/LedgerKeyring.ts index d8aafac84..ff2d09c48 100644 --- a/packages/eth-keyring-ledger/src/LedgerKeyring.ts +++ b/packages/eth-keyring-ledger/src/LedgerKeyring.ts @@ -4,7 +4,7 @@ import { TransactionFactory, FeeMarketEIP1559Transaction, } from '@ethereumjs/tx'; -import LedgerEth, { ledgerService } from '@ledgerhq/hw-app-eth'; +import LedgerEth from '@ledgerhq/hw-app-eth'; import type Transport from '@ledgerhq/hw-transport'; import { addressUtils } from '@rabby-wallet/base-utils'; import { @@ -416,12 +416,7 @@ class LedgerKeyring { const hdPath = await this.unlockAccountByAddress(address); await this.makeApp(true); try { - const resolution = await ledgerService.resolveTransaction( - rawTxHex, - {}, - {}, - ); - const res = await this.app!.signTransaction(hdPath, rawTxHex, resolution); + const res = await this.app!.signTransaction(hdPath, rawTxHex); const newOrMutatedTx = handleSigning(res); const valid = newOrMutatedTx.verifySignature(); if (valid) { @@ -511,21 +506,6 @@ class LedgerKeyring { ); } - const { domain, types, primaryType, message } = - sigUtil.TypedDataUtils.sanitizeData(data); - const domainSeparatorHex = sigUtil.TypedDataUtils.hashStruct( - 'EIP712Domain', - domain, - types, - isV4, - ).toString('hex'); - const hashStructMessageHex = sigUtil.TypedDataUtils.hashStruct( - primaryType as string, - message, - types, - isV4, - ).toString('hex'); - const hdPath = await this.unlockAccountByAddress(withAccount); try { await this.makeApp(true); @@ -537,30 +517,36 @@ class LedgerKeyring { }; // https://github.com/LedgerHQ/ledger-live/blob/5bae039273beeeb02d8640d778fd7bf5f7fd3776/libs/coin-evm/src/hw-signMessage.ts#L68C7-L79C10 - // try { - // res = await this.app!.signEIP712Message(hdPath, data); - // } catch (e) { - // if ( - // e instanceof Error && - // 'statusText' in e && - // (e as any).statusText === 'INS_NOT_SUPPORTED' - // ) { - // res = await this.app!.signEIP712HashedMessage( - // hdPath, - // domainSeparatorHex, - // hashStructMessageHex - // ); - // } else { - // throw e; - // } - // } - - // eslint-disable-next-line prefer-const - res = await this.app!.signEIP712HashedMessage( - hdPath, - domainSeparatorHex, - hashStructMessageHex, - ); + try { + res = await this.app!.signEIP712Message(hdPath, data); + } catch (e: any) { + const shouldFallbackOnHashedMethod = + 'statusText' in e && e.statusText === 'INS_NOT_SUPPORTED'; + if (!shouldFallbackOnHashedMethod) { + throw e; + } + + const { domain, types, primaryType, message } = + sigUtil.TypedDataUtils.sanitizeData(data); + const domainSeparatorHex = sigUtil.TypedDataUtils.hashStruct( + 'EIP712Domain', + domain, + types, + isV4, + ).toString('hex'); + const hashStructMessageHex = sigUtil.TypedDataUtils.hashStruct( + primaryType as string, + message, + types, + isV4, + ).toString('hex'); + + res = await this.app!.signEIP712HashedMessage( + hdPath, + domainSeparatorHex, + hashStructMessageHex, + ); + } let v = res.v.toString(16); if (v.length < 2) { diff --git a/yarn.lock b/yarn.lock index 312ebb222..4ad17d9a6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4967,12 +4967,13 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/cryptoassets@npm:^6.35.1": - version: 6.37.0 - resolution: "@ledgerhq/cryptoassets@npm:6.37.0" +"@ledgerhq/cryptoassets-evm-signatures@npm:^13.5.1": + version: 13.5.1 + resolution: "@ledgerhq/cryptoassets-evm-signatures@npm:13.5.1" dependencies: - invariant: 2 - checksum: 2418c1751740e976d1509b7ce6da447cc3a0f05e1498db252bab70c635881658c8a4a4eaba39cfbc98f4ad373a355689131eb6f844d3a4fe2f6b2af9ddbd6e90 + "@ledgerhq/live-env": ^2.4.0 + axios: 1.7.7 + checksum: c7a43393aa997f8eef4dc440d08f7c133f2d9c3b7a6621d98903c4b59ad7a53810f7cbe527fe9210a81c21999d753d5d04e9d8810e22d600ac36b5d9dbc3795c languageName: node linkType: hard @@ -5000,15 +5001,30 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/devices@npm:^8.4.2": - version: 8.4.2 - resolution: "@ledgerhq/devices@npm:8.4.2" +"@ledgerhq/devices@npm:^8.4.4": + version: 8.4.4 + resolution: "@ledgerhq/devices@npm:8.4.4" dependencies: - "@ledgerhq/errors": ^6.18.0 + "@ledgerhq/errors": ^6.19.1 "@ledgerhq/logs": ^6.12.0 rxjs: ^7.8.1 semver: ^7.3.5 - checksum: ff03c2cdb9cfef0eadd26c360f8023c3973f924832ad19e2ecd42800ea665ee9177f79f949f76cd26dcbc9d162c7901b81a28478943a3e391b7f2ec16d9f2c89 + checksum: 370fb38d484665c92165580e285cc792e7af0bf114a5d1e855aec602c6e39592090d0de7a43addeb4c13622f734ddd4f25be82f07507e14550753ce5473eea66 + languageName: node + linkType: hard + +"@ledgerhq/domain-service@npm:^1.2.7": + version: 1.2.7 + resolution: "@ledgerhq/domain-service@npm:1.2.7" + dependencies: + "@ledgerhq/errors": ^6.19.1 + "@ledgerhq/logs": ^6.12.0 + "@ledgerhq/types-live": ^6.52.1 + axios: 1.7.7 + eip55: ^2.1.1 + react: ^18.2.0 + react-dom: ^18.2.0 + checksum: fdd19d8b5cbf48fac46100116a7e1b432643d43c2efebae3f24dfa1f8b48b4b891ad59d83f007c7a13baebc6e7bef0379a52a8d73f4128f95137c4fc7cb4acc1 languageName: node linkType: hard @@ -5019,69 +5035,84 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/errors@npm:^6.11.1, @ledgerhq/errors@npm:^6.16.1": +"@ledgerhq/errors@npm:^6.16.1": version: 6.16.1 resolution: "@ledgerhq/errors@npm:6.16.1" checksum: 6bbcedee7103d8aa878a7e84e4824796e1505ef32013e1e98679827a72696d01da897adb95a996ad30fa120bf126b98d68107870001b950a55bf9af4372f42af languageName: node linkType: hard -"@ledgerhq/errors@npm:^6.18.0": - version: 6.18.0 - resolution: "@ledgerhq/errors@npm:6.18.0" - checksum: 167f9530ca7498aa2ebfd3e036d3269f917bc27d95540f8a2a566b454896d41fc15026ac53951be0befdd1a05f9a9c2d03a6de8c78752e57aee9bc28838c8a48 +"@ledgerhq/errors@npm:^6.19.1": + version: 6.19.1 + resolution: "@ledgerhq/errors@npm:6.19.1" + checksum: f4e1cf0d6a5808c58235c54e2a1565556de8e683552bd94d97609f790e8c25226114bfa2af9914bb329c3e7c314585b60c66ddac8d8f8f1d072b7e791a889ad8 + languageName: node + linkType: hard + +"@ledgerhq/evm-tools@npm:^1.2.4": + version: 1.2.4 + resolution: "@ledgerhq/evm-tools@npm:1.2.4" + dependencies: + "@ledgerhq/cryptoassets-evm-signatures": ^13.5.1 + "@ledgerhq/live-env": ^2.4.0 + axios: 1.7.7 + crypto-js: 4.2.0 + ethers: 5.7.2 + checksum: 2567018b627e0ca93a29b4efd3864a77dfce44b37f701cdbab08912f1075ed413d120e46744068682f4afd18f47be153df5624bb8d9e098ad4123c7a4daef5b3 languageName: node linkType: hard -"@ledgerhq/hw-app-eth@npm:6.29.9": - version: 6.29.9 - resolution: "@ledgerhq/hw-app-eth@npm:6.29.9" +"@ledgerhq/hw-app-eth@npm:6.40.0": + version: 6.40.0 + resolution: "@ledgerhq/hw-app-eth@npm:6.40.0" dependencies: "@ethersproject/abi": ^5.5.0 "@ethersproject/rlp": ^5.5.0 - "@ledgerhq/cryptoassets": ^6.35.1 - "@ledgerhq/errors": ^6.11.1 - "@ledgerhq/hw-transport": ^6.27.6 - "@ledgerhq/hw-transport-mocker": ^6.27.6 - "@ledgerhq/logs": ^6.10.1 - axios: ^0.26.1 - bignumber.js: ^9.0.2 - checksum: 1f7af59764301f3d221f4c0185a8093f36bec29dbf75b6e7027462df9289d4bc048367047c9255e9841920299c5a72dee95a2453e9693f1b98c3fa805f7c91f9 + "@ledgerhq/cryptoassets-evm-signatures": ^13.5.1 + "@ledgerhq/domain-service": ^1.2.7 + "@ledgerhq/errors": ^6.19.1 + "@ledgerhq/evm-tools": ^1.2.4 + "@ledgerhq/hw-transport": ^6.31.4 + "@ledgerhq/hw-transport-mocker": ^6.29.4 + "@ledgerhq/logs": ^6.12.0 + "@ledgerhq/types-live": ^6.52.1 + axios: 1.7.7 + bignumber.js: ^9.1.2 + semver: ^7.3.5 + checksum: f4b1860014a72c54b335719e9ba4d07a347b38ce6f4ab6d802af502768a2611351a7d47bdd380f47bdd3e1b183b8391306308e1340cefd08ede72ac78143ad52 languageName: node linkType: hard -"@ledgerhq/hw-transport-mocker@npm:^6.27.6": - version: 6.28.3 - resolution: "@ledgerhq/hw-transport-mocker@npm:6.28.3" +"@ledgerhq/hw-transport-mocker@npm:^6.29.4": + version: 6.29.4 + resolution: "@ledgerhq/hw-transport-mocker@npm:6.29.4" dependencies: - "@ledgerhq/hw-transport": ^6.30.3 + "@ledgerhq/hw-transport": ^6.31.4 "@ledgerhq/logs": ^6.12.0 rxjs: ^7.8.1 - checksum: bd8349d29728eb75fd8d6d8af2f9ae0704519b46a4599bd1c3d025886231e7d95ca2b233d8e2e57f093d054ddb16833d92a4839f914864277b23dfa3d2132693 + checksum: 0b082677de245ffb0b861ed267eba921cde184686539ad870bf6a28e9577acd154c9faf30894f2c1020a034f1241f30d526cad2930e5a9bfc4a1266504fa234e languageName: node linkType: hard -"@ledgerhq/hw-transport@npm:^6.27.6, @ledgerhq/hw-transport@npm:^6.30.3": - version: 6.30.3 - resolution: "@ledgerhq/hw-transport@npm:6.30.3" +"@ledgerhq/hw-transport@npm:6.31.4, @ledgerhq/hw-transport@npm:^6.31.4": + version: 6.31.4 + resolution: "@ledgerhq/hw-transport@npm:6.31.4" dependencies: - "@ledgerhq/devices": ^8.2.0 - "@ledgerhq/errors": ^6.16.1 + "@ledgerhq/devices": ^8.4.4 + "@ledgerhq/errors": ^6.19.1 "@ledgerhq/logs": ^6.12.0 events: ^3.3.0 - checksum: 745b13b66afe02231c20a338a4a6e8d2cfd2ff3f17e033c89a6da9b7e64b0812e73dc6ce5cd44147058d208a17c152aa7cf138c31be4aa094d15b1921642c920 + checksum: bb5204513f2df3dbb646265954d1539bf6117cc08e73a4d1761ec10cb5f8255fe2b30112debc2433608de7260ee8878340c9f67690f5f62447a1466daa241ea7 languageName: node linkType: hard -"@ledgerhq/hw-transport@npm:^6.31.2": - version: 6.31.2 - resolution: "@ledgerhq/hw-transport@npm:6.31.2" +"@ledgerhq/live-env@npm:^2.4.0": + version: 2.4.0 + resolution: "@ledgerhq/live-env@npm:2.4.0" dependencies: - "@ledgerhq/devices": ^8.4.2 - "@ledgerhq/errors": ^6.18.0 - "@ledgerhq/logs": ^6.12.0 - events: ^3.3.0 - checksum: 61f9fc0c9576bd2247f8ac660efc32f50ffaf7c099d6f0270d8ea66e624dab00c8a58586aed14e4c56ff6462c76f01e4e5e5d3ca7d6920beafb51b29b840b3ad + rxjs: ^7.8.1 + utility-types: ^3.10.0 + checksum: 1fb7ff33a12b12e69c06aae54e9b19ad099d855a804fd382e978bf92c953f9fbc35e3fa1b7f3e8fe17ae95a7ffd8f4f7f5bd8e4e4c94bae64d24184b68a32e79 languageName: node linkType: hard @@ -5092,25 +5123,25 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/logs@npm:^6.10.1, @ledgerhq/logs@npm:^6.12.0": +"@ledgerhq/logs@npm:^6.12.0": version: 6.12.0 resolution: "@ledgerhq/logs@npm:6.12.0" checksum: 53fb9ceaf26b2a9fd6e7639b19119f4fef2f814d465fdd910e69c9486dce78137a1790e24f019a03bfabc87e19b2e6683f4da93a7fd203a61117a709fdf6484c languageName: node linkType: hard -"@ledgerhq/react-native-hw-transport-ble@npm:6.33.2": - version: 6.33.2 - resolution: "@ledgerhq/react-native-hw-transport-ble@npm:6.33.2" +"@ledgerhq/react-native-hw-transport-ble@npm:6.33.4": + version: 6.33.4 + resolution: "@ledgerhq/react-native-hw-transport-ble@npm:6.33.4" dependencies: - "@ledgerhq/devices": ^8.4.2 - "@ledgerhq/errors": ^6.18.0 - "@ledgerhq/hw-transport": ^6.31.2 + "@ledgerhq/devices": ^8.4.4 + "@ledgerhq/errors": ^6.19.1 + "@ledgerhq/hw-transport": ^6.31.4 "@ledgerhq/logs": ^6.12.0 react-native-ble-plx: 3.1.2 rxjs: ^7.8.1 uuid: ^9.0.1 - checksum: 932e736832441f8c5856f01801fff5f8354b9f3c088b78aa42d04029b8cc14e1f50478deb88d1df1257d13a1375b59ecb4c83547629bcf8fffe52deacc96d90a + checksum: 52e2088b4154ce8346e4ea5b23f84d549abebc47879e21296598d0985055ae9c518090b134a459d112c545b65aa0caee1b55241b35bab1f458ad9479b740b014 languageName: node linkType: hard @@ -5128,6 +5159,16 @@ __metadata: languageName: node linkType: hard +"@ledgerhq/types-live@npm:^6.52.1": + version: 6.52.1 + resolution: "@ledgerhq/types-live@npm:6.52.1" + dependencies: + bignumber.js: ^9.1.2 + rxjs: ^7.8.1 + checksum: 89b665a2fe643b05f438a7753a8f71560c44bdcdef91b5bb740de99d183c93d2b1577f70247cdc82b81c31069981984151c8a382e5698362111ba68db6e8472d + languageName: node + linkType: hard + "@leichtgewicht/ip-codec@npm:^2.0.1": version: 2.0.4 resolution: "@leichtgewicht/ip-codec@npm:2.0.4::__archiveUrl=https%3A%2F%2Fregistry.npmjs.org%2F%40leichtgewicht%2Fip-codec%2F-%2Fip-codec-2.0.4.tgz" @@ -6228,8 +6269,8 @@ __metadata: dependencies: "@ethereumjs/tx": 5 "@ledgerhq/devices": ^8.2.0 - "@ledgerhq/hw-app-eth": 6.29.9 - "@ledgerhq/hw-transport": ^6.30.3 + "@ledgerhq/hw-app-eth": 6.40.0 + "@ledgerhq/hw-transport": 6.31.4 "@ledgerhq/types-cryptoassets": ^7.9.0 "@ledgerhq/types-devices": ^6.23.0 "@metamask/auto-changelog": ^3.4.3 @@ -11830,6 +11871,17 @@ __metadata: languageName: node linkType: hard +"axios@npm:1.7.7": + version: 1.7.7 + resolution: "axios@npm:1.7.7" + dependencies: + follow-redirects: ^1.15.6 + form-data: ^4.0.0 + proxy-from-env: ^1.1.0 + checksum: 882d4fe0ec694a07c7f5c1f68205eb6dc5a62aecdb632cc7a4a3d0985188ce3030e0b277e1a8260ac3f194d314ae342117660a151fabffdc5081ca0b5a8b47fe + languageName: node + linkType: hard + "axios@npm:^0.24.0": version: 0.24.0 resolution: "axios@npm:0.24.0" @@ -11839,15 +11891,6 @@ __metadata: languageName: node linkType: hard -"axios@npm:^0.26.1": - version: 0.26.1 - resolution: "axios@npm:0.26.1" - dependencies: - follow-redirects: ^1.14.8 - checksum: d9eb58ff4bc0b36a04783fc9ff760e9245c829a5a1052ee7ca6013410d427036b1d10d04e7380c02f3508c5eaf3485b1ae67bd2adbfec3683704745c8d7a6e1a - languageName: node - linkType: hard - "axios@npm:^0.27.2": version: 0.27.2 resolution: "axios@npm:0.27.2::__archiveUrl=https%3A%2F%2Fregistry.npmjs.org%2Faxios%2F-%2Faxios-0.27.2.tgz" @@ -14355,6 +14398,13 @@ __metadata: languageName: node linkType: hard +"crypto-js@npm:4.2.0": + version: 4.2.0 + resolution: "crypto-js@npm:4.2.0" + checksum: f051666dbc077c8324777f44fbd3aaea2986f198fe85092535130d17026c7c2ccf2d23ee5b29b36f7a4a07312db2fae23c9094b644cc35f7858b1b4fcaf27774 + languageName: node + linkType: hard + "crypto-random-string@npm:^1.0.0": version: 1.0.0 resolution: "crypto-random-string@npm:1.0.0::__archiveUrl=https%3A%2F%2Fregistry.npmjs.org%2Fcrypto-random-string%2F-%2Fcrypto-random-string-1.0.0.tgz" @@ -15810,6 +15860,15 @@ __metadata: languageName: node linkType: hard +"eip55@npm:^2.1.1": + version: 2.1.1 + resolution: "eip55@npm:2.1.1" + dependencies: + keccak: ^3.0.3 + checksum: 512d319e4f91ab0c33b514f371206956521dcdcdd23e8eb4d6f9c21e3be9f72287c0b82feb854d3a1eec91805804d13c31e7a1a7dafd37f69eb9994a9c6c8f32 + languageName: node + linkType: hard + "ejs@npm:^3.1.6": version: 3.1.9 resolution: "ejs@npm:3.1.9::__archiveUrl=https%3A%2F%2Fregistry.npmjs.org%2Fejs%2F-%2Fejs-3.1.9.tgz" @@ -17426,7 +17485,7 @@ __metadata: languageName: node linkType: hard -"ethers@npm:^5.5.1": +"ethers@npm:5.7.2, ethers@npm:^5.5.1": version: 5.7.2 resolution: "ethers@npm:5.7.2" dependencies: @@ -18291,13 +18350,13 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.14.8": - version: 1.15.5 - resolution: "follow-redirects@npm:1.15.5" +"follow-redirects@npm:^1.15.6": + version: 1.15.9 + resolution: "follow-redirects@npm:1.15.9" peerDependenciesMeta: debug: optional: true - checksum: 5ca49b5ce6f44338cbfc3546823357e7a70813cecc9b7b768158a1d32c1e62e7407c944402a918ea8c38ae2e78266312d617dc68783fac502cbb55e1047b34ec + checksum: 859e2bacc7a54506f2bf9aacb10d165df78c8c1b0ceb8023f966621b233717dab56e8d08baadc3ad3b9db58af290413d585c999694b7c146aaf2616340c3d2a6 languageName: node linkType: hard @@ -20024,7 +20083,7 @@ __metadata: languageName: node linkType: hard -"invariant@npm:2, invariant@npm:2.2.4": +"invariant@npm:2.2.4": version: 2.2.4 resolution: "invariant@npm:2.2.4" dependencies: @@ -23007,6 +23066,18 @@ __metadata: languageName: node linkType: hard +"keccak@npm:^3.0.3": + version: 3.0.4 + resolution: "keccak@npm:3.0.4" + dependencies: + node-addon-api: ^2.0.0 + node-gyp: latest + node-gyp-build: ^4.2.0 + readable-stream: ^3.6.0 + checksum: 2bf27b97b2f24225b1b44027de62be547f5c7326d87d249605665abd0c8c599d774671c35504c62c9b922cae02758504c6f76a73a84234d23af8a2211afaaa11 + languageName: node + linkType: hard + "keymirror@npm:^0.1.1": version: 0.1.1 resolution: "keymirror@npm:0.1.1::__archiveUrl=https%3A%2F%2Fregistry.npmjs.org%2Fkeymirror%2F-%2Fkeymirror-0.1.1.tgz" @@ -28078,7 +28149,7 @@ __metadata: "@ethereumjs/tx": 5.1.0 "@ethereumjs/util": ^9.0.1 "@gorhom/bottom-sheet": alpha - "@ledgerhq/react-native-hw-transport-ble": 6.33.2 + "@ledgerhq/react-native-hw-transport-ble": 6.33.4 "@metamask/abi-utils": 2.0.2 "@metamask/eth-sig-util": 5.1.0 "@ngraveio/bc-ur": 1.1.6 @@ -34083,6 +34154,13 @@ __metadata: languageName: node linkType: hard +"utility-types@npm:^3.10.0": + version: 3.11.0 + resolution: "utility-types@npm:3.11.0" + checksum: 35a4866927bbea5d037726744028d05c6e37772ded2aabaca21480ce9380185436aef586ead525e327c7f3c640b1a3287769a12ef269c7b165a2ddd50ea6ad61 + languageName: node + linkType: hard + "utils-merge@npm:1.0.1": version: 1.0.1 resolution: "utils-merge@npm:1.0.1::__archiveUrl=https%3A%2F%2Fregistry.npmjs.org%2Futils-merge%2F-%2Futils-merge-1.0.1.tgz"