UNPKG

bebox

Version:

TronBox - Simple development framework for Tron

1 lines 7.23 kB
"use strict";var Profiler=require("./profiler");var OS=require("os");var path=require("path");var CompileError=require("./compileerror");var expect=require("@truffle/expect");var find_contracts=require("@truffle/contract-sources");var Config=require("../Config");var preReleaseCompilerWarning=require("./messages").preReleaseCompilerWarning;var compile=function compile(sources,options,callback){if(typeof options==="function"){callback=options;options={}}if(!options.logger){options.logger=console}expect.options(options,["contracts_directory","solc"]);var _require=require("../TronSolc"),getWrapper=_require.getWrapper;var solc=getWrapper(options);var listeners=process.listeners("uncaughtException");var solc_listener=listeners[listeners.length-1];if(solc_listener){process.removeListener("uncaughtException",solc_listener)}var operatingSystemIndependentSources={};var originalPathMappings={};Object.keys(sources).forEach(function(source){var replacement=source.replace(/\\/g,"/");if(replacement.length>=2&&replacement[1]===":"){replacement="/"+replacement;replacement=replacement.replace(":","")}operatingSystemIndependentSources[replacement]=sources[source];originalPathMappings[replacement]=source});var solcStandardInput={language:"Solidity",sources:{},settings:{evmVersion:options.solc.evmVersion,optimizer:options.solc.optimizer,outputSelection:{"*":{"":["legacyAST","ast"],"*":["abi","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object","evm.deployedBytecode.sourceMap"]}}}};if(!Object.keys(sources).length){return callback(null,[],[])}Object.keys(operatingSystemIndependentSources).forEach(function(file_path){solcStandardInput.sources[file_path]={content:operatingSystemIndependentSources[file_path]}});var result=solc[solc.compileStandard?"compileStandard":"compile"](JSON.stringify(solcStandardInput));var standardOutput=JSON.parse(result);var errors=standardOutput.errors||[];var warnings=[];if(options.strict!==true){warnings=errors.filter(function(error){return error.severity==="warning"&&error.message!==preReleaseCompilerWarning});errors=errors.filter(function(error){return error.severity!=="warning"});if(options.quiet!==true&&warnings.length>0){options.logger.log(OS.EOL+"Compilation warnings encountered:"+OS.EOL);options.logger.log(warnings.map(function(warning){return warning.formattedMessage}).join())}}if(errors.length>0){options.logger.log("");return callback(new CompileError(standardOutput.errors.map(function(error){return error.formattedMessage}).join()))}var contracts=standardOutput.contracts;var files=[];Object.keys(standardOutput.sources).forEach(function(filename){var source=standardOutput.sources[filename];files[source.id]=originalPathMappings[filename]});var returnVal={};Object.keys(contracts).forEach(function(source_path){var files_contracts=contracts[source_path];Object.keys(files_contracts).forEach(function(contract_name){var contract=files_contracts[contract_name];var contract_definition={contract_name:contract_name,sourcePath:originalPathMappings[source_path],source:operatingSystemIndependentSources[source_path],sourceMap:contract.evm.bytecode.sourceMap,deployedSourceMap:contract.evm.deployedBytecode.sourceMap,legacyAST:standardOutput.sources[source_path].legacyAST,ast:standardOutput.sources[source_path].ast,abi:contract.abi,bytecode:"0x"+contract.evm.bytecode.object,deployedBytecode:"0x"+contract.evm.deployedBytecode.object,unlinked_binary:"0x"+contract.evm.bytecode.object,compiler:{name:"solc",version:solc.version()}};contract_definition.abi=orderABI(contract_definition);Object.keys(contract.evm.bytecode.linkReferences).forEach(function(file_name){var fileLinks=contract.evm.bytecode.linkReferences[file_name];Object.keys(fileLinks).forEach(function(library_name){var linkReferences=fileLinks[library_name]||[];contract_definition.bytecode=replaceLinkReferences(contract_definition.bytecode,linkReferences,library_name);contract_definition.unlinked_binary=replaceLinkReferences(contract_definition.unlinked_binary,linkReferences,library_name)})});Object.keys(contract.evm.deployedBytecode.linkReferences).forEach(function(file_name){var fileLinks=contract.evm.deployedBytecode.linkReferences[file_name];Object.keys(fileLinks).forEach(function(library_name){var linkReferences=fileLinks[library_name]||[];contract_definition.deployedBytecode=replaceLinkReferences(contract_definition.deployedBytecode,linkReferences,library_name)})});returnVal[contract_name]=contract_definition})});callback(null,returnVal,files)};function replaceLinkReferences(bytecode,linkReferences,libraryName){var linkId="__"+libraryName;while(linkId.length<40){linkId+="_"}linkReferences.forEach(function(ref){var start=ref.start*2+2;bytecode=bytecode.substring(0,start)+linkId+bytecode.substring(start+40)});return bytecode}function orderABI(contract){var contract_definition;var ordered_function_names=[];for(var i=0;i<contract.legacyAST.children.length;i++){var definition=contract.legacyAST.children[i];if(definition.name!=="ContractDefinition"||definition.attributes.name!==contract.contract_name){continue}contract_definition=definition;break}if(!contract_definition)return contract.abi;if(!contract_definition.children)return contract.abi;contract_definition.children.forEach(function(child){if(child.name==="FunctionDefinition"){ordered_function_names.push(child.attributes.name)}});var functions_to_remove=ordered_function_names.reduce(function(obj,value,index){obj[value]=index;return obj},{});var function_definitions=contract.abi.filter(function(item){return functions_to_remove[item.name]!=null});function_definitions=function_definitions.sort(function(item_a,item_b){var a=functions_to_remove[item_a.name];var b=functions_to_remove[item_b.name];if(a>b)return 1;if(a<b)return-1;return 0});var newABI=[];contract.abi.forEach(function(item){if(functions_to_remove[item.name]!=null)return;newABI.push(item)});Array.prototype.push.apply(newABI,function_definitions);return newABI}compile.all=function(options,callback){find_contracts(options.contracts_directory,function(err,files){options.paths=files;compile.with_dependencies(options,callback)})};compile.necessary=function(options,callback){options.logger=options.logger||console;Profiler.updated(options,function(err,updated){if(err)return callback(err);if(updated.length===0&&options.quiet!==true){return callback(null,[],{})}options.paths=updated;compile.with_dependencies(options,callback)})};compile.with_dependencies=function(options,callback){options.logger=options.logger||console;options.contracts_directory=options.contracts_directory||process.cwd();expect.options(options,["paths","working_directory","contracts_directory","resolver"]);var config=Config["default"]().merge(options);Profiler.required_sources(config["with"]({paths:options.paths,base_path:options.contracts_directory,resolver:options.resolver}),function(err,result){if(err)return callback(err);if(!options.quiet){Object.keys(result).sort().forEach(function(import_path){var display_path=import_path;if(path.isAbsolute(import_path)){display_path="."+path.sep+path.relative(options.working_directory,import_path)}options.logger.log("Compiling "+display_path+"...")})}compile(result,options,callback)})};module.exports=compile;