diff --git a/lib/modules/coverage/contract_source.js b/lib/modules/coverage/contract_source.js index 0b91ca7da..7d2bf8ec8 100644 --- a/lib/modules/coverage/contract_source.js +++ b/lib/modules/coverage/contract_source.js @@ -1,3 +1,5 @@ +const util = require('util'); + const SourceMap = require('./source_map'); class ContractSource { @@ -68,18 +70,29 @@ class ContractSource { var bytecodeIdx = 0; var pc = 0; var instructions = 0; + var previousSourceMap = null; do { + let sourceMap; + + if(previousSourceMap === null) { + sourceMap = new SourceMap(sourceMaps[instructions]); + } else { + sourceMap = previousSourceMap.createRelativeTo(sourceMaps[instructions]); + } + var instruction = opcodes[bytecodeIdx]; var length = this._instructionLength(instruction); bytecodeMapping[pc] = { instruction: instruction, - sourceMap: sourceMaps[instructions], + sourceMap: sourceMap, + jump: sourceMap.jump, seen: false }; pc += length; instructions++; bytecodeIdx += (length > 1) ? 2 : 1; + previousSourceMap = sourceMap; } while(bytecodeIdx < opcodes.length); } } @@ -89,7 +102,7 @@ class ContractSource { if(!this.ast || !this.contractBytecode) throw new Error('Error generating coverage: solc output was not assigned'); var coverage = { - code: this.body.split("\n"), + code: this.body.trim().split("\n"), l: {}, path: this.file, s: {}, @@ -111,10 +124,10 @@ class ContractSource { var markLocations = []; switch(node.nodeType) { - case 'Identifier': + case 'Assignment': case 'Literal': - case 'VariableDeclaration': case 'PragmaDirective': + case 'VariableDeclaration': // We don't need to do anything with these. Just carry on. break; @@ -166,8 +179,9 @@ class ContractSource { node.src = node.expression.src; // falls through - case 'Assignment': case 'ExpressionStatement': + case 'Identifier': + case 'UnaryOperation': coverage.s[node.id] = 0; location = this.sourceMapToLocations(node.src); @@ -219,8 +233,43 @@ class ContractSource { markLocations = [location]; break; + case 'ForStatement': + // For statements will be a bit of a special case. We want to count the body + // iterations but we only want to count the for loop being hit once. Because + // of this, we cover the initialization on the node. + let sourceMap = new SourceMap(node.src); + let bodySourceMap = new SourceMap(node.body.src); + let forLoopDeclaration = sourceMap.subtract(bodySourceMap).toString(); + let initializationLocation = this.sourceMapToLocations(node.initializationExpression.src); + + location = this.sourceMapToLocations(forLoopDeclaration); + + coverage.s[node.id] = 0; + coverage.statementMap[node.id] = location; + + if(!sourceMapToNodeType[node.initializationExpression.src]) sourceMapToNodeType[node.initializationExpression.src] = []; + sourceMapToNodeType[node.initializationExpression.src].push({type: 's', id: node.id, body: {loc: location}}); + + console.dir(node); + + children = node.body.statements; + markLocations = [initializationLocation]; + break; + + case 'VariableDeclarationStatement': + location = this.sourceMapToLocations(node.src); + + coverage.s[node.id] = 0; + coverage.statementMap[node.id] = location; + markLocations = [location]; + + if(!sourceMapToNodeType[node.src]) sourceMapToNodeType[node.src] = []; + sourceMapToNodeType[node.src].push({type: 's', id: node.id, body: {loc: location}, foo: 'bar'}); + + break; + default: - // console.log(`Don't know how to handle node type ${node.nodeType}`); + console.log(`Don't know how to handle node type ${node.nodeType}`); break; } @@ -243,23 +292,26 @@ class ContractSource { contractMatches = trace.structLogs.every((step) => { return bytecode[step.pc]; }); if(!contractMatches) break; + console.log(sourceMapToNodeType); + trace.structLogs.forEach((step) => { step = bytecode[step.pc]; if(!step.sourceMap || step.sourceMap == '') return; - var nodes = sourceMapToNodeType[step.sourceMap]; + let sourceMapString = step.sourceMap.toString(this.id); + var nodes = sourceMapToNodeType[sourceMapString]; + if(step.sourceMap.offset == 189) console.log(nodes); if(!nodes) return; - var recordedLineHit = false; - nodes.forEach((node) => { - if(node.body && node.body.loc && !recordedLineHit) { + // Skip duplicate function reports by only reporting when there is a jump. + if(node.type == 'f' && step.jump) return; + + if(node.body && node.body.loc) { for(var line = node.body.loc.start.line; line <= node.body.loc.end.line; line++) { coverage.l[line]++; } - - recordedLineHit = true; } if(node.type != 'b') coverage[node.type][node.id]++; diff --git a/lib/modules/coverage/index.js b/lib/modules/coverage/index.js index 5de8755c9..93bc8f183 100644 --- a/lib/modules/coverage/index.js +++ b/lib/modules/coverage/index.js @@ -10,6 +10,7 @@ web3.extend({ methods: [{name: 'traceTransaction', call: 'debug_traceTransaction', params: 2}] }); + class CodeCoverage { constructor(embark, _options) { this.events = embark.events; @@ -21,6 +22,7 @@ class CodeCoverage { embark.events.on('block:header', this.runSolc.bind(this)); this.seenTransactions = {}; + this.coverageReport = {}; var self = this; diff --git a/lib/modules/coverage/source_map.js b/lib/modules/coverage/source_map.js index 84215d8e5..35696093d 100644 --- a/lib/modules/coverage/source_map.js +++ b/lib/modules/coverage/source_map.js @@ -1,29 +1,64 @@ +class EmptySourceMap { + static createRelativeTo(sourceMapString) { + if(sourceMapString == '') return EmptySourceMap; + + return new SourceMap(sourceMapString); + } + + static toString() { + return ''; + } +} + class SourceMap { - constructor(sourceMapStringOrOffset, length, id) { + constructor(sourceMapStringOrOffset, length, id, jump) { if(typeof sourceMapStringOrOffset == 'string') { - let [offset, length, id, ..._rest] = sourceMapStringOrOffset.split(":"); + let [offset, length, id, jump] = sourceMapStringOrOffset.split(":"); this.offset = parseInt(offset, 10); this.length = parseInt(length, 10); if(id) this.id = parseInt(id, 10); + this.jump = jump; } else { this.offset = sourceMapStringOrOffset; this.length = length; this.id = id; + this.jump = jump; } } - subtract(sourceMap) { - return new SourceMap(this.offset, sourceMap.offset - this.offset); + createRelativeTo(sourceMapString) { + if(sourceMapString == '' || sourceMapString == undefined) return EmptySourceMap; + + let [offset, length, id, jump] = sourceMapString.split(":"); + + (offset == '') ? offset = this.offset : offset = parseInt(offset, 10); + (id == '' || id == undefined) ? id = this.id : id = parseInt(id, 10); + length = parseInt(length, 10); + + return new SourceMap(offset, length, id, jump); } - toString() { - var parts = [this.offset, this.length]; - if(this.id) parts.push(this.id); + subtract(sourceMap) { + return new SourceMap(this.offset, sourceMap.offset - this.offset, this.id, this.jump); + } + + toString(defaultId) { + let parts = [this.offset, this.length]; + + if(this.id !== undefined && this.id != '') { + parts.push(this.id) + } else if(defaultId !== undefined) { + parts.push(defaultId); + } return parts.join(':'); } + + static empty() { + return EmptySourceMap; + } } module.exports = SourceMap; diff --git a/lib/tests/test.js b/lib/tests/test.js index 1e7cc774f..8f239c5ad 100644 --- a/lib/tests/test.js +++ b/lib/tests/test.js @@ -112,7 +112,6 @@ class Test { compileOnceOnly: true }); this.events.request('deploy:setGasLimit', 6000000); - this.engine.startService("codeCoverage"); } init(callback) { @@ -139,6 +138,7 @@ class Test { this.engine.startService("codeRunner"); this.initDeployServices(); this.engine.startService("codeGenerator"); + this.engine.startService("codeCoverage"); if (this.options.node === 'embark') { return this.engine.ipc.connect((err) => { diff --git a/test/coverage.js b/test/coverage.js index 5c2f01096..74141d36c 100644 --- a/test/coverage.js +++ b/test/coverage.js @@ -162,10 +162,10 @@ contract x { var bytecode = contractSource.contractBytecode['x']; - assert.deepEqual({instruction: 'PUSH1', sourceMap: '26:487:0:-', seen: false}, bytecode[0]); - assert.deepEqual({instruction: 'PUSH1', sourceMap: '', seen: false}, bytecode[2]); - assert.deepEqual({instruction: 'MSTORE', sourceMap: '', seen: false}, bytecode[4]); - assert.deepEqual({instruction: 'PUSH1', sourceMap: '', seen: false}, bytecode[5]); + assert.deepEqual({instruction: 'PUSH1', sourceMap: {offset: 26, length: 487, id: 0}, seen: false}, bytecode[0]); + assert.deepEqual({instruction: 'PUSH1', sourceMap: SourceMap.empty(), seen: false}, bytecode[2]); + assert.deepEqual({instruction: 'MSTORE', sourceMap: SourceMap.empty(), seen: false}, bytecode[4]); + assert.deepEqual({instruction: 'PUSH1', sourceMap: SourceMap.empty(), seen: false}, bytecode[5]); done(); }); @@ -193,6 +193,7 @@ contract x { var trace = JSON.parse(loadFixture('geth-debugtrace-output-h-5.json')); var coverage = cs.generateCodeCoverage(trace); + assert.exists(coverage); done(); }); @@ -213,7 +214,7 @@ contract x { // In the fixture, the branch has an ID of 61, and the function has the // ID of 63 assert.deepEqual([1,1], coverage.b['61']); - assert.equal(2, coverage.f['63']); + assert.equal(4, coverage.f['63']); done(); }); @@ -234,4 +235,26 @@ describe('SourceMap', () => { done(); }); }); + + describe('#createRelativeTo', () => { + it('should return an empty source map on an empty string', (done) => { + var sm1 = new SourceMap('192:10:0'); + var sm2 = sm1.createRelativeTo(''); + + assert.equal('', sm2.toString()); + + done(); + }); + + it('should return the correct source map on a relative string', (done) => { + var sm1 = new SourceMap('192:10:0'); + var sm2 = sm1.createRelativeTo(':14'); + + assert.equal(192, sm2.offset); + assert.equal(14, sm2.length); + assert.equal(0, sm2.id); + + done(); + }); + }); }); diff --git a/test_apps/coverage_app/.gitignore b/test_apps/coverage_app/.gitignore new file mode 100644 index 000000000..9fb2a32c1 --- /dev/null +++ b/test_apps/coverage_app/.gitignore @@ -0,0 +1,6 @@ +.embark/ +node_modules/ +dist/ +config/production/password +config/livenet/password +coverage/ diff --git a/test_apps/coverage_app/app/components/blockchain.js b/test_apps/coverage_app/app/components/blockchain.js new file mode 100644 index 000000000..b9e5e313c --- /dev/null +++ b/test_apps/coverage_app/app/components/blockchain.js @@ -0,0 +1,91 @@ +import EmbarkJS from 'Embark/EmbarkJS'; +import SimpleStorage from 'Embark/contracts/SimpleStorage'; +import React from 'react'; +import { Form, FormGroup, FormControl, HelpBlock, Button } from 'react-bootstrap'; + +class Blockchain extends React.Component { + + constructor(props) { + super(props); + + this.state = { + valueSet: 10, + valueGet: "", + logs: [] + } + } + + handleChange(e){ + this.setState({valueSet: e.target.value}); + } + + setValue(e){ + e.preventDefault(); + + var value = parseInt(this.state.valueSet, 10); + + // If web3.js 1.0 is being used + if (EmbarkJS.isNewWeb3()) { + SimpleStorage.methods.set(value).send({from: web3.eth.defaultAccount}); + this._addToLog("SimpleStorage.methods.set(value).send({from: web3.eth.defaultAccount})"); + } else { + SimpleStorage.set(value); + this._addToLog("#blockchain", "SimpleStorage.set(" + value + ")"); + } + } + + getValue(e){ + e.preventDefault(); + + if (EmbarkJS.isNewWeb3()) { + SimpleStorage.methods.get().call() + .then(_value => this.setState({valueGet: _value})) + this._addToLog("SimpleStorage.methods.get(console.log)"); + } else { + SimpleStorage.get() + .then(_value => this.setState({valueGet: _value})); + this._addToLog("SimpleStorage.get()"); + } + } + + _addToLog(txt){ + this.state.logs.push(txt); + this.setState({logs: this.state.logs}); + } + + render(){ + return ( +

1. Set the value in the blockchain

+
+ + this.handleChange(e)} /> + + Once you set the value, the transaction will need to be mined and then the value will be updated on the blockchain. + +
+ +

2. Get the current value

+
+ + current value is {this.state.valueGet} + + Click the button to get the current value. The initial value is 100. + +
+ +

3. Contract Calls

+

Javascript calls being made:

+
+ { + this.state.logs.map((item, i) =>

{item}

) + } +
+
+ ); + } + } + + export default Blockchain; \ No newline at end of file diff --git a/test_apps/coverage_app/app/components/ens.js b/test_apps/coverage_app/app/components/ens.js new file mode 100644 index 000000000..0167bfcdc --- /dev/null +++ b/test_apps/coverage_app/app/components/ens.js @@ -0,0 +1,172 @@ +/*global web3*/ +import EmbarkJS from 'Embark/EmbarkJS'; +import React from 'react'; +import { Alert, Form, FormGroup, FormControl, Button } from 'react-bootstrap'; + +window.EmbarkJS = EmbarkJS; + +class ENS extends React.Component { + + constructor(props) { + super(props); + + this.state = { + valueResolve: 'embark.eth', + responseResolve: null, + isResolveError: false, + valueLookup: '', + responseLookup: null, + isLookupError: false, + valueRegister: '', + addressRegister: '', + responseRegister: null, + isRegisterError: false, + embarkLogs: [] + }; + } + + componentDidMount() { + EmbarkJS.onReady(() => { + if (!web3.eth.defaultAccount) { + this.setState({ + globalError: 'There is currently no default account. If Metamask is active, please sign in or deactivate it.' + }); + } + this.setState({ + addressRegister: web3.eth.defaultAccount, + valueLookup: web3.eth.defaultAccount + }) + }); + } + + handleChange(stateName, e) { + this.setState({ [stateName]: e.target.value }); + } + + registerSubDomain(e) { + e.preventDefault(); + const self = this; + const embarkLogs = this.state.embarkLogs; + embarkLogs.push(`EmbarkJS.Names.registerSubDomain('${this.state.valueRegister}', '${this.state.addressRegister}', console.log)`); + this.setState({ + embarkLogs: embarkLogs + }); + + EmbarkJS.Names.registerSubDomain(this.state.valueRegister, this.state.addressRegister, (err, transaction) => { + const message = err ? err : `Successfully registered "${this.state.valueRegister}" with ${transaction.gasUsed} gas`; + self.setState({ + responseRegister: message, + isRegisterError: !!err + }); + }); + } + + resolveName(e) { + e.preventDefault(); + const embarkLogs = this.state.embarkLogs; + embarkLogs.push(`EmbarkJS.Names.resolve('${this.state.valueResolve}', console.log)`); + + this.setState({ + embarkLogs: embarkLogs + }); + EmbarkJS.Names.resolve(this.state.valueResolve, (err, result) => { + if (err) { + return this.setState({ + responseResolve: err.message || err, + isResolveError: true + }); + } + this.setState({ + responseResolve: result, + isResolveError: false + }); + }); + } + + lookupAddress(e) { + e.preventDefault(); + const embarkLogs = this.state.embarkLogs; + embarkLogs.push(`EmbarkJS.Names.resolve('${this.state.valueLookup}', console.log)`); + + this.setState({ + embarkLogs: embarkLogs + }); + EmbarkJS.Names.lookup(this.state.valueLookup, (err, result) => { + if (err) { + return this.setState({ + responseLookup: err.message || err, + isLookupError: true + }); + } + this.setState({ + responseLookup: result, + isLookupError: false + }); + }); + } + + render() { + return ( + {this.state.globalError && {this.state.globalError}} +

Resolve a name

+
+ + {this.state.responseResolve && + + Resolved address: {this.state.responseResolve} + } + this.handleChange('valueResolve', e)}/> + + +
+ +

Lookup an address

+
+ + {this.state.responseLookup && + + Looked up domain: {this.state.responseLookup} + } + this.handleChange('valueLookup', e)}/> + + +
+ +

Register subdomain for embark

+
+ + {this.state.responseRegister && + + {this.state.responseRegister} + } + this.handleChange('valueRegister', e)}/> + this.handleChange('addressRegister', e)}/> + + +
+ +

Embark Calls

+

Javascript calls being made:

+
+ { + this.state.embarkLogs.map((item, i) =>

{item}

) + } +
+
+ ); + } +} + +export default ENS; diff --git a/test_apps/coverage_app/app/components/storage.js b/test_apps/coverage_app/app/components/storage.js new file mode 100644 index 000000000..a3295a38e --- /dev/null +++ b/test_apps/coverage_app/app/components/storage.js @@ -0,0 +1,258 @@ +import EmbarkJS from 'Embark/EmbarkJS'; +import React from 'react'; +import {Alert, Form, FormGroup, FormControl, HelpBlock, Button} from 'react-bootstrap'; + +class Storage extends React.Component { + + constructor(props) { + super(props); + + this.state = { + textToSave: 'hello world!', + generatedHash: '', + loadText: '', + storedText: '', + fileToUpload: null, + fileHash: '', + imageToDownload: '', + url: '', + logs: [], + storageError: '', + valueRegister: '', + valueResolver: '', + }; + } + + handleChange(e, name) { + this.state[name] = e.target.value; + this.setState(this.state); + } + + handleFileUpload(e) { + this.setState({fileToUpload: [e.target]}); + } + + addToLog(txt) { + this.state.logs.push(txt); + this.setState({logs: this.state.logs}); + } + + setText(e) { + e.preventDefault(); + + EmbarkJS.Storage.saveText(this.state.textToSave) + .then((hash) => { + this.setState({ + generatedHash: hash, + loadText: hash, + storageError: '' + }); + this.addToLog("EmbarkJS.Storage.saveText('" + this.state.textToSave + "').then(function(hash) { })"); + }) + .catch((err) => { + if (err) { + this.setState({storageError: err.message}); + console.log("Storage saveText Error => " + err.message); + } + }); + } + + loadHash(e) { + e.preventDefault(); + + EmbarkJS.Storage.get(this.state.loadText) + .then((content) => { + this.setState({storedText: content, storageError: ''}); + this.addToLog("EmbarkJS.Storage.get('" + this.state.loadText + "').then(function(content) { })"); + }) + .catch((err) => { + if (err) { + this.setState({storageError: err.message}); + console.log("Storage get Error => " + err.message); + } + }); + } + + uploadFile(e) { + e.preventDefault(); + + EmbarkJS.Storage.uploadFile(this.state.fileToUpload) + .then((hash) => { + this.setState({ + fileHash: hash, + imageToDownload: hash, + storageError: '' + }); + this.addToLog("EmbarkJS.Storage.uploadFile(this.state.fileToUpload).then(function(hash) { })"); + }) + .catch((err) => { + if (err) { + this.setState({storageError: err.message}); + console.log("Storage uploadFile Error => " + err.message); + } + }); + } + + loadFile(e) { + let _url = EmbarkJS.Storage.getUrl(this.state.imageToDownload); + this.setState({url: _url}); + this.addToLog("EmbarkJS.Storage.getUrl('" + this.state.imageToDownload + "')"); + } + + ipnsRegister(e) { + e.preventDefault(); + this.setState({ registering: true, responseRegister: false }); + this.addToLog("EmbarkJS.Names.register(this.state.ipfsHash).then(function(hash) { })"); + EmbarkJS.Names.register(this.state.valueRegister, (err, name) => { + let responseRegister; + let isRegisterError = false; + if (err) { + isRegisterError = true; + responseRegister = "Name Register Error: " + (err.message || err) + } else { + responseRegister = name; + } + + this.setState({ + registering: false, + responseRegister, + isRegisterError + }); + }); + } + + ipnsResolve(e) { + e.preventDefault(); + this.setState({ resolving: true, responseResolver: false }); + this.addToLog("EmbarkJS.Names.resolve(this.state.ipnsName, function(err, path) { })"); + EmbarkJS.Names.resolve(this.state.valueResolver, (err, path) => { + let responseResolver; + let isResolverError = false; + if (err) { + isResolverError = true; + responseResolver = "Name Resolve Error: " + (err.message || err) + } else { + responseResolver = path; + } + + this.setState({ + resolving: false, + responseResolver, + isResolverError + }); + }); + } + + render() { + return + { + !this.props.enabled ? + + The node you are using does not support IPFS. Please ensure CORS is setup for the IPFS + node. + : '' + } + { + this.state.storageError !== '' ? + {this.state.storageError} + : '' + } +

Save text to storage

+
+ + this.handleChange(e, 'textToSave')}/> + + generated Hash: {this.state.generatedHash} + +
+ +

Load text from storage given an hash

+
+ + this.handleChange(e, 'loadText')}/> + + result: {this.state.storedText} + +
+ +

Upload file to storage

+
+ + this.handleFileUpload(e)}/> + + generated hash: {this.state.fileHash} + +
+ +

Get file or image from storage

+
+ + this.handleChange(e, 'imageToDownload')}/> + + file available at: {this.state.url} + + +
+ +

Register to IPNS

+
+ + this.handleChange(e, 'valueRegister')}/> + + It will take around 1 minute + {this.state.responseRegister && + + {this.state.responseRegister} + } + +
+ +

Resolve name

+
+ + this.handleChange(e, 'valueResolver')}/> + + It will take around 1 minute + {this.state.responseResolver && + + {this.state.responseResolver} + } + +
+ + +

Javascript calls being made:

+
+

EmbarkJS.Storage.setProvider('ipfs',{'{'}server: 'localhost', port: '5001'{'}'})

+ { + this.state.logs.map((item, i) =>

{item}

) + } +
+
; + } +} + +export default Storage; diff --git a/test_apps/coverage_app/app/components/whisper.js b/test_apps/coverage_app/app/components/whisper.js new file mode 100644 index 000000000..3c056bf21 --- /dev/null +++ b/test_apps/coverage_app/app/components/whisper.js @@ -0,0 +1,118 @@ +import EmbarkJS from 'Embark/EmbarkJS'; +import React from 'react'; +import {Alert, Form, FormGroup, FormControl, Button} from 'react-bootstrap'; + +class Whisper extends React.Component { + + constructor (props) { + super(props); + + this.state = { + listenTo: '', + channel: '', + message: '', + subscribedChannels: [], + messageList: [], + logs: [] + }; + } + + handleChange (e, name) { + this.state[name] = e.target.value; + this.setState(this.state); + } + + sendMessage (e) { + e.preventDefault(); + EmbarkJS.Messages.sendMessage({topic: this.state.channel, data: this.state.message}); + this.addToLog("EmbarkJS.Messages.sendMessage({topic: '" + this.state.channel + "', data: '" + this.state.message + "'})"); + } + + listenToChannel (e) { + e.preventDefault(); + + const subscribedChannels = this.state.subscribedChannels; + subscribedChannels.push(Subscribed to {this.state.listenTo}. Now try sending a message); + this.setState({ + subscribedChannels + }); + + EmbarkJS.Messages.listenTo({topic: [this.state.listenTo]}, (error, message) => { + const messageList = this.state.messageList; + if (error) { + messageList.push(Error: {error}); + } else { + messageList.push(Channel: {message.topic} | Message: {message.data}); + } + this.setState({ + messageList + }); + }); + + this.addToLog("EmbarkJS.Messages.listenTo({topic: ['" + this.state.listenTo + "']}).then(function(message) {})"); + } + + addToLog (txt) { + this.state.logs.push(txt); + this.setState({logs: this.state.logs}); + } + + render () { + return ( + + { + !this.props.enabled ? + + The node you are using does not support Whisper + The node uses an unsupported version of Whisper + : '' + } +

Listen To channel

+
+ + this.handleChange(e, 'listenTo')}/> + +
+ {this.state.subscribedChannels.map((item, i) =>

{item}

)} +
+

messages received:

+
+ {this.state.messageList.map((item, i) =>

{item}

)} +
+
+
+ +

Send Message

+
+ + this.handleChange(e, 'channel')}/> + this.handleChange(e, 'message')}/> + + +
+ +

Javascript calls being made:

+
+

EmbarkJS.Messages.setProvider('whisper')

+ { + this.state.logs.map((item, i) =>

{item}

) + } +
+
+ ); + } +} + +export default Whisper; diff --git a/test_apps/coverage_app/app/dapp.css b/test_apps/coverage_app/app/dapp.css new file mode 100644 index 000000000..401124e86 --- /dev/null +++ b/test_apps/coverage_app/app/dapp.css @@ -0,0 +1,57 @@ + +div { + margin: 15px; +} + +.logs { + background-color: black; + font-size: 14px; + color: white; + font-weight: bold; + padding: 10px; + border-radius: 8px; +} + +.tab-content { + border-left: 1px solid #ddd; + border-right: 1px solid #ddd; + border-bottom: 1px solid #ddd; + padding: 10px; + margin: 0px; +} + +.nav-tabs { + margin-bottom: 0; +} + +.status-offline { + vertical-align: middle; + margin-left: 5px; + margin-top: 4px; + width: 12px; + height: 12px; + background: red; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + border-radius: 10px; +} + +.status-online { + vertical-align: middle; + margin-left: 5px; + margin-top: 4px; + width: 12px; + height: 12px; + background: mediumseagreen; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + border-radius: 10px; +} + +input.form-control { + margin-right: 5px; +} + +.alert-result { + margin-left: 0; +} diff --git a/test_apps/coverage_app/app/dapp.js b/test_apps/coverage_app/app/dapp.js new file mode 100644 index 000000000..c48ab0bdb --- /dev/null +++ b/test_apps/coverage_app/app/dapp.js @@ -0,0 +1,92 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import {Tabs, Tab} from 'react-bootstrap'; + +import EmbarkJS from 'Embark/EmbarkJS'; +import Blockchain from './components/blockchain'; +import Whisper from './components/whisper'; +import Storage from './components/storage'; +import ENS from './components/ens'; + +import './dapp.css'; + +class App extends React.Component { + + constructor(props) { + super(props); + + this.handleSelect = this.handleSelect.bind(this); + + this.state = { + activeKey: 1, + whisperEnabled: false, + storageEnabled: false, + ensEnabled: false + }; + } + + componentDidMount() { + EmbarkJS.onReady(() => { + if (EmbarkJS.isNewWeb3()) { + EmbarkJS.Messages.Providers.whisper.getWhisperVersion((err, _version) => { + if (err) { + return console.log(err); + } + this.setState({whisperEnabled: true}); + }); + } else { + if (EmbarkJS.Messages.providerName === 'whisper') { + EmbarkJS.Messages.getWhisperVersion((err, _version) => { + if (err) { + return console.log(err); + } + this.setState({whisperEnabled: true}); + }); + } + } + this.setState({ + storageEnabled: EmbarkJS.Storage.isAvailable(), + ensEnabled: EmbarkJS.Names.isAvailable(), + ensNameSystems: EmbarkJS.Names.currentNameSystems + }); + }); + } + + _renderStatus(title, available) { + let className = available ? 'pull-right status-online' : 'pull-right status-offline'; + return + {title} + + ; + } + + handleSelect(key) { + if (key === 2) { + EmbarkJS.Names.setProvider('ipns', {server: 'localhost', port: '5001'}); + } else if (key === 4) { + EmbarkJS.Names.currentNameSystems = this.state.ensNameSystems + } + this.setState({ activeKey: key }); + } + + render() { + return (

Embark - Usage Example

+ + + + + + + + + + + + + + +
); + } +} + +ReactDOM.render(, document.getElementById('app')); diff --git a/test_apps/coverage_app/app/images/.gitkeep b/test_apps/coverage_app/app/images/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test_apps/coverage_app/app/index.html b/test_apps/coverage_app/app/index.html new file mode 100644 index 000000000..55521af61 --- /dev/null +++ b/test_apps/coverage_app/app/index.html @@ -0,0 +1,12 @@ + + + Embark - SimpleStorage Demo + + + + +
+
+ + + diff --git a/test_apps/coverage_app/chains.json b/test_apps/coverage_app/chains.json new file mode 100644 index 000000000..6030083b1 --- /dev/null +++ b/test_apps/coverage_app/chains.json @@ -0,0 +1,1574 @@ +{ + "0x2e2fd8239472c00db30585977fb1aee3fa6da44b99a56523df8d68c34c64d1e0": { + "contracts": { + "0xa72e15b4fc637528e678fdcab66f178b753f609a6d2a66564f1676fde4d51ed3": { + "name": "SimpleStorage", + "address": "0x163AE618000f2438cb199FA89220C949d88664f9" + } + } + }, + "0x47e33b21d55c6de09853d5dfaea0530f495dc9b607f9ed8b75caf27198eda3a8": { + "contracts": { + "0x5ac8e85c3107bd018a1d2289dd1a75698bd7ac36349d368323de17b68f2d444b": { + "name": "SimpleStorage", + "address": "0x0FA23B382dAb5e95866CB0621bB8469086443fbe" + } + } + }, + "0x259b3eb66cf5e5d5cfe7530d31edd7465284b0015be4629564897c323cebbd96": { + "contracts": { + "0x5ac8e85c3107bd018a1d2289dd1a75698bd7ac36349d368323de17b68f2d444b": { + "name": "SimpleStorage", + "address": "0x5DC0CD5E6E507627E2DB22722D2445341e78B7a8" + } + } + }, + "0xeeb5bc5da64b6039bdd3999c40d44bfea0b81653dcfe3b6596a2c06e1109a84b": { + "contracts": { + "0x5ac8e85c3107bd018a1d2289dd1a75698bd7ac36349d368323de17b68f2d444b": { + "name": "SimpleStorage", + "address": "0xF4747a8Ea23D179825E3e5BC313F2dE5A0d92140" + } + } + }, + "0x0f2ab9040d02bfec297fbae17e4592b0d662dbe4a83022606d67989286fd7c69": { + "contracts": { + "0x5ac8e85c3107bd018a1d2289dd1a75698bd7ac36349d368323de17b68f2d444b": { + "name": "SimpleStorage", + "address": "0x0f20de065908fFd26Bbf19cD1446243833210ea8" + } + } + }, + "0xd3265d478339c28e6d308753d03ec64a1df11eabff66736eede596e84fab8857": { + "contracts": { + "0x5ac8e85c3107bd018a1d2289dd1a75698bd7ac36349d368323de17b68f2d444b": { + "name": "SimpleStorage", + "address": "0xFE2dBfF60c0F9994c2325B1B9Ef65CAd9290F551" + } + } + }, + "0x532d260855b2e397ec6aa91a1be1f3688b09012e0ff122f6ae47eaec51897adf": { + "contracts": { + "0x5ac8e85c3107bd018a1d2289dd1a75698bd7ac36349d368323de17b68f2d444b": { + "name": "SimpleStorage", + "address": "0x5fF3705E109eB5385d992943EeD804eb0a968CC4" + } + } + }, + "0x7e004d4b15ebe4c2ff1f9b0209d158fd8ac88fdc148ada804993714f20fcd798": { + "contracts": { + "0x5ac8e85c3107bd018a1d2289dd1a75698bd7ac36349d368323de17b68f2d444b": { + "name": "SimpleStorage", + "address": "0x34a988b55c1a828E51D95492bC0A126994C3A915" + } + } + }, + "0x846b492f55bc56e6c040f500bb5fe9a7f2928f38e0b1fa2705cf9ef8b8b2f922": { + "contracts": { + "0x5ac8e85c3107bd018a1d2289dd1a75698bd7ac36349d368323de17b68f2d444b": { + "name": "SimpleStorage", + "address": "0x2d8339a551D57B68f220817A19dF4EC82dD6d1a6" + } + } + }, + "0x6d4d731f0ffd5ced1bf510b277fa232d053130acc49d921c2d1e234b1ffcbb04": { + "contracts": { + "0x5ac8e85c3107bd018a1d2289dd1a75698bd7ac36349d368323de17b68f2d444b": { + "name": "SimpleStorage", + "address": "0xa0D6B5d6956b79975e5c3c40d70182854751d47e" + } + } + }, + "0x402038a4a00285fcc119adb1b3d57a009c2d3dcc6f97089c2a1ee8510acb9663": { + "contracts": { + "0x5ac8e85c3107bd018a1d2289dd1a75698bd7ac36349d368323de17b68f2d444b": { + "name": "SimpleStorage", + "address": "0xC68e0faeDFA32cE567F86EC46FF2303241eC0195" + } + } + }, + "0x6c7bae11dcffc09f71b08dd546a4be112b70998489112364a963574e264e9bb9": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x020d014a23930754d519B173CceddD3c5378895C" + } + } + }, + "0x28e023b9910f808b60d42fca47487e9f01ea551960c21ca6e37a4f329208f1bb": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x7E23277e0C5d8Bf7DF45d51924049CEA5dd8AC6e" + } + } + }, + "0xd028ddc43f63250dced6d43ee6bed4a4c763eb0d7ed7521bab21ab88278df3d9": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x2aFCC98F9864AE6F5B5934066BC546b9526076f7" + } + } + }, + "0xaaf1b5630c1ba6e320f5dcf7ebbaebec1bfd3ff1f37631a6fe6656027eba7e25": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xafB6d4F66A94925fb16962c82C62C4aAbcC13d86" + } + } + }, + "0xc809316b5dca9097ddb8d3c9a42dd2ce19f163248be2925c6df42ca0e5d5a0dd": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x9B18D37B70676D6595D0230eFb03fd1Fae2A3713" + } + } + }, + "0x76e5d22254cfc7ddfc001d083052c2f363c5f1b648b3081f2b8870a7d08fcaa9": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xc654316c2A88998e02af9cDEa06AE5e76dA14530" + } + } + }, + "0x070c8d433c20243d6de3809f203e39f1ebbc4b86457e697a8261327db0bbdff9": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xC1DE4dd72e63371A8c39d1A5e6c073d0430558e6" + } + } + }, + "0x557bca491b5e6a41daede18c1aeaf30639abb0d5eb3a881c82be2df2447c79a1": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x4835E24F6e4185F5F2BEF4dB6c6623840Ea9D0f8" + } + } + }, + "0x9a5cedbe03e67709abddfaff93002bf511fcddc06d3d4296e65d3af649d3a48a": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x50692A34F62EcC8E6364565609d3eAfd03c7527E" + } + } + }, + "0xad52b7280fa645e59d90cb2c15a0a3cf2c3787181e1fe200abfc547faf83dcd9": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x35aDCf93e74b0bCE66adee73Db6b81582DC59848" + } + } + }, + "0x81ab821211c60bc55bfb304c1443c88933a4998e80eba5dabd6949a66ca897a8": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xeCc7Fe6f14B04edb20e58a1F48c7F1016d4416E2" + } + } + }, + "0x8e24d2ea88772e3fd965892bf89c93254d9448bb4529836d3d600a135d65d8be": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xbfF734731C50CBf8cac3Fe2BCE232aDBE114Bb8B" + } + } + }, + "0x3cb28f49e419e07be401d2fe1f0f8fe10c3fc9e35d94e2f309b24d57cd951331": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x6C9158e0CfB4914d0497Fb0A4C4d5AaC8D7f5eeF" + } + } + }, + "0xf2ad72c9479c88b2727f403c42814ee9ea05967c4e368a5dd9e52b356b70b5b7": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x4f0ce18F2C4b71F88f402db9fa341bd4d13a7dA3" + } + } + }, + "0x0aad34ba22f996efd4ea851b365a3803ae24eeaec4c37a7e15b9058f620d55a8": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x38160036Ac48FE73c4917F64021bbCA976b3C495" + } + } + }, + "0x3b9c5868ed849690a5fc79de376f75d0e4e801dbb06579f88cacd9fe0afad8dc": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xa9c56947d8a67ADcc389Ff46891c87FE9c4F3814" + } + } + }, + "0xb5e7149ce9aa27c5d36bdd3a09c65f40992fc7aae19520d3b5b23d488718890e": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xf9ec016C1df5bf75a8d887168f5B4cE7f5d43873" + } + } + }, + "0xd98cb93aee7dcca824085d9418feea8a5ac5d37a114908f434908e3f1b065a2b": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x0502a94Dbe91419D33ebFFaf169d07526C7635dF" + } + } + }, + "0xfa8f5acc979211e509b980f0b2bf58293369626a5e4cf915e22396f36fbcb4d8": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xf047EaE59Ec457aBc633C1e25aaDA90eAd013562" + } + } + }, + "0xce262a65f754921ed06f12648b1ef73d9ffed497921daca9b393506a010e75ff": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x6597D2A11977F6b4b9F68748458030aCd07E3f12" + } + } + }, + "0x859ec57ec7b8abecc610aa47e8bfc1cbea5c7d13e456439124f38cfa2fea26d9": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xA650e740cFaed5533c5ebB1e4B6709C6249aed35" + } + } + }, + "0x8d2cb447d0c64d131a293d3bccc476ceca6d3c9881917e10704c7fcdf1c879e8": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xD2e567794fe3EC820cDB98501046Edf0ca3217a4" + } + } + }, + "0x2816b85bc14b63d788e5bd02fab02d85863651657236a3620e23855188b24642": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x336d3790Aa92398A7CD38051c1eED9a093875Feb" + } + } + }, + "0x132af1e26857042a22b7a78f1469ede3d5d142530f38d29487b581a11ecea72f": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x7f4FdD42e4BA16D4BdAAbd8c8c0EDbdebf331523" + } + } + }, + "0x4eb156c9da6a7027c4ac63bb65b50f36f64eaf1bace8a1eb4904731ee6a52f21": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x36Da06Dfbf362eDe6DBBff6760376A36d604694a" + } + } + }, + "0xb99df708bc84a2ba6535cfa606a98240a96ebeb4ccbf540e393fe9f145356099": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x18979c37Cad600F0255CBfd168B16a055820C8D5" + } + } + }, + "0x61567d14017296a81facd5132f87e5820e28f1a5b6999c9a2ca92bb2ecae7d7b": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x99c70b017E270F7E47F960630BEf7E80b29F9Dd1" + } + } + }, + "0x833afa6e0cdf7c3d49a618f730fc5733d7ad9e924fb960d0c4c0c3947fb6860c": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x3a3954C43fbdB8b7B68Da7447DE4F11caf3085c0" + } + } + }, + "0xf1a29dfa311d762e97ad23586bf9158289187d1caf985841dd5fb60fe6277fdf": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xbA7f44D0E7348d7b44CBB26303Cb7C0764e1A0b2" + } + } + }, + "0x289cfe3a81f0ea6b216c422121fcc24235525eb59279f0dc280ce06b73aed6b8": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x08E1E348d37DCC47F4788696fBb307b1e2170e3b" + } + } + }, + "0x6e6febc886dad5729f97fa4ba7abba16be90ef56744e5358b639f33cc218ce93": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xa66114dD5F2A2626D734bF5319fd53FBe37aDB73" + } + } + }, + "0x29550c93435e7f5ab7ce1284c14c11d4b1e5c78db3699c3cb0c26bca90f82b82": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xD4865c3E29C8264175D04A398a7d07e3B8639d68" + } + } + }, + "0xfdddfffb5ecfc270c0a3de6353841b3b6741411a21ed3cc85a42a503f8e787df": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x27F47ffb17e23563aC68f426b3A9Dba54896c639" + } + } + }, + "0x61527dcfa3a215ca289b579990f39b206a0088e6e0f8981de41bcb6b394447e6": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xDe0A642E3B83C5144845C0007C256b8a2736b69f" + } + } + }, + "0xbff3fc1a428c6b7c3497573c363ce4e9283de7ed2055495521e67ec55f8ac6ab": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x85d398487849c1cC23b1490AEA92dAD965aded23" + } + } + }, + "0xa9ebdf4379524a33a9996fb1ce161398a184ae7e553296307fdc2080077e9dab": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xbb5f52036A1F0bBDDdf9AE2350A47069eC6a885e" + } + } + }, + "0x87b3d8e2b4a03c23039958eb9bd94168935c38fed3324b297c0166916d8abba5": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x422CF29a94b46a47C87C9034Fe102f22c927E128" + } + } + }, + "0xde55641f9262fddad9579f54b7e622582c6b0c7553febba4bcdb9b24036d8ba4": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x57E1242D218d8343B2F83f67b3Efc580Baa35fdC" + } + } + }, + "0x2c76be8b09962db3d0ce16c580a6c2c976777cca521c9dd8c9eaa31c76551be0": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x1106715c9Fd42709b8DB4fB750ae4CA1dF80d8fC" + } + } + }, + "0xcbc0554ead4cbbf7baef760f0cae12adf8df1f2c443f1eb773aa72ba4e679e3f": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x463140aEdC356B671c9F0a1dcc95D871d6366DC5" + } + } + }, + "0xaf216211b197c29cd394a3783423ce4b15f7e198609b4bf4f5dfdd572b825cb2": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xd981AC8898969d2bFbEC928285742AE8dC2F784A" + } + } + }, + "0x903a9ad6783eb89138f7cc20d356b1353fd04d6d00dd8fadf26ed61dfc0a78d5": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xb3AD7782Ad1BBA49A5dA0Ae5E6F4b953AD3D3e79" + } + } + }, + "0xad52c38c17edf15b2ed5dfb9c90676f15feee047aba06eb0df4eaf481b2e0dd0": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xeb5F713A7c090221019334A6220e9dBc7B3C2948" + } + } + }, + "0x3f1812aec48597d6ccad8c3d15c7ecc08a1886a8b24f1de650aec329e158acd7": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xE07573Efd486dFC2E492Ed5cA9927bf86490E9c4" + } + } + }, + "0xa80c530e5f8b4ffc21129f350a4f0ef267caab5bf6db7afddd442597f080d0f8": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xAeb091391eAA9416c6cA29277a631C1F9D96Cb5d" + } + } + }, + "0x533989eff4a94adfd840491ce2db1b5147d5664a6cebe699a9a1245b6edd00b8": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x3C51f4F669A27D54ffbE4649029794a67a8ae3Ee" + } + } + }, + "0xbee732c16b02880b803b969082dc9a63db4caa69f902643e3ced6acf73a3d5da": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x4Fbb303d1B39CC3B47989150228E289881D6CF97" + } + } + }, + "0x2ef2b8dd8b36fb9170b9d7b89bcf128874de8a45a2afe2d88ed77da5b2fe048b": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x1B0cCb8E070bf5b30585e8F3ab837f8D1FA969b0" + } + } + }, + "0xe6ac04aebb512c776bda6f3ffc859158c1f41c2613c1dae3e956cca8a8a2faae": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xAda6d8C30dEA979B6827335f03a58393780a488D" + } + } + }, + "0x83fe7ebb17588939a25240a240506dfc6a8ab4c8917a9acca04d6ad5d8acd16c": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x36c8C8c0fF608DBc3ACee8CD8D8978FeA1F00562" + } + } + }, + "0x4af5ea234befd7004998e9888a3c624e3ce222c40fb532c148ef3f7e0a31bbc3": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x446FD45280Ac526415EE1Ebb2241A412b11E09a9" + } + } + }, + "0x8c39392ad7723407ab8b71b5c5f29d5e1a574275ce0f4fcd7867fc06998a9506": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x5e14A6f3d389DD4795729724784471c50533e25C" + } + } + }, + "0x8de74f6dd0fce39ccd16bf73ebe61b6644d59139356cc4fe8a790ad74425bf88": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x6A8e323b653A29C16fdC2060B09652051459810d" + } + } + }, + "0xba8ab6bca4f6d0d5ae7b82f1d3df5f2af45faee03312a6ca452dc3ed8cf8c70e": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x75aF3aEA3D932ec280b2307057A2664Ee014aC9C" + } + } + }, + "0x332e0d0eab24cc05d326c92172eb9dce074081b18f2f80256b1a5f1048ae6db8": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x005792dcecD02454Fc9B1b838dd9974C2403c38b" + } + } + }, + "0x61b800281b0212bf422b1d145bf29539fa500820d5f5758cf989f2f87e618153": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xF06303F7DD39886d1E6D7FB72D76B9f4fcA19d50" + } + } + }, + "0xb2a914e1b9328ef8aee0a5f70cbd99d8d0c1a297b9686ccf286c06b93effe1c4": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x89A0C74d9C4cE277529BD1AE11841C7e8276f7C7" + } + } + }, + "0x9487735704821115df80d174a690327a241e22a04e55a9f10b38de1e74dd315b": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xA41548a29B4F6729292b9DF18D6fB0a0dAB9aeeC" + } + } + }, + "0x2a339516600c14dc32e266c5963978781d7124b5f7b3ceb0e1f4eced78091062": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xaFb7189633AA8Fec00C01dfDe255c4F001636Ebf" + } + } + }, + "0xb2526eb99a72a365650a7f10774005bf0ad29be2cb2ebef627210f7d9ea8676a": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xb4050dfEFb4A7D8090B26fe357350F3457Fc3Db6" + } + } + }, + "0x33bc48560269188f3800f68c4e036c1763aedfa9769d05c87ed175468f6daa81": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x313AAcf3Be55fdf18D9b46d49C4873d2D7219831" + } + } + }, + "0x6a3b2027efc72b8844a260fa5e4aba7c46a9430197b102e38e25702b0919ff65": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x8B00f0b4484FbAc517f080bD67a393652F922666" + } + } + }, + "0x54c958d9ced73fb23233db8fd7e4df6a89413b2223b7aa585f594de733db71a6": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x9cc30ECa279aa5998ac1b0e0BB488456f68eCF1D" + } + } + }, + "0xfaa6ab1a974aa79086ff3d2224e8876e7aedffb4341c416b85082e63e47f4fc2": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xc667FABf9Ac4d31A8632770Af536941F2A7541b5" + } + } + }, + "0xe2c2d11614c127435435e1a38f25d74966ea82c78981483354781e0cfc67dcb7": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x690C6eE50A5940E7757D146C5547F0377d5A055d" + } + } + }, + "0xc474504f323b8ff38e5478cd49d59cb64b3cf5f4bd71e4651d439a4cd07282e1": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x76C2C2cD1c3b0ee0484e8C18f9B7103688dB7192" + } + } + }, + "0xbf1e951af1a88c18fc4700d9117e00feda488c1c7ce47a3bbabe2edb9d8acfde": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x7354AaD826a9611Bb9749721Eaa5B14F779eC841" + } + } + }, + "0x8d83593f349e5b8a558584b8e0789da1ad7cca7319fdd92dd934efd566887021": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x5119580c5363E04d7ACbefd8C3eA474f07248110" + } + } + }, + "0x745c6bd605cf52e11cca71e51dfc229558af2cb043bc1451e876b2f64982f29a": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xAF62824bB08321Eb6fdD5599e9fF7d77c40d6e6C" + } + } + }, + "0xab3b07a7bd4289b414a03a599f72ad894961b39c4b537c9d798690b24e541d69": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x9AA9fbdD78588d8a45d4C9518169D341EDaFacB5" + } + } + }, + "0xc4b2a85142c5add3937af9678bd0400556b1742eacb3159f1a29f27fd480f8e8": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x210f9d6C7F74e854a0f8861dBdD1bC2c18a04b9e" + } + } + }, + "0xf9506c9b8fd8db7714ba47a4ad363f6ec814e3da7b9ff4f89fb6750858cc1d30": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x64C133bcC6e520340065407d1606bEA1426157E5" + } + } + }, + "0xfd711b6e38d0fbc1e817e65151d44454f928e162ff7dabdb0b45a467274e446c": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x33dcB50641EBC030a0a559dd130420304cc8733c" + } + } + }, + "0x4f9ca2540fe066d5b5312099957193c85773042f3ac843fdf9d1a7dd506d8dd0": { + "contracts": { + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x21dfb9A5ec46969f8D01221Ab7d7B82658Ad47dd" + } + } + }, + "0x10a54534dbf7d27c32a0d38a836c5a05e51d0b13a947381c17e984b72961c1a7": { + "contracts": { + "0x9d9aa56f68387dddb746da3d6ace3e23e739ec3f91d09add46ede715c0b20b03": { + "name": "Loops", + "address": "0x3b329Fee8d3C17342938e2BB532192c36715AFdA" + } + } + }, + "0xc5bd66327bcbb07ae0b53ec2d8a34ce0a5cbd51b5ff9365f78c5829ab3fd3d6c": { + "contracts": { + "0x9d9aa56f68387dddb746da3d6ace3e23e739ec3f91d09add46ede715c0b20b03": { + "name": "Loops", + "address": "0x8B572D40d0a1c92bAeb2a07E90Eee1860e0A2A43" + } + } + }, + "0xd8833b302cdc5c78941ca1125c143e642fc2f0e3e99172bd7d9ea56a12563923": { + "contracts": { + "0x9d9aa56f68387dddb746da3d6ace3e23e739ec3f91d09add46ede715c0b20b03": { + "name": "Loops", + "address": "0x674da42516Fa94EFB534506c5c680632756a3162" + } + } + }, + "0xb4a5825e8c748537ed69be7db565021f3b881140eb6f5bdf4cc13a28a2fca1cb": { + "contracts": { + "0x9d9aa56f68387dddb746da3d6ace3e23e739ec3f91d09add46ede715c0b20b03": { + "name": "Loops", + "address": "0xf6dC5898d8ba8b3DD2ada2726EF303DF26271F62" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x35dbd009871CAC1DD0Ca614C2fd18af9B53940C8" + } + } + }, + "0x22e377a1e76f91f97e89b5cbfa5e9cca6f21da38882ec3f70f26dbbe5f202d42": { + "contracts": { + "0x9d9aa56f68387dddb746da3d6ace3e23e739ec3f91d09add46ede715c0b20b03": { + "name": "Loops", + "address": "0x16bC335ca9361CdFDB9BA6F783b2Efb015d3c266" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x344a2567F602fb726FC9182Ae636f83Fe82F605F" + } + } + }, + "0x1252ec126d14ef5f56f05ed6d81e5d5db6ab898bd12a7828d5af711544ffb891": { + "contracts": { + "0x9d9aa56f68387dddb746da3d6ace3e23e739ec3f91d09add46ede715c0b20b03": { + "name": "Loops", + "address": "0x8488BFfCA077A0816f2bD659D5CD656E46BD141D" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xc01Fc7F25F70bE8cFc7c529F1f3C5C06c080Bf82" + } + } + }, + "0x2bd7666ea1cb7fb4c18928ce32750ec8b5701b4946ea602eeb5ef2cd336f38be": { + "contracts": { + "0x9d9aa56f68387dddb746da3d6ace3e23e739ec3f91d09add46ede715c0b20b03": { + "name": "Loops", + "address": "0x5a85A7FDc0DbacD586c27a31b63cE574f2a8764B" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x6d94dF19e581393621d254Ef9ABf756D2fFcfC11" + } + } + }, + "0xc9387c0e2d0360b2f8c894307a80174203c5fcd424010ac09f2c2e7ae1bd6745": { + "contracts": { + "0x9d9aa56f68387dddb746da3d6ace3e23e739ec3f91d09add46ede715c0b20b03": { + "name": "Loops", + "address": "0xDA9c0317DB5506605C93d3A1Fe1e768B6B558E65" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xA90B83aDCa28fA288d098263Fc33525FfEe6cD1F" + } + } + }, + "0x5f4c2d17bb3d247aa0be47104dd483562b1941c02b21f4c81fb529ae468c8ac3": { + "contracts": { + "0x9d9aa56f68387dddb746da3d6ace3e23e739ec3f91d09add46ede715c0b20b03": { + "name": "Loops", + "address": "0x2cA3C54191e57Da5e14A5EcD20a8CEb497a98B75" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x6d14f71387c93c503856F23bB23E5a1FF2412246" + } + } + }, + "0xa42a27bf95f667dc5db280fd7749a993cf2997f407c9712047161e97278f119f": { + "contracts": { + "0x9d9aa56f68387dddb746da3d6ace3e23e739ec3f91d09add46ede715c0b20b03": { + "name": "Loops", + "address": "0x43A1F57263C65FBE00Df15e15682DadfCbd7A8b9" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x8B03602C69f1a5bD0ae6556d3e7873aC3835B072" + } + } + }, + "0x506d0efcacbef1f69167514f62e46232a85b37078892a7c09c9641d32efc1a67": { + "contracts": { + "0x9d9aa56f68387dddb746da3d6ace3e23e739ec3f91d09add46ede715c0b20b03": { + "name": "Loops", + "address": "0x35947a790cbC0f3ad069682739C5bE73325C824f" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x63C72AB715007b986D2098174D1D5177eA57C86E" + } + } + }, + "0xc723ad7c5cfde47decdbd75ecda78c9b4bce288b2099bc29fdb596c160e13804": { + "contracts": { + "0x9d9aa56f68387dddb746da3d6ace3e23e739ec3f91d09add46ede715c0b20b03": { + "name": "Loops", + "address": "0xa90AC22FdC12458c724701D51f52B3F05Df942a6" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x3147Cd8fAcb7F02140DFbb0e7434D902019f331f" + } + } + }, + "0x7bd7508227d878d4d63447579ea1f9a8071356be76974048f6cd4b8dcec354b7": { + "contracts": { + "0x280d635c0dd8f0b5af8fa13860daa3a47898de70851e15eba16cefecd36f3949": { + "name": "Loops", + "address": "0x1700ffA0f76e26a4759Dd337695a1160389ec38d" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xe50970547135dE36A3693b2F064770D405231E13" + } + } + }, + "0x0b16273754f9a9cf3842d1b80b5d8b806c0add67196eaa7a4edc4ed17821f000": { + "contracts": { + "0x280d635c0dd8f0b5af8fa13860daa3a47898de70851e15eba16cefecd36f3949": { + "name": "Loops", + "address": "0x9603e3e0697F87FF724c6e5a099debe4fEC94438" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xB8e78B231E2325fA4aB22978Be88f5F2c7c9c2d0" + } + } + }, + "0xfbddfa9da1b8c9069d48863a99f1626bb7e0b9f571d744f963799026d9bfd1cc": { + "contracts": { + "0x280d635c0dd8f0b5af8fa13860daa3a47898de70851e15eba16cefecd36f3949": { + "name": "Loops", + "address": "0x85216eEEd3E37007Ef43Ef6439a06076A8409A1F" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x77544a3F6A3361d2771A1203157fb2dAeD909B5e" + } + } + }, + "0xb3db150d85912d9e4e2c774c70b8713de4cd75e6f70099c2d0d058d391f90095": { + "contracts": { + "0x280d635c0dd8f0b5af8fa13860daa3a47898de70851e15eba16cefecd36f3949": { + "name": "Loops", + "address": "0xaa25E5a427B88bf4A6826aAf47465aE6Ad775558" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x138e0095d31bCc6EB03fa972999b1d561989974f" + } + } + }, + "0xb6629dc7418cf1e2d52a6036e8eaea458179952a6117b2fbccab66253608c3fc": { + "contracts": { + "0x280d635c0dd8f0b5af8fa13860daa3a47898de70851e15eba16cefecd36f3949": { + "name": "Loops", + "address": "0xdEDCDee9212406B6b6746Bc92C352197492b736F" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xA181C584Ad99EB44c77819e8f7b64a27648c2723" + } + } + }, + "0xa77b6b2260df4c715b8698ac914d8b2be914c9dd5fee8fb7a3b151b8d181b7f1": { + "contracts": { + "0x280d635c0dd8f0b5af8fa13860daa3a47898de70851e15eba16cefecd36f3949": { + "name": "Loops", + "address": "0x9A2DAa43dbAaC252E17361eB2057019c7a26CB9c" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xe6053D2A85198E05823Db054bd896c1cE987939d" + } + } + }, + "0xcf0b242320f7f2ba50fdc39c84ef95e188c9841a9eef9d0e30fd115c8d254879": { + "contracts": { + "0x280d635c0dd8f0b5af8fa13860daa3a47898de70851e15eba16cefecd36f3949": { + "name": "Loops", + "address": "0x5aCf3ED3e766E1C55791a9BD8868e3A70C188cAc" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xEb2Ad2E8b30360E996b3AA9AD230934dC5FAB838" + } + } + }, + "0x67b071dd6bae45f1e28a8ba211e3199ec1509ff0aabfd14bec02e0ff5cd27a75": { + "contracts": { + "0x280d635c0dd8f0b5af8fa13860daa3a47898de70851e15eba16cefecd36f3949": { + "name": "Loops", + "address": "0x7ce1A921fc38Ad7c9CA0Bea7a59D983e84392F82" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xc31763eFa2346412bdEbfb3A76293e81225B96B2" + } + } + }, + "0xc3626f4588c365fa790deaa8b954fee22f8e1416351f73a784064ed207f25721": { + "contracts": { + "0x280d635c0dd8f0b5af8fa13860daa3a47898de70851e15eba16cefecd36f3949": { + "name": "Loops", + "address": "0x694cdF477AE0766763bCbE54a184FD26bA5DeBFB" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x9B6e711Af924C24B480Bff2775c899a98585963e" + } + } + }, + "0xdb578c3a0266be3a46e8f36361a8dee894c7b48d93f1a89a2f1b2b2d310d4f17": { + "contracts": { + "0x280d635c0dd8f0b5af8fa13860daa3a47898de70851e15eba16cefecd36f3949": { + "name": "Loops", + "address": "0xB476aeE0d4788F18e8e7561242Ffa46Acd7df2Fa" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xa09954Adc8761F1C7E74133296995715DC80AE5f" + } + } + }, + "0x7ed178871e5ec6dcf38421fb87705cc5a162b536521241dce9846848bd93c833": { + "contracts": { + "0x280d635c0dd8f0b5af8fa13860daa3a47898de70851e15eba16cefecd36f3949": { + "name": "Loops", + "address": "0xa10974B8a1E949D4f2Ab14B370E45147aD1054d1" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x20C9749aE0f9eF1E933D40FD8e81dCa9C50c4c45" + } + } + }, + "0x6013aaee6432c33a80cc02574efe8bdbaf5e45293e62445a675c8e15fd39dd2d": { + "contracts": { + "0x280d635c0dd8f0b5af8fa13860daa3a47898de70851e15eba16cefecd36f3949": { + "name": "Loops", + "address": "0xA70B29a594B1E0E507eAd3A8FB9840453C53d703" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x34C1441dd2CA996324D65B1221F14A800B57886C" + } + } + }, + "0x0cd96e121a7d44eefe7a728942c066e67299ce76176896ddc6ecc0bf14aebb74": { + "contracts": { + "0xbf91a29deaa752dee9acd47e6f5a52c49d864ef7c57f5c4eb87ae5de535f128d": { + "name": "Loops", + "address": "0x705c140526653c672a4D190F7De850c46808de3D" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x443dd0fB61129b1bdDb78561eB873A2c5549b4fa" + } + } + }, + "0xd38613022162b337167883900b5deff4031fac8a6719b18b7d81ae376f3756aa": { + "contracts": { + "0xbf91a29deaa752dee9acd47e6f5a52c49d864ef7c57f5c4eb87ae5de535f128d": { + "name": "Loops", + "address": "0xa8cB7A598BdA621Dc53aDA9E81Dca0c2AFa3fa96" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x33e6C25Dc1F841aE2f66DFb9aa500CC06E4EDBFB" + } + } + }, + "0x55f5984965f220d4723f922ec3c95cbfdaca19ee1db2a6c6670ad989d566fecf": { + "contracts": { + "0xbf91a29deaa752dee9acd47e6f5a52c49d864ef7c57f5c4eb87ae5de535f128d": { + "name": "Loops", + "address": "0xdAE76eF1a86c80aBBc712DCabbC80c72323581C5" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xD7C5fA1b862aF2585782D47900AAb067C9478f99" + } + } + }, + "0x4f4689e9dcfed0538de065d16b7b0485b155bafe1d5f39790cbed6c22dde36be": { + "contracts": { + "0xbf91a29deaa752dee9acd47e6f5a52c49d864ef7c57f5c4eb87ae5de535f128d": { + "name": "Loops", + "address": "0xd6Cb9aBC8AC8Ab11b2c1F9fFE8E02f9c3915709b" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xdc097B69e555eE12e133176A2B86eB46bdbF4829" + } + } + }, + "0xb9f2fa30e2b6f0f978dd59e82372cdab65f90e52694a06dd2d2ada8f88fc24f1": { + "contracts": { + "0xbf91a29deaa752dee9acd47e6f5a52c49d864ef7c57f5c4eb87ae5de535f128d": { + "name": "Loops", + "address": "0xB77d5033Ce99ba0a9298C6e04C57B5c3d286566E" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x2a2Dc61769707D3199FcAC9172eF4A346fd1Eee5" + } + } + }, + "0x392e589deb56822a3f45489be7583946a2e48d98532b0eddad9f09ffc76f931b": { + "contracts": { + "0xbf91a29deaa752dee9acd47e6f5a52c49d864ef7c57f5c4eb87ae5de535f128d": { + "name": "Loops", + "address": "0x9AdC3eB6f57B4845e5c2Ac7d2e852428AC07C14a" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xbB672F504eE3523D5A2eFD6bc886De3d859FC29C" + } + } + }, + "0x987794d5088172aef67cf68f956d8470648cca05dc4566ecdb3e04ec5579a61f": { + "contracts": { + "0xbf91a29deaa752dee9acd47e6f5a52c49d864ef7c57f5c4eb87ae5de535f128d": { + "name": "Loops", + "address": "0x46eE986F2D3BDc07438CDFE493C4B723EBDED558" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x87E8736c8e7BD78f7ABC5ac5d5d1B5Db321F1e22" + } + } + }, + "0x7dde755411c3a073632e50dd032d28717f9163101aa04ef1e1d1511a7d83bbf0": { + "contracts": { + "0x5b053547d6be4798c8fd0f0922b5ed68280587c74ce43bc80c54e9f4f06ace69": { + "name": "Loops", + "address": "0xC13112307f985a02Cb562b3fE384d7e0C054aDBc" + } + } + }, + "0x2e581a86bb1e58f0eaa733159a3d8ce0628512393e1228a119bac9450c036a3a": { + "contracts": { + "0x5b053547d6be4798c8fd0f0922b5ed68280587c74ce43bc80c54e9f4f06ace69": { + "name": "Loops", + "address": "0x61DcC4d9586f58C40193E48D45F201a8E1f80a1E" + } + } + }, + "0xc16f1829af158aae1a1baa32d090497ba86fe1759e5b2a535a98c79e1816ef8b": { + "contracts": { + "0x5b053547d6be4798c8fd0f0922b5ed68280587c74ce43bc80c54e9f4f06ace69": { + "name": "Loops", + "address": "0x7d038830328348cf1c484Cd7e6C1226a56AEB058" + } + } + }, + "0x3f6bfb48a8b9427743ede1106d95741823a6b1e740c43232458f58abcb0223af": { + "contracts": { + "0x5b053547d6be4798c8fd0f0922b5ed68280587c74ce43bc80c54e9f4f06ace69": { + "name": "Loops", + "address": "0x40eBa7Dd92BfC1aeAE1e24b907e394Fc4a328deB" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xE0956Bc356ebD69FE1B340F6a1CaBa845f8877B9" + } + } + }, + "0x8ccc4bc0070f9863c43ac4cfcb1bfe1911b92f80878db4c45522a325dddb0def": { + "contracts": { + "0x5b053547d6be4798c8fd0f0922b5ed68280587c74ce43bc80c54e9f4f06ace69": { + "name": "Loops", + "address": "0x763690D4A3E1de35e023015B0ff4c2f240F85EeE" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xAD39943fbA4436Eb3d0D14Ee1C486287A4253cC2" + } + } + }, + "0xe82d6ed3a663a789c8b9f072b8f15ca393f439525d9d465bd73b64502b0cd12c": { + "contracts": { + "0x5b053547d6be4798c8fd0f0922b5ed68280587c74ce43bc80c54e9f4f06ace69": { + "name": "Loops", + "address": "0xB52de9cD8d5239207D45Ba7E87708F4808308731" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x395f5243b9C4b77Fc93920FC1FD11bC00AaEA32E" + } + } + }, + "0xf392b8e823176ece683dcdbb988774124dc9df6116965f9e2b843b19012efb28": { + "contracts": { + "0x5b053547d6be4798c8fd0f0922b5ed68280587c74ce43bc80c54e9f4f06ace69": { + "name": "Loops", + "address": "0xE32bB65baE467FCcFD294d0156C940820DD79088" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x8163D3ed1dd30753319d2d455f1e2d4B97F18D59" + } + } + }, + "0xd29f78f09a23b246237a91aa23c3cbedde51efc62a22c53850014ced89a81eac": { + "contracts": { + "0x5b053547d6be4798c8fd0f0922b5ed68280587c74ce43bc80c54e9f4f06ace69": { + "name": "Loops", + "address": "0x112576e1b001FD4e43bb55D3cD557e0166a75E64" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xC91831f6aB9Cd7b243455Ae19Ab36AaAAFDd77f5" + } + } + }, + "0x1ecb7bc9222285b117aa05364935b3189d740de594cc7f5427fbc3e56f04423a": { + "contracts": { + "0x5b053547d6be4798c8fd0f0922b5ed68280587c74ce43bc80c54e9f4f06ace69": { + "name": "Loops", + "address": "0xC86C0825111E75Dca19F6F2002969800B53ffb00" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x36922666760B15aD7F38218C63c35Dc4cBBC902f" + } + } + }, + "0xa3ff71ef61a82528daa87f9970ff20a6dd1ba97a3a9f303bcefecb7bf1acbcc1": { + "contracts": { + "0x5b053547d6be4798c8fd0f0922b5ed68280587c74ce43bc80c54e9f4f06ace69": { + "name": "Loops", + "address": "0x7237F712362ba2F9be55776Fe6437109050C5cEC" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xf53CCB0C160ED05812FF08873Bc2313d9c1a666d" + } + } + }, + "0x2ee9b90638b6d4e4021a432edea77fcafeb9a19e888a16b738d35236594b56e3": { + "contracts": { + "0x5b053547d6be4798c8fd0f0922b5ed68280587c74ce43bc80c54e9f4f06ace69": { + "name": "Loops", + "address": "0x4D2CE5CC3EFfB86c2A8A6Ad7d49608478Aba5A8E" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xB3c67bCE4E9b39034D3a4911De84135a717B1fe0" + } + } + }, + "0xdc953e815556982330d81a826c73d320b82ad9a2db96eaa0ea0b52a7c836ae97": { + "contracts": { + "0x5b053547d6be4798c8fd0f0922b5ed68280587c74ce43bc80c54e9f4f06ace69": { + "name": "Loops", + "address": "0xFc15cB0c7609b9B038104bCa56D998Bc98798cf7" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x8F9E0Fa989c1396B0550F99ac80BD04e0D067806" + } + } + }, + "0xe2bfa837f7d3c08470e37c7c012e23de32d70acd269a00461c6e7b9eb6a548dc": { + "contracts": { + "0x5b053547d6be4798c8fd0f0922b5ed68280587c74ce43bc80c54e9f4f06ace69": { + "name": "Loops", + "address": "0xc62e06C8ceF600a292e2518CAb10d6F7f49AEb9C" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x23988a042eD790809DAE6Bdf2611Ca3ab535E46d" + } + } + }, + "0x203e7c3f3adc90957ec5c6337dbc0921791f9d64be2525dda6f7ae054e373355": { + "contracts": { + "0x5b053547d6be4798c8fd0f0922b5ed68280587c74ce43bc80c54e9f4f06ace69": { + "name": "Loops", + "address": "0x2aDf74C846F07fc3B06B4a21848Bd235dCEc2761" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xcde73E28552bC9130cCa43D9BE5C012e0C4E0231" + } + } + }, + "0x241a4502c04b1219f3eef42c8552c17294474585c7a474304049b1f2f9585e4f": { + "contracts": { + "0x5b053547d6be4798c8fd0f0922b5ed68280587c74ce43bc80c54e9f4f06ace69": { + "name": "Loops", + "address": "0x20d85A1073e4e79F0f4bc6fC22b503dE198A39f5" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xB50A228d07DBd3078836Fd4AB1eA3E164CadcDB5" + } + } + }, + "0xd41d4b76a4d4a927d7529bdb5ad16edcb1c09b9a592409c7e7a3e0295a67e376": { + "contracts": { + "0x5b053547d6be4798c8fd0f0922b5ed68280587c74ce43bc80c54e9f4f06ace69": { + "name": "Loops", + "address": "0x4f47dddCEcFAbfDaAd7d1f78dE91F9c08E2411D7" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x580f32845B272b845a2D67Ca7CcD17bc2051d1B3" + } + } + }, + "0x253606b86e079b1053476db3b47b23766535451eac226b2e509e6b8512e4b988": { + "contracts": { + "0x5b053547d6be4798c8fd0f0922b5ed68280587c74ce43bc80c54e9f4f06ace69": { + "name": "Loops", + "address": "0xB13E58c7598932Ae32315681Ef3293b51af8b192" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0x81e323847C532B0AD2D96C6f86cFD24D7f8A45A2" + } + } + }, + "0xabd48cffdc150a2978f2c4b99857f4153c398425bbff41e808febe40bd242da7": { + "contracts": { + "0x5b053547d6be4798c8fd0f0922b5ed68280587c74ce43bc80c54e9f4f06ace69": { + "name": "Loops", + "address": "0x9a73A00CCf8A0F50d97Bb486ceF135d54d42c017" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xc327D862f0367e6Ada0eEaaA7C411b616d45bcCD" + } + } + }, + "0xa9608ad622614351887f3bccc4e02453549be5ae3a21f9476e669ac9d5cf04b2": { + "contracts": { + "0x5b053547d6be4798c8fd0f0922b5ed68280587c74ce43bc80c54e9f4f06ace69": { + "name": "Loops", + "address": "0x6fec1efc1B593a29Ee5F15a6bc9386E9a4633855" + }, + "0x8d23794943d32fc87f99285a8257d31dcfd1be5d973b6d776659d651c6807ada": { + "name": "SimpleStorage", + "address": "0xB6ba05d15e861857922f758ee5A05df5Ef67CB80" + } + } + }, + "0x877e203e2d8500a97b3cbfe8be7749f12e5205efa7cf6b7709ad9624dfec2ad2": { + "contracts": { + "0x5b053547d6be4798c8fd0f0922b5ed68280587c74ce43bc80c54e9f4f06ace69": { + "name": "Loops", + "address": "0xFAa0eBa0E71b15FE448c04ec18678A46102009d9" + } + } + }, + "0x2d0d88e32f655e2d818b99d59ffc95d0d1e9e44f735636a527e720435478d19c": { + "contracts": { + "0x5b053547d6be4798c8fd0f0922b5ed68280587c74ce43bc80c54e9f4f06ace69": { + "name": "Loops", + "address": "0x38351627563AFE814dec136F03b9946d714903cE" + } + } + }, + "0xd9513e06eb472b88f6c495da759a16556d65430985e75c9135d7b9f8a228c7d3": { + "contracts": { + "0x5b053547d6be4798c8fd0f0922b5ed68280587c74ce43bc80c54e9f4f06ace69": { + "name": "Loops", + "address": "0x08EF04fd193D6138441eF9BC2BC61aC8A68A0CBC" + } + } + }, + "0x383fce75cd5e12123180901a0cb4c9357438d0b4c2f70375d1a649a277dfdb65": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0xDcc2Dbd14Eb28e18563735aa6B0A270011D3B5DE" + } + } + }, + "0x354f09246636824b6a9ca4440ac0a45c1d8cea973ad9db174cbcd12bb4571bbd": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0x9A3feEd3e8AABD86b743106Eab88682E4Cf87D40" + } + } + }, + "0x14ec747dc30c4d7c34126aaee04adb49d14bf90b30e308499a0cda5bbd6712f5": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0x3fa1E18E568923628851314aeDA9F16d201A6390" + } + } + }, + "0x8bd7ee8b40256e91254ffe0c52b227a771d5603893beaf85554998d6395e4548": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0x19724088D03034bF1C465B90367dD550eF6A93a3" + } + } + }, + "0x3286f149ea91de75b81c2dbdfa5aa02ee18fe7d4dac86d42abbcc31a5351e9cc": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0xf68CBcBE64A7aAFcb5b20673B1c718AaA8d86254" + } + } + }, + "0x6d849bf76ec898b5e41b98635400403bcda0a14458e442ae64657daa6dce5d42": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0x148Cc4Ab024539dd6c2eC0072F94f69B35eF1F0b" + } + } + }, + "0x1ae93a4d2dd1bd0ecd01df0eab159847cb15010a7ed5e246373aac72180320ca": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0xB552a46b6D5BbC7eE099840B06aE2010E2e32aaf" + } + } + }, + "0x7c38d2c7317332d3196e03e04dd12a43d71cc0542cf26c840359e3255d214fae": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0xc39539E43EEDC14867128aBEAd0bD092748712B1" + } + } + }, + "0xa2a115287f846c1653b45437dbb12ec36ca9f1b5e63a95abc57b2ba41d16d215": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0xF3c45ea2279ce9c8f8Ca1605733269A0d84D15E6" + } + } + }, + "0xce8aa8d787d48d72f3f8df4fb468821f19d1477777d2ff0c8c51370c0c740524": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0xB88ee4fD257cbeFBC802E8a8C0E345Bf607b98dc" + } + } + }, + "0xbc44fe8bd11a283dd13a9ca13d7bc1f5ce10e1d325a5bd966edd43c2283abc15": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0xB402c8c6F4BE719d15BBcABceF350546DA51091a" + } + } + }, + "0x0876ec12fc1fd3622a3d9484781672687248ef909e88d4dbfe07325a25b84d12": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0xE4C6c02740623cc17c91DCF21c2AF7402181fEE2" + } + } + }, + "0x0498357f985cd8818f352936f9d497e3a0f3e11c84a25c8c0b22d8ac70d12639": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0x00f8cc170E6b72Cb5518145b6E2FAF0CeDA4A863" + } + } + }, + "0xb330dbf7628f512095fccf436c64fdf0ffa6c4e6214e71e5fd59b56e4436662a": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0x3aB0eADC6d0E595CC764ea9d8e6198f241a28c5D" + } + } + }, + "0xf1bcd74cc87bbcc6235381e7bb551389a1c970c62d60b43d619151a3f696cfd0": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0x35b72DFDcc8dd0EC9D861bA53067475C133F8B58" + } + } + }, + "0xc710a5a384e7bceed62a5152cc2ad6cfa5f7dc24d8a42407192c87aa6a1e9eaf": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0xDb7530aCC027589c132df02778329D95B1E161fD" + } + } + }, + "0xa8eb8fdffd7118cf29360e50daf138dddd34c1723dac527b66441bbd0beebf67": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0xf040DDEd9975614ceF247aE8a560b6909c212aa3" + } + } + }, + "0x58a9939f84d5981ffaab5a736a2ba462cca1f97a09762da457ef5a184c2e6180": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0x180DEE92e70470baf8E0630ec74613A36abb4E47" + } + } + }, + "0x496e392f93b7236d99cf53179ad8219651d5b0b85c28d005e7872e683ae63118": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0xf06C42ea7F061e6e556AB2F1F708B4D4f0299051" + } + } + }, + "0xd86ebb1eb62d4a289d5df43a398e1d3fff68201e39eceedb18b279fff67054b5": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0xd69E6B702EEf0FFeab8010949154b381725416fb" + } + } + }, + "0x83a24047632914878d1e9619a37dff81948f76aae99c972b9ac647c134dceeec": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0x8b3ae4932962794e0e8BC12facF555fAa78fc052" + } + } + }, + "0xbd223d2e11c2416aa4d41acb5aa2ee152f4423c87300f56362a2a1dee414f290": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0x0FEeC2D672bc1Ce91405e4211F4B581eE1DB9b03" + } + } + }, + "0x4a3965fe5a777affeb95eb8128c1a4355093d9bcae2c96b53c09288e6c7d1852": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0x978E3027323FA4F4ef63a7e191889B30CAD0B678" + } + } + }, + "0x766a1f677094dcd9b01874ed7d077d72e0717e55aa9ed293f5e9630c2798457a": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0xd538eA4d177af6eDC7a69F7f3c42a252C9465D53" + } + } + }, + "0x22145cca2b67ca667e9fee7af205dd4effae1dd21fe26715fe68db80ad27fb5d": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0x945E1532bf09312eC6ed1f183431356E13CB398D" + } + } + }, + "0xab81da3cb9f1dadde28db64a2d02336abd67f7ac8dea20483db740ae635ad579": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0x1d3e82066a3Ee0348DCA7Dd8a41e5744cBB4CDdD" + } + } + }, + "0xded9ba366095311b41c5a104eb7a7241c8c9c18c18742bd3c8a27b9057949993": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0x87B243892030a453e05e242AD4bECe90902bBfa0" + } + } + }, + "0xb84631c1124f187f76a62b99b07a1cd4eb9ddbfd28f47ff0d057e1c0a6cadccb": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0xb74F0E160a8bDc8Fd5346603B19f1d591333a902" + } + } + }, + "0x6635e703b7aebd3da3d28c891ab5503253481d30c7874aa8c8bcafcf7dffe5dc": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0x7F6Cc7855D5338E2fE1FD1b2CA8b87B87472B648" + } + } + }, + "0x13d49aabb71c7263070f1093bb080704b8a69aee02616ed8f79f7b6dca992090": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0x3824cd9117cE37bA73CeE5542678E9E977918265" + } + } + }, + "0x12c76359f8d69e0cdfe26ca3f9b4d8561c0203434e1357b7d8be504fb92052f3": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0xAa12786B4007c88B773cea7E806d9cd40A928f5e" + } + } + }, + "0xa645e5e1c310474280bf492c6c66a25248830b029f6257f1749f1e041f3bd923": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0x472aEaE2d26833D1437124693c7d9793179B0F58" + } + } + }, + "0x8962f25499b9812eb2c922872e7262c6b1a899e37904cb721a9e395821f5099c": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0x0d117fAabb7b3aa1D0dc407e1C12d3145fe98589" + } + } + }, + "0xddb5d1f4b21be9f3f188572bed0d2715520ae87ddc49487e3d9740d09a3f8176": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0x57d42A5C69B1763d5515cEe1E35d36F11c7d6A8a" + } + } + }, + "0x559c1a7481a527d35fcf7e98530d614ecdabad8bff9b05c965750a9effd88fe3": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0x498Dc2aD344567aB4721Fa6fd7674A8B8D07b0ab" + } + } + }, + "0x846b1bc233a3ef2a3e96020a57a90de0f232c585b37daef9ebfbd88f70c49107": { + "contracts": { + "0x73ef69ce3bb1c70015ab500b19dd4863fbf4c41acd1d6c47237686a9e0017d10": { + "name": "Loops", + "address": "0x0E75234E95330d3ab967b73A2130E50F21091D22" + }, + "0x33399485c5b2893d178ca38e3a0587e788a85b4c634ab302458da5104dad8219": { + "name": "SimpleStorage", + "address": "0xd6E8e6ca22FDc273b817A1e19608Bba59dF42bD9" + } + } + } +} diff --git a/test_apps/coverage_app/config/blockchain.js b/test_apps/coverage_app/config/blockchain.js new file mode 100644 index 000000000..836939538 --- /dev/null +++ b/test_apps/coverage_app/config/blockchain.js @@ -0,0 +1,73 @@ +module.exports = { + development: { + enabled: true, + networkType: "custom", // Can be: testnet, rinkeby, livenet or custom, in which case, it will use the specified networkId + networkId: "1337", // Network id used when networkType is custom + isDev: true, // Uses and ephemeral proof-of-authority network with a pre-funded developer account, mining enabled + datadir: ".embark/development/datadir", // Data directory for the databases and keystore + mineWhenNeeded: true, // Uses our custom script (if isDev is false) to mine only when needed + nodiscover: true, // Disables the peer discovery mechanism (manual peer addition) + maxpeers: 0, // Maximum number of network peers (network disabled if set to 0) (default: 25) + rpcHost: "localhost", // HTTP-RPC server listening interface (default: "localhost") + rpcPort: 8545, // HTTP-RPC server listening port (default: 8545) + rpcCorsDomain: "auto", // Comma separated list of domains from which to accept cross origin requests (browser enforced) + // When set to "auto", Embark will automatically set the cors to the address of the webserver + proxy: true, // Proxy is used to present meaningful information about transactions + targetGasLimit: 8000000, // Target gas limit sets the artificial target gas floor for the blocks to mine + wsRPC: true, // Enable the WS-RPC server + wsOrigins: "http://localhost:8000,http://localhost:8080,embark", // Origins from which to accept websockets requests + // When set to "auto", Embark will automatically set the cors to the address of the webserver + wsHost: "localhost", // WS-RPC server listening interface (default: "localhost") + wsPort: 8546, // WS-RPC server listening port (default: 8546) + simulatorMnemonic: "example exile argue silk regular smile grass bomb merge arm assist farm", // Mnemonic used by the simulator to generate a wallet + simulatorBlocktime: 0 // Specify blockTime in seconds for automatic mining. Default is 0 and no auto-mining. + }, + privatenet: { + enabled: true, + networkType: "custom", + networkId: "1337", + isDev: false, + genesisBlock: "config/privatenet/genesis.json", // Genesis block to initiate on first creation of a development node + datadir: ".embark/privatenet/datadir", + mineWhenNeeded: true, + nodiscover: true, + maxpeers: 0, + rpcHost: "localhost", + rpcPort: 8545, + rpcCorsDomain: "auto", + proxy: true, + account: { + // "address": "", // When specified, uses that address instead of the default one for the network + password: "config/privatenet/password" // Password to unlock the account + }, + targetGasLimit: 8000000, + wsRPC: true, + wsOrigins: "auto", + wsHost: "localhost", + wsPort: 8546, + simulatorMnemonic: "example exile argue silk regular smile grass bomb merge arm assist farm", + simulatorBlocktime: 0 + }, + testnet: { + enabled: true, + networkType: "testnet", + syncMode: "light", + rpcHost: "localhost", + rpcPort: 8545, + rpcCorsDomain: "http://localhost:8000", + account: { + password: "config/testnet/password" + } + }, + livenet: { + enabled: true, + networkType: "livenet", + syncMode: "light", + rpcHost: "localhost", + rpcPort: 8545, + rpcCorsDomain: "http://localhost:8000", + account: { + password: "config/livenet/password" + } + } +}; diff --git a/test_apps/coverage_app/config/communication.js b/test_apps/coverage_app/config/communication.js new file mode 100644 index 000000000..8c4d1f918 --- /dev/null +++ b/test_apps/coverage_app/config/communication.js @@ -0,0 +1,12 @@ +module.exports = { + default: { + enabled: true, + provider: "whisper", // Communication provider. Currently, Embark only supports whisper + available_providers: ["whisper"], // Array of available providers + connection: { + host: "localhost", // Host of the blockchain node + port: 8546, // Port of the blockchain node + type: "ws" // Type of connection (ws or rpc) + } + } +}; diff --git a/test_apps/coverage_app/config/contracts.js b/test_apps/coverage_app/config/contracts.js new file mode 100644 index 000000000..bf2164b32 --- /dev/null +++ b/test_apps/coverage_app/config/contracts.js @@ -0,0 +1,41 @@ +module.exports = { + // default applies to all environments + default: { + // Blockchain node to deploy the contracts + deployment: { + host: "localhost", // Host of the blockchain node + port: 8545, // Port of the blockchain node + type: "rpc" // Type of connection (ws or rpc), + // Accounts to use instead of the default account to populate your wallet + /*,accounts: [ + { + privateKey: "your_private_key", + balance: "5 ether" // You can set the balance of the account in the dev environment + // Balances are in Wei, but you can specify the unit with its name + }, + { + privateKeyFile: "path/to/file" // You can put more than one key, separated by , or ; + }, + { + mnemonic: "12 word mnemonic", + addressIndex: "0", // Optionnal. The index to start getting the address + numAddresses: "1", // Optionnal. The number of addresses to get + hdpath: "m/44'/60'/0'/0/" // Optionnal. HD derivation path + } + ]*/ + }, + // order of connections the dapp should connect to + dappConnection: [ + "$WEB3", // uses pre existing web3 object if available (e.g in Mist) + "ws://localhost:8546", + "http://localhost:8545" + ], + gas: "auto", + contracts: { + SimpleStorage: { + fromIndex: 0, + args: [100] + } + } + } +}; diff --git a/test_apps/coverage_app/config/namesystem.js b/test_apps/coverage_app/config/namesystem.js new file mode 100644 index 000000000..4e9891ac1 --- /dev/null +++ b/test_apps/coverage_app/config/namesystem.js @@ -0,0 +1,12 @@ +module.exports = { + default: { + available_providers: ["ens", "ipns"], + provider: "ens", + register: { + rootDomain: "embark.eth", + subdomains: { + 'status': '0x1a2f3b98e434c02363f3dac3174af93c1d690914' + } + } + } +}; diff --git a/test_apps/coverage_app/config/privatenet/genesis.json b/test_apps/coverage_app/config/privatenet/genesis.json new file mode 100644 index 000000000..a67418b85 --- /dev/null +++ b/test_apps/coverage_app/config/privatenet/genesis.json @@ -0,0 +1,18 @@ +{ + "config": { + "homesteadBlock": 0, + "byzantiumBlock": 0, + "daoForkSupport": true + }, + "nonce": "0x0000000000000042", + "difficulty": "0x0", + "alloc": { + "0x3333333333333333333333333333333333333333": {"balance": "15000000000000000000"} + }, + "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x3333333333333333333333333333333333333333", + "timestamp": "0x00", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "extraData": "0x", + "gasLimit": "0x7a1200" +} diff --git a/test_apps/coverage_app/config/privatenet/password b/test_apps/coverage_app/config/privatenet/password new file mode 100644 index 000000000..c747d679e --- /dev/null +++ b/test_apps/coverage_app/config/privatenet/password @@ -0,0 +1 @@ +dev_password diff --git a/test_apps/coverage_app/config/storage.js b/test_apps/coverage_app/config/storage.js new file mode 100644 index 000000000..59ef12bf5 --- /dev/null +++ b/test_apps/coverage_app/config/storage.js @@ -0,0 +1,35 @@ +module.exports = { + default: { + enabled: true, + ipfs_bin: "ipfs", + provider: "ipfs", + available_providers: ["ipfs"], + upload: { + host: "localhost", + port: 5001 + }, + dappConnection: [ + { + provider:"ipfs", + host: "localhost", + port: 5001, + getUrl: "http://localhost:8080/ipfs/" + } + ] + // Configuration to start Swarm in the same terminal as `embark run` + /*,account: { + address: "YOUR_ACCOUNT_ADDRESS", // Address of account accessing Swarm + password: "PATH/TO/PASSWORD/FILE" // File containing the password of the account + }, + swarmPath: "PATH/TO/SWARM/EXECUTABLE" // Path to swarm executable (default: swarm)*/ + }, + development: { + enabled: true, + provider: "ipfs", + upload: { + host: "localhost", + port: 5001, + getUrl: "http://localhost:8080/ipfs/" + } + } +}; diff --git a/test_apps/coverage_app/config/testnet/password b/test_apps/coverage_app/config/testnet/password new file mode 100644 index 000000000..414f84905 --- /dev/null +++ b/test_apps/coverage_app/config/testnet/password @@ -0,0 +1 @@ +test_password diff --git a/test_apps/coverage_app/config/webserver.js b/test_apps/coverage_app/config/webserver.js new file mode 100644 index 000000000..1814065d0 --- /dev/null +++ b/test_apps/coverage_app/config/webserver.js @@ -0,0 +1,5 @@ +module.exports = { + enabled: true, + host: "localhost", + port: 8000 +}; diff --git a/test_apps/coverage_app/contracts/loops.sol b/test_apps/coverage_app/contracts/loops.sol new file mode 100644 index 000000000..4af20be1d --- /dev/null +++ b/test_apps/coverage_app/contracts/loops.sol @@ -0,0 +1,21 @@ +pragma solidity ^0.4.23; + +contract Loops { + uint public storedData; + + constructor(uint initialValue) public { + storedData = initialValue; + } + + + function set(uint x) public { + for(uint i = storedData; i < x; i++) { + uint newValue = storedData + x; + storedData = newValue; + } + } + + function get() public view returns (uint retVal) { + return storedData; + } +} diff --git a/test_apps/coverage_app/contracts/simple_storage.sol b/test_apps/coverage_app/contracts/simple_storage.sol new file mode 100644 index 000000000..2c1c7ac89 --- /dev/null +++ b/test_apps/coverage_app/contracts/simple_storage.sol @@ -0,0 +1,17 @@ +pragma solidity ^0.4.23; + +contract SimpleStorage { + uint public storedData; + + constructor(uint initialValue) public { + storedData = initialValue; + } + + function set(uint x) public { + storedData = x; + } + + function get() public view returns (uint retVal) { + return storedData; + } +} diff --git a/test_apps/coverage_app/embark.json b/test_apps/coverage_app/embark.json new file mode 100644 index 000000000..2f73ec75b --- /dev/null +++ b/test_apps/coverage_app/embark.json @@ -0,0 +1,17 @@ +{ + "contracts": ["contracts/**"], + "app": { + "js/dapp.js": ["app/dapp.js"], + "index.html": "app/index.html", + "images/": ["app/images/**"] + }, + "buildDir": "dist/", + "config": "config/", + "versions": { + "web3": "1.0.0-beta", + "solc": "0.4.24", + "ipfs-api": "17.2.4" + }, + "plugins": { + } +} diff --git a/test_apps/coverage_app/package-lock.json b/test_apps/coverage_app/package-lock.json new file mode 100644 index 000000000..6c2ea9a22 --- /dev/null +++ b/test_apps/coverage_app/package-lock.json @@ -0,0 +1,278 @@ +{ + "name": "app_name", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + } + } + }, + "classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "dom-helpers": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.3.1.tgz", + "integrity": "sha512-2Sm+JaYn74OiTM2wHvxJOo3roiq/h25Yi69Fqk269cNUwIXsCvATB6CRSFC9Am/20G2b28hGv/+7NiWydIrPvg==" + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "fbjs": { + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "requires": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + } + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "keycode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", + "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ=" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, + "prop-types": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "requires": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "prop-types-extra": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.0.tgz", + "integrity": "sha512-QFyuDxvMipmIVKD2TwxLVPzMnO4e5oOf1vr3tJIomL8E7d0lr6phTHd5nkPhFIzTD1idBLLEPeylL9g+rrTzRg==", + "requires": { + "react-is": "^16.3.2", + "warning": "^3.0.0" + } + }, + "react": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/react/-/react-16.4.2.tgz", + "integrity": "sha512-dMv7YrbxO4y2aqnvA7f/ik9ibeLSHQJTI6TrYAenPSaQ6OXfb+Oti+oJiy8WBxgRzlKatYqtCjphTgDSCEiWFg==", + "requires": { + "fbjs": "^0.8.16", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0" + } + }, + "react-bootstrap": { + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-0.32.1.tgz", + "integrity": "sha512-RbfzKUbsukWsToWqGHfCCyMFq9QQI0TznutdyxyJw6dih2NvIne25Mrssg8LZsprqtPpyQi8bN0L0Fx3fUsL8Q==", + "requires": { + "babel-runtime": "^6.11.6", + "classnames": "^2.2.5", + "dom-helpers": "^3.2.0", + "invariant": "^2.2.1", + "keycode": "^2.1.2", + "prop-types": "^15.5.10", + "prop-types-extra": "^1.0.1", + "react-overlays": "^0.8.0", + "react-prop-types": "^0.4.0", + "react-transition-group": "^2.0.0", + "uncontrollable": "^4.1.0", + "warning": "^3.0.0" + } + }, + "react-dom": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.4.2.tgz", + "integrity": "sha512-Usl73nQqzvmJN+89r97zmeUpQDKDlh58eX6Hbs/ERdDHzeBzWy+ENk7fsGQ+5KxArV1iOFPT46/VneklK9zoWw==", + "requires": { + "fbjs": "^0.8.16", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0" + } + }, + "react-is": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.4.2.tgz", + "integrity": "sha512-rI3cGFj/obHbBz156PvErrS5xc6f1eWyTwyV4mo0vF2lGgXgS+mm7EKD5buLJq6jNgIagQescGSVG2YzgXt8Yg==" + }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "react-overlays": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-0.8.3.tgz", + "integrity": "sha512-h6GT3jgy90PgctleP39Yu3eK1v9vaJAW73GOA/UbN9dJ7aAN4BTZD6793eI1D5U+ukMk17qiqN/wl3diK1Z5LA==", + "requires": { + "classnames": "^2.2.5", + "dom-helpers": "^3.2.1", + "prop-types": "^15.5.10", + "prop-types-extra": "^1.0.1", + "react-transition-group": "^2.2.0", + "warning": "^3.0.0" + } + }, + "react-prop-types": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.4.0.tgz", + "integrity": "sha1-+ZsL+0AGkpya8gUefBQUpcdbk9A=", + "requires": { + "warning": "^3.0.0" + } + }, + "react-transition-group": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.4.0.tgz", + "integrity": "sha512-Xv5d55NkJUxUzLCImGSanK8Cl/30sgpOEMGc5m86t8+kZwrPxPCPcFqyx83kkr+5Lz5gs6djuvE5By+gce+VjA==", + "requires": { + "dom-helpers": "^3.3.1", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "ua-parser-js": { + "version": "0.7.18", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.18.tgz", + "integrity": "sha512-LtzwHlVHwFGTptfNSgezHp7WUlwiqb0gA9AALRbKaERfxwJoiX0A73QbTToxteIAuIaFshhgIZfqK8s7clqgnA==" + }, + "uncontrollable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-4.1.0.tgz", + "integrity": "sha1-4DWCkSUuGGUiLZCTmxny9J+Bwak=", + "requires": { + "invariant": "^2.1.0" + } + }, + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "whatwg-fetch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + } + } +} diff --git a/test_apps/coverage_app/package.json b/test_apps/coverage_app/package.json new file mode 100644 index 000000000..8020497c0 --- /dev/null +++ b/test_apps/coverage_app/package.json @@ -0,0 +1,19 @@ +{ + "name": "coverage_app", + "version": "0.0.1", + "description": "", + "main": "Gruntfile.js", + "scripts": { + "test": "../../bin/embark test", + "coverage": "istanbul report --root .embark --format html" + }, + "author": "", + "license": "ISC", + "homepage": "", + "dependencies": { + "react": "^16.3.2", + "react-bootstrap": "^0.32.1", + "react-dom": "^16.3.2", + "istanbul": "^0.4.5" + } +} diff --git a/test_apps/coverage_app/test/loops_spec.js b/test_apps/coverage_app/test/loops_spec.js new file mode 100644 index 000000000..4e5c9c6c9 --- /dev/null +++ b/test_apps/coverage_app/test/loops_spec.js @@ -0,0 +1,28 @@ +/*global contract, config, it, assert*/ +const Loops = require('Embark/contracts/Loops'); + +config({ + contracts: { + "Loops": { + args: [1] + } + } +}); + +contract("Loops", function() { + it("should set constructor value", function(done) { + Loops.methods.storedData().call().then((result) => { + assert.strictEqual(parseInt(result, 10), 1); + done(); + }); + }); + + it("set storage value", function(done) { + Loops.methods.set(5).send().then(() => { + Loops.methods.get().call().then((result) => { + assert.strictEqual(parseInt(result, 10), 21); + done(); + }); + }); + }); +}); diff --git a/test_apps/coverage_app/test/simple_storage_spec.js b/test_apps/coverage_app/test/simple_storage_spec.js new file mode 100644 index 000000000..cbcdf3363 --- /dev/null +++ b/test_apps/coverage_app/test/simple_storage_spec.js @@ -0,0 +1,28 @@ +/*global contract, config, it, assert*/ +const SimpleStorage = require('Embark/contracts/SimpleStorage'); + +config({ + contracts: { + "SimpleStorage": { + args: [100] + } + } +}); + +contract("SimpleStorage", function() { + it("should set constructor value", function(done) { + SimpleStorage.methods.storedData().call().then((result) => { + assert.strictEqual(parseInt(result, 10), 100); + done(); + }); + }); + + it("set storage value", function(done) { + SimpleStorage.methods.set(150).send().then(() => { + SimpleStorage.methods.get().call().then((result) => { + assert.strictEqual(parseInt(result, 10), 150); + done(); + }); + }); + }); +});