docs: async function () {
      const oThis = this
      ;
  
      // validations
      if (!basicHelper.isNonZeroWeiValid(oThis.amountToStakeInWeis)) {
        logger.error('Invalid amount');
        process.exit(1);
      }
  
      // Format to big number
      oThis.amountToStakeInWeis = basicHelper.convertToBigNumber(oThis.amountToStakeInWeis);
  
      const amountToStakeForBT = ((oThis.amountToStakeInWeis.mul(0.9)).minus(oThis.amountToStakeInWeis.mul(0.9).modulo(1)))
        , amountToStakeForSTP = oThis.amountToStakeInWeis.minus(amountToStakeForBT)
        , stPrimeUuid = coreConstants.OST_OPENSTUTILITY_ST_PRIME_UUID
      ;
  
      // validations
      if (!basicHelper.isNonZeroWeiValid(amountToStakeForBT)) {
        logger.error('Invalid wei amount to stake for BT', amountToStakeForBT.toString(10));
        process.exit(1);
      }
      if (!basicHelper.isNonZeroWeiValid(amountToStakeForSTP)) {
        logger.error('Invalid wei amount to stake for ST Prime', amountToStakeForSTP.toString(10));
        process.exit(1);
      }
  
      logger.step('** Starting stake mint for branded token for beneficiary reserve of BT Reserve:', oThis.reserveAddr);
  
      // NOTE: In real case, Member Company transfers ST to staker and then approve is called. To simulate this, foundation
      // is transfering ST to staker.
      logger.info('* Foundation transfers ST to BT Reserve');
      await fundManager.transferST(
          foundationAddr, foundationPassphrase, stakerAddr, oThis.amountToStakeInWeis,
          {tag: 'transferSTToBTReserve', returnType: 'txReceipt'}
      );
  
      logger.info('* Staker approves openSTValue contract');
      const approveResponse = await (new approveService()).perform();
      if (approveResponse.isFailure()) {
        process.exit(1);
      }
  
      const approveTransactionHash = approveResponse.data.transaction_hash;
  
      logger.info('* Get approval status and keep doing so till success');
      const approveReceiptResponse =  await contractInteractHelper.waitAndGetTransactionReceipt(web3Provider, approveTransactionHash, {});
      if (!approveReceiptResponse.isSuccess()) {
        logger.error('Approval receipt error ', approveReceiptResponse);
        process.exit(1);
      }
  
      logger.info('* Start stake for Branded Token');
      await (new startStakeService({
        beneficiary: oThis.reserveAddr,
        to_stake_amount: amountToStakeForBT,
        uuid: oThis.brandedTokenUuid
      })).perform();
  
      logger.info('* Waiting for credit of Branded Token to BT Reserve');
      await oThis._waitForBrandedTokenMint();
  
      logger.info('* Start stake for Simple Token Prime');
      await (new startStakeService({
        beneficiary: oThis.reserveAddr,
        to_stake_amount: amountToStakeForSTP,
        uuid: stPrimeUuid
      })).perform();
  
      logger.info('* Waiting for credit of Simple Token Prime to BT Reserve');
      await oThis._waitForSimpleTokenPrimeMint();
  
      return Promise.resolve(responseHelper.successWithData({}));
    }