Skip to content

Commit

Permalink
fix: require a configuration to be used when initializing the resolver
Browse files Browse the repository at this point in the history
BREAKING CHANGE: this removes the fallback hardcoded RPC URLs and will fail early when a wrong configuration (or none) is provided to `getResolver()`
  • Loading branch information
mirceanis committed Jan 24, 2020
1 parent b18fcf5 commit 3adc029
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 50 deletions.
26 changes: 26 additions & 0 deletions src/__tests__/config-tests.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { Resolver } from 'did-resolver'
import { getResolver } from '../ethr-did-resolver'

describe('getResolver', () => {
let addr = '0xd0dbe9d3698738f899ccd8ee27ff2347a7faa4dd'

it('throws when no configuration is provided', () => {
expect(() => { getResolver() })
.toThrow("EthrDIDResolver requires a provider configuration for at least one network")
})

it("throws when trying to resolve a non configured network", async () => {
const did = 'did:ethr:nonconf:' + addr
const ethr = getResolver({networks: [{name: "existent", rpcUrl: "http://localhost:7545"}]})
const resolver = new Resolver(ethr)
return await expect(resolver.resolve(did)).rejects.toThrow("No conf for networkId: nonconf")
})

it("throws when trying to resolve mainnet on a config with only private networks", async () => {
const did = 'did:ethr:' + addr
const ethr = getResolver({networks: [{name: "0x4", rpcUrl: "http://localhost:7545"}]})
const resolver = new Resolver(ethr)
return await expect(resolver.resolve(did)).rejects.toThrow("No conf for networkId: mainnet")
})

})
34 changes: 21 additions & 13 deletions src/__tests__/networks-tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,18 @@ import { Resolver } from 'did-resolver'
import { getResolver } from '../ethr-did-resolver'

describe('ethrResolver (alt-chains)', () => {
let addr, didResolver
let addr

beforeAll(async () => {
addr = '0xd0dbe9d3698738f899ccd8ee27ff2347a7faa4dd'
const ethr = getResolver()
didResolver = new Resolver(ethr)
})

describe('eth-testnets', () => {
it('resolves on ropsten', () => {
it('resolves on ropsten when configured', () => {
const did = 'did:ethr:ropsten:' + addr
return expect(didResolver.resolve(did)).resolves.toEqual({
const ethr = getResolver({networks: [{name: "ropsten", rpcUrl: "https://ropsten.infura.io/v3/6b734e0b04454df8a6ce234023c04f26"}]})
const resolver = new Resolver(ethr)
return expect(resolver.resolve(did)).resolves.toEqual({
'@context': 'https://w3id.org/did/v1',
id: did,
publicKey: [
Expand All @@ -33,9 +33,11 @@ describe('ethrResolver (alt-chains)', () => {
})
})

it('resolves on rinkeby', () => {
it('resolves on rinkeby when configured', () => {
const did = 'did:ethr:rinkeby:' + addr
return expect(didResolver.resolve(did)).resolves.toEqual({
const ethr = getResolver({networks: [{name: "rinkeby", rpcUrl: "https://rinkeby.infura.io/v3/6b734e0b04454df8a6ce234023c04f26"}]})
const resolver = new Resolver(ethr)
return expect(resolver.resolve(did)).resolves.toEqual({
'@context': 'https://w3id.org/did/v1',
id: did,
publicKey: [
Expand All @@ -55,9 +57,11 @@ describe('ethrResolver (alt-chains)', () => {
})
})

it('resolves on kovan', () => {
it('resolves on kovan when configured', () => {
const did = 'did:ethr:kovan:' + addr
return expect(didResolver.resolve(did)).resolves.toEqual({
const ethr = getResolver({networks: [{name: "kovan", rpcUrl: "https://kovan.infura.io/v3/6b734e0b04454df8a6ce234023c04f26"}]})
const resolver = new Resolver(ethr)
return expect(resolver.resolve(did)).resolves.toEqual({
'@context': 'https://w3id.org/did/v1',
id: did,
publicKey: [
Expand All @@ -77,9 +81,11 @@ describe('ethrResolver (alt-chains)', () => {
})
})

it('resolves on rsk', () => {
it('resolves on rsk when configured', () => {
const did = 'did:ethr:rsk:' + addr
return expect(didResolver.resolve(did)).resolves.toEqual({
const ethr = getResolver({networks: [{name: "rsk", rpcUrl: "https://did.rsk.co:4444"}]})
const resolver = new Resolver(ethr)
return expect(resolver.resolve(did)).resolves.toEqual({
'@context': 'https://w3id.org/did/v1',
id: did,
publicKey: [
Expand All @@ -99,9 +105,11 @@ describe('ethrResolver (alt-chains)', () => {
})
})

it.skip('resolves on rsk:testnet', () => {
it.skip('resolves on rsk:testnet when configured', () => {
const did = 'did:ethr:rsk:testnet:' + addr
return expect(didResolver.resolve(did)).resolves.toEqual({
const ethr = getResolver({networks: [{name: "rsk", rpcUrl: "https://did.testnet.rsk.co:4444"}]})
const resolver = new Resolver(ethr)
return expect(resolver.resolve(did)).resolves.toEqual({
'@context': 'https://w3id.org/did/v1',
id: did,
publicKey: [
Expand Down
42 changes: 39 additions & 3 deletions src/ethr-did-resolver.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import BN from 'bn.js'
import EthContract from 'ethjs-contract'
import DidRegistryContract from '../contracts/ethr-did-registry.json'
import { Buffer } from 'buffer'
import networksJson from './networks.json'
const REGISTRY = '0xdca7ef03e98e0dc2b855be647c39abe984fcf21b'

function bytes32toString (bytes32) {
Expand Down Expand Up @@ -171,13 +170,18 @@ function configureProvider (conf = {}) {
return conf.provider
} else if (conf.web3) {
return conf.web3.currentProvider
} else if (conf.rpcUrl) {
return new HttpProvider(conf.rpcUrl)
} else {
return new HttpProvider(conf.rpcUrl || 'https://mainnet.infura.io/ethr-did')
return null
}
}

function configureNetwork (conf = {}) {
const provider = configureProvider(conf)
if (provider === null) {
return null
}
const eth = new Eth(provider)
const registryAddress = conf.registry || REGISTRY
const DidReg = new EthContract(eth)(DidRegistryContract)
Expand All @@ -191,19 +195,51 @@ function configureNetworks (networksConf = []) {
for (let i = 0; i < networksConf.length; i++) {
const net = networksConf[i]
networks[net.name] = configureNetwork(net)
if (networks[net.name] === null) {
console.warn(`invalid configuration for ${net.name}`)
}
}
return networks
}

function validateNetworksAgainstConfig(networks = {}, conf = {}) {
if (conf.provider || conf.web3 || conf.rpcUrl) {
if (networks["mainnet"] === null) {
throw new Error("Ethereum provider configuration for mainnet was attempted but no valid configuration was provided.")
}
}

//if conf.networks => validate each network in the input was actually configured
if (conf && conf.networks) {
for (const expectedNet of conf.networks) {
if (!networks[expectedNet.name]) {
throw new Error(`Ethereum provider configuration for ${expectedNet.name} was attempted but no valid configuration was provided`)
}
}
}

let count = 0
for (const net of Object.keys(networks)) {
if (networks[net] !== null) {
count++
}
}

if (count == 0) {
throw new Error('EthrDIDResolver requires a provider configuration for at least one network')
}
}

function getResolver (conf = {}) {
const logDecoder = abi.logDecoder(DidRegistryContract, false)

const networks = {
mainnet: configureNetwork(conf),
...configureNetworks(networksJson),
...configureNetworks(conf.networks)
}

validateNetworksAgainstConfig(networks, conf)

const lastChanged = async (identity, networkId) => {
const result = await networks[networkId].didReg.changed(identity)
if (result) {
Expand Down
34 changes: 0 additions & 34 deletions src/networks.json

This file was deleted.

0 comments on commit 3adc029

Please sign in to comment.