@cryptovarna/tronbox
Version:
TronBox - Simple development framework for Tron
1 lines • 13.1 kB
JavaScript
;var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");var _regenerator=_interopRequireDefault(require("@babel/runtime/regenerator"));var _toConsumableArray2=_interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));var _typeof2=_interopRequireDefault(require("@babel/runtime/helpers/typeof"));var _asyncToGenerator2=_interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));function _createForOfIteratorHelper(o,allowArrayLike){var it=typeof Symbol!=="undefined"&&o[Symbol.iterator]||o["@@iterator"];if(!it){if(Array.isArray(o)||(it=_unsupportedIterableToArray(o))||allowArrayLike&&o&&typeof o.length==="number"){if(it)o=it;var i=0;var F=function F(){};return{s:F,n:function n(){if(i>=o.length)return{done:true};return{done:false,value:o[i++]}},e:function e(_e){throw _e},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var normalCompletion=true,didErr=false,err;return{s:function s(){it=it.call(o)},n:function n(){var step=it.next();normalCompletion=step.done;return step},e:function e(_e2){didErr=true;err=_e2},f:function f(){try{if(!normalCompletion&&it["return"]!=null)it["return"]()}finally{if(didErr)throw err}}}}function _unsupportedIterableToArray(o,minLen){if(!o)return;if(typeof o==="string")return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(o);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _arrayLikeToArray(o,minLen)}function _arrayLikeToArray(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i<len;i++){arr2[i]=arr[i]}return arr2}var _TronWeb=require("tronweb");var chalk=require("chalk");var constants=require("./constants");var axios=require("axios");var instance;function TronWrap(){this._toNumber=toNumber;this.EventList=[];this.filterMatchFunction=filterMatchFunction;instance=this;return instance}function toNumber(value){if(!value)return null;if(typeof value==="string"){value=/^0x/.test(value)?value:"0x"+value}else{value=value.toNumber()}return value}function filterMatchFunction(method,abi){var methodObj=abi.filter(function(item){return item.name===method});if(!methodObj||methodObj.length===0){return null}methodObj=methodObj[0];var parametersObj=methodObj.inputs.map(function(item){return item.type});return{"function":methodObj.name+"("+parametersObj.join(",")+")",parameter:parametersObj,methodName:methodObj.name,methodType:methodObj.type}}function sleep(millis){return new Promise(function(resolve){return setTimeout(resolve,millis)})}function filterNetworkConfig(options){var userFeePercentage=typeof options.userFeePercentage==="number"?options.userFeePercentage:typeof options.consume_user_resource_percent==="number"?options.consume_user_resource_percent:constants.deployParameters.userFeePercentage;return{fullNode:options.fullNode||options.fullHost,feeLimit:options.feeLimit||options.fee_limit||constants.deployParameters.feeLimit,originEnergyLimit:options.originEnergyLimit||options.origin_energy_limit||constants.deployParameters.originEnergyLimit,callValue:options.callValue||options.call_value||constants.deployParameters.callValue,tokenValue:options.tokenValue||options.token_value||options.call_token_value,tokenId:options.tokenId||options.token_id,userFeePercentage:userFeePercentage}}function init(options){var extraOptions=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};if(instance){return instance}if(extraOptions.verify&&(!options||!options.privateKey||!(options.fullHost||options.fullNode&&options.solidityNode&&options.eventServer))){if(!options){throw new Error("It was not possible to instantiate TronWeb. The chosen network does not exist in your \"tronbox.js\".")}else{throw new Error("It was not possible to instantiate TronWeb. Some required parameters are missing in your \"tronbox.js\".")}}TronWrap.prototype=new _TronWeb(options.fullNode||options.fullHost,options.solidityNode||options.fullHost,options.eventServer||options.fullHost,options.privateKey);var tronWrap=TronWrap.prototype;tronWrap.networkConfig=filterNetworkConfig(options);if(extraOptions.log){tronWrap._log=extraOptions.log}tronWrap._getNetworkInfo=(0,_asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee(){var info,res;return _regenerator["default"].wrap(function _callee$(_context){while(1){switch(_context.prev=_context.next){case 0:info={parameters:{},nodeinfo:{}};_context.prev=1;_context.next=4;return Promise.all([tronWrap.trx.getChainParameters(),tronWrap.trx.getNodeInfo()]);case 4:res=_context.sent;info.parameters=res[0]||{};info.nodeinfo=res[1]||{};_context.next=11;break;case 9:_context.prev=9;_context.t0=_context["catch"](1);case 11:return _context.abrupt("return",Promise.resolve(info));case 12:case"end":return _context.stop();}}},_callee,null,[[1,9]])}));tronWrap._getNetwork=function(callback){callback&&callback(null,options.network_id)};var defaultAddress=tronWrap.address.fromPrivateKey(tronWrap.defaultPrivateKey);tronWrap._accounts=[defaultAddress];tronWrap._privateKeyByAccount={};tronWrap._privateKeyByAccount[defaultAddress]=tronWrap.defaultPrivateKey;tronWrap._getAccounts=function(callback){var _this=this;var self=this;return new Promise(function(accept){function cb(){if(callback){callback(null,self._accounts);accept()}else{accept(self._accounts)}}if(self._accountsRequested){return cb()}return axios.get(self.networkConfig.fullNode+"/admin/accounts-json").then(function(_ref2){var data=_ref2.data;data=Array.isArray(data)?data:data.privateKeys;if(data.length>0&&data[0].length===64){self._accounts=[];self._privateKeyByAccount={};var _iterator=_createForOfIteratorHelper(data),_step;try{for(_iterator.s();!(_step=_iterator.n()).done;){var account=_step.value;var address=_this.address.fromPrivateKey(account);self._privateKeyByAccount[address]=account;self._accounts.push(address)}}catch(err){_iterator.e(err)}finally{_iterator.f()}}self._accountsRequested=true;return cb()})["catch"](function(){self._accountsRequested=true;return cb()})})};tronWrap._getContract=function(){var _ref3=(0,_asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee2(address,callback){var contractInstance;return _regenerator["default"].wrap(function _callee2$(_context2){while(1){switch(_context2.prev=_context2.next){case 0:_context2.next=2;return tronWrap.trx.getContract(address||"");case 2:contractInstance=_context2.sent;if(contractInstance){callback&&callback(null,contractInstance.contract_address)}else{callback(new Error("no code"))}case 4:case"end":return _context2.stop();}}},_callee2)}));return function(_x,_x2){return _ref3.apply(this,arguments)}}();tronWrap._deployContract=function(option,callback){var myContract=this.contract();var originEnergyLimit=option.originEnergyLimit||this.networkConfig.originEnergyLimit;if(originEnergyLimit<0||originEnergyLimit>constants.deployParameters.originEnergyLimit){throw new Error("Origin Energy Limit must be > 0 and <= 10,000,000")}var userFeePercentage=typeof options.userFeePercentage==="number"?options.userFeePercentage:this.networkConfig.userFeePercentage;this._new(myContract,{bytecode:option.data,feeLimit:option.feeLimit||this.networkConfig.feeLimit,callValue:option.callValue||this.networkConfig.callValue,userFeePercentage:userFeePercentage,originEnergyLimit:originEnergyLimit,abi:option.abi,parameters:option.parameters,name:option.contractName},option.privateKey).then(function(){callback(null,myContract);option.address=myContract.address})["catch"](function(reason){callback(new Error(reason))})};tronWrap._new=function(){var _ref4=(0,_asyncToGenerator2["default"])(_regenerator["default"].mark(function _callee3(myContract,options){var privateKey,signedTransaction,address,transaction,result,contract,i,e,url,_args3=arguments;return _regenerator["default"].wrap(function _callee3$(_context3){while(1){switch(_context3.prev=_context3.next){case 0:privateKey=_args3.length>2&&_args3[2]!==undefined?_args3[2]:tronWrap.defaultPrivateKey;_context3.prev=1;address=tronWrap.address.fromPrivateKey(privateKey);_context3.next=5;return tronWrap.transactionBuilder.createSmartContract(options,address);case 5:transaction=_context3.sent;_context3.next=8;return tronWrap.trx.sign(transaction,privateKey);case 8:signedTransaction=_context3.sent;_context3.next=11;return tronWrap.trx.sendRawTransaction(signedTransaction);case 11:result=_context3.sent;if(!(!result||(0,_typeof2["default"])(result)!=="object")){_context3.next=14;break}return _context3.abrupt("return",Promise.reject("Error while broadcasting the transaction to create the contract ".concat(options.name,". Most likely, the creator has either insufficient bandwidth or energy.")));case 14:if(!result.code){_context3.next=16;break}return _context3.abrupt("return",Promise.reject("".concat(result.code," (").concat(tronWrap.toUtf8(result.message),") while broadcasting the transaction to create the contract ").concat(options.name)));case 16:dlog("Contract broadcasted",{result:result.result,transaction_id:transaction.txID,address:transaction.contract_address});i=0;case 18:if(!(i<10)){_context3.next=38;break}_context3.prev=19;dlog("Requesting contract");_context3.next=23;return tronWrap.trx.getContract(signedTransaction.contract_address);case 23:contract=_context3.sent;dlog("Contract requested");if(!contract.contract_address){_context3.next=28;break}dlog("Contract found");return _context3.abrupt("break",38);case 28:_context3.next=33;break;case 30:_context3.prev=30;_context3.t0=_context3["catch"](19);dlog("Contract does not exist yet");case 33:_context3.next=35;return sleep(500);case 35:i++;_context3.next=18;break;case 38:dlog("Reading contract data");if(!(!contract||!contract.contract_address)){_context3.next=41;break}throw new Error("Contract does not exist");case 41:myContract.address=contract.contract_address;myContract.bytecode=contract.bytecode;myContract.deployed=true;myContract.loadAbi(contract.abi.entrys||[]);dlog("Contract deployed");return _context3.abrupt("return",Promise.resolve(myContract));case 49:_context3.prev=49;_context3.t1=_context3["catch"](1);if(_context3.t1.toString().includes("does not exist")){url=this.networkConfig.fullNode+"/wallet/gettransactionbyid?value="+signedTransaction.txID;e="Contract "+chalk.bold(options.name)+" has not been deployed on the network.\nFor more details, check the transaction at:\n"+chalk.blue(url)+"\nIf the transaction above is empty, most likely, your address had no bandwidth/energy to deploy the contract."}return _context3.abrupt("return",Promise.reject(e||_context3.t1));case 53:case"end":return _context3.stop();}}},_callee3,this,[[1,49],[19,30]])}));return function(_x3,_x4){return _ref4.apply(this,arguments)}}();tronWrap.triggerContract=function(option,callback){var myContract=this.contract(option.abi,option.address);var callSend="send";option.abi.forEach(function(val){if(val.name===option.methodName){callSend=/payable/.test(val.stateMutability)?"send":"call"}});option.methodArgs||(option.methodArgs={});option.methodArgs.from||(option.methodArgs.from=this._accounts[0]);dlog(option.methodName,option.args,options.methodArgs);var privateKey;if(callSend==="send"&&option.methodArgs.from){privateKey=this._privateKeyByAccount[option.methodArgs.from]}this._getNetworkInfo().then(function(info){if(info.compilerVersion==="1"){delete option.methodArgs.tokenValue;delete option.methodArgs.tokenId}return myContract[option.methodName].apply(myContract,(0,_toConsumableArray2["default"])(option.args))[callSend](option.methodArgs||{},privateKey)}).then(function(res){callback(null,res)})["catch"](function(reason){if((0,_typeof2["default"])(reason)==="object"&&reason.error){reason=reason.error}if(process.env.CURRENT==="test"){callback(reason)}else{logErrorAndExit(console,reason)}})};return new TronWrap}var logErrorAndExit=function logErrorAndExit(logger,err){function log(str){try{logger.error(str)}catch(err){console.error(str)}}var msg=typeof err==="string"?err:err.message;if(msg){msg=msg.replace(/^error(:|) /i,"");if(msg==="Invalid URL provided to HttpProvider"){msg="Either invalid or wrong URL provided to HttpProvider. Verify the configuration in your \"tronbox.js\""}log(chalk.red(chalk.bold("ERROR:"),msg))}else{log("Error encountered, bailing. Network state unknown.")}process.exit()};var dlog=function dlog(){if(process.env.DEBUG_MODE){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}for(var i=0;i<args.length;i++){if((0,_typeof2["default"])(args[i])==="object"){try{args[i]=JSON.stringify(args[i],null,2)}catch(err){}}}console.debug(chalk.blue(args.join(" ")))}};module.exports=init;module.exports.config=function(){return console.info("config")};module.exports.constants=constants;module.exports.logErrorAndExit=logErrorAndExit;module.exports.dlog=dlog;module.exports.sleep=sleep;module.exports.TronWeb=_TronWeb;