diff --git a/.gitignore b/.gitignore index 4ee0c1c626fc..c5233306b29d 100644 --- a/.gitignore +++ b/.gitignore @@ -45,3 +45,5 @@ notes.txt .coveralls.yml .nyc_output + +.niftywalletrc diff --git a/.niftywalletrc.dist b/.niftywalletrc.dist new file mode 100644 index 000000000000..386cafa58318 --- /dev/null +++ b/.niftywalletrc.dist @@ -0,0 +1,2 @@ +; Extra environment variables +ETH_MAINNET_RPC_ENDPOINT=00000000000 diff --git a/CHANGELOG.md b/CHANGELOG.md index be315788464c..48142f18780d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Current Master +- [#441](https://github.com/poanetwork/nifty-wallet/pull/441) - Replace Infura Mainnet endpoint with custom one + ## 5.2.2 Tue Dec 29 2020 - [#437](https://github.com/poanetwork/nifty-wallet/pull/437) - Support getting proxy implementation address by following EIP-1967 diff --git a/app/scripts/background.js b/app/scripts/background.js index cd4f71597623..5dc0ab3f2326 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -242,6 +242,7 @@ function setupController (initState, initLangCode) { // const controller = new MetamaskController({ + ethMainnetRpcEndpoint: process.env.ETH_MAINNET_RPC_ENDPOINT, // User confirmation callbacks: showUnconfirmedMessage: triggerUi, unlockAccountMessage: triggerUi, diff --git a/app/scripts/controllers/currency.js b/app/scripts/controllers/currency.js index d9d1100d1800..ce7e5731a52e 100644 --- a/app/scripts/controllers/currency.js +++ b/app/scripts/controllers/currency.js @@ -129,19 +129,11 @@ class CurrencyController { try { currentCurrency = this.getCurrentCurrency() currentCoin = this.getCurrentCoin() - let conversionRate, conversionDate - if (currentCoin === 'poa' || currentCoin === 'etc' || currentCoin === 'rbtc') { - const apiLink = `https://min-api.cryptocompare.com/data/price?fsym=${currentCoin.toUpperCase()}&tsyms=${currentCurrency.toUpperCase()}` - const response = await fetch(apiLink) - const parsedResponse = await response.json() - conversionRate = Number(parsedResponse[currentCurrency.toUpperCase()]) - conversionDate = parseInt((new Date()).getTime() / 1000) - } else { - const response = await fetch(`https://api.infura.io/v1/ticker/eth${currentCurrency.toLowerCase()}`) - const parsedResponse = await response.json() - conversionRate = Number(parsedResponse.bid) - conversionDate = Number(parsedResponse.timestamp) - } + const apiLink = `https://min-api.cryptocompare.com/data/price?fsym=${currentCoin.toUpperCase()}&tsyms=${currentCurrency.toUpperCase()}` + const response = await fetch(apiLink) + const parsedResponse = await response.json() + const conversionRate = Number(parsedResponse[currentCurrency.toUpperCase()]) + const conversionDate = parseInt((new Date()).getTime() / 1000) this.setConversionRate(conversionRate) this.setConversionDate(conversionDate) } catch (err) { diff --git a/app/scripts/controllers/network/network.js b/app/scripts/controllers/network/network.js index 42080318a17f..73711623d7ef 100644 --- a/app/scripts/controllers/network/network.js +++ b/app/scripts/controllers/network/network.js @@ -41,7 +41,7 @@ const { RSK_CODE, RSK_TESTNET_CODE, } = require('./enums') -const INFURA_PROVIDER_TYPES = [ROPSTEN, RINKEBY, KOVAN, MAINNET] +const INFURA_PROVIDER_TYPES = [ROPSTEN, RINKEBY, KOVAN] const POCKET_PROVIDER_TYPES = [ROPSTEN, RINKEBY, KOVAN, MAINNET, POA, DAI, GOERLI_TESTNET, POA_SOKOL] const env = process.env.METAMASK_ENV @@ -234,6 +234,8 @@ module.exports = class NetworkController extends EventEmitter { } else if (isInfura) { this._configureInfuraProvider(opts) // other type-based rpc endpoints + } else if (type === MAINNET) { + this._configureStandardProvider({ rpcUrl: this._ethMainnetRpcEndpoint, chainId, ticker, nickname }) } else if (type === POA) { this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(POA_CODE)[0], chainId, ticker, nickname }) } else if (type === DAI) { @@ -258,6 +260,21 @@ module.exports = class NetworkController extends EventEmitter { } } + /** + * Sets the Ethereum Mainnet RPC endpoint + * + * @param {string} endpoint - Ethereum Mainnet RPC endpoint + * @throws {Error} if the endpoint is not a valid string + * @return {void} + */ + setEthMainnetRPCEndpoint (endpoint) { + if (!endpoint || typeof endpoint !== 'string') { + throw new Error('Invalid ETH Mainnet RPC Endpoint') + } + + this._ethMainnetRpcEndpoint = endpoint + } + _configureInfuraProvider ({ type }) { log.info('NetworkController - configureInfuraProvider', type) const networkClient = createInfuraClient({ diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 2b95733f10d6..d83cdd31946c 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -108,6 +108,7 @@ module.exports = class MetamaskController extends EventEmitter { // network store this.networkController = new NetworkController(initState.NetworkController) + this.networkController.setEthMainnetRPCEndpoint(opts.ethMainnetRpcEndpoint) // preferences controller this.preferencesController = new PreferencesController({ @@ -494,7 +495,7 @@ module.exports = class MetamaskController extends EventEmitter { setPreference: nodeify(preferencesController.setPreference, preferencesController), // BlacklistController - whitelistPhishingDomain: this.whitelistPhishingDomain.bind(this), + // whitelistPhishingDomain: this.whitelistPhishingDomain.bind(this), // AddressController setAddressBook: nodeify(addressBookController.setAddressBook, addressBookController), diff --git a/gulpfile.js b/gulpfile.js index 9e5326c2a066..dc36cfb53647 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -30,6 +30,10 @@ function gulpParallel (...args) { } } +const conf = require('rc')('niftywallet', { + ETH_MAINNET_RPC_ENDPOINT: process.env.ETH_MAINNET_RPC_ENDPOINT, +}) + const browserPlatforms = [ 'firefox', 'chrome', @@ -425,6 +429,7 @@ function generateBundler (opts, performBundle) { bundler.transform(envify({ METAMASK_DEBUG: opts.devMode, NODE_ENV: opts.devMode ? 'development' : 'production', + ETH_MAINNET_RPC_ENDPOINT: conf.ETH_MAINNET_RPC_ENDPOINT, })) if (opts.watch) { diff --git a/old-ui/app/util.js b/old-ui/app/util.js index e916e54bcc6e..1cef8cb03d32 100644 --- a/old-ui/app/util.js +++ b/old-ui/app/util.js @@ -42,6 +42,8 @@ const { customDPaths, } = require('../../app/scripts/controllers/network/enums') +const INFURA_PROVIDER_TYPES = [ROPSTEN, RINKEBY, KOVAN] + const valueTable = { wei: '1000000000000000000', kwei: '1000000000000000', @@ -491,14 +493,13 @@ function isValidChecksumAddress (network, address) { } function isInfuraProvider (type) { - const INFURA_PROVIDER_TYPES = [ROPSTEN, RINKEBY, KOVAN, MAINNET] return INFURA_PROVIDER_TYPES.includes(type) } function isKnownProvider (type) { - const INFURA_PROVIDER_TYPES = [ROPSTEN, RINKEBY, KOVAN, MAINNET] return INFURA_PROVIDER_TYPES.includes(type) || type === LOCALHOST || + type === MAINNET || type === POA_SOKOL || type === POA || type === DAI || diff --git a/package-lock.json b/package-lock.json index 3b08c2f6cce8..5b467e0e013f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42987,6 +42987,26 @@ } } }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + } + } + }, "react": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", diff --git a/package.json b/package.json index 3641f2a374db..b9459555c96f 100644 --- a/package.json +++ b/package.json @@ -306,6 +306,7 @@ "qs": "^6.2.0", "qunitjs": "^2.4.1", "radgrad-jsdoc-template": "^1.1.3", + "rc": "^1.2.8", "react-redux": "^7.2.0", "react-test-renderer": "^16.12.0", "react-testutils-additions": "^16.0.2", diff --git a/test/unit/app/controllers/detect-tokens-test.js b/test/unit/app/controllers/detect-tokens-test.js index ea10ef468b26..2284ad06f536 100644 --- a/test/unit/app/controllers/detect-tokens-test.js +++ b/test/unit/app/controllers/detect-tokens-test.js @@ -25,6 +25,7 @@ describe('DetectTokensController', () => { keyringMemStore = new ObservableStore({ isUnlocked: false}) network = new NetworkController() + network.setEthMainnetRPCEndpoint('foo') preferences = new PreferencesController({ network }) controller = new DetectTokensController({ preferences: preferences, network: network, keyringMemStore: keyringMemStore }) diff --git a/test/unit/app/controllers/metamask-controller-test.js b/test/unit/app/controllers/metamask-controller-test.js index fb5bc4cae7c6..25a62ef9c70b 100644 --- a/test/unit/app/controllers/metamask-controller-test.js +++ b/test/unit/app/controllers/metamask-controller-test.js @@ -69,6 +69,7 @@ describe('MetaMaskController', function () { }, initState: cloneDeep(firstTimeState), platform: { showTransactionNotification: () => {} }, + ethMainnetRpcEndpoint: 'foo', }) // disable diagnostics metamaskController.diagnostics = null diff --git a/test/unit/app/controllers/network-contoller-test.js b/test/unit/app/controllers/network-contoller-test.js index e8c013881e42..e9365a4740b5 100644 --- a/test/unit/app/controllers/network-contoller-test.js +++ b/test/unit/app/controllers/network-contoller-test.js @@ -20,6 +20,7 @@ describe('# Network Controller', function () { .reply(200) networkController = new NetworkController() + networkController.setEthMainnetRPCEndpoint('foo') networkController.initializeProvider(networkControllerProviderConfig) }) diff --git a/test/unit/old-ui/app/util.spec.js b/test/unit/old-ui/app/util.spec.js index 07b043940011..28133f125909 100644 --- a/test/unit/old-ui/app/util.spec.js +++ b/test/unit/old-ui/app/util.spec.js @@ -401,7 +401,7 @@ describe('normalizing values', function () { assert(isInfuraProvider('kovan')) assert(isInfuraProvider('ropsten')) assert(isInfuraProvider('rinkeby')) - assert(isInfuraProvider('mainnet')) + assert(!isInfuraProvider('mainnet')) assert(!isInfuraProvider('goerli_testnet')) assert(!isInfuraProvider('sokol')) assert(!isInfuraProvider('classic')) diff --git a/test/unit/ui/app/actions.spec.js b/test/unit/ui/app/actions.spec.js index 8de077805bd0..f3d1d023bd77 100644 --- a/test/unit/ui/app/actions.spec.js +++ b/test/unit/ui/app/actions.spec.js @@ -53,6 +53,7 @@ describe('Actions', () => { }, }, initState: clone(firstTimeState), + ethMainnetRpcEndpoint: 'foo', }) await metamaskController.createNewVaultAndRestore(password, TEST_SEED)