mirror of https://github.com/embarklabs/embark.git
feat(web3connector): add web3 connector plugin to connect to web3
This commit is contained in:
parent
3b0a2b9b3e
commit
976f9944a8
|
@ -2,6 +2,7 @@ const async = require('async');
|
||||||
|
|
||||||
const utils = require('../utils/utils');
|
const utils = require('../utils/utils');
|
||||||
const IPC = require('./ipc');
|
const IPC = require('./ipc');
|
||||||
|
const fs = require('./fs');
|
||||||
|
|
||||||
class Engine {
|
class Engine {
|
||||||
constructor(options) {
|
constructor(options) {
|
||||||
|
@ -30,6 +31,7 @@ class Engine {
|
||||||
|
|
||||||
let options = _options || {};
|
let options = _options || {};
|
||||||
this.events = options.events || this.events || new Events();
|
this.events = options.events || this.events || new Events();
|
||||||
|
this.registerCommands();
|
||||||
this.logger = options.logger || new Logger({context: this.context, logLevel: options.logLevel || this.logLevel || 'debug', events: this.events, logFile: this.logFile});
|
this.logger = options.logger || new Logger({context: this.context, logLevel: options.logLevel || this.logLevel || 'debug', events: this.events, logFile: this.logFile});
|
||||||
this.config = new Config({env: this.env, logger: this.logger, events: this.events, context: this.context, webServerConfig: this.webServerConfig, version: this.version});
|
this.config = new Config({env: this.env, logger: this.logger, events: this.events, context: this.context, webServerConfig: this.webServerConfig, version: this.version});
|
||||||
this.config.loadConfigFiles({embarkConfig: this.embarkConfig, interceptLogs: this.interceptLogs});
|
this.config.loadConfigFiles({embarkConfig: this.embarkConfig, interceptLogs: this.interceptLogs});
|
||||||
|
@ -49,9 +51,23 @@ class Engine {
|
||||||
this.ipc.serve();
|
this.ipc.serve();
|
||||||
return callback();
|
return callback();
|
||||||
}
|
}
|
||||||
|
|
||||||
callback();
|
callback();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
registerCommands() {
|
||||||
|
this.events.setCommandHandler('embark:path', function () {
|
||||||
|
const cb = arguments[arguments.length - 1];
|
||||||
|
const pathParts = Array.from(arguments).splice(0, arguments.length - 1);
|
||||||
|
cb(fs.embarkPath(...pathParts));
|
||||||
|
});
|
||||||
|
this.events.setCommandHandler('dapp:path', function () {
|
||||||
|
const cb = arguments[arguments.length - 1];
|
||||||
|
const pathParts = Array.from(arguments).splice(0, arguments.length - 1);
|
||||||
|
cb(fs.dappPath(...pathParts));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
registerModule(moduleName, options) {
|
registerModule(moduleName, options) {
|
||||||
this.plugins.loadInternalPlugin(moduleName, options || {});
|
this.plugins.loadInternalPlugin(moduleName, options || {});
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
__mainContext.web3 = undefined;
|
|
||||||
web3 = new Web3(new Web3.providers.HttpProvider("<%- url -%>"));
|
|
||||||
web3.eth.getAccounts(function(err, accounts) {
|
|
||||||
if (err) {
|
|
||||||
return done(new Error(err));
|
|
||||||
}
|
|
||||||
web3.defaultAccount = accounts[0];
|
|
||||||
<%- done %>
|
|
||||||
});
|
|
|
@ -10,7 +10,6 @@ const Templates = {
|
||||||
load_manager: require('./code_templates/load-manager.js.ejs'),
|
load_manager: require('./code_templates/load-manager.js.ejs'),
|
||||||
define_when_env_loaded: require('./code_templates/define-when-env-loaded.js.ejs'),
|
define_when_env_loaded: require('./code_templates/define-when-env-loaded.js.ejs'),
|
||||||
main_context: require('./code_templates/main-context.js.ejs'),
|
main_context: require('./code_templates/main-context.js.ejs'),
|
||||||
define_web3_simple: require('./code_templates/define-web3-simple.js.ejs'),
|
|
||||||
do_when_loaded: require('./code_templates/do-when-loaded.js.ejs'),
|
do_when_loaded: require('./code_templates/do-when-loaded.js.ejs'),
|
||||||
exec_when_env_loaded: require('./code_templates/exec-when-env-loaded.js.ejs')
|
exec_when_env_loaded: require('./code_templates/exec-when-env-loaded.js.ejs')
|
||||||
};
|
};
|
||||||
|
@ -299,20 +298,7 @@ class CodeGenerator {
|
||||||
let code = "";
|
let code = "";
|
||||||
|
|
||||||
async.waterfall([
|
async.waterfall([
|
||||||
function getWeb3Location(next) {
|
function getImports(next) {
|
||||||
self.events.request("version:get:web3", function(web3Version) {
|
|
||||||
if (web3Version === "1.0.0-beta") {
|
|
||||||
return next(null, require.resolve("web3", {paths: [self.fs.embarkPath("node_modules")]}));
|
|
||||||
}
|
|
||||||
self.events.request("version:getPackageLocation", "web3", web3Version, function(err, location) {
|
|
||||||
return next(null, self.fs.dappPath(location));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
},
|
|
||||||
function getImports(web3Location, next) {
|
|
||||||
web3Location = web3Location.replace(/\\/g, '/'); // Import paths must always have forward slashes
|
|
||||||
code += `\nimport Web3 from '${web3Location}';\n`;
|
|
||||||
code += `\nglobal.Web3 = Web3;`;
|
|
||||||
code += "\nimport IpfsApi from 'ipfs-api';\n";
|
code += "\nimport IpfsApi from 'ipfs-api';\n";
|
||||||
|
|
||||||
next();
|
next();
|
||||||
|
|
|
@ -156,7 +156,6 @@ class Pipeline {
|
||||||
(next) => self.buildContracts(next),
|
(next) => self.buildContracts(next),
|
||||||
function createImportList(next) {
|
function createImportList(next) {
|
||||||
importsList["Embark/EmbarkJS"] = self.fs.dappPath(self.embarkConfig.generationDir, constants.dappConfig.embarkjs);
|
importsList["Embark/EmbarkJS"] = self.fs.dappPath(self.embarkConfig.generationDir, constants.dappConfig.embarkjs);
|
||||||
importsList["Embark/web3"] = self.fs.dappPath(".embark", 'web3_instance.js');
|
|
||||||
importsList["Embark/contracts"] = contractsDir;
|
importsList["Embark/contracts"] = contractsDir;
|
||||||
|
|
||||||
self.plugins.getPluginsProperty('imports', 'imports').forEach(importObject => {
|
self.plugins.getPluginsProperty('imports', 'imports').forEach(importObject => {
|
||||||
|
|
|
@ -215,12 +215,11 @@ let Contract = function(options) {
|
||||||
this.code = '0x' + options.code;
|
this.code = '0x' + options.code;
|
||||||
|
|
||||||
this.blockchainConnector = Blockchain.blockchainConnector;
|
this.blockchainConnector = Blockchain.blockchainConnector;
|
||||||
this.web3 = this.blockchainConnector.getInstance();
|
|
||||||
|
|
||||||
ContractClass = this.blockchainConnector.newContract({abi: this.abi, address: this.address});
|
ContractClass = this.blockchainConnector.newContract({abi: this.abi, address: this.address});
|
||||||
contracts.push(ContractClass);
|
contracts.push(ContractClass);
|
||||||
ContractClass.options.data = this.code;
|
ContractClass.options.data = this.code;
|
||||||
const from = this.from || self.blockchainConnector.getDefaultAccount() || this.web3.eth.defaultAccount;
|
const from = this.from || self.blockchainConnector.getDefaultAccount();
|
||||||
if (from) {
|
if (from) {
|
||||||
ContractClass.options.from = from;
|
ContractClass.options.from = from;
|
||||||
}
|
}
|
||||||
|
@ -232,9 +231,9 @@ let Contract = function(options) {
|
||||||
|
|
||||||
Blockchain.execWhenReady(function(_err, _web3) {
|
Blockchain.execWhenReady(function(_err, _web3) {
|
||||||
if (!ContractClass.currentProvider) {
|
if (!ContractClass.currentProvider) {
|
||||||
ContractClass.setProvider(self.blockchainConnector.getCurrentProvider() || self.web3.currentProvider);
|
ContractClass.setProvider(self.blockchainConnector.getCurrentProvider());
|
||||||
}
|
}
|
||||||
ContractClass.options.from = self.blockchainConnector.getDefaultAccount() ||self.web3.eth.defaultAccount;
|
ContractClass.options.from = self.blockchainConnector.getDefaultAccount();
|
||||||
});
|
});
|
||||||
|
|
||||||
ContractClass._jsonInterface.forEach((abi) => {
|
ContractClass._jsonInterface.forEach((abi) => {
|
||||||
|
@ -288,7 +287,7 @@ Contract.prototype.deploy = function(args, _options) {
|
||||||
contractParams = args || [];
|
contractParams = args || [];
|
||||||
|
|
||||||
contractParams.push({
|
contractParams.push({
|
||||||
from: this.blockchainConnector.getDefaultAccount() || this.web3.eth.accounts[0],
|
from: this.blockchainConnector.getDefaultAccount(),
|
||||||
data: this.code,
|
data: this.code,
|
||||||
gas: options.gas || 800000
|
gas: options.gas || 800000
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,24 +1,48 @@
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
const fs = require('fs');
|
||||||
|
|
||||||
module.exports = (embark) => {
|
module.exports = (embark) => {
|
||||||
embark.events.on('runcode:ready', () => {
|
embark.events.on('runcode:ready', () => {
|
||||||
embark.events.emit('runcode:register', '__web3Connector', require('./web3Connector'), false);
|
const pathPromise = new Promise((resolve, reject) => {
|
||||||
|
embark.events.request("version:get:web3", (web3Version) => {
|
||||||
|
if (web3Version === "1.0.0-beta") {
|
||||||
|
return embark.events.request('embark:path', 'node_modules', (result) => {
|
||||||
|
const web3Path = require.resolve("web3", {paths: [result]});
|
||||||
|
resolve(web3Path);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
embark.events.request("version:getPackageLocation", "web3", web3Version, (err, location) => {
|
||||||
|
if (err) {
|
||||||
|
return reject(err);
|
||||||
|
}
|
||||||
|
embark.events.request('dapp:path', location, resolve);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
pathPromise.then((web3Location) => {
|
||||||
|
web3Location = web3Location.replace(/\\/g, '/');
|
||||||
|
embark.events.emit('runcode:register', 'Web3', require(web3Location), false);
|
||||||
|
|
||||||
|
let code = `\nconst Web3 = global.Web3 || require('${web3Location}');`;
|
||||||
|
code += `\nglobal.Web3 = Web3;`;
|
||||||
|
|
||||||
|
const connectorCode = fs.readFileSync(path.join(__dirname, 'web3Connector.js'), 'utf8');
|
||||||
|
code += connectorCode;
|
||||||
|
|
||||||
|
code += "\nEmbarkJS.Blockchain.registerProvider('web3', web3Connector);";
|
||||||
|
|
||||||
|
code += "\nEmbarkJS.Blockchain.setProvider('web3', {});";
|
||||||
|
|
||||||
|
embark.addCodeToEmbarkJS(code);
|
||||||
|
|
||||||
|
code = "EmbarkJS.Blockchain.setProvider('web3', {});";
|
||||||
|
|
||||||
|
const shouldInit = (_config) => {
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
embark.addConsoleProviderInit('blockchain', code, shouldInit);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
let code = `\nconst __embarkWeb3 = global.__web3Connector || require('${path.join(__dirname, 'web3ConnectorBrowser.js').replace(/\\/g, '/')}').default;`;
|
|
||||||
|
|
||||||
code += "\nEmbarkJS.Blockchain.registerProvider('web3', __embarkWeb3);";
|
|
||||||
|
|
||||||
// TODO when we refactor code generator, refactor this to actually do something like connect
|
|
||||||
code += "\nEmbarkJS.Blockchain.setProvider('web3', {});";
|
|
||||||
|
|
||||||
embark.addCodeToEmbarkJS(code);
|
|
||||||
|
|
||||||
code = "EmbarkJS.Blockchain.setProvider('web3', {});";
|
|
||||||
|
|
||||||
const shouldInit = (_config) => {
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
|
|
||||||
embark.addConsoleProviderInit('blockchain', code, shouldInit);
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
"description": "Web3.js Connector for EmbarkJS",
|
"description": "Web3.js Connector for EmbarkJS",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"test": "echo \"Error: no test specified\" && exit 0"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
@ -17,9 +17,6 @@
|
||||||
"ethereum",
|
"ethereum",
|
||||||
"smart-contract"
|
"smart-contract"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
|
||||||
"web3": "1.0.0-beta.37"
|
|
||||||
},
|
|
||||||
"author": "Jonathan Rainville",
|
"author": "Jonathan Rainville",
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,10 @@
|
||||||
const Web3 = require('web3');
|
/*global Web3*/
|
||||||
|
|
||||||
const web3Connector = {};
|
const web3Connector = {};
|
||||||
// const _web3 = require('./web3_instance').default;
|
|
||||||
// global.wtf = _web3;
|
|
||||||
|
|
||||||
web3Connector.init = function(_config) {
|
web3Connector.init = function(_config) {
|
||||||
// Check if the global web3 object uses the old web3 (0.x)
|
// Check if the global web3 object uses the old web3 (0.x)
|
||||||
if (global.web3 && typeof global.web3.version !== 'string') {
|
if (global.web3 && typeof global.web3.version !== 'string') {
|
||||||
// If so, use a new instance using 1.0, but use its provider
|
// If so, use a new instance using 1.0, but use its provider
|
||||||
// _web3.setProvider(global.web3.currentProvider);
|
|
||||||
this.web3 = new Web3(global.web3.currentProvider);
|
this.web3 = new Web3(global.web3.currentProvider);
|
||||||
} else {
|
} else {
|
||||||
this.web3 = global.web3 || new Web3();
|
this.web3 = global.web3 || new Web3();
|
||||||
|
@ -29,7 +25,6 @@ web3Connector.getNewProvider = function (providerName, ...args) {
|
||||||
};
|
};
|
||||||
|
|
||||||
web3Connector.setProvider = function (provider) {
|
web3Connector.setProvider = function (provider) {
|
||||||
// _web3.setProvider(provider);
|
|
||||||
return this.web3.setProvider(provider);
|
return this.web3.setProvider(provider);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -60,12 +55,3 @@ web3Connector.toWei = function () {
|
||||||
web3Connector.getNetworkId = function () {
|
web3Connector.getNetworkId = function () {
|
||||||
return this.web3.eth.net.getId();
|
return this.web3.eth.net.getId();
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = web3Connector;
|
|
||||||
// if (typeof module !== 'undefined' && module.exports) {
|
|
||||||
// module.exports = web3Connector;
|
|
||||||
// return;
|
|
||||||
// } else {
|
|
||||||
// export default web3Connector;
|
|
||||||
// }
|
|
||||||
// exports.default = web3Connector;
|
|
||||||
|
|
|
@ -1,71 +0,0 @@
|
||||||
const Web3 = require('web3');
|
|
||||||
|
|
||||||
const web3Connector = {};
|
|
||||||
// const _web3 = require('./web3_instance').default;
|
|
||||||
// global.wtf = _web3;
|
|
||||||
|
|
||||||
web3Connector.init = function(_config) {
|
|
||||||
// Check if the global web3 object uses the old web3 (0.x)
|
|
||||||
if (global.web3 && typeof global.web3.version !== 'string') {
|
|
||||||
// If so, use a new instance using 1.0, but use its provider
|
|
||||||
// _web3.setProvider(global.web3.currentProvider);
|
|
||||||
this.web3 = new Web3(global.web3.currentProvider);
|
|
||||||
} else {
|
|
||||||
this.web3 = global.web3 || new Web3();
|
|
||||||
}
|
|
||||||
global.web3 = this.web3;
|
|
||||||
};
|
|
||||||
|
|
||||||
web3Connector.getInstance = function () {
|
|
||||||
return this.web3;
|
|
||||||
};
|
|
||||||
|
|
||||||
web3Connector.getAccounts = function () {
|
|
||||||
return this.web3.eth.getAccounts(...arguments);
|
|
||||||
};
|
|
||||||
|
|
||||||
web3Connector.getNewProvider = function (providerName, ...args) {
|
|
||||||
return new Web3.providers[providerName](...args);
|
|
||||||
};
|
|
||||||
|
|
||||||
web3Connector.setProvider = function (provider) {
|
|
||||||
// _web3.setProvider(provider);
|
|
||||||
return this.web3.setProvider(provider);
|
|
||||||
};
|
|
||||||
|
|
||||||
web3Connector.getCurrentProvider = function () {
|
|
||||||
return this.web3.currentProvider;
|
|
||||||
};
|
|
||||||
|
|
||||||
web3Connector.getDefaultAccount = function () {
|
|
||||||
return this.web3.eth.defaultAccount;
|
|
||||||
};
|
|
||||||
|
|
||||||
web3Connector.setDefaultAccount = function (account) {
|
|
||||||
this.web3.eth.defaultAccount = account;
|
|
||||||
};
|
|
||||||
|
|
||||||
web3Connector.newContract = function (options) {
|
|
||||||
return new this.web3.eth.Contract(options.abi, options.address);
|
|
||||||
};
|
|
||||||
|
|
||||||
web3Connector.send = function () {
|
|
||||||
return this.web3.eth.sendTransaction(...arguments);
|
|
||||||
};
|
|
||||||
|
|
||||||
web3Connector.toWei = function () {
|
|
||||||
return this.web3.toWei(...arguments);
|
|
||||||
};
|
|
||||||
|
|
||||||
web3Connector.getNetworkId = function () {
|
|
||||||
return this.web3.eth.net.getId();
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// if (typeof module !== 'undefined' && module.exports) {
|
|
||||||
// module.exports = web3Connector;
|
|
||||||
// return;
|
|
||||||
// } else {
|
|
||||||
// export default web3Connector;
|
|
||||||
// }
|
|
||||||
export default web3Connector;
|
|
|
@ -20,7 +20,8 @@
|
||||||
"ipfs-api": "17.2.7"
|
"ipfs-api": "17.2.7"
|
||||||
},
|
},
|
||||||
"plugins": {
|
"plugins": {
|
||||||
"embark-service": {}
|
"embark-service": {},
|
||||||
|
"web3Connector": {}
|
||||||
},
|
},
|
||||||
"options": {
|
"options": {
|
||||||
"solc": {
|
"solc": {
|
||||||
|
|
|
@ -11,7 +11,8 @@
|
||||||
"react-bootstrap": "0.32.4",
|
"react-bootstrap": "0.32.4",
|
||||||
"react-dom": "16.7.0",
|
"react-dom": "16.7.0",
|
||||||
"rimraf": "2.6.3",
|
"rimraf": "2.6.3",
|
||||||
"zeppelin-solidity": "1.12.0"
|
"zeppelin-solidity": "1.12.0",
|
||||||
|
"web3Connector": "file:../../../packages/web3Connector"
|
||||||
},
|
},
|
||||||
"name": "test_app",
|
"name": "test_app",
|
||||||
"private": true,
|
"private": true,
|
||||||
|
|
Loading…
Reference in New Issue