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
+
+
+ 2. Get the current value
+
+
+ 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
+
+
+ Lookup an address
+
+
+ Register subdomain for embark
+
+
+ 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
+
+
+ Load text from storage given an hash
+
+
+ Upload file to storage
+
+
+ Get file or image from storage
+
+
+ Register to IPNS
+
+
+ Resolve name
+
+
+
+ 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
+
+
+ Send 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();
+ });
+ });
+ });
+});