Standard: include curly brackets in branches as required

pull/1/head
Alex Beregszaszi 9 years ago
parent 3a7bc52ed6
commit 60ebbee3ed
  1. 6
      src/app.js
  2. 40
      src/app/compiler.js
  3. 6
      src/app/editor.js
  4. 4
      src/app/gist-handler.js
  5. 4
      src/app/query-params.js
  6. 55
      src/app/renderer.js
  7. 12
      src/app/storage-handler.js
  8. 120
      src/universal-dapp.js
  9. 5
      src/web3-adapter.js

@ -40,8 +40,9 @@ var run = function () {
loadFiles(files); loadFiles(files);
}; };
if (filesToLoad !== null) if (filesToLoad !== null) {
loadFiles(filesToLoad); loadFiles(filesToLoad);
}
// ------------------ query params (hash) ---------------- // ------------------ query params (hash) ----------------
@ -133,8 +134,9 @@ var run = function () {
'To which other browser-solidity instance do you want to copy over all files?', 'To which other browser-solidity instance do you want to copy over all files?',
'https://ethereum.github.io/browser-solidity/' 'https://ethereum.github.io/browser-solidity/'
); );
if (target === null) if (target === null) {
return; return;
}
var files = editor.packageFiles(); var files = editor.packageFiles();
var iframe = $('<iframe/>', {src: target, style: 'display:none;', load: function () { var iframe = $('<iframe/>', {src: target, style: 'display:none;', load: function () {
this.contentWindow.postMessage(['loadFiles', files], '*'); this.contentWindow.postMessage(['loadFiles', files], '*');

@ -24,10 +24,13 @@ function Compiler (editor, handleGithubCall, outputField, hidingRHP, updateFiles
editor.setCacheFileContent(''); editor.setCacheFileContent('');
return; return;
} }
if (input === previousInput) if (input === previousInput) {
return; return;
}
previousInput = input; previousInput = input;
if (compileTimeout) window.clearTimeout(compileTimeout); if (compileTimeout) {
window.clearTimeout(compileTimeout);
}
compileTimeout = window.setTimeout(compile, 300); compileTimeout = window.setTimeout(compile, 300);
} }
@ -112,24 +115,30 @@ function Compiler (editor, handleGithubCall, outputField, hidingRHP, updateFiles
if (data['error'] !== undefined) { if (data['error'] !== undefined) {
renderer.error(data['error']); renderer.error(data['error']);
if (utils.errortype(data['error']) !== 'warning') noFatalErrors = false; if (utils.errortype(data['error']) !== 'warning') {
noFatalErrors = false;
}
} }
if (data['errors'] !== undefined) { if (data['errors'] !== undefined) {
data['errors'].forEach(function (err) { data['errors'].forEach(function (err) {
renderer.error(err); renderer.error(err);
if (utils.errortype(err) !== 'warning') noFatalErrors = false; if (utils.errortype(err) !== 'warning') {
noFatalErrors = false;
}
}); });
} }
if (missingInputs !== undefined && missingInputs.length > 0) if (missingInputs !== undefined && missingInputs.length > 0) {
compile(missingInputs); compile(missingInputs);
else if (noFatalErrors && !hidingRHP()) } else if (noFatalErrors && !hidingRHP()) {
renderer.contracts(data, editor.getValue()); renderer.contracts(data, editor.getValue());
} }
}
this.initializeWorker = function (version, setVersionText) { this.initializeWorker = function (version, setVersionText) {
if (worker !== null) if (worker !== null) {
worker.terminate(); worker.terminate();
}
worker = new Worker('worker.js'); worker = new Worker('worker.js');
worker.addEventListener('message', function (msg) { worker.addEventListener('message', function (msg) {
var data = msg.data; var data = msg.data;
@ -154,8 +163,7 @@ function Compiler (editor, handleGithubCall, outputField, hidingRHP, updateFiles
function gatherImports (files, importHints, cb) { function gatherImports (files, importHints, cb) {
importHints = importHints || []; importHints = importHints || [];
if (!compilerAcceptsMultipleFiles) if (!compilerAcceptsMultipleFiles) {
{
cb(files[editor.getCacheFile()]); cb(files[editor.getCacheFile()]);
return; return;
} }
@ -166,12 +174,15 @@ function Compiler (editor, handleGithubCall, outputField, hidingRHP, updateFiles
reloop = false; reloop = false;
for (var fileName in files) { for (var fileName in files) {
var match; var match;
while (match = importRegex.exec(files[fileName])) while (match = importRegex.exec(files[fileName])) {
importHints.push(match[1]); importHints.push(match[1]);
} }
}
while (importHints.length > 0) { while (importHints.length > 0) {
var m = importHints.pop(); var m = importHints.pop();
if (m in files) continue; if (m in files) {
continue;
}
if (editor.hasFile(m)) { if (editor.hasFile(m)) {
files[m] = window.localStorage[utils.fileKey(m)]; files[m] = window.localStorage[utils.fileKey(m)];
reloop = true; reloop = true;
@ -183,15 +194,14 @@ function Compiler (editor, handleGithubCall, outputField, hidingRHP, updateFiles
reloop = true; reloop = true;
} else if (githubMatch = /^(https?:\/\/)?(www.)?github.com\/([^\/]*\/[^\/]*)\/(.*)/.exec(m)) { } else if (githubMatch = /^(https?:\/\/)?(www.)?github.com\/([^\/]*\/[^\/]*)\/(.*)/.exec(m)) {
handleGithubCall(githubMatch[3], githubMatch[4], function (result) { handleGithubCall(githubMatch[3], githubMatch[4], function (result) {
if ('content' in result) if ('content' in result) {
{
var content = Base64.decode(result.content); var content = Base64.decode(result.content);
cachedRemoteFiles[m] = content; cachedRemoteFiles[m] = content;
files[m] = content; files[m] = content;
gatherImports(files, importHints, cb); gatherImports(files, importHints, cb);
} } else {
else
cb(null, 'Unable to import "' + m + '"'); cb(null, 'Unable to import "' + m + '"');
}
}).fail(function () { }).fail(function () {
cb(null, 'Unable to import "' + m + '"'); cb(null, 'Unable to import "' + m + '"');
}); });

@ -7,8 +7,9 @@ function Editor (loadingFromGist) {
this.newFile = function () { this.newFile = function () {
untitledCount = ''; untitledCount = '';
while (window.localStorage[SOL_CACHE_UNTITLED + untitledCount]) while (window.localStorage[SOL_CACHE_UNTITLED + untitledCount]) {
untitledCount = (untitledCount - 0) + 1; untitledCount = (untitledCount - 0) + 1;
}
SOL_CACHE_FILE = SOL_CACHE_UNTITLED + untitledCount; SOL_CACHE_FILE = SOL_CACHE_UNTITLED + untitledCount;
sessions[SOL_CACHE_FILE] = null; sessions[SOL_CACHE_FILE] = null;
this.setCacheFileContent(''); this.setCacheFileContent('');
@ -120,8 +121,9 @@ function Editor (loadingFromGist) {
if (!files.length || window.localStorage['sol-cache']) { if (!files.length || window.localStorage['sol-cache']) {
if (loadingFromGist) return; if (loadingFromGist) return;
// Backwards-compatibility // Backwards-compatibility
while (window.localStorage[SOL_CACHE_UNTITLED + untitledCount]) while (window.localStorage[SOL_CACHE_UNTITLED + untitledCount]) {
untitledCount = (untitledCount - 0) + 1; untitledCount = (untitledCount - 0) + 1;
}
SOL_CACHE_FILE = SOL_CACHE_UNTITLED + untitledCount; SOL_CACHE_FILE = SOL_CACHE_UNTITLED + untitledCount;
window.localStorage[SOL_CACHE_FILE] = window.localStorage['sol-cache'] || BALLOT_EXAMPLE; window.localStorage[SOL_CACHE_FILE] = window.localStorage['sol-cache'] || BALLOT_EXAMPLE;
window.localStorage.removeItem('sol-cache'); window.localStorage.removeItem('sol-cache');

@ -15,7 +15,9 @@ function handleLoad (cb) {
gistId = params['gist']; gistId = params['gist'];
loadingFromGist = !!gistId; loadingFromGist = !!gistId;
} }
if (loadingFromGist) cb(gistId); if (loadingFromGist) {
cb(gistId);
}
} }
return loadingFromGist; return loadingFromGist;
} }

@ -11,7 +11,9 @@ function getQueryParams () {
var parts = qs.split('&'); var parts = qs.split('&');
for (var x in parts) { for (var x in parts) {
var keyValue = parts[x].split('='); var keyValue = parts[x].split('=');
if (keyValue[0] !== '') params[keyValue[0]] = keyValue[1]; if (keyValue[0] !== '') {
params[keyValue[0]] = keyValue[1];
}
} }
return params; return params;
} }

@ -25,18 +25,20 @@ function Renderer (editor, compiler, updateFiles) {
function setProviderFromEndpoint () { function setProviderFromEndpoint () {
var endpoint = $web3endpoint.val(); var endpoint = $web3endpoint.val();
if (endpoint === 'ipc') if (endpoint === 'ipc') {
web3.setProvider(new web3.providers.IpcProvider()); web3.setProvider(new web3.providers.IpcProvider());
else } else {
web3.setProvider(new web3.providers.HttpProvider(endpoint)); web3.setProvider(new web3.providers.HttpProvider(endpoint));
} }
}
var $vmToggle = $('#vm'); var $vmToggle = $('#vm');
var $web3Toggle = $('#web3'); var $web3Toggle = $('#web3');
var $web3endpoint = $('#web3Endpoint'); var $web3endpoint = $('#web3Endpoint');
if (web3.providers && web3.currentProvider instanceof web3.providers.IpcProvider) if (web3.providers && web3.currentProvider instanceof web3.providers.IpcProvider) {
$web3endpoint.val('ipc'); $web3endpoint.val('ipc');
}
$vmToggle.get(0).checked = true; $vmToggle.get(0).checked = true;
@ -44,7 +46,9 @@ function Renderer (editor, compiler, updateFiles) {
$web3Toggle.on('change', executionContextChange); $web3Toggle.on('change', executionContextChange);
$web3endpoint.on('change', function () { $web3endpoint.on('change', function () {
setProviderFromEndpoint(); setProviderFromEndpoint();
if (executionContext === 'web3') compiler.compile(); if (executionContext === 'web3') {
compiler.compile();
}
}); });
})(); })();
@ -126,13 +130,16 @@ function Renderer (editor, compiler, updateFiles) {
var $txOrigin = $('#txorigin'); var $txOrigin = $('#txorigin');
function renderAccounts (err, accounts) { function renderAccounts (err, accounts) {
if (err) if (err) {
renderError(err.message); renderError(err.message);
}
if (accounts && accounts[0]) { if (accounts && accounts[0]) {
$txOrigin.empty(); $txOrigin.empty();
for (var a in accounts) { $txOrigin.append($('<option />').val(accounts[a]).text(accounts[a])); } for (var a in accounts) { $txOrigin.append($('<option />').val(accounts[a]).text(accounts[a])); }
$txOrigin.val(accounts[0]); $txOrigin.val(accounts[0]);
} else $txOrigin.val('unknown'); } else {
$txOrigin.val('unknown');
}
} }
dapp.getAccounts(renderAccounts); dapp.getAccounts(renderAccounts);
@ -173,17 +180,18 @@ function Renderer (editor, compiler, updateFiles) {
details.append($('<pre/>').text(funHashes)); details.append($('<pre/>').text(funHashes));
details.append($('<span class="col1">Gas Estimates</span>')); details.append($('<span class="col1">Gas Estimates</span>'));
details.append($('<pre/>').text(formatGasEstimates(contract.gasEstimates))); details.append($('<pre/>').text(formatGasEstimates(contract.gasEstimates)));
if (contract.runtimeBytecode && contract.runtimeBytecode.length > 0) if (contract.runtimeBytecode && contract.runtimeBytecode.length > 0) {
details.append(tableRow('Runtime Bytecode', contract.runtimeBytecode)); details.append(tableRow('Runtime Bytecode', contract.runtimeBytecode));
if (contract.assembly !== null) }
{ if (contract.assembly !== null) {
details.append($('<span class="col1">Assembly</span>')); details.append($('<span class="col1">Assembly</span>'));
var assembly = $('<pre/>').text(formatAssemblyText(contract.assembly, '', source)); var assembly = $('<pre/>').text(formatAssemblyText(contract.assembly, '', source));
details.append(assembly); details.append(assembly);
} }
button.click(function () { detailsOpen[contractName] = !detailsOpen[contractName]; details.toggle(); }); button.click(function () { detailsOpen[contractName] = !detailsOpen[contractName]; details.toggle(); });
if (detailsOpen[contractName]) if (detailsOpen[contractName]) {
details.show(); details.show();
}
return $('<div class="contractDetails"/>').append(button).append(details); return $('<div class="contractDetails"/>').append(button).append(details);
}; };
@ -191,38 +199,46 @@ function Renderer (editor, compiler, updateFiles) {
var gasToText = function (g) { return g === null ? 'unknown' : g; } var gasToText = function (g) { return g === null ? 'unknown' : g; }
var text = ''; var text = '';
var fun; var fun;
if ('creation' in data) if ('creation' in data) {
text += 'Creation: ' + gasToText(data.creation[0]) + ' + ' + gasToText(data.creation[1]) + '\n'; text += 'Creation: ' + gasToText(data.creation[0]) + ' + ' + gasToText(data.creation[1]) + '\n';
}
text += 'External:\n'; text += 'External:\n';
for (fun in data.external) for (fun in data.external) {
text += ' ' + fun + ': ' + gasToText(data.external[fun]) + '\n'; text += ' ' + fun + ': ' + gasToText(data.external[fun]) + '\n';
}
text += 'Internal:\n'; text += 'Internal:\n';
for (fun in data.internal) for (fun in data.internal) {
text += ' ' + fun + ': ' + gasToText(data.internal[fun]) + '\n'; text += ' ' + fun + ': ' + gasToText(data.internal[fun]) + '\n';
}
return text; return text;
}; };
var formatAssemblyText = function (asm, prefix, source) { var formatAssemblyText = function (asm, prefix, source) {
if (typeof asm === typeof '' || asm === null || asm === undefined) if (typeof asm === typeof '' || asm === null || asm === undefined) {
return prefix + asm + '\n'; return prefix + asm + '\n';
}
var text = prefix + '.code\n'; var text = prefix + '.code\n';
$.each(asm['.code'], function (i, item) { $.each(asm['.code'], function (i, item) {
var v = item.value === undefined ? '' : item.value; var v = item.value === undefined ? '' : item.value;
var src = ''; var src = '';
if (item.begin !== undefined && item.end !== undefined) if (item.begin !== undefined && item.end !== undefined) {
src = source.slice(item.begin, item.end).replace('\n', '\\n', 'g'); src = source.slice(item.begin, item.end).replace('\n', '\\n', 'g');
if (src.length > 30) }
if (src.length > 30) {
src = src.slice(0, 30) + '...'; src = src.slice(0, 30) + '...';
if (item.name !== 'tag') }
if (item.name !== 'tag') {
text += ' '; text += ' ';
}
text += prefix + item.name + ' ' + v + '\t\t\t' + src + '\n'; text += prefix + item.name + ' ' + v + '\t\t\t' + src + '\n';
}); });
text += prefix + '.data\n'; text += prefix + '.data\n';
if (asm['.data']) if (asm['.data']) {
$.each(asm['.data'], function (i, item) { $.each(asm['.data'], function (i, item) {
text += ' ' + prefix + '' + i + ':\n'; text += ' ' + prefix + '' + i + ':\n';
text += formatAssemblyText(item, prefix + ' ', source); text += formatAssemblyText(item, prefix + ' ', source);
}); });
}
return text; return text;
}; };
@ -259,11 +275,12 @@ function Renderer (editor, compiler, updateFiles) {
function getConstructorInterface (abi) { function getConstructorInterface (abi) {
var funABI = { 'name': '', 'inputs': [], 'type': 'constructor', 'outputs': [] }; var funABI = { 'name': '', 'inputs': [], 'type': 'constructor', 'outputs': [] };
for (var i = 0; i < abi.length; i++) for (var i = 0; i < abi.length; i++) {
if (abi[i].type === 'constructor') { if (abi[i].type === 'constructor') {
funABI.inputs = abi[i].inputs || []; funABI.inputs = abi[i].inputs || [];
break; break;
} }
}
return funABI; return funABI;
} }

@ -4,7 +4,9 @@ function StorageHandler (updateFiles) {
this.sync = function () { this.sync = function () {
if (typeof chrome === 'undefined' || !chrome || !chrome.storage || !chrome.storage.sync) return; if (typeof chrome === 'undefined' || !chrome || !chrome.storage || !chrome.storage.sync) {
return;
}
var obj = {}; var obj = {};
var done = false; var done = false;
@ -23,16 +25,20 @@ function StorageHandler (updateFiles) {
obj[key] = localStorage[key]; obj[key] = localStorage[key];
} }
done++; done++;
if (done >= count) chrome.storage.sync.set(obj, function () { if (done >= count) {
chrome.storage.sync.set(obj, function () {
console.log('updated cloud files with: ', obj, this, arguments); console.log('updated cloud files with: ', obj, this, arguments);
}) })
}
}) })
} }
for (var y in window.localStorage) { for (var y in window.localStorage) {
console.log('checking', y); console.log('checking', y);
obj[y] = window.localStorage.getItem(y); obj[y] = window.localStorage.getItem(y);
if (y.indexOf(utils.getCacheFilePrefix()) !== 0) continue; if (y.indexOf(utils.getCacheFilePrefix()) !== 0) {
continue;
}
count++; count++;
check(y); check(y);
} }

@ -50,7 +50,9 @@ UniversalDApp.prototype.getAccounts = function (cb) {
if (!this.vm) { if (!this.vm) {
this.web3.eth.getAccounts(cb); this.web3.eth.getAccounts(cb);
} else { } else {
if (!this.accounts) return cb('No accounts?'); if (!this.accounts) {
return cb('No accounts?');
}
cb(null, Object.keys(this.accounts)); cb(null, Object.keys(this.accounts));
} }
@ -68,7 +70,9 @@ UniversalDApp.prototype.getBalance = function (address, cb) {
} }
}); });
} else { } else {
if (!this.accounts) return cb('No accounts?'); if (!this.accounts) {
return cb('No accounts?');
}
this.vm.stateManager.getAccountBalance(new Buffer(address, 'hex'), function (err, res) { this.vm.stateManager.getAccountBalance(new Buffer(address, 'hex'), function (err, res) {
if (err) { if (err) {
@ -113,9 +117,11 @@ UniversalDApp.prototype.render = function () {
}; };
UniversalDApp.prototype.getContractByName = function (contractName) { UniversalDApp.prototype.getContractByName = function (contractName) {
for (var c in this.contracts) for (var c in this.contracts) {
if (this.contracts[c].name === contractName) if (this.contracts[c].name === contractName) {
return this.contracts[c]; return this.contracts[c];
}
}
return null; return null;
}; };
@ -162,11 +168,17 @@ UniversalDApp.prototype.getCreateInterface = function ($container, contract) {
UniversalDApp.prototype.getInstanceInterface = function (contract, address, $target) { UniversalDApp.prototype.getInstanceInterface = function (contract, address, $target) {
var self = this; var self = this;
var abi = JSON.parse(contract.interface).sort(function (a, b) { var abi = JSON.parse(contract.interface).sort(function (a, b) {
if (a.name > b.name) return -1; if (a.name > b.name) {
else return 1; return -1;
} else {
return 1;
}
}).sort(function (a, b) { }).sort(function (a, b) {
if (a.constant === true) return -1; if (a.constant === true) {
else return 1; return -1;
} else {
return 1;
}
}); });
var web3contract = this.web3.eth.contract(abi); var web3contract = this.web3.eth.contract(abi);
var funABI = this.getConstructorInterface(abi); var funABI = this.getConstructorInterface(abi);
@ -189,8 +201,9 @@ UniversalDApp.prototype.getInstanceInterface = function (contract, address, $tar
var $events = $('<div class="events"/>'); var $events = $('<div class="events"/>');
var parseLogs = function (err, response) { var parseLogs = function (err, response) {
if (err) if (err) {
return; return;
}
var $event = $('<div class="event" />'); var $event = $('<div class="event" />');
@ -209,7 +222,9 @@ UniversalDApp.prototype.getInstanceInterface = function (contract, address, $tar
var eventABI = {}; var eventABI = {};
$.each(abi, function (i, funABI) { $.each(abi, function (i, funABI) {
if (funABI.type !== 'event') return; if (funABI.type !== 'event') {
return;
}
var hash = ethJSABI.eventID(funABI.name, funABI.inputs.map(function (item) { return item.type; })); var hash = ethJSABI.eventID(funABI.name, funABI.inputs.map(function (item) { return item.type; }));
eventABI[hash.toString('hex')] = { event: funABI.name, inputs: funABI.inputs }; eventABI[hash.toString('hex')] = { event: funABI.name, inputs: funABI.inputs };
@ -252,7 +267,9 @@ UniversalDApp.prototype.getInstanceInterface = function (contract, address, $tar
})); }));
$.each(abi, function (i, funABI) { $.each(abi, function (i, funABI) {
if (funABI.type !== 'function') return; if (funABI.type !== 'function') {
return;
}
// @todo getData cannot be used with overloaded functions // @todo getData cannot be used with overloaded functions
$instance.append(self.getCallButton({ $instance.append(self.getCallButton({
abi: funABI, abi: funABI,
@ -286,11 +303,12 @@ UniversalDApp.prototype.getInstanceInterface = function (contract, address, $tar
UniversalDApp.prototype.getConstructorInterface = function (abi) { UniversalDApp.prototype.getConstructorInterface = function (abi) {
var funABI = { 'name': '', 'inputs': [], 'type': 'constructor', 'outputs': [] }; var funABI = { 'name': '', 'inputs': [], 'type': 'constructor', 'outputs': [] };
for (var i = 0; i < abi.length; i++) for (var i = 0; i < abi.length; i++) {
if (abi[i].type === 'constructor') { if (abi[i].type === 'constructor') {
funABI.inputs = abi[i].inputs || []; funABI.inputs = abi[i].inputs || [];
break; break;
} }
}
return funABI; return funABI;
}; };
@ -303,7 +321,9 @@ UniversalDApp.prototype.getCallButton = function (args) {
var inputs = ''; var inputs = '';
$.each(args.abi.inputs, function (i, inp) { $.each(args.abi.inputs, function (i, inp) {
if (inputs !== '') inputs += ', '; if (inputs !== '') {
inputs += ', ';
}
inputs += inp.type + ' ' + inp.name; inputs += inp.type + ' ' + inp.name;
}); });
var inputField = $('<input/>').attr('placeholder', inputs).attr('title', inputs); var inputField = $('<input/>').attr('placeholder', inputs).attr('title', inputs);
@ -363,11 +383,12 @@ UniversalDApp.prototype.getCallButton = function (args) {
var handleCallButtonClick = function (ev, $result) { var handleCallButtonClick = function (ev, $result) {
if (!$result) { if (!$result) {
$result = getOutput(); $result = getOutput();
if (lookupOnly && !inputs.length) if (lookupOnly && !inputs.length) {
$outputOverride.empty().append($result); $outputOverride.empty().append($result);
else } else {
outputSpan.append($result); outputSpan.append($result);
} }
}
var funArgs = ''; var funArgs = '';
try { try {
@ -385,30 +406,35 @@ UniversalDApp.prototype.getCallButton = function (args) {
return; return;
} }
} }
if (data.slice(0, 9) === 'undefined') if (data.slice(0, 9) === 'undefined') {
data = data.slice(9); data = data.slice(9);
if (data.slice(0, 2) === '0x') data = data.slice(2); }
if (data.slice(0, 2) === '0x') {
data = data.slice(2);
}
replaceOutput($result, $('<span>Waiting for transaction to be mined...</span>')); replaceOutput($result, $('<span>Waiting for transaction to be mined...</span>'));
if (isConstructor) { if (isConstructor) {
if (args.bytecode.indexOf('_') >= 0) { if (args.bytecode.indexOf('_') >= 0) {
replaceOutput($result, $('<span>Deploying and linking required libraries...</span>')); replaceOutput($result, $('<span>Deploying and linking required libraries...</span>'));
if (self.options.vm) if (self.options.vm) {
self.linkBytecode(args.contractName, function (err, bytecode) { self.linkBytecode(args.contractName, function (err, bytecode) {
if (err) if (err) {
replaceOutput($result, $('<span/>').text('Error deploying required libraries: ' + err)); replaceOutput($result, $('<span/>').text('Error deploying required libraries: ' + err));
else { } else {
args.bytecode = bytecode; args.bytecode = bytecode;
handleCallButtonClick(ev, $result); handleCallButtonClick(ev, $result);
} }
}); });
else } else {
replaceOutput($result, $('<span>Contract needs to be linked to a library, this is only supported in the JavaScript VM for now.</span>')); replaceOutput($result, $('<span>Contract needs to be linked to a library, this is only supported in the JavaScript VM for now.</span>'));
}
return; return;
} else } else {
data = args.bytecode + data; data = args.bytecode + data;
} }
}
self.runTx(data, args, function (err, result) { self.runTx(data, args, function (err, result) {
if (err) { if (err) {
@ -462,13 +488,16 @@ UniversalDApp.prototype.getCallButton = function (args) {
function testResult (err, address) { function testResult (err, address) {
if (!err && !address) { if (!err && !address) {
setTimeout(function () { tryTillResponse(txhash, done); }, 500); setTimeout(function () { tryTillResponse(txhash, done); }, 500);
} else done(err, address); } else {
done(err, address);
}
} }
} }
tryTillResponse(result, function (err, result) { tryTillResponse(result, function (err, result) {
if (err) replaceOutput($result, $('<span/>').text(err).addClass('error')); if (err) {
else if (isConstructor) { replaceOutput($result, $('<span/>').text(err).addClass('error'));
} else if (isConstructor) {
$result.html(''); $result.html('');
args.appendFunctions(result.contractAddress); args.appendFunctions(result.contractAddress);
} else { } else {
@ -503,41 +532,52 @@ UniversalDApp.prototype.getCallButton = function (args) {
UniversalDApp.prototype.linkBytecode = function (contractName, cb) { UniversalDApp.prototype.linkBytecode = function (contractName, cb) {
var bytecode = this.getContractByName(contractName).bytecode; var bytecode = this.getContractByName(contractName).bytecode;
if (bytecode.indexOf('_') < 0) if (bytecode.indexOf('_') < 0) {
return cb(null, bytecode); return cb(null, bytecode);
}
var m = bytecode.match(/__([^_]{1,36})__/); var m = bytecode.match(/__([^_]{1,36})__/);
if (!m) if (!m) {
return cb('Invalid bytecode format.'); return cb('Invalid bytecode format.');
}
var libraryName = m[1]; var libraryName = m[1];
if (!this.getContractByName(libraryName)) if (!this.getContractByName(libraryName)) {
return cb('Library ' + libraryName + ' not found.'); return cb('Library ' + libraryName + ' not found.');
}
var self = this; var self = this;
this.deployLibrary(libraryName, function (err, address) { this.deployLibrary(libraryName, function (err, address) {
if (err) return cb(err); if (err) {
return cb(err);
}
var libLabel = '__' + libraryName + Array(39 - libraryName.length).join('_'); var libLabel = '__' + libraryName + Array(39 - libraryName.length).join('_');
var hexAddress = address.toString('hex'); var hexAddress = address.toString('hex');
if (hexAddress.slice(0, 2) === '0x') hexAddress = hexAddress.slice(2); if (hexAddress.slice(0, 2) === '0x') {
hexAddress = hexAddress.slice(2);
}
hexAddress = Array(40 - hexAddress.length + 1).join('0') + hexAddress; hexAddress = Array(40 - hexAddress.length + 1).join('0') + hexAddress;
while (bytecode.indexOf(libLabel) >= 0) while (bytecode.indexOf(libLabel) >= 0) {
bytecode = bytecode.replace(libLabel, hexAddress); bytecode = bytecode.replace(libLabel, hexAddress);
}
self.getContractByName(contractName).bytecode = bytecode; self.getContractByName(contractName).bytecode = bytecode;
self.linkBytecode(contractName, cb); self.linkBytecode(contractName, cb);
}); });
}; };
UniversalDApp.prototype.deployLibrary = function (contractName, cb) { UniversalDApp.prototype.deployLibrary = function (contractName, cb) {
if (this.getContractByName(contractName).address) if (this.getContractByName(contractName).address) {
return cb(null, this.getContractByName(contractName).address); return cb(null, this.getContractByName(contractName).address);
}
var self = this; var self = this;
var bytecode = this.getContractByName(contractName).bytecode; var bytecode = this.getContractByName(contractName).bytecode;
if (bytecode.indexOf('_') >= 0) if (bytecode.indexOf('_') >= 0) {
this.linkBytecode(contractName, function (err, bytecode) { this.linkBytecode(contractName, function (err, bytecode) {
if (err) cb(err); if (err) cb(err);
else self.deployLibrary(contractName, cb); else self.deployLibrary(contractName, cb);
}); });
else { } else {
this.runTx(bytecode, { abi: { constant: false }, bytecode: bytecode }, function (err, result) { this.runTx(bytecode, { abi: { constant: false }, bytecode: bytecode }, function (err, result) {
if (err) return cb(err); if (err) {
return cb(err);
}
self.getContractByName(contractName).address = result.createdAddress; self.getContractByName(contractName).address = result.createdAddress;
cb(err, result.createdAddress); cb(err, result.createdAddress);
}); });
@ -554,8 +594,9 @@ UniversalDApp.prototype.runTx = function (data, args, cb) {
var to = args.address; var to = args.address;
var constant = args.abi.constant; var constant = args.abi.constant;
var isConstructor = args.bytecode !== undefined; var isConstructor = args.bytecode !== undefined;
if (data.slice(0, 2) !== '0x') if (data.slice(0, 2) !== '0x') {
data = '0x' + data; data = '0x' + data;
}
var gas = self.options.getGas ? self.options.getGas : 1000000; var gas = self.options.getGas ? self.options.getGas : 1000000;
@ -582,8 +623,11 @@ UniversalDApp.prototype.runTx = function (data, args, cb) {
} else { } else {
this.web3.eth.estimateGas(tx, function (err, resp) { this.web3.eth.estimateGas(tx, function (err, resp) {
tx.gas = resp; tx.gas = resp;
if (!err) self.web3.eth.sendTransaction(tx, cb); if (!err) {
else cb(err, resp); self.web3.eth.sendTransaction(tx, cb);
} else {
cb(err, resp);
}
}); });
} }
} else { } else {

@ -3,9 +3,10 @@
var Web3 = require('web3'); var Web3 = require('web3');
if (typeof web3 !== 'undefined') if (typeof web3 !== 'undefined') {
web3 = new Web3(web3.currentProvider); web3 = new Web3(web3.currentProvider);
else } else {
web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545')); web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));
}
module.exports = web3; module.exports = web3;

Loading…
Cancel
Save