A reactive data-store for web3 and smart contracts
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

89 lines
2.3 KiB

import { call, put } from 'redux-saga/effects'
import * as Action from './constants'
var Web3 = require('web3')
/*
* Initialization
*/
export function * initializeWeb3 (options) {
try {
let web3 = {}
if (options.customProvider) {
yield put({ type: Action.WEB3_INITIALIZED })
return options.customProvider
}
if (window.ethereum) {
const { ethereum } = window
web3 = new Web3(ethereum)
try {
// ethereum.enable() will return the selected account
// unless user opts out and then it will return undefined
const selectedAccount = yield call([ethereum, 'enable'])
yield put({ type: Action.WEB3_INITIALIZED })
if (!selectedAccount) {
yield put({ type: Action.WEB3_USER_DENIED })
return
}
return web3
} catch (error) {
console.error(error)
yield put({ type: Action.WEB3_FAILED })
return
}
} else if (typeof window.web3 !== 'undefined') {
// Checking if Web3 has been injected by the browser (Mist/MetaMask)
// Use Mist/MetaMask's provider.
web3 = new Web3(window.web3.currentProvider)
yield put({ type: Action.WEB3_INITIALIZED })
return web3
} else if (options.fallback) {
// Attempt fallback if no web3 injection.
switch (options.fallback.type) {
case 'ws':
var provider = new Web3.providers.WebsocketProvider(
options.fallback.url
)
web3 = new Web3(provider)
yield put({ type: Action.WEB3_INITIALIZED })
return web3
default:
// Invalid options; throw.
throw new Error('Invalid web3 fallback provided.')
}
} else {
// Out of web3 options; throw.
throw new Error('Cannot find injected web3 or valid fallback.')
}
} catch (error) {
yield put({ type: Action.WEB3_FAILED, error })
console.error('Error intializing web3:')
console.error(error)
}
}
/*
* Network ID
*/
export function * getNetworkId ({ web3 }) {
try {
const networkId = yield call(web3.eth.net.getId)
yield put({ type: Action.NETWORK_ID_FETCHED, networkId })
return networkId
} catch (error) {
yield put({ type: Action.NETWORK_ID_FAILED, error })
console.error('Error fetching network ID:')
console.error(error)
}
}