Skip to content

Commit

Permalink
Merge pull request #303 from andrewnguyen22/pocket-nifty
Browse files Browse the repository at this point in the history
Pocket-Nifty PR: Closes Issue #288
  • Loading branch information
vbaranov committed Aug 7, 2019
2 parents 5a1aff9 + 75f0ffa commit 5279197
Show file tree
Hide file tree
Showing 9 changed files with 2,524 additions and 86 deletions.
124 changes: 124 additions & 0 deletions app/scripts/controllers/network/createPocketClient.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
const mergeMiddleware = require('json-rpc-engine/src/mergeMiddleware')
const createScaffoldMiddleware = require('json-rpc-engine/src/createScaffoldMiddleware')
const createBlockReRefMiddleware = require('eth-json-rpc-middleware/block-ref')
const createRetryOnEmptyMiddleware = require('eth-json-rpc-middleware/retryOnEmpty')
const createBlockCacheMiddleware = require('eth-json-rpc-middleware/block-cache')
const createInflightMiddleware = require('eth-json-rpc-middleware/inflight-cache')
const createBlockTrackerInspectorMiddleware = require('eth-json-rpc-middleware/block-tracker-inspector')
const providerFromMiddleware = require('eth-json-rpc-middleware/providerFromMiddleware')
const createPocketMiddleware = require('json-rpc-pocket')
const BlockTracker = require('eth-block-tracker')
const devid = 'DEVVGQ8VfHgBBet8CyowHcN'
const {
ROPSTEN,
ROPSTEN_CODE,
ROPSTEN_CHAINID,
RINKEBY_CODE,
RINKEBY_CHAINID,
RINKEBY,
KOVAN,
KOVAN_CODE,
KOVAN_CHAINID,
MAINNET,
MAINNET_CODE,
MAINNET_CHAINID,
ETH_TICK,
POA_SOKOL,
POA_CODE,
POA_CHAINID,
POA_TICK,
POA,
DAI,
DAI_CODE,
DAI_CHAINID,
GOERLI_TESTNET,
GOERLI_TESTNET_CODE,
GOERLI_TESTNET_CHAINID,
POA_SOKOL_CODE,
POA_SOKOL_CHAINID,
} = require('./enums')

module.exports = createPocketClient

function createPocketClient ({ network }) {
const networkIDs = getNetworkIds({ network })
const pocketMiddleware = createPocketMiddleware(devid, {
netID: networkIDs.netId,
network: networkIDs.ticker,
})
const pocketProvider = providerFromMiddleware(pocketMiddleware)
const blockTracker = new BlockTracker({ provider: pocketProvider })

const networkMiddleware = mergeMiddleware([
createNetworkAndChainIdMiddleware({ network }),
createBlockCacheMiddleware({ blockTracker }),
createInflightMiddleware(),
createBlockReRefMiddleware({ blockTracker, provider: pocketProvider }),
createRetryOnEmptyMiddleware({ blockTracker, provider: pocketProvider }),
createBlockTrackerInspectorMiddleware({ blockTracker }),
pocketMiddleware,
])
return { networkMiddleware, blockTracker }
}

function getNetworkIds ({ network }) {
let chainId
let netId
let ticker
switch (network) {
case MAINNET:
netId = MAINNET_CODE.toString()
chainId = MAINNET_CHAINID
ticker = ETH_TICK
break
case ROPSTEN:
netId = ROPSTEN_CODE.toString()
chainId = ROPSTEN_CHAINID
ticker = ETH_TICK
break
case RINKEBY:
netId = RINKEBY_CODE.toString()
chainId = RINKEBY_CHAINID
ticker = ETH_TICK
break
case KOVAN:
netId = KOVAN_CODE.toString()
chainId = KOVAN_CHAINID
ticker = ETH_TICK
break
case GOERLI_TESTNET:
netId = GOERLI_TESTNET_CODE.toString()
chainId = GOERLI_TESTNET_CHAINID
ticker = ETH_TICK
break
case POA:
netId = POA_CODE.toString()
chainId = POA_CHAINID
ticker = POA_TICK
break
case DAI:
netId = DAI_CODE.toString()
chainId = DAI_CHAINID
ticker = POA_TICK
break
case POA_SOKOL:
netId= POA_SOKOL_CODE.toString()
chainId = POA_SOKOL_CHAINID
ticker = POA_TICK
break
default:
throw new Error(`createPocketClient - unknown network "${network}"`)
}
return {
chainId, netId, ticker
}
}

function createNetworkAndChainIdMiddleware ({ network }) {
const networkIds = getNetworkIds({network})

return createScaffoldMiddleware({
eth_chainId: networkIds.chainId,
net_version: networkIds.netId,
})
}
22 changes: 22 additions & 0 deletions app/scripts/controllers/network/enums.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,18 @@ const RSK = 'rsk'
const RSK_TESTNET = 'rsk_testnet'
const LOCALHOST = 'localhost'

const ETH_TICK = "ETH"
const POA_TICK = "POA"

const MAINNET_CHAINID = "0X01"
const ROPSTEN_CHAINID = "0x03"
const RINKEBY_CHAINID = "0x04"
const KOVAN_CHAINID = "0x2a"
const GOERLI_TESTNET_CHAINID = "0X5"
const POA_CHAINID = "0x63"
const DAI_CHAINID = "0x64"
const POA_SOKOL_CHAINID = "0x4D"

const POA_CODE = 99
const DAI_CODE = 100
const POA_SOKOL_CODE = 77
Expand Down Expand Up @@ -54,6 +66,16 @@ const chainTypes = {

module.exports = {
POA,
POA_TICK,
ETH_TICK,
MAINNET_CHAINID,
ROPSTEN_CHAINID,
RINKEBY_CHAINID,
KOVAN_CHAINID,
GOERLI_TESTNET_CHAINID,
POA_CHAINID,
DAI_CHAINID,
POA_SOKOL_CHAINID,
DAI,
POA_SOKOL,
MAINNET,
Expand Down
44 changes: 37 additions & 7 deletions app/scripts/controllers/network/network.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ const createMetamaskMiddleware = require('./createMetamaskMiddleware')
const createInfuraClient = require('./createInfuraClient')
const createJsonRpcClient = require('./createJsonRpcClient')
const createLocalhostClient = require('./createLocalhostClient')
const createPocketClient = require('./createPocketClient')
const { createSwappableProxy, createEventEmitterProxy } = require('swappable-obj-proxy')
const ethNetProps = require('eth-net-props')
const parse = require('url-parse')
Expand All @@ -36,6 +37,7 @@ const {
RSK_TESTNET_CODE,
} = require('./enums')
const INFURA_PROVIDER_TYPES = [ROPSTEN, RINKEBY, KOVAN, MAINNET]
const POCKET_PROVIDER_TYPES = [ROPSTEN, RINKEBY, KOVAN, MAINNET, POA, DAI, GOERLI_TESTNET, POA_SOKOL]

const env = process.env.METAMASK_ENV
const METAMASK_DEBUG = process.env.METAMASK_DEBUG
Expand All @@ -55,7 +57,8 @@ module.exports = class NetworkController extends EventEmitter {
// create stores
this.providerStore = new ObservableStore(providerConfig)
this.networkStore = new ObservableStore('loading')
this.store = new ComposedStore({ provider: this.providerStore, network: this.networkStore })
this.dProviderStore = new ObservableStore({dProvider: false})
this.store = new ComposedStore({ provider: this.providerStore, network: this.networkStore, dProviderStore: this.dProviderStore })
this.on('networkDidChange', this.lookupNetwork)
// provider and block tracker
this._provider = null
Expand Down Expand Up @@ -152,6 +155,16 @@ module.exports = class NetworkController extends EventEmitter {
return this.providerStore.getState()
}

getDProvider(){
return this.dProviderStore.getState().dProvider
}

setDProvider(key){
this.dProviderStore.updateState({
dProvider: key,
})
}

//
// Private
//
Expand All @@ -166,17 +179,28 @@ module.exports = class NetworkController extends EventEmitter {
const { type, rpcTarget } = opts
// infura type-based endpoints
const isInfura = INFURA_PROVIDER_TYPES.includes(type)
if (isInfura) {
this._configureInfuraProvider(opts)
// pocket type-based endpointes
const isPocket = POCKET_PROVIDER_TYPES.includes(type)

if (!isPocket && this.dProviderStore.getState().dProvider){
this.dProviderStore.updateState({
dProvider: false
})
}

if (isPocket && this.dProviderStore.getState().dProvider){
this._configurePocketProvider(opts)
} else if (isInfura) {
this._configureInfuraProvider(opts)
// other type-based rpc endpoints
} else if (type === POA) {
this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(POA_CODE)[0] })
this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(POA_CODE)[0] })
} else if (type === DAI) {
this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(DAI_CODE)[0] })
this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(DAI_CODE)[0] })
} else if (type === POA_SOKOL) {
this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(POA_SOKOL_CODE)[0] })
this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(POA_SOKOL_CODE)[0] })
} else if (type === GOERLI_TESTNET) {
this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(GOERLI_TESTNET_CODE)[0] })
this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(GOERLI_TESTNET_CODE)[0] })
} else if (type === CLASSIC) {
this._configureStandardProvider({ rpcUrl: ethNetProps.RPCEndpoints(CLASSIC_CODE)[0] })
} else if (type === RSK) {
Expand All @@ -199,6 +223,12 @@ module.exports = class NetworkController extends EventEmitter {
this._setNetworkClient(networkClient)
}

_configurePocketProvider ({ type }) {
log.info('NetworkController - configurePocketProvider', type)
const networkClient = createPocketClient({ network: type })
this._setNetworkClient(networkClient)
}

_configureLocalhostProvider () {
log.info('NetworkController - configureLocalhostProvider')
const networkClient = createLocalhostClient()
Expand Down
15 changes: 15 additions & 0 deletions app/scripts/metamask-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,7 @@ module.exports = class MetamaskController extends EventEmitter {
setCurrentCoin: this.setCurrentCoin.bind(this),
setUseBlockie: this.setUseBlockie.bind(this),
setCurrentLocale: this.setCurrentLocale.bind(this),
setDProvider: this.setDProvider.bind(this),
markAccountsFound: this.markAccountsFound.bind(this),
markPasswordForgotten: this.markPasswordForgotten.bind(this),
unMarkPasswordForgotten: this.unMarkPasswordForgotten.bind(this),
Expand Down Expand Up @@ -1750,6 +1751,20 @@ module.exports = class MetamaskController extends EventEmitter {
}
}

/**
* A method for setting a user's preference of decent provider
* @param {string} key - boolean for decentralized provider
* @param {Function} cb - A callback function called when complete.
*/
setDProvider (key, cb) {
try {
this.networkController.setDProvider(key)
cb(null)
} catch (err) {
cb(err)
}
}

/**
* A method for initializing storage the first time.
* @param {Object} initState - The default state to initialize with.
Expand Down
65 changes: 64 additions & 1 deletion old-ui/app/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,25 @@ const exportAsFile = require('./util').exportAsFile
const Modal = require('../../ui/app/components/modals/index').Modal
const ethNetProps = require('eth-net-props')
const { networks } = require('../../app/scripts/controllers/network/util')
const {
ROPSTEN,
RINKEBY,
KOVAN,
MAINNET,
POA,
DAI,
POA_SOKOL,
GOERLI_TESTNET,
} = require('../../app/scripts/controllers/network/enums')
const POCKET_PROVIDER_TYPES = [ROPSTEN, RINKEBY, KOVAN, MAINNET, POA, DAI, GOERLI_TESTNET, POA_SOKOL]

class ConfigScreen extends Component {

constructor (props) {
super(props)
this.state = {
loading: false,
dProvider: props.metamask.dProviderStore.dProvider
}
}

Expand All @@ -32,6 +44,12 @@ class ConfigScreen extends Component {
const metamaskState = state.metamask
const warning = state.warning

if(state.metamask.dProviderStore.dProvider != this.state.dProvider){
this.setState({
dProvider: this.props.metamask.dProviderStore.dProvider
})
}

return (
h('.flex-column.flex-grow', {
style: {
Expand Down Expand Up @@ -184,6 +202,32 @@ class ConfigScreen extends Component {
},
}),

h('p', {
style: {
fontFamily: 'Nunito Regular',
fontSize: '14px',
lineHeight: '18px',
},
}, [
'Switch to Decentralized Provider (Pocket)',
]),

h('input', {
type:'checkbox',
name:'pocket-checkbox',
checked: this.state.dProvider,
onChange: (event) => {
event.preventDefault()
this.toggleProvider()
},
}),

h('hr.horizontal-line', {
style: {
marginTop: '20px',
},
}),

h('div', {
style: {
marginTop: '20px',
Expand Down Expand Up @@ -233,6 +277,26 @@ class ConfigScreen extends Component {
)
}

toggleProvider(){
const isPocket = POCKET_PROVIDER_TYPES.includes(this.props.metamask.provider.type)
if (isPocket){
if (!this.state.dProvider){
this.props.dispatch(actions.setDProvider(true))
this.setState({
dProvider: true
})
} else {
this.props.dispatch(actions.setDProvider(false))
this.setState({
dProvider: false
})
}
this.props.dispatch(actions.setProviderType(this.props.metamask.provider.type))
} else {
alert("Pocket does not support this network, using centralized provider")
}
}

componentWillUnmount () {
this.props.dispatch(actions.displayWarning(''))
}
Expand Down Expand Up @@ -306,7 +370,6 @@ class ConfigScreen extends Component {
}, 'Delete'),
])
}

}

function mapStateToProps (state) {
Expand Down
Loading

0 comments on commit 5279197

Please sign in to comment.