From dc9e6c168bcbb5afcacd748009a6bdc378defa08 Mon Sep 17 00:00:00 2001 From: Jonathan Rainville Date: Thu, 12 Apr 2018 13:24:54 -0400 Subject: [PATCH] start vyper implementation --- lib/core/engine.js | 3 ++ lib/modules/solidity/index.js | 2 +- lib/modules/vyper/index.js | 75 +++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 lib/modules/vyper/index.js diff --git a/lib/core/engine.js b/lib/core/engine.js index b4ebe9283..9c02a5da0 100644 --- a/lib/core/engine.js +++ b/lib/core/engine.js @@ -137,6 +137,9 @@ class Engine { this.registerModule('solidity', { contractDirectories: self.config.contractDirectories }); + this.registerModule('vyper', { + contractDirectories: self.config.contractDirectories + }); this.contractsManager = new ContractsManager({ contractFiles: this.config.contractsFiles, diff --git a/lib/modules/solidity/index.js b/lib/modules/solidity/index.js index d59564a4c..a4f5c035d 100644 --- a/lib/modules/solidity/index.js +++ b/lib/modules/solidity/index.js @@ -49,7 +49,7 @@ class Solidity { }); }, function compileContracts(callback) { - self.logger.info("compiling contracts..."); + self.logger.info("compiling solidity contracts..."); let jsonObj = { language: 'Solidity', sources: input, diff --git a/lib/modules/vyper/index.js b/lib/modules/vyper/index.js new file mode 100644 index 000000000..b18830bb5 --- /dev/null +++ b/lib/modules/vyper/index.js @@ -0,0 +1,75 @@ +let async = require('../../utils/async_extend.js'); +const shelljs = require('shelljs'); + +class Vyper { + + constructor(embark, options) { + this.logger = embark.logger; + this.events = embark.events; + this.contractDirectories = options.contractDirectories; + + console.log('Construct VYPER'); + embark.registerCompiler(".py", this.compile_vyper.bind(this)); + } + + compile_vyper(contractFiles, cb) { + let self = this; + async.waterfall([ + function compileContracts(callback) { + self.logger.info("compiling vyper contracts..."); + async.each(contractFiles, + function(file, fileCb) { + shelljs.exec(`vyper ${file.filename}`, (code, stdout, stderr) => { + console.log('Code', code); + console.log('Stdout', stdout); + console.log('Stderr', stderr); + fileCb(); + }); + }, + function (err) { + process.exit(); // TODO remove me + callback(err); + }); + }, + function createCompiledObject(output, callback) { + let json = output.contracts; + + if (!output || !output.contracts) { + return callback(new Error("error compiling for unknown reasons")); + } + + if (Object.keys(output.contracts).length === 0 && output.sourceList.length > 0) { + return callback(new Error("error compiling. There are sources available but no code could be compiled, likely due to fatal errors in the solidity code").message); + } + + let compiled_object = {}; + + for (let contractFile in json) { + for (let contractName in json[contractFile]) { + let contract = json[contractFile][contractName]; + + const className = contractName; + const filename = contractFile; + + compiled_object[className] = {}; + compiled_object[className].code = contract.evm.bytecode.object; + compiled_object[className].runtimeBytecode = contract.evm.deployedBytecode.object; + compiled_object[className].realRuntimeBytecode = contract.evm.deployedBytecode.object.slice(0, -68); + compiled_object[className].swarmHash = contract.evm.deployedBytecode.object.slice(-68).slice(0, 64); + compiled_object[className].gasEstimates = contract.evm.gasEstimates; + compiled_object[className].functionHashes = contract.evm.methodIdentifiers; + compiled_object[className].abiDefinition = contract.abi; + compiled_object[className].filename = filename; + } + } + + callback(null, compiled_object); + } + ], function (err, result) { + cb(err, result); + }); + } + +} + +module.exports = Vyper;