docs: async function (contractName, web3Provider, contractAbi, contractBin, deployerName, customOptions, constructorArgs) {
      const oThis = this
        , deployerAddr = coreAddresses.getAddressForUser(deployerName)
        , deployerAddrPassphrase = coreAddresses.getPassphraseForUser(deployerName);
  
      const txParams = {
        from: deployerAddr,
        gas: gasLimit,
        gasPrice: gasPrice
      };
  
      Object.assign(txParams, customOptions);
  
      const options = {
        data: (web3Provider.utils.isHexStrict(contractBin) ? "" : "0x") + contractBin
      };
  
      Object.assign(options, txParams);
  
      if (constructorArgs) {
        options.arguments = constructorArgs;
      }
  
      const contract = new web3Provider.eth.Contract(
        contractAbi,
        null, // since addr is not known yet
        options
      );
  
      // this is needed since the contract object
      //contract.setProvider(web3Provider.currentProvider);
  
      const deploy = function () {
        const encodeABI = contract.deploy(options).encodeABI();
        txParams.data = encodeABI;
  
        return new Promise(function (onResolve, onReject) {
          web3Provider.eth.sendTransaction(txParams)
            .on('transactionHash', function(transactionHash){
              onResolve(transactionHash)
            })
            .on('error', onReject);
        });
      };
  
      logger.info('* Unlocking address:', deployerAddr);
      await web3Provider.eth.personal.unlockAccount(deployerAddr, deployerAddrPassphrase);
  
      logger.info('* Deploying contract:', contractName);
      var deployFailedReason = null;
  
      const transactionReceipt = await deploy().then(function (transactionHash) {
          return contractInteractHelper.waitAndGetTransactionReceipt(web3Provider, transactionHash, {});
        })
        .then(function(response){
          if (!response.isSuccess()) {
            throw response.err.msg;
          } else {
            return Promise.resolve(response.data.rawTransactionReceipt);
          }
        })
        .catch(reason => {
          deployFailedReason = reason;
          logger.error(deployFailedReason);
          return Promise.resolve({});
        });
  
      if ( deployFailedReason ) {
        process.exit(1);
      }
  
      logger.info('* Deploy transactionReceipt ::', transactionReceipt);
  
      const contractAddress = transactionReceipt.contractAddress
        , code = await web3Provider.eth.getCode(contractAddress);
  
      if (code.length <= 2) {
        const err = 'Contract deployment failed. Invalid code length for contract: ' + contractName;
        logger.error(err);
        return Promise.reject(err);
      }
  
      // Print summary
      logger.info('Contract Address:', contractAddress);
      logger.info('Gas used:', transactionReceipt.gasUsed);
  
      return Promise.resolve({
        receipt: transactionReceipt,
        contractAddress: contractAddress
      });
    }