Merge branch 'develop' of https://github.com/embark-framework/embark into develop

This commit is contained in:
Santiago Gonzalez Toral 2018-09-11 12:32:07 -05:00
commit 8a43b0789e
27 changed files with 2337 additions and 1988 deletions

View File

@ -4,11 +4,32 @@ try {
eval('let __nodeTest = 123;'); eval('let __nodeTest = 123;');
} catch(e) { } catch(e) {
if (e.name === 'SyntaxError') { if (e.name === 'SyntaxError') {
console.error("unsupported version of NodeJS. Make sure you are running nodejs 6.9.5 or above"); console.error("unsupported version of NodeJS. Make sure you are running nodejs 8.11.3 or above");
process.exit(); process.exit();
} }
} }
function launchEmbark() {
var Cmd = require('../cmd/cmd'); var Cmd = require('../cmd/cmd');
var cli = new Cmd(); var cli = new Cmd();
cli.process(process.argv); cli.process(process.argv);
}
const path = require('path');
try {
const dappPackage = require(path.join(process.cwd(), 'package.json'));
require(path.join(process.cwd(), 'embark.json')); // Make sure we are in a Dapp
require('check-dependencies')(dappPackage, (state) => {
if (state.status) {
require('colors');
console.error('\nMissing dependencies. Please run npm install'.red);
process.exit();
}
launchEmbark();
});
} catch (_e) {
// We are not in a Dapp
launchEmbark();
}

View File

@ -26,9 +26,9 @@ if (!process.env.EMBARK_PATH) {
// as an ejected webpack.config.js), making embark's dependencies trasitive // as an ejected webpack.config.js), making embark's dependencies trasitive
// dependencies of a dapp without the dapp explicitly specifying embark as a // dependencies of a dapp without the dapp explicitly specifying embark as a
// dependency in the dapp's package.json // dependency in the dapp's package.json
process.env.NODE_PATH = utils.joinPath(process.env.EMBARK_PATH, 'node_modules') process.env.NODE_PATH = utils.joinPath(process.env.EMBARK_PATH, 'node_modules') +
+ (process.env.NODE_PATH ? require('path').delimiter : '') (process.env.NODE_PATH ? require('path').delimiter : '') +
+ (process.env.NODE_PATH || ''); (process.env.NODE_PATH || '');
class Cmd { class Cmd {
constructor() { constructor() {
@ -98,13 +98,12 @@ class Cmd {
} }
} }
}); });
} else { }
if (options.simple) { if (options.simple) {
embark.generateTemplate('simple', './', name); embark.generateTemplate('simple', './', name);
} else { } else {
embark.generateTemplate('boilerplate', './', name, options.template); embark.generateTemplate('boilerplate', './', name, options.template);
} }
}
}); });
} }
@ -124,7 +123,7 @@ class Cmd {
.command('build [environment]') .command('build [environment]')
.option('--contracts', 'only compile contracts into Embark wrappers') .option('--contracts', 'only compile contracts into Embark wrappers')
.option('--logfile [logfile]', __('filename to output logs (default: none)')) .option('--logfile [logfile]', __('filename to output logs (default: none)'))
.option('-c, --client [client]', __('Use a specific ethereum client or simulator (supported: %s)', 'geth, testrpc')) .option('-c, --client [client]', __('Use a specific ethereum client (supported: %s)', 'geth'))
.option('--loglevel [loglevel]', __('level of logging to display') + ' ["error", "warn", "info", "debug", "trace"]', /^(error|warn|info|debug|trace)$/i, 'debug') .option('--loglevel [loglevel]', __('level of logging to display') + ' ["error", "warn", "info", "debug", "trace"]', /^(error|warn|info|debug|trace)$/i, 'debug')
.option('--locale [locale]', __('language to use (default: en)')) .option('--locale [locale]', __('language to use (default: en)'))
.option('--pipeline [pipeline]', __('webpack config to use (default: production)')) .option('--pipeline [pipeline]', __('webpack config to use (default: production)'))
@ -145,7 +144,7 @@ class Cmd {
program program
.command('run [environment]') .command('run [environment]')
.option('-p, --port [port]', __('port to run the dev webserver (default: %s)', '8000')) .option('-p, --port [port]', __('port to run the dev webserver (default: %s)', '8000'))
.option('-c, --client [client]', __('Use a specific ethereum client or simulator (supported: %s)', 'geth, testrpc')) .option('-c, --client [client]', __('Use a specific ethereum client (supported: %s)', 'geth'))
.option('-b, --host [host]', __('host to run the dev webserver (default: %s)', 'localhost')) .option('-b, --host [host]', __('host to run the dev webserver (default: %s)', 'localhost'))
.option('--noserver', __('disable the development webserver')) .option('--noserver', __('disable the development webserver'))
.option('--nodashboard', __('simple mode, disables the dashboard')) .option('--nodashboard', __('simple mode, disables the dashboard'))
@ -175,7 +174,7 @@ class Cmd {
console() { console() {
program program
.command('console [environment]') .command('console [environment]')
.option('-c, --client [client]', __('Use a specific ethereum client or simulator (supported: %s)', 'geth, testrpc')) .option('-c, --client [client]', __('Use a specific ethereum client (supported: %s)', 'geth'))
.option('--logfile [logfile]', __('filename to output logs (default: %s)', 'none')) .option('--logfile [logfile]', __('filename to output logs (default: %s)', 'none'))
.option('--loglevel [loglevel]', __('level of logging to display') + ' ["error", "warn", "info", "debug", "trace"]', /^(error|warn|info|debug|trace)$/i, 'debug') .option('--loglevel [loglevel]', __('level of logging to display') + ' ["error", "warn", "info", "debug", "trace"]', /^(error|warn|info|debug|trace)$/i, 'debug')
.option('--locale [locale]', __('language to use (default: en)')) .option('--locale [locale]', __('language to use (default: en)'))
@ -197,7 +196,7 @@ class Cmd {
blockchain() { blockchain() {
program program
.command('blockchain [environment]') .command('blockchain [environment]')
.option('-c, --client [client]', __('Use a specific ethereum client or simulator (supported: %s)', 'geth, testrpc')) .option('-c, --client [client]', __('Use a specific ethereum client (supported: %s)', 'geth'))
.option('--locale [locale]', __('language to use (default: en)')) .option('--locale [locale]', __('language to use (default: en)'))
.description(__('run blockchain server (default: %s)', 'development')) .description(__('run blockchain server (default: %s)', 'development'))
.action(function(env, options) { .action(function(env, options) {
@ -259,7 +258,7 @@ class Cmd {
.option('--logfile [logfile]', __('filename to output logs (default: %s)', 'none')) .option('--logfile [logfile]', __('filename to output logs (default: %s)', 'none'))
.option('--loglevel [loglevel]', __('level of logging to display') + ' ["error", "warn", "info", "debug", "trace"]', /^(error|warn|info|debug|trace)$/i, 'debug') .option('--loglevel [loglevel]', __('level of logging to display') + ' ["error", "warn", "info", "debug", "trace"]', /^(error|warn|info|debug|trace)$/i, 'debug')
.option('--locale [locale]', __('language to use (default: en)')) .option('--locale [locale]', __('language to use (default: en)'))
.option('-c, --client [client]', __('Use a specific ethereum client or simulator (supported: %s)', 'geth, testrpc')) .option('-c, --client [client]', __('Use a specific ethereum client (supported: %s)', 'geth'))
.option('--pipeline [pipeline]', __('webpack config to use (default: production)')) .option('--pipeline [pipeline]', __('webpack config to use (default: production)'))
.description(__('Upload your dapp to a decentralized storage') + '.') .description(__('Upload your dapp to a decentralized storage') + '.')
.action(function(env, _options) { .action(function(env, _options) {

View File

@ -79,18 +79,20 @@ class EmbarkController {
context: self.context, context: self.context,
useDashboard: options.useDashboard, useDashboard: options.useDashboard,
webServerConfig: webServerConfig, webServerConfig: webServerConfig,
webpackConfigName: options.webpackConfigName, webpackConfigName: options.webpackConfigName
ipcRole: 'server'
}); });
engine.init();
async.waterfall([
function initEngine(callback) {
engine.init({}, () => {
if (!options.useDashboard) { if (!options.useDashboard) {
engine.logger.info('========================'.bold.green); engine.logger.info('========================'.bold.green);
engine.logger.info((__('Welcome to Embark') + ' ' + this.version).yellow.bold); engine.logger.info((__('Welcome to Embark') + ' ' + engine.version).yellow.bold);
engine.logger.info('========================'.bold.green); engine.logger.info('========================'.bold.green);
} }
callback();
async.parallel([ });
},
function startDashboard(callback) { function startDashboard(callback) {
if (!options.useDashboard) { if (!options.useDashboard) {
return callback(); return callback();
@ -182,9 +184,12 @@ class EmbarkController {
context: this.context, context: this.context,
webpackConfigName: options.webpackConfigName webpackConfigName: options.webpackConfigName
}); });
engine.init();
async.waterfall([ async.waterfall([
function initEngine(callback) {
engine.init({}, callback);
},
function startServices(callback) { function startServices(callback) {
let pluginList = engine.plugins.listPlugins(); let pluginList = engine.plugins.listPlugins();
if (pluginList.length > 0) { if (pluginList.length > 0) {
@ -250,8 +255,11 @@ class EmbarkController {
context: this.context, context: this.context,
webpackConfigName: options.webpackConfigName webpackConfigName: options.webpackConfigName
}); });
engine.init();
async.waterfall([ async.waterfall([
function initEngine(callback) {
engine.init({}, callback);
},
function startServices(callback) { function startServices(callback) {
let pluginList = engine.plugins.listPlugins(); let pluginList = engine.plugins.listPlugins();
if (pluginList.length > 0) { if (pluginList.length > 0) {
@ -350,9 +358,12 @@ class EmbarkController {
logFile: options.logFile, logFile: options.logFile,
context: this.context context: this.context
}); });
engine.init();
async.waterfall([ async.waterfall([
function (callback) {
engine.init({}, callback);
},
function (callback) { function (callback) {
let pluginList = engine.plugins.listPlugins(); let pluginList = engine.plugins.listPlugins();
if (pluginList.length > 0) { if (pluginList.length > 0) {
@ -436,12 +447,22 @@ class EmbarkController {
context: this.context, context: this.context,
webpackConfigName: options.webpackConfigName webpackConfigName: options.webpackConfigName
}); });
engine.init();
let platform = engine.config.storageConfig.upload.provider;
let platform;
async.waterfall([ async.waterfall([
function initEngine(callback) {
engine.init({}, () => {
if (engine.config.embarkConfig.config.storage === false || engine.config.storageConfig.enabled === false) {
engine.logger.error(__('Storage configuration is disabled in embark.json. Please provide a storage file before uploading'));
engine.logger.info(__('You can find an example here: %s', 'https://github.com/embark-framework/embark/blob/master/templates/demo/config/storage.js'.underline));
process.exit(1);
}
platform = engine.config.storageConfig.upload.provider;
callback();
});
},
function startServices(callback) { function startServices(callback) {
engine.startService("processManager"); engine.startService("processManager");
@ -499,7 +520,7 @@ class EmbarkController {
engine.logger.error(err.message); engine.logger.error(err.message);
return engine.logger.debug(err.stack); return engine.logger.debug(err.stack);
} }
engine.locale.error(err); engine.logger.error(err);
} else { } else {
engine.logger.info((__("finished building DApp and deploying to") + " " + platform).underline); engine.logger.info((__("finished building DApp and deploying to") + " " + platform).underline);
} }

View File

@ -183,7 +183,8 @@ Config.prototype.loadBlockchainConfigFile = function() {
if (!configFilePath) { if (!configFilePath) {
this.blockchainConfig.default = true; this.blockchainConfig.default = true;
} }
if(!this.blockchainConfig.account && !this.blockchainConfig.isDev) { if (!this.blockchainConfig.account && !this.blockchainConfig.isDev &&
this.env !== 'development' && this.env !== 'test') {
this.logger.warn( this.logger.warn(
__('Account settings are needed for this chain.' + __('Account settings are needed for this chain.' +
' Please put a valid address and possibly a password in your blockchain config or use a dev chain.') ' Please put a valid address and possibly a password in your blockchain config or use a dev chain.')
@ -322,8 +323,12 @@ Config.prototype.loadWebServerConfigFile = function() {
let webServerConfig = this._mergeConfig(configFilePath, configObject, false); let webServerConfig = this._mergeConfig(configFilePath, configObject, false);
if (configFilePath === false) {
this.webServerConfig = {enabled: false};
return;
}
if (this.webServerConfig) { if (this.webServerConfig) {
// cli falgs to `embark run` should override configFile and defaults (configObject) // cli flags to `embark run` should override configFile and defaults (configObject)
this.webServerConfig = utils.recursiveMerge(webServerConfig, this.webServerConfig); this.webServerConfig = utils.recursiveMerge(webServerConfig, this.webServerConfig);
} else { } else {
this.webServerConfig = webServerConfig; this.webServerConfig = webServerConfig;

View File

@ -17,11 +17,11 @@ class Engine {
this.context = options.context; this.context = options.context;
this.useDashboard = options.useDashboard; this.useDashboard = options.useDashboard;
this.webServerConfig = options.webServerConfig; this.webServerConfig = options.webServerConfig;
this.ipcRole = options.ipcRole;
this.webpackConfigName = options.webpackConfigName; this.webpackConfigName = options.webpackConfigName;
} }
init(_options) { init(_options, callback) {
callback = callback || function() {};
const Events = require('./events.js'); const Events = require('./events.js');
const Logger = require('./logger.js'); const Logger = require('./logger.js');
const Config = require('./config.js'); const Config = require('./config.js');
@ -38,22 +38,13 @@ class Engine {
utils.interceptLogs(console, this.logger); utils.interceptLogs(console, this.logger);
} }
if (this.ipcRole) {
this.ipc = new IPC({logger: this.logger, ipcRole: this.ipcRole});
if(this.ipc.isServer()) {
this.ipc.serve();
}
return;
}
this.ipc = new IPC({logger: this.logger, ipcRole: 'client'}); this.ipc = new IPC({logger: this.logger, ipcRole: 'client'});
this.ipc.connect((err) => { this.ipc.connect((err) => {
if(err) { if(err) {
this.ipc = new IPC({logger: this.logger, ipcRole: 'server'}); this.ipc = new IPC({logger: this.logger, ipcRole: 'server'});
this.ipc.serve(); this.ipc.serve();
} }
callback();
}); });
} }

View File

@ -6,7 +6,7 @@ class IPC {
constructor(options) { constructor(options) {
this.logger = options.logger; this.logger = options.logger;
this.socketPath = options.socketPath || fs.dappPath(".embark/embark.ipc"); this.socketPath = options.socketPath || fs.dappPath(".embark/embark.ipc");
this.ipcRole = options.ipcRole || "server"; this.ipcRole = options.ipcRole;
ipc.config.silent = true; ipc.config.silent = true;
this.connected = false; this.connected = false;
} }

View File

@ -12,14 +12,15 @@ class ProcessWrapper {
* Manages the log interception so that all console.* get sent back to the parent process * Manages the log interception so that all console.* get sent back to the parent process
* Also creates an Events instance. To use it, just do `this.events.[on|request]` * Also creates an Events instance. To use it, just do `this.events.[on|request]`
* *
* @param {Options} _options Nothing for now * @param {Options} options pingParent: true by default
*/ */
constructor(_options) { constructor(options = {pingParent: true}) {
this.interceptLogs(); this.interceptLogs();
this.events = new Events(); this.events = new Events();
if(options.pingParent) {
this.pingParent(); this.pingParent();
} }
}
// Ping parent to see if it is still alive. Otherwise, let's die // Ping parent to see if it is still alive. Otherwise, let's die
pingParent() { pingParent() {

View File

@ -5,6 +5,7 @@ let proxy = require('./proxy');
const Ipc = require('../../core/ipc'); const Ipc = require('../../core/ipc');
const constants = require('../../constants.json'); const constants = require('../../constants.json');
const {defaultHost, dockerHostSwap} = require('../../utils/host'); const {defaultHost, dockerHostSwap} = require('../../utils/host');
const fs = require('../../core/fs.js');
class Simulator { class Simulator {
constructor(options) { constructor(options) {
@ -15,7 +16,7 @@ class Simulator {
run(options) { run(options) {
let cmds = []; let cmds = [];
const ganache_main = require.resolve('ganache-cli'); const ganache_main = require.resolve('ganache-cli', {paths: fs.embarkPath('node_modules')});
const ganache_json = pkgUp.sync(path.dirname(ganache_main)); const ganache_json = pkgUp.sync(path.dirname(ganache_main));
const ganache_root = path.dirname(ganache_json); const ganache_root = path.dirname(ganache_json);
const ganache_bin = require(ganache_json).bin; const ganache_bin = require(ganache_json).bin;

View File

@ -289,7 +289,7 @@ class CodeGenerator {
function getWeb3Location(next) { function getWeb3Location(next) {
self.events.request("version:get:web3", function(web3Version) { self.events.request("version:get:web3", function(web3Version) {
if (web3Version === "1.0.0-beta") { if (web3Version === "1.0.0-beta") {
return next(null, fs.embarkPath("node_modules/web3")); return next(null, require.resolve("web3", {paths: fs.embarkPath("node_modules")}));
} }
self.events.request("version:getPackageLocation", "web3", web3Version, function(err, location) { self.events.request("version:getPackageLocation", "web3", web3Version, function(err, location) {
return next(null, fs.dappPath(location)); return next(null, fs.dappPath(location));
@ -350,7 +350,7 @@ class CodeGenerator {
function getWeb3Location(next) { function getWeb3Location(next) {
self.events.request("version:get:web3", function(web3Version) { self.events.request("version:get:web3", function(web3Version) {
if (web3Version === "1.0.0-beta") { if (web3Version === "1.0.0-beta") {
return next(null, utils.joinPath(fs.embarkPath("node_modules/web3"))); return next(null, require.resolve("web3", {paths: fs.embarkPath("node_modules")}));
} }
self.events.request("version:getPackageLocation", "web3", web3Version, function(err, location) { self.events.request("version:getPackageLocation", "web3", web3Version, function(err, location) {
return next(null, fs.dappPath(location)); return next(null, fs.dappPath(location));

View File

@ -28,7 +28,7 @@ class ENS {
} }
registerEvents() { registerEvents() {
this.embark.registerActionForEvent("contracts:deploy:afterAll", this.setProviderAndRegisterDomains.bind(this)); this.events.once("contracts:deploy:afterAll", this.setProviderAndRegisterDomains.bind(this));
this.events.setCommandHandler("storage:ens:associate", this.associateStorageToEns.bind(this)); this.events.setCommandHandler("storage:ens:associate", this.associateStorageToEns.bind(this));
} }

View File

@ -10,7 +10,7 @@ const NpmTimer = require('../library_manager/npmTimer');
class SolcProcess extends ProcessWrapper { class SolcProcess extends ProcessWrapper {
constructor(options){ constructor(options){
super(); super({pingParent: false});
this._logger = options.logger; this._logger = options.logger;
this._showSpinner = options.showSpinner === true; this._showSpinner = options.showSpinner === true;
} }

View File

@ -32,6 +32,26 @@ class WebServer {
port: this.port port: this.port
}); });
this.events.on('webserver:config:change', () => {
this.embark.config.webServerConfig = null;
this.embark.config.loadWebServerConfigFile();
this.webServerConfig = this.embark.config.webServerConfig;
this.host = this.webServerConfig.host;
this.port = this.webServerConfig.port;
this.server.host = this.host;
this.server.port = this.port;
this.testPort(() => {
this.server.stop((_err) => {
this.server.start((_err, message, port) => {
this.logger.info(message);
this.port = port;
this.events.request('open-browser', () => {});
});
});
});
});
this.testPort(() => { this.testPort(() => {
this.listenToCommands(); this.listenToCommands();
this.registerConsoleCommands(); this.registerConsoleCommands();

View File

@ -85,9 +85,12 @@ class Pipeline {
}, },
function runWebpack(next) { function runWebpack(next) {
self.logger.info(__(`running webpack with '${self.webpackConfigName}' config...`)); self.logger.info(__(`running webpack with '${self.webpackConfigName}' config...`));
Object.keys(self.assetFiles) const assets = Object.keys(self.assetFiles)
.filter(key => key.match(/\.js?$/)) .filter(key => key.match(/\.js$/));
.forEach(key => { if (!assets || !assets.length) {
return next();
}
assets.forEach(key => {
self.logger.info(__("writing file") + " " + (utils.joinPath(self.buildDir, key)).bold.dim); self.logger.info(__("writing file") + " " + (utils.joinPath(self.buildDir, key)).bold.dim);
}); });
let built = false; let built = false;
@ -117,7 +120,7 @@ class Pipeline {
async.eachOf( async.eachOf(
// assetFileWrite should not process .js files // assetFileWrite should not process .js files
Object.keys(self.assetFiles) Object.keys(self.assetFiles)
.filter(key => !key.match(/\.js?$/)) .filter(key => !key.match(/\.js$/))
.reduce((obj, key) => { .reduce((obj, key) => {
obj[key] = self.assetFiles[key]; obj[key] = self.assetFiles[key];
return obj; return obj;

View File

@ -26,8 +26,12 @@ class Watch {
self.logger.trace('ready to watch contract changes'); self.logger.trace('ready to watch contract changes');
}); });
this.watchConfigs(embarkConfig, function () { this.watchContractConfig(embarkConfig, function () {
self.logger.trace('ready to watch config changes'); self.logger.trace('ready to watch contract config changes');
});
this.watchWebserverConfig(embarkConfig, function () {
self.logger.trace('ready to watch webserver config changes');
}); });
this.logger.info(__("ready to watch file changes")); this.logger.info(__("ready to watch file changes"));
@ -96,19 +100,45 @@ class Watch {
); );
} }
watchConfigs(embarkConfig, callback) { watchWebserverConfig(embarkConfig, callback) {
let self = this; let self = this;
let contractsConfig; let webserverConfig;
if (typeof embarkConfig.config === 'object' || embarkConfig.config.contracts) { if (typeof embarkConfig.config === 'object') {
contractsConfig = embarkConfig.config.contracts; if (!embarkConfig.config.webserver) {
return;
}
webserverConfig = embarkConfig.config.webserver;
} else { } else {
let contractsFolder = embarkConfig.config.replace(/\\/g, '/'); let contractsFolder = embarkConfig.config.replace(/\\/g, '/');
if (contractsFolder.charAt(contractsFolder.length - 1) !== '/') { if (contractsFolder.charAt(contractsFolder.length - 1) !== '/') {
contractsFolder += '/'; contractsFolder += '/';
} }
contractsConfig = [`${contractsFolder}**/contracts.json`, `${contractsFolder}**/contracts.js`]; webserverConfig = [`${contractsFolder}**/webserver.json`, `${contractsFolder}**/webserver.js`];
} }
this.watchFiles(contractsConfig, this.watchFiles(webserverConfig,
function (eventName, path) {
self.logger.info(`${eventName}: ${path}`);
self.events.emit('webserver:config:change', 'config', path);
},
function () {
callback();
}
);
}
watchContractConfig(embarkConfig, callback) {
let self = this;
let contractConfig;
if (typeof embarkConfig.config === 'object' || embarkConfig.config.contracts) {
contractConfig = embarkConfig.config.contracts;
} else {
let contractsFolder = embarkConfig.config.replace(/\\/g, '/');
if (contractsFolder.charAt(contractsFolder.length - 1) !== '/') {
contractsFolder += '/';
}
contractConfig = [`${contractsFolder}**/contracts.json`, `${contractsFolder}**/contracts.js`];
}
this.watchFiles(contractConfig,
function (eventName, path) { function (eventName, path) {
self.logger.info(`${eventName}: ${path}`); self.logger.info(`${eventName}: ${path}`);
self.events.emit('file-' + eventName, 'config', path); self.events.emit('file-' + eventName, 'config', path);

View File

@ -36,7 +36,7 @@ try {
} }
const entry = Object.keys(embarkAssets) const entry = Object.keys(embarkAssets)
.filter(key => key.match(/\.js?$/)) .filter(key => key.match(/\.js$/))
.reduce((obj, key) => { .reduce((obj, key) => {
// webpack entry paths should start with './' if they're relative to the // webpack entry paths should start with './' if they're relative to the
// webpack context; embark.json "app" keys correspond to lists of .js // webpack context; embark.json "app" keys correspond to lists of .js

View File

@ -116,48 +116,52 @@ class Test {
} }
init(callback) { init(callback) {
let self = this;
this.engine = new Engine({ this.engine = new Engine({
env: this.options.env || 'test', env: this.options.env || 'test',
// TODO: config will need to detect if this is a obj // TODO: config will need to detect if this is a obj
embarkConfig: this.options.embarkConfig || 'embark.json', embarkConfig: this.options.embarkConfig || 'embark.json',
interceptLogs: false, interceptLogs: false
ipcRole: 'client'
}); });
async.waterfall([
this.engine.init({ function initEngine(cb) {
logger: new TestLogger({logLevel: this.options.loglevel}) self.engine.init({
}); logger: new TestLogger({logLevel: self.options.loglevel})
}, cb);
this.versions_default = this.engine.config.contractsConfig.versions; },
function startServices(cb) {
self.versions_default = self.engine.config.contractsConfig.versions;
// Reset contract config to nothing to make sure we deploy only what we want // Reset contract config to nothing to make sure we deploy only what we want
this.engine.config.contractsConfig = { self.engine.config.contractsConfig = {
contracts: {}, contracts: {},
versions: this.versions_default versions: self.versions_default
}; };
this.engine.startService("libraryManager"); self.engine.startService("libraryManager");
this.engine.startService("codeRunner"); self.engine.startService("codeRunner");
this.initDeployServices(); self.initDeployServices();
this.engine.startService("codeGenerator"); self.engine.startService("codeGenerator");
this.engine.startService("codeCoverage"); self.engine.startService("codeCoverage");
if (this.options.node === 'embark') { if (self.options.node === 'embark') {
return this.engine.ipc.connect((err) => { return self.engine.ipc.connect((err) => {
if (err) { if (err) {
this.engine.logger.error(err.message || err); this.engine.logger.error(err.message || err);
this.engine.logger.error("Could not connect to Embark's IPC. Is embark running?"); this.engine.logger.error("Could not connect to Embark's IPC. Is embark running?");
process.exit(1); process.exit(1);
} }
this.engine.ipc.request('blockchain:node', {}, (err, node) => { self.engine.ipc.request('blockchain:node', {}, (err, node) => {
if (err) { if (err) {
return this.engine.logger.error(err.message || err); return self.engine.logger.error(err.message || err);
} }
this.options.node = node; self.options.node = node;
callback(); cb();
}); });
}); });
} }
callback(); cb();
}
], callback);
} }
onReady(callback) { onReady(callback) {

View File

@ -75,25 +75,66 @@ class TemplateGenerator {
console.log('\n' + __('App ready at ').green + templatePath); console.log('\n' + __('App ready at ').green + templatePath);
} }
getExternalProject(uri) { extractGithubUrlAndFolder(uri){
let match = uri.match(
/\.[a-z]+\/([-a-zA-Z0-9@:%_+.~#?&\/=]+)/ /* first matching group is the url, second the repoPart and third the branch with a hash in the beginning (if existing)
); e.g. (["git@github.com/status-im/dappcon-workshop-dapp#master", "status-im/dappcon-workshop-dapp", "#master" ])
should work with all formats of the following:
* git@github.com/status-im/dappcon-workshop-dapp#start-here
* git@github.com/status-im/dappcon-workshop-dapp
* http://www.github.com/status-im/dappcon-workshop-dapp
* https://www.github.com/status-im/dappcon-workshop-dapp
* github.com/status-im/dappcon-workshop-dapp#start-here
sadly it doesn't extract from http(s)://github.com/status-im/dappcon-workshop-dapp/tree/start-here
thats why we have a special case later
*/
const match = uri.match(/github\.com+\/(.+?)(#.*)?$/);
const githubPart = "https://github.com/";
let repoPart = match !== null? match[1] : null;
let branchName = match !== null? match[2] : null;
if (branchName && branchName !== '#'){
branchName = branchName.substring(1);
} else {
branchName = "master";
}
let url, folder; let url, folder;
if (uri.includes("/tree")){
//e.g http(s)://github.com/status-im/dappcon-workshop-dapp/tree/start-here
let repoPartAndBranch = repoPart.split("/tree/");
repoPart = repoPartAndBranch[0];
branchName = repoPartAndBranch[1];
url = "https://github.com/" + repoPart + "/archive/"+ branchName +".zip";
folder = repoPart + "/" + branchName;
} else if (repoPart !== undefined) {
url = githubPart + repoPart + "/archive/" + branchName + ".zip";
folder = repoPart + "/" + branchName;
}
if (uri.startsWith('http')) { return {
url = uri + "/archive/master.zip"; 'url': url,
folder = match[1]; 'folder': folder
} else if (uri.startsWith('github')) { };
url = "https://" + uri + "/archive/master.zip"; }
folder = match[1];
} else if (uri.split('/').length === 2) { getExternalProject(uri) {
url = "https://github.com/" + uri + "/archive/master.zip"; let url, folder;
folder = uri; if (uri.split('/').length === 2) {
//e.g embark-framework/embark
let repoPartAndBranch = uri.split('#');
let repoPart = repoPartAndBranch[0];
let branchName = (repoPartAndBranch.length === 2)? repoPartAndBranch[1] : "master";
url = "https://github.com/" + repoPart + "/archive/"+ branchName + ".zip";
folder = repoPart + "/" + branchName;
} else if (uri.indexOf('/') === -1) { } else if (uri.indexOf('/') === -1) {
url = "https://github.com/embark-framework/embark-" + uri + "-template/archive/master.zip"; url = "https://github.com/embark-framework/embark-" + uri + "-template/archive/master.zip";
folder = "embark-framework/embark-" + uri + "-template"; folder = "embark-framework/embark-" + uri + "-template";
} else {
let urlAndFolder = this.extractGithubUrlAndFolder(uri);
url = urlAndFolder.url;
folder = urlAndFolder.folder;
} }
return { return {
@ -101,7 +142,5 @@ class TemplateGenerator {
filePath: utils.joinPath(".embark/templates/", folder, "archive.zip") filePath: utils.joinPath(".embark/templates/", folder, "archive.zip")
}; };
} }
} }
module.exports = TemplateGenerator; module.exports = TemplateGenerator;

3711
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -31,6 +31,7 @@
"babel-loader": "8.0.0-beta.4", "babel-loader": "8.0.0-beta.4",
"babel-plugin-module-resolver": "^3.1.1", "babel-plugin-module-resolver": "^3.1.1",
"bip39": "^2.5.0", "bip39": "^2.5.0",
"check-dependencies": "^1.1.0",
"chokidar": "^2.0.3", "chokidar": "^2.0.3",
"clone-deep": "^4.0.0", "clone-deep": "^4.0.0",
"colors": "^1.1.2", "colors": "^1.1.2",
@ -40,7 +41,7 @@
"decompress": "^4.2.0", "decompress": "^4.2.0",
"deep-equal": "^1.0.1", "deep-equal": "^1.0.1",
"ejs": "^2.5.8", "ejs": "^2.5.8",
"embarkjs": "^0.4.0", "embarkjs": "^0.4.1",
"eth-ens-namehash": "^2.0.8", "eth-ens-namehash": "^2.0.8",
"eth-lib": "^0.2.8", "eth-lib": "^0.2.8",
"ethereumjs-wallet": "0.6.0", "ethereumjs-wallet": "0.6.0",

View File

@ -43,6 +43,11 @@ module.exports = {
// default environment, merges with the settings in default // default environment, merges with the settings in default
// assumed to be the intended environment by `embark run` // assumed to be the intended environment by `embark run`
development: { development: {
dappConnection: [
"ws://localhost:8546",
"http://localhost:8545",
"$WEB3" // uses pre existing web3 object if available (e.g in Mist)
]
}, },
// merges with the settings in default // merges with the settings in default

View File

@ -43,6 +43,11 @@ module.exports = {
// default environment, merges with the settings in default // default environment, merges with the settings in default
// assumed to be the intended environment by `embark run` // assumed to be the intended environment by `embark run`
development: { development: {
dappConnection: [
"ws://localhost:8546",
"http://localhost:8545",
"$WEB3" // uses pre existing web3 object if available (e.g in Mist)
]
}, },
// merges with the settings in default // merges with the settings in default

View File

@ -43,6 +43,11 @@ module.exports = {
// default environment, merges with the settings in default // default environment, merges with the settings in default
// assumed to be the intended environment by `embark run` // assumed to be the intended environment by `embark run`
development: { development: {
dappConnection: [
"ws://localhost:8546",
"http://localhost:8545",
"$WEB3" // uses pre existing web3 object if available (e.g in Mist)
]
}, },
// merges with the settings in default // merges with the settings in default

View File

@ -44,7 +44,6 @@ let generateApiObject = function() {
} }
describe('embark.Compiler', function() { describe('embark.Compiler', function() {
describe('#compile_solidity', function() { describe('#compile_solidity', function() {
this.timeout(0); this.timeout(0);
@ -54,10 +53,10 @@ describe('embark.Compiler', function() {
let expectedObject = {}; let expectedObject = {};
expectedObject["SimpleStorage"] = { expectedObject["SimpleStorage"] = {
"code":"608060405234801561001057600080fd5b50604051602080610114833981016040525160005560e1806100336000396000f30060806040526004361060525763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416632a1afcd98114605757806360fe47b114607b5780636d4ce63c146092575b600080fd5b348015606257600080fd5b50606960a4565b60408051918252519081900360200190f35b348015608657600080fd5b50609060043560aa565b005b348015609d57600080fd5b50606960af565b60005481565b600055565b600054905600a165627a7a723058200d15419363aede339114aad0374f61d748071e4d9cd677583967b8b94eeb35ed0029", "code":"608060405234801561001057600080fd5b50604051602080610114833981016040525160005560e1806100336000396000f30060806040526004361060525763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416632a1afcd98114605757806360fe47b114607b5780636d4ce63c146092575b600080fd5b348015606257600080fd5b50606960a4565b60408051918252519081900360200190f35b348015608657600080fd5b50609060043560aa565b005b348015609d57600080fd5b50606960af565b60005481565b600055565b600054905600a165627a7a72305820614716494f92abbcf64973073344e48071ac9a7a9f8515b7f5226e6bbd244b730029",
"runtimeBytecode":"60806040526004361060525763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416632a1afcd98114605757806360fe47b114607b5780636d4ce63c146092575b600080fd5b348015606257600080fd5b50606960a4565b60408051918252519081900360200190f35b348015608657600080fd5b50609060043560aa565b005b348015609d57600080fd5b50606960af565b60005481565b600055565b600054905600a165627a7a723058200d15419363aede339114aad0374f61d748071e4d9cd677583967b8b94eeb35ed0029", "runtimeBytecode":"60806040526004361060525763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416632a1afcd98114605757806360fe47b114607b5780636d4ce63c146092575b600080fd5b348015606257600080fd5b50606960a4565b60408051918252519081900360200190f35b348015608657600080fd5b50609060043560aa565b005b348015609d57600080fd5b50606960af565b60005481565b600055565b600054905600a165627a7a72305820614716494f92abbcf64973073344e48071ac9a7a9f8515b7f5226e6bbd244b730029",
"realRuntimeBytecode":"60806040526004361060525763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416632a1afcd98114605757806360fe47b114607b5780636d4ce63c146092575b600080fd5b348015606257600080fd5b50606960a4565b60408051918252519081900360200190f35b348015608657600080fd5b50609060043560aa565b005b348015609d57600080fd5b50606960af565b60005481565b600055565b600054905600a165627a7a72305820", "realRuntimeBytecode":"60806040526004361060525763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416632a1afcd98114605757806360fe47b114607b5780636d4ce63c146092575b600080fd5b348015606257600080fd5b50606960a4565b60408051918252519081900360200190f35b348015608657600080fd5b50609060043560aa565b005b348015609d57600080fd5b50606960af565b60005481565b600055565b600054905600a165627a7a72305820",
"swarmHash":"0d15419363aede339114aad0374f61d748071e4d9cd677583967b8b94eeb35ed", "swarmHash":"614716494f92abbcf64973073344e48071ac9a7a9f8515b7f5226e6bbd244b73",
"gasEstimates":{"creation":{"codeDepositCost":"45000","executionCost":"20141","totalCost":"65141"},"external":{"get()":"428","set(uint256)":"20161","storedData()":"384"}}, "gasEstimates":{"creation":{"codeDepositCost":"45000","executionCost":"20141","totalCost":"65141"},"external":{"get()":"428","set(uint256)":"20161","storedData()":"384"}},
"functionHashes":{"get()":"6d4ce63c","set(uint256)":"60fe47b1","storedData()":"2a1afcd9"}, "functionHashes":{"get()":"6d4ce63c","set(uint256)":"60fe47b1","storedData()":"2a1afcd9"},
"abiDefinition":[{"constant":true,"inputs":[],"name":"storedData","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"retVal","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"initialValue","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}], "abiDefinition":[{"constant":true,"inputs":[],"name":"storedData","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"retVal","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"initialValue","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}],
@ -65,10 +64,10 @@ describe('embark.Compiler', function() {
}; };
expectedObject["Token"] = { expectedObject["Token"] = {
"code":"608060405234801561001057600080fd5b506040516020806104618339810160409081529051336000908152602081905291909120819055600255610418806100496000396000f3006080604052600436106100775763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663095ea7b3811461007c57806318160ddd146100b457806323b872dd146100db57806370a0823114610105578063a9059cbb14610126578063dd62ed3e1461014a575b600080fd5b34801561008857600080fd5b506100a0600160a060020a0360043516602435610171565b604080519115158252519081900360200190f35b3480156100c057600080fd5b506100c96101d7565b60408051918252519081900360200190f35b3480156100e757600080fd5b506100a0600160a060020a03600435811690602435166044356101dd565b34801561011157600080fd5b506100c9600160a060020a03600435166102e9565b34801561013257600080fd5b506100a0600160a060020a0360043516602435610304565b34801561015657600080fd5b506100c9600160a060020a03600435811690602435166103ba565b336000818152600160209081526040808320600160a060020a038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b60025490565b600160a060020a03831660009081526020819052604081205482111561020257600080fd5b600160a060020a038416600090815260016020908152604080832033845290915290205482111561023257600080fd5b600160a060020a03831660009081526020819052604090205461025590836103e5565b151561026057600080fd5b600160a060020a03808516600081815260016020908152604080832033845282528083208054889003905583835282825280832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b600160a060020a031660009081526020819052604090205490565b3360009081526020819052604081205482111561032057600080fd5b600160a060020a03831660009081526020819052604090205461034390836103e5565b151561034e57600080fd5b3360008181526020818152604080832080548790039055600160a060020a03871680845292819020805487019055805186815290519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a350600192915050565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b81011015905600a165627a7a72305820f4d3e54bdfabcdb60435da61d6a6d650b6814ec3bfa0ac2cb0e4eec3795d11a20029", "code":"608060405234801561001057600080fd5b506040516020806104618339810160409081529051336000908152602081905291909120819055600255610418806100496000396000f3006080604052600436106100775763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663095ea7b3811461007c57806318160ddd146100b457806323b872dd146100db57806370a0823114610105578063a9059cbb14610126578063dd62ed3e1461014a575b600080fd5b34801561008857600080fd5b506100a0600160a060020a0360043516602435610171565b604080519115158252519081900360200190f35b3480156100c057600080fd5b506100c96101d7565b60408051918252519081900360200190f35b3480156100e757600080fd5b506100a0600160a060020a03600435811690602435166044356101dd565b34801561011157600080fd5b506100c9600160a060020a03600435166102e9565b34801561013257600080fd5b506100a0600160a060020a0360043516602435610304565b34801561015657600080fd5b506100c9600160a060020a03600435811690602435166103ba565b336000818152600160209081526040808320600160a060020a038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b60025490565b600160a060020a03831660009081526020819052604081205482111561020257600080fd5b600160a060020a038416600090815260016020908152604080832033845290915290205482111561023257600080fd5b600160a060020a03831660009081526020819052604090205461025590836103e5565b151561026057600080fd5b600160a060020a03808516600081815260016020908152604080832033845282528083208054889003905583835282825280832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b600160a060020a031660009081526020819052604090205490565b3360009081526020819052604081205482111561032057600080fd5b600160a060020a03831660009081526020819052604090205461034390836103e5565b151561034e57600080fd5b3360008181526020818152604080832080548790039055600160a060020a03871680845292819020805487019055805186815290519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a350600192915050565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b81011015905600a165627a7a72305820607405c1f2c38630c04e36d3137c31d3ac8aff2ad5da1d0b7d4502c95f46df4b0029",
"runtimeBytecode":"6080604052600436106100775763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663095ea7b3811461007c57806318160ddd146100b457806323b872dd146100db57806370a0823114610105578063a9059cbb14610126578063dd62ed3e1461014a575b600080fd5b34801561008857600080fd5b506100a0600160a060020a0360043516602435610171565b604080519115158252519081900360200190f35b3480156100c057600080fd5b506100c96101d7565b60408051918252519081900360200190f35b3480156100e757600080fd5b506100a0600160a060020a03600435811690602435166044356101dd565b34801561011157600080fd5b506100c9600160a060020a03600435166102e9565b34801561013257600080fd5b506100a0600160a060020a0360043516602435610304565b34801561015657600080fd5b506100c9600160a060020a03600435811690602435166103ba565b336000818152600160209081526040808320600160a060020a038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b60025490565b600160a060020a03831660009081526020819052604081205482111561020257600080fd5b600160a060020a038416600090815260016020908152604080832033845290915290205482111561023257600080fd5b600160a060020a03831660009081526020819052604090205461025590836103e5565b151561026057600080fd5b600160a060020a03808516600081815260016020908152604080832033845282528083208054889003905583835282825280832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b600160a060020a031660009081526020819052604090205490565b3360009081526020819052604081205482111561032057600080fd5b600160a060020a03831660009081526020819052604090205461034390836103e5565b151561034e57600080fd5b3360008181526020818152604080832080548790039055600160a060020a03871680845292819020805487019055805186815290519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a350600192915050565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b81011015905600a165627a7a72305820f4d3e54bdfabcdb60435da61d6a6d650b6814ec3bfa0ac2cb0e4eec3795d11a20029", "runtimeBytecode":"6080604052600436106100775763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663095ea7b3811461007c57806318160ddd146100b457806323b872dd146100db57806370a0823114610105578063a9059cbb14610126578063dd62ed3e1461014a575b600080fd5b34801561008857600080fd5b506100a0600160a060020a0360043516602435610171565b604080519115158252519081900360200190f35b3480156100c057600080fd5b506100c96101d7565b60408051918252519081900360200190f35b3480156100e757600080fd5b506100a0600160a060020a03600435811690602435166044356101dd565b34801561011157600080fd5b506100c9600160a060020a03600435166102e9565b34801561013257600080fd5b506100a0600160a060020a0360043516602435610304565b34801561015657600080fd5b506100c9600160a060020a03600435811690602435166103ba565b336000818152600160209081526040808320600160a060020a038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b60025490565b600160a060020a03831660009081526020819052604081205482111561020257600080fd5b600160a060020a038416600090815260016020908152604080832033845290915290205482111561023257600080fd5b600160a060020a03831660009081526020819052604090205461025590836103e5565b151561026057600080fd5b600160a060020a03808516600081815260016020908152604080832033845282528083208054889003905583835282825280832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b600160a060020a031660009081526020819052604090205490565b3360009081526020819052604081205482111561032057600080fd5b600160a060020a03831660009081526020819052604090205461034390836103e5565b151561034e57600080fd5b3360008181526020818152604080832080548790039055600160a060020a03871680845292819020805487019055805186815290519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a350600192915050565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b81011015905600a165627a7a72305820607405c1f2c38630c04e36d3137c31d3ac8aff2ad5da1d0b7d4502c95f46df4b0029",
"realRuntimeBytecode":"6080604052600436106100775763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663095ea7b3811461007c57806318160ddd146100b457806323b872dd146100db57806370a0823114610105578063a9059cbb14610126578063dd62ed3e1461014a575b600080fd5b34801561008857600080fd5b506100a0600160a060020a0360043516602435610171565b604080519115158252519081900360200190f35b3480156100c057600080fd5b506100c96101d7565b60408051918252519081900360200190f35b3480156100e757600080fd5b506100a0600160a060020a03600435811690602435166044356101dd565b34801561011157600080fd5b506100c9600160a060020a03600435166102e9565b34801561013257600080fd5b506100a0600160a060020a0360043516602435610304565b34801561015657600080fd5b506100c9600160a060020a03600435811690602435166103ba565b336000818152600160209081526040808320600160a060020a038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b60025490565b600160a060020a03831660009081526020819052604081205482111561020257600080fd5b600160a060020a038416600090815260016020908152604080832033845290915290205482111561023257600080fd5b600160a060020a03831660009081526020819052604090205461025590836103e5565b151561026057600080fd5b600160a060020a03808516600081815260016020908152604080832033845282528083208054889003905583835282825280832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b600160a060020a031660009081526020819052604090205490565b3360009081526020819052604081205482111561032057600080fd5b600160a060020a03831660009081526020819052604090205461034390836103e5565b151561034e57600080fd5b3360008181526020818152604080832080548790039055600160a060020a03871680845292819020805487019055805186815290519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a350600192915050565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b81011015905600a165627a7a72305820", "realRuntimeBytecode":"6080604052600436106100775763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663095ea7b3811461007c57806318160ddd146100b457806323b872dd146100db57806370a0823114610105578063a9059cbb14610126578063dd62ed3e1461014a575b600080fd5b34801561008857600080fd5b506100a0600160a060020a0360043516602435610171565b604080519115158252519081900360200190f35b3480156100c057600080fd5b506100c96101d7565b60408051918252519081900360200190f35b3480156100e757600080fd5b506100a0600160a060020a03600435811690602435166044356101dd565b34801561011157600080fd5b506100c9600160a060020a03600435166102e9565b34801561013257600080fd5b506100a0600160a060020a0360043516602435610304565b34801561015657600080fd5b506100c9600160a060020a03600435811690602435166103ba565b336000818152600160209081526040808320600160a060020a038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b60025490565b600160a060020a03831660009081526020819052604081205482111561020257600080fd5b600160a060020a038416600090815260016020908152604080832033845290915290205482111561023257600080fd5b600160a060020a03831660009081526020819052604090205461025590836103e5565b151561026057600080fd5b600160a060020a03808516600081815260016020908152604080832033845282528083208054889003905583835282825280832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b600160a060020a031660009081526020819052604090205490565b3360009081526020819052604081205482111561032057600080fd5b600160a060020a03831660009081526020819052604090205461034390836103e5565b151561034e57600080fd5b3360008181526020818152604080832080548790039055600160a060020a03871680845292819020805487019055805186815290519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a350600192915050565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b81011015905600a165627a7a72305820",
"swarmHash":"f4d3e54bdfabcdb60435da61d6a6d650b6814ec3bfa0ac2cb0e4eec3795d11a2", "swarmHash":"607405c1f2c38630c04e36d3137c31d3ac8aff2ad5da1d0b7d4502c95f46df4b",
"gasEstimates":{"creation":{"codeDepositCost":"209600","executionCost":"40385","totalCost":"249985"},"external":{"allowance(address,address)":"818","approve(address,uint256)":"22332","balanceOf(address)":"675","totalSupply()":"406","transfer(address,uint256)":"43544","transferFrom(address,address,uint256)":"64387"},"internal":{"safeToAdd(uint256,uint256)":"24"}}, "gasEstimates":{"creation":{"codeDepositCost":"209600","executionCost":"40385","totalCost":"249985"},"external":{"allowance(address,address)":"818","approve(address,uint256)":"22332","balanceOf(address)":"675","totalSupply()":"406","transfer(address,uint256)":"43544","transferFrom(address,address,uint256)":"64387"},"internal":{"safeToAdd(uint256,uint256)":"24"}},
"functionHashes":{"allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd"}, "functionHashes":{"allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd"},
"abiDefinition":[{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"supply","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"who","type":"address"}],"name":"balanceOf","outputs":[{"name":"value","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"_allowance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"initial_balance","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}], "abiDefinition":[{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"supply","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"who","type":"address"}],"name":"balanceOf","outputs":[{"name":"value","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"_allowance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"initial_balance","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}],
@ -97,10 +96,10 @@ describe('embark.Compiler', function() {
let expectedObject = {}; let expectedObject = {};
expectedObject["SimpleStorage"] = { expectedObject["SimpleStorage"] = {
"code":"608060405234801561001057600080fd5b506040516020806101618339810180604052810190808051906020019092919050505080600081905550506101178061004a6000396000f3006080604052600436106053576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632a1afcd914605857806360fe47b11460805780636d4ce63c1460aa575b600080fd5b348015606357600080fd5b50606a60d2565b6040518082815260200191505060405180910390f35b348015608b57600080fd5b5060a86004803603810190808035906020019092919050505060d8565b005b34801560b557600080fd5b5060bc60e2565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b600080549050905600a165627a7a72305820031e899b9bf6ce1eedee31ac19bb4e49a4b5b666e83ccb4342d5e608154164b60029", "code":"608060405234801561001057600080fd5b506040516020806101618339810180604052810190808051906020019092919050505080600081905550506101178061004a6000396000f3006080604052600436106053576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632a1afcd914605857806360fe47b11460805780636d4ce63c1460aa575b600080fd5b348015606357600080fd5b50606a60d2565b6040518082815260200191505060405180910390f35b348015608b57600080fd5b5060a86004803603810190808035906020019092919050505060d8565b005b34801560b557600080fd5b5060bc60e2565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b600080549050905600a165627a7a723058208767191d8e94f92eb21bca12a1c23f972a28b18f7fbb8fa67eec4b88e95715820029",
"runtimeBytecode":"6080604052600436106053576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632a1afcd914605857806360fe47b11460805780636d4ce63c1460aa575b600080fd5b348015606357600080fd5b50606a60d2565b6040518082815260200191505060405180910390f35b348015608b57600080fd5b5060a86004803603810190808035906020019092919050505060d8565b005b34801560b557600080fd5b5060bc60e2565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b600080549050905600a165627a7a72305820031e899b9bf6ce1eedee31ac19bb4e49a4b5b666e83ccb4342d5e608154164b60029", "runtimeBytecode":"6080604052600436106053576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632a1afcd914605857806360fe47b11460805780636d4ce63c1460aa575b600080fd5b348015606357600080fd5b50606a60d2565b6040518082815260200191505060405180910390f35b348015608b57600080fd5b5060a86004803603810190808035906020019092919050505060d8565b005b34801560b557600080fd5b5060bc60e2565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b600080549050905600a165627a7a723058208767191d8e94f92eb21bca12a1c23f972a28b18f7fbb8fa67eec4b88e95715820029",
"realRuntimeBytecode":"6080604052600436106053576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632a1afcd914605857806360fe47b11460805780636d4ce63c1460aa575b600080fd5b348015606357600080fd5b50606a60d2565b6040518082815260200191505060405180910390f35b348015608b57600080fd5b5060a86004803603810190808035906020019092919050505060d8565b005b34801560b557600080fd5b5060bc60e2565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b600080549050905600a165627a7a72305820", "realRuntimeBytecode":"6080604052600436106053576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632a1afcd914605857806360fe47b11460805780636d4ce63c1460aa575b600080fd5b348015606357600080fd5b50606a60d2565b6040518082815260200191505060405180910390f35b348015608b57600080fd5b5060a86004803603810190808035906020019092919050505060d8565b005b34801560b557600080fd5b5060bc60e2565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b600080549050905600a165627a7a72305820",
"swarmHash":"031e899b9bf6ce1eedee31ac19bb4e49a4b5b666e83ccb4342d5e608154164b6", "swarmHash":"8767191d8e94f92eb21bca12a1c23f972a28b18f7fbb8fa67eec4b88e9571582",
"gasEstimates":{"creation":{"codeDepositCost":"55800","executionCost":"20205","totalCost":"76005"},"external":{"get()":"446","set(uint256)":"20227","storedData()":"394"}}, "gasEstimates":{"creation":{"codeDepositCost":"55800","executionCost":"20205","totalCost":"76005"},"external":{"get()":"446","set(uint256)":"20227","storedData()":"394"}},
"functionHashes":{"get()":"6d4ce63c","set(uint256)":"60fe47b1","storedData()":"2a1afcd9"}, "functionHashes":{"get()":"6d4ce63c","set(uint256)":"60fe47b1","storedData()":"2a1afcd9"},
"abiDefinition":[{"constant":true,"inputs":[],"name":"storedData","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"retVal","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"initialValue","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}], "abiDefinition":[{"constant":true,"inputs":[],"name":"storedData","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"get","outputs":[{"name":"retVal","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"initialValue","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}],
@ -108,10 +107,10 @@ describe('embark.Compiler', function() {
}; };
expectedObject["Token"] = { expectedObject["Token"] = {
"code":"608060405234801561001057600080fd5b506040516020806109bb83398101806040528101908080519060200190929190505050806000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806002819055505061092e8061008d6000396000f300608060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063095ea7b31461007d57806318160ddd146100e257806323b872dd1461010d57806370a0823114610192578063a9059cbb146101e9578063dd62ed3e1461024e575b600080fd5b34801561008957600080fd5b506100c8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506102c5565b604051808215151515815260200191505060405180910390f35b3480156100ee57600080fd5b506100f76103b7565b6040518082815260200191505060405180910390f35b34801561011957600080fd5b50610178600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506103c1565b604051808215151515815260200191505060405180910390f35b34801561019e57600080fd5b506101d3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061067c565b6040518082815260200191505060405180910390f35b3480156101f557600080fd5b50610234600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506106c4565b604051808215151515815260200191505060405180910390f35b34801561025a57600080fd5b506102af600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061086b565b6040518082815260200191505060405180910390f35b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600254905090565b6000816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561040e57600080fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561049757600080fd5b6104df6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836108f2565b15156104ea57600080fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561071157600080fd5b6107596000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836108f2565b151561076457600080fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60008282840110159050929150505600a165627a7a7230582001e0089d85828d4d2c0bb811fd6015f61224838cbfaaa8c7d72b01a6dcfe35ce0029", "code":"608060405234801561001057600080fd5b506040516020806109bb83398101806040528101908080519060200190929190505050806000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806002819055505061092e8061008d6000396000f300608060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063095ea7b31461007d57806318160ddd146100e257806323b872dd1461010d57806370a0823114610192578063a9059cbb146101e9578063dd62ed3e1461024e575b600080fd5b34801561008957600080fd5b506100c8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506102c5565b604051808215151515815260200191505060405180910390f35b3480156100ee57600080fd5b506100f76103b7565b6040518082815260200191505060405180910390f35b34801561011957600080fd5b50610178600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506103c1565b604051808215151515815260200191505060405180910390f35b34801561019e57600080fd5b506101d3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061067c565b6040518082815260200191505060405180910390f35b3480156101f557600080fd5b50610234600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506106c4565b604051808215151515815260200191505060405180910390f35b34801561025a57600080fd5b506102af600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061086b565b6040518082815260200191505060405180910390f35b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600254905090565b6000816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561040e57600080fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561049757600080fd5b6104df6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836108f2565b15156104ea57600080fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561071157600080fd5b6107596000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836108f2565b151561076457600080fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60008282840110159050929150505600a165627a7a72305820981ad128c29450c3409fdae69b63a96944d97726367b4b211308ad530e5b02800029",
"runtimeBytecode":"608060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063095ea7b31461007d57806318160ddd146100e257806323b872dd1461010d57806370a0823114610192578063a9059cbb146101e9578063dd62ed3e1461024e575b600080fd5b34801561008957600080fd5b506100c8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506102c5565b604051808215151515815260200191505060405180910390f35b3480156100ee57600080fd5b506100f76103b7565b6040518082815260200191505060405180910390f35b34801561011957600080fd5b50610178600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506103c1565b604051808215151515815260200191505060405180910390f35b34801561019e57600080fd5b506101d3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061067c565b6040518082815260200191505060405180910390f35b3480156101f557600080fd5b50610234600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506106c4565b604051808215151515815260200191505060405180910390f35b34801561025a57600080fd5b506102af600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061086b565b6040518082815260200191505060405180910390f35b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600254905090565b6000816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561040e57600080fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561049757600080fd5b6104df6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836108f2565b15156104ea57600080fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561071157600080fd5b6107596000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836108f2565b151561076457600080fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60008282840110159050929150505600a165627a7a7230582001e0089d85828d4d2c0bb811fd6015f61224838cbfaaa8c7d72b01a6dcfe35ce0029", "runtimeBytecode":"608060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063095ea7b31461007d57806318160ddd146100e257806323b872dd1461010d57806370a0823114610192578063a9059cbb146101e9578063dd62ed3e1461024e575b600080fd5b34801561008957600080fd5b506100c8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506102c5565b604051808215151515815260200191505060405180910390f35b3480156100ee57600080fd5b506100f76103b7565b6040518082815260200191505060405180910390f35b34801561011957600080fd5b50610178600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506103c1565b604051808215151515815260200191505060405180910390f35b34801561019e57600080fd5b506101d3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061067c565b6040518082815260200191505060405180910390f35b3480156101f557600080fd5b50610234600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506106c4565b604051808215151515815260200191505060405180910390f35b34801561025a57600080fd5b506102af600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061086b565b6040518082815260200191505060405180910390f35b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600254905090565b6000816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561040e57600080fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561049757600080fd5b6104df6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836108f2565b15156104ea57600080fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561071157600080fd5b6107596000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836108f2565b151561076457600080fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60008282840110159050929150505600a165627a7a72305820981ad128c29450c3409fdae69b63a96944d97726367b4b211308ad530e5b02800029",
"realRuntimeBytecode":"608060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063095ea7b31461007d57806318160ddd146100e257806323b872dd1461010d57806370a0823114610192578063a9059cbb146101e9578063dd62ed3e1461024e575b600080fd5b34801561008957600080fd5b506100c8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506102c5565b604051808215151515815260200191505060405180910390f35b3480156100ee57600080fd5b506100f76103b7565b6040518082815260200191505060405180910390f35b34801561011957600080fd5b50610178600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506103c1565b604051808215151515815260200191505060405180910390f35b34801561019e57600080fd5b506101d3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061067c565b6040518082815260200191505060405180910390f35b3480156101f557600080fd5b50610234600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506106c4565b604051808215151515815260200191505060405180910390f35b34801561025a57600080fd5b506102af600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061086b565b6040518082815260200191505060405180910390f35b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600254905090565b6000816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561040e57600080fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561049757600080fd5b6104df6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836108f2565b15156104ea57600080fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561071157600080fd5b6107596000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836108f2565b151561076457600080fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60008282840110159050929150505600a165627a7a72305820", "realRuntimeBytecode":"608060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063095ea7b31461007d57806318160ddd146100e257806323b872dd1461010d57806370a0823114610192578063a9059cbb146101e9578063dd62ed3e1461024e575b600080fd5b34801561008957600080fd5b506100c8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506102c5565b604051808215151515815260200191505060405180910390f35b3480156100ee57600080fd5b506100f76103b7565b6040518082815260200191505060405180910390f35b34801561011957600080fd5b50610178600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506103c1565b604051808215151515815260200191505060405180910390f35b34801561019e57600080fd5b506101d3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061067c565b6040518082815260200191505060405180910390f35b3480156101f557600080fd5b50610234600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506106c4565b604051808215151515815260200191505060405180910390f35b34801561025a57600080fd5b506102af600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061086b565b6040518082815260200191505060405180910390f35b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600254905090565b6000816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561040e57600080fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561049757600080fd5b6104df6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836108f2565b15156104ea57600080fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561071157600080fd5b6107596000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836108f2565b151561076457600080fd5b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60008282840110159050929150505600a165627a7a72305820",
"swarmHash":"01e0089d85828d4d2c0bb811fd6015f61224838cbfaaa8c7d72b01a6dcfe35ce", "swarmHash":"981ad128c29450c3409fdae69b63a96944d97726367b4b211308ad530e5b0280",
"gasEstimates":{"creation":{"codeDepositCost":"470000","executionCost":"40708","totalCost":"510708"},"external":{"allowance(address,address)":"794","approve(address,uint256)":"22331","balanceOf(address)":"625","totalSupply()":"424","transfer(address,uint256)":"43562","transferFrom(address,address,uint256)":"64373"},"internal":{"safeToAdd(uint256,uint256)":"45"}}, "gasEstimates":{"creation":{"codeDepositCost":"470000","executionCost":"40708","totalCost":"510708"},"external":{"allowance(address,address)":"794","approve(address,uint256)":"22331","balanceOf(address)":"625","totalSupply()":"424","transfer(address,uint256)":"43562","transferFrom(address,address,uint256)":"64373"},"internal":{"safeToAdd(uint256,uint256)":"45"}},
"functionHashes":{"allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd"}, "functionHashes":{"allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd"},
"abiDefinition":[{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"supply","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"who","type":"address"}],"name":"balanceOf","outputs":[{"name":"value","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"_allowance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"initial_balance","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}], "abiDefinition":[{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"supply","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"who","type":"address"}],"name":"balanceOf","outputs":[{"name":"value","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"_allowance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"initial_balance","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}],
@ -127,7 +126,5 @@ describe('embark.Compiler', function() {
done(); done();
}); });
}); });
}); });
}); });

View File

@ -1,16 +1,17 @@
pragma solidity ^0.4.7; pragma solidity ^0.4.7;
contract SimpleStorage { contract SimpleStorage {
uint public storedData; uint public storedData;
function SimpleStorage(uint initialValue) { constructor(uint initialValue) public {
storedData = initialValue; storedData = initialValue;
} }
function set(uint x) { function set(uint x) public {
storedData = x; storedData = x;
} }
function get() constant returns (uint retVal) { function get() public view returns (uint retVal) {
return storedData; return storedData;
} }

View File

@ -1,6 +1,7 @@
// https://github.com/nexusdev/erc20/blob/master/contracts/base.sol // https://github.com/nexusdev/erc20/blob/master/contracts/base.sol
pragma solidity ^0.4.7; pragma solidity ^0.4.7;
contract Token { contract Token {
event Transfer(address indexed from, address indexed to, uint value); event Transfer(address indexed from, address indexed to, uint value);
@ -9,57 +10,65 @@ contract Token {
mapping( address => uint ) _balances; mapping( address => uint ) _balances;
mapping( address => mapping( address => uint ) ) _approvals; mapping( address => mapping( address => uint ) ) _approvals;
uint _supply; uint _supply;
function Token( uint initial_balance ) {
constructor(uint initial_balance) public {
_balances[msg.sender] = initial_balance; _balances[msg.sender] = initial_balance;
_supply = initial_balance; _supply = initial_balance;
} }
function totalSupply() constant returns (uint supply) {
function totalSupply() public view returns (uint supply) {
return _supply; return _supply;
} }
function balanceOf( address who ) constant returns (uint value) {
function balanceOf(address who) public view returns (uint value) {
return _balances[who]; return _balances[who];
} }
function transfer( address to, uint value) returns (bool ok) {
function transfer(address to, uint value) public returns (bool ok) {
if( _balances[msg.sender] < value ) { if( _balances[msg.sender] < value ) {
throw; revert();
} }
if( !safeToAdd(_balances[to], value) ) { if( !safeToAdd(_balances[to], value) ) {
throw; revert();
} }
_balances[msg.sender] -= value; _balances[msg.sender] -= value;
_balances[to] += value; _balances[to] += value;
Transfer( msg.sender, to, value ); emit Transfer( msg.sender, to, value );
return true; return true;
} }
function transferFrom( address from, address to, uint value) returns (bool ok) {
function transferFrom(address from, address to, uint value) public returns (bool ok) {
// if you don't have enough balance, throw // if you don't have enough balance, throw
if( _balances[from] < value ) { if( _balances[from] < value ) {
throw; revert();
} }
// if you don't have approval, throw // if you don't have approval, throw
if( _approvals[from][msg.sender] < value ) { if( _approvals[from][msg.sender] < value ) {
throw; revert();
} }
if( !safeToAdd(_balances[to], value) ) { if( !safeToAdd(_balances[to], value) ) {
throw; revert();
} }
// transfer and return true // transfer and return true
_approvals[from][msg.sender] -= value; _approvals[from][msg.sender] -= value;
_balances[from] -= value; _balances[from] -= value;
_balances[to] += value; _balances[to] += value;
Transfer( from, to, value ); emit Transfer( from, to, value );
return true; return true;
} }
function approve(address spender, uint value) returns (bool ok) {
function approve(address spender, uint value) public returns (bool ok) {
// TODO: should increase instead // TODO: should increase instead
_approvals[msg.sender][spender] = value; _approvals[msg.sender][spender] = value;
Approval( msg.sender, spender, value ); emit Approval( msg.sender, spender, value );
return true; return true;
} }
function allowance(address owner, address spender) constant returns (uint _allowance) {
function allowance(address owner, address spender) public view returns (uint _allowance) {
return _approvals[owner][spender]; return _approvals[owner][spender];
} }
function safeToAdd(uint a, uint b) internal returns (bool) {
function safeToAdd(uint a, uint b) internal pure returns (bool) {
return (a + b >= a); return (a + b >= a);
} }
} }

View File

@ -1,6 +1,7 @@
// https://github.com/nexusdev/erc20/blob/master/contracts/base.sol // https://github.com/nexusdev/erc20/blob/master/contracts/base.sol
pragma solidity ^0.4.7; pragma solidity ^0.4.7;
contract TokenStorage { contract TokenStorage {
event Transfer(address indexed from, address indexed to, uint value); event Transfer(address indexed from, address indexed to, uint value);
@ -10,58 +11,66 @@ contract TokenStorage {
mapping( address => mapping( address => uint ) ) _approvals; mapping( address => mapping( address => uint ) ) _approvals;
uint _supply; uint _supply;
address public addr; address public addr;
function TokenStorage( uint initial_balance, address _addr) {
constructor( uint initial_balance, address _addr) public {
_balances[msg.sender] = initial_balance; _balances[msg.sender] = initial_balance;
_supply = initial_balance; _supply = initial_balance;
addr = _addr; addr = _addr;
} }
function totalSupply() constant returns (uint supply) {
function totalSupply() public view returns (uint supply) {
return _supply; return _supply;
} }
function balanceOf( address who ) constant returns (uint value) {
function balanceOf(address who) public view returns (uint value) {
return _balances[who]; return _balances[who];
} }
function transfer( address to, uint value) returns (bool ok) {
function transfer(address to, uint value) public returns (bool ok) {
if( _balances[msg.sender] < value ) { if( _balances[msg.sender] < value ) {
throw; revert();
} }
if( !safeToAdd(_balances[to], value) ) { if( !safeToAdd(_balances[to], value) ) {
throw; revert();
} }
_balances[msg.sender] -= value; _balances[msg.sender] -= value;
_balances[to] += value; _balances[to] += value;
Transfer( msg.sender, to, value ); emit Transfer( msg.sender, to, value );
return true; return true;
} }
function transferFrom( address from, address to, uint value) returns (bool ok) {
function transferFrom(address from, address to, uint value) public returns (bool ok) {
// if you don't have enough balance, throw // if you don't have enough balance, throw
if( _balances[from] < value ) { if( _balances[from] < value ) {
throw; revert();
} }
// if you don't have approval, throw // if you don't have approval, throw
if( _approvals[from][msg.sender] < value ) { if( _approvals[from][msg.sender] < value ) {
throw; revert();
} }
if( !safeToAdd(_balances[to], value) ) { if( !safeToAdd(_balances[to], value) ) {
throw; revert();
} }
// transfer and return true // transfer and return true
_approvals[from][msg.sender] -= value; _approvals[from][msg.sender] -= value;
_balances[from] -= value; _balances[from] -= value;
_balances[to] += value; _balances[to] += value;
Transfer( from, to, value ); emit Transfer( from, to, value );
return true; return true;
} }
function approve(address spender, uint value) returns (bool ok) {
function approve(address spender, uint value) public returns (bool ok) {
// TODO: should increase instead // TODO: should increase instead
_approvals[msg.sender][spender] = value; _approvals[msg.sender][spender] = value;
Approval( msg.sender, spender, value ); emit Approval( msg.sender, spender, value );
return true; return true;
} }
function allowance(address owner, address spender) constant returns (uint _allowance) {
function allowance(address owner, address spender) public view returns (uint _allowance) {
return _approvals[owner][spender]; return _approvals[owner][spender];
} }
function safeToAdd(uint a, uint b) internal returns (bool) {
function safeToAdd(uint a, uint b) internal pure returns (bool) {
return (a + b >= a); return (a + b >= a);
} }
} }

View File

@ -15,31 +15,49 @@ describe('TemplateGenerator', function () {
it('return correct zip filename for https link', function () { it('return correct zip filename for https link', function () {
let result = templateGenerator.getExternalProject("https://github.com/embark-framework/embark"); let result = templateGenerator.getExternalProject("https://github.com/embark-framework/embark");
assert.strictEqual(result.url, "https://github.com/embark-framework/embark/archive/master.zip"); assert.strictEqual(result.url, "https://github.com/embark-framework/embark/archive/master.zip");
assert.strictEqual(result.filePath.replace(/\\/g,'/'), ".embark/templates/embark-framework/embark/archive.zip"); assert.strictEqual(result.filePath.replace(/\\/g,'/'), ".embark/templates/embark-framework/embark/master/archive.zip");
});
it('return correct zip filename for https link with branch specified', function () {
let result = templateGenerator.getExternalProject("https://github.com/embark-framework/embark/tree/develop");
assert.strictEqual(result.url, "https://github.com/embark-framework/embark/archive/develop.zip");
assert.strictEqual(result.filePath.replace(/\\/g,'/'), ".embark/templates/embark-framework/embark/develop/archive.zip");
}); });
it('return correct zip filename for http link', function () { it('return correct zip filename for http link', function () {
let result = templateGenerator.getExternalProject("http://github.com/embark-framework/embark"); let result = templateGenerator.getExternalProject("http://github.com/embark-framework/embark");
assert.strictEqual(result.url, "http://github.com/embark-framework/embark/archive/master.zip"); assert.strictEqual(result.url, "https://github.com/embark-framework/embark/archive/master.zip");
assert.strictEqual(result.filePath.replace(/\\/g,'/'), ".embark/templates/embark-framework/embark/archive.zip"); assert.strictEqual(result.filePath.replace(/\\/g,'/'), ".embark/templates/embark-framework/embark/master/archive.zip");
});
it('return correct zip filename for http link with branch specified', function () {
let result = templateGenerator.getExternalProject("http://github.com/embark-framework/embark/tree/develop");
assert.strictEqual(result.url, "https://github.com/embark-framework/embark/archive/develop.zip");
assert.strictEqual(result.filePath.replace(/\\/g,'/'), ".embark/templates/embark-framework/embark/develop/archive.zip");
}); });
it('return correct zip filename without protocol specified ', function () { it('return correct zip filename without protocol specified ', function () {
let result = templateGenerator.getExternalProject("github.com/embark-framework/embark"); let result = templateGenerator.getExternalProject("github.com/embark-framework/embark");
assert.strictEqual(result.url, "https://github.com/embark-framework/embark/archive/master.zip"); assert.strictEqual(result.url, "https://github.com/embark-framework/embark/archive/master.zip");
assert.strictEqual(result.filePath.replace(/\\/g,'/'), ".embark/templates/embark-framework/embark/archive.zip"); assert.strictEqual(result.filePath.replace(/\\/g,'/'), ".embark/templates/embark-framework/embark/master/archive.zip");
}); });
it('return correct zip filename without protocol specified ', function () { it('return correct zip filename without protocol with branch specified', function () {
let result = templateGenerator.getExternalProject("github.com/embark-framework/embark"); let result = templateGenerator.getExternalProject("github.com/embark-framework/embark#develop");
assert.strictEqual(result.url, "https://github.com/embark-framework/embark/archive/master.zip"); assert.strictEqual(result.url, "https://github.com/embark-framework/embark/archive/develop.zip");
assert.strictEqual(result.filePath.replace(/\\/g,'/'), ".embark/templates/embark-framework/embark/archive.zip"); assert.strictEqual(result.filePath.replace(/\\/g,'/'), ".embark/templates/embark-framework/embark/develop/archive.zip");
}); });
it('return correct zip filename with just username/repo specified', function () { it('return correct zip filename with just username/repo specified', function () {
let result = templateGenerator.getExternalProject("embark-framework/embark"); let result = templateGenerator.getExternalProject("embark-framework/embark");
assert.strictEqual(result.url, "https://github.com/embark-framework/embark/archive/master.zip"); assert.strictEqual(result.url, "https://github.com/embark-framework/embark/archive/master.zip");
assert.strictEqual(result.filePath.replace(/\\/g,'/'), ".embark/templates/embark-framework/embark/archive.zip"); assert.strictEqual(result.filePath.replace(/\\/g,'/'), ".embark/templates/embark-framework/embark/master/archive.zip");
});
it('return correct zip filename with just username/repo and branch specified', function () {
let result = templateGenerator.getExternalProject("embark-framework/embark#develop");
assert.strictEqual(result.url, "https://github.com/embark-framework/embark/archive/develop.zip");
assert.strictEqual(result.filePath.replace(/\\/g,'/'), ".embark/templates/embark-framework/embark/develop/archive.zip");
}); });
it('return correct zip filename with just embark template specified', function () { it('return correct zip filename with just embark template specified', function () {
@ -47,7 +65,6 @@ describe('TemplateGenerator', function () {
assert.strictEqual(result.url, "https://github.com/embark-framework/embark-react-template/archive/master.zip"); assert.strictEqual(result.url, "https://github.com/embark-framework/embark-react-template/archive/master.zip");
assert.strictEqual(result.filePath.replace(/\\/g,'/'), ".embark/templates/embark-framework/embark-react-template/archive.zip"); assert.strictEqual(result.filePath.replace(/\\/g,'/'), ".embark/templates/embark-framework/embark-react-template/archive.zip");
}); });
}); });
}); });