Skip to content

Instantly share code, notes, and snippets.

@soundyogi
Last active October 30, 2018 04:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save soundyogi/cc049c3fe8bb045510e5925e2de196c9 to your computer and use it in GitHub Desktop.
Save soundyogi/cc049c3fe8bb045510e5925e2de196c9 to your computer and use it in GitHub Desktop.
avoid race conditions with web3 and be ready for new ethereum provider system ( provider.enable() ) 2nd. nov 2018
/* global window */
// originally from: https://github.com/adrianmcli
// adapted by me
import Web3 from 'web3'
const fallback = 'wss://mainnet.infura.io/ws'
function resolveWeb3(resolve, reject){
// Modern dapp browsers...
if (window.ethereum) {
console.log('web3, using ethereum provider')
window.web3 = new Web3(window.ethereum);
window.ethereum
.enable()
.then( _ => {
resolve(window.web3)
})
.catch( err => {
console.warn('access denied by user', err)
reject()
})
}
// Legacy dapp browsers...
else if (window.web3) {
console.log('web3, using legacy provider')
window.web3 = new Web3(window.web3.currentProvider);
resolve(window.web3)
}
// fallback provider
else if (typeof window.web3 === undefined) {
console.log('web3, using fallback provider')
window.web3 = new Web3(fallback);
window.metamask = false;
resolve(window.web3)
}
// Non-dapp browsers...
else {
console.warn('Non-Ethereum browser detected. You should consider trying MetaMask!');
reject()
}
}
export function web3resolver(){
return new Promise((resolve, reject) => {
// Wait for loading completion to avoid race conditions with web3 injection timing.
window.addEventListener(`load`, () => resolveWeb3(resolve, reject) )
// resolve immediatly
if (document.readyState === `complete`) resolveWeb3(resolve, reject)
})
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment