tronbox
Version:
TronBox - Simple development framework for Tron
1 lines • 6.49 kB
JavaScript
;var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");var _regenerator=_interopRequireDefault(require("@babel/runtime/regenerator"));var _asyncToGenerator2=_interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));var dir=require("node-dir");var path=require("path");var ResolverIntercept=require("./resolverintercept");var Require=require("../Require");var async=require("async");var expect=require("@truffle/expect");var Deployer=require("../Deployer");var TronWrap=require("../TronWrap");var logErrorAndExit=require("../TronWrap").logErrorAndExit;var tronWrap;function Migration(file){this.file=path.resolve(file);this.number=parseInt(path.basename(file))}Migration.prototype.run=function(options,callback){var self=this;var logger=options.logger;logger.log("Running migration: "+path.relative(options.migrations_directory,this.file));var resolver=new ResolverIntercept(options.resolver);tronWrap=TronWrap(options);var context={tronWrap:tronWrap};if(tronWrap._web3){context.web3=tronWrap._web3}var deployer=new Deployer({options:options,logger:{log:function log(msg){logger.log(" "+msg)}},network:options.network,network_id:options.network_id,provider:options.provider,basePath:path.dirname(this.file)});var finish=function finish(err,migrateFn){if(err)return callback(err);deployer.start().then((0,_asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee(){var Migrations,result;return _regenerator["default"].wrap(function _callee$(_context){while(1)switch(_context.prev=_context.next){case 0:if(!(migrateFn&&migrateFn.then!==undefined)){_context.next=3;break}_context.next=3;return migrateFn;case 3:if(!(options.save===false)){_context.next=5;break}return _context.abrupt("return");case 5:Migrations=resolver.require("./Migrations.sol");if(!(Migrations&&Migrations.isDeployed())){_context.next=12;break}logger.log("Saving successful migration to network...");_context.next=10;return Migrations.deployed();case 10:result=Migrations.call("setCompleted",[self.number]);return _context.abrupt("return",Promise.resolve(result));case 12:case"end":return _context.stop()}},_callee)}))).then(function(){if(options.save===false)return;logger.log("Saving artifacts...");return options.artifactor.saveAll(resolver.contracts(),{evm:options.evm})}).then(function(){process.nextTick(callback)})["catch"](function(e){logErrorAndExit(logger,e)})};var fn=Require.file({file:self.file,context:context,resolver:resolver,args:[deployer]},options);if(!fn||!fn.length||fn.length===0){return callback(new Error("Migration "+self.file+" invalid or does not take any parameters"))}var migrateFn=fn(deployer,options.network,options.networks[options.network].from);finish(null,migrateFn)};var Migrate={Migration:Migration,assemble:function assemble(options,callback){dir.files(options.migrations_directory,function(err,files){if(err)return callback(err);options.allowed_extensions=options.allowed_extensions||/^\.(js|es6?)$/;var migrations=files.filter(function(file){return isNaN(parseInt(path.basename(file)))===false}).filter(function(file){return path.extname(file).match(options.allowed_extensions)!=null}).map(function(file){return new Migration(file,options.network)});migrations=migrations.sort(function(a,b){if(a.number>b.number){return 1}else if(a.number<b.number){return-1}return 0});callback(null,migrations)})},run:function run(options,callback){var self=this;expect.options(options,["working_directory","migrations_directory","contracts_build_directory","provider","artifactor","resolver","network","network_id","logger","from"]);if(options.reset===true){return this.runAll(options,callback)}self.lastCompletedMigration(options,function(err,last_migration){if(err)return callback(err);self.runFrom(last_migration+1,options,callback)})},runFrom:function runFrom(number,options,callback){var self=this;this.assemble(options,function(err,migrations){if(err)return callback(err);while(migrations.length>0){if(migrations[0].number>=number){break}migrations.shift()}if(options.to){migrations=migrations.filter(function(migration){return migration.number<=options.to})}self.runMigrations(migrations,options,callback)})},runAll:function runAll(options,callback){this.runFrom(0,options,callback)},runMigrations:function runMigrations(migrations,options,callback){var clone={};Object.keys(options).forEach(function(key){clone[key]=options[key]});if(options.quiet){clone.logger={log:function log(){}}}clone.provider=this.wrapProvider(options.provider,clone.logger);clone.resolver=this.wrapResolver(options.resolver,clone.provider);async.eachSeries(migrations,function(migration,finished){migration.run(clone,function(err){if(err)return finished(err);finished()})},callback)},wrapProvider:function wrapProvider(provider,logger){var printTransaction=function printTransaction(tx_hash){logger.log(" ... "+tx_hash)};return{send:function send(payload){var result=provider.send(payload);if(payload.method==="eth_sendTransaction"){printTransaction(result.result)}return result},sendAsync:function sendAsync(payload,callback){provider.sendAsync(payload,function(err,result){if(err)return callback(err);if(payload.method==="eth_sendTransaction"){printTransaction(result.result)}callback(err,result)})}}},wrapResolver:function wrapResolver(resolver,provider){return{require:function require(import_path,search_path){var abstraction=resolver.require(import_path,search_path);abstraction.setProvider(provider);return abstraction},resolve:resolver.resolve}},lastCompletedMigration:function lastCompletedMigration(options,callback){if(!tronWrap){tronWrap=TronWrap()}var Migrations=options.resolver.require("Migrations");if(Migrations.isDeployed()===false){return callback(null,0)}Migrations.deployed().then(function(migrations){return tronWrap.filterMatchFunction("last_completed_migration",migrations.abi)?migrations.call("last_completed_migration"):migrations.call("lastCompletedMigration")}).then(function(completed_migration){callback(null,Number(completed_migration))})["catch"](function(){callback(null,0)})},needsMigrating:function needsMigrating(options,callback){var self=this;if(options.reset){return callback(null,true)}this.lastCompletedMigration(options,function(err,number){if(err)return callback(err);self.assemble(options,function(err,migrations){if(err)return callback(err);while(migrations.length>0){if(migrations[0].number>=number){break}migrations.shift()}callback(null,migrations.length>1)})})}};module.exports=Migrate;