Source: trans/TxDataCreator/erc20/LockTxE20DataCreator.js

'use strict'
let     errorHandle   = require('../../transUtil').errorHandle;
let     retResult     = require('../../transUtil').retResult;
let     TxDataCreator = require('../common/TxDataCreator');
let     ccUtil        = require('../../../api/ccUtil');
/**
 * @class
 * @augments  TxDataCreator
 */
class LockTxE20DataCreator extends TxDataCreator{
  /**
   * @constructor
   * @param {Object} input  - {@link CrossChain#input input}
   * @param {Object} config - {@link CrossChain#config config}
   */
  constructor(input,config) {
    super(input,config);
  }

  /**
   * @override
   * @returns {Promise<{code: boolean, result: null}>}
   */
  async createCommonData(){
    global.logger.debug("Entering LockTxE20DataCreator::createCommonData");

    retResult.code      = true;
    let  commonData     = {};
    commonData.from     = this.input.from;
    commonData.to       = this.config.midSCAddr;
    commonData.value    = 0;
    commonData.gasPrice = ccUtil.getGWeiToWei(this.input.gasPrice);
    commonData.gasLimit = Number(this.input.gasLimit);
    commonData.gas      = Number(this.input.gasLimit);
    commonData.nonce    = null;
    try{
      if(this.input.hasOwnProperty('testOrNot')){
        commonData.nonce  = ccUtil.getNonceTest();
      }else{
        commonData.nonce  = await ccUtil.getNonce(commonData.from,this.input.chainType,true);
      }
      //commonData.nonce  = await ccUtil.getNonce(commonData.from,this.input.chainType);
      global.logger.debug("nonce:is ",commonData.nonce);
    }catch(error){
      global.logger.error("error:",error);
      retResult.code      = false;
      retResult.result    = error;
    }
    commonData.x      = this.input.x;
    commonData.hashX  = this.input.hashX;
    //global.logger.debug("x:",commonData.x);
    global.logger.debug("hash x:",commonData.hashX);

    if(this.input.chainType === 'WAN'){
      commonData.Txtype = '0x01';
      //let coin2WanRatio = global.coin2WanRatio;
      let coin2WanRatio = this.config.token2WanRatio;
      let txFeeRatio    = this.input.txFeeRatio;
      global.logger.debug("amount:coin2WanRatio:txFeeRatio",Number(this.input.amount), coin2WanRatio, txFeeRatio);
      let value         = ccUtil.calculateLocWanFee(Number(this.input.amount), coin2WanRatio, txFeeRatio);
      global.logger.debug("amount:coin2WanRatio:txFeeRatio:Fee",Number(this.input.amount), coin2WanRatio, txFeeRatio, value);
      commonData.value  = value;
    }
    retResult.result  = commonData;
    return Promise.resolve(retResult);
  }

  /**
   * @override
   * @returns {{code: boolean, result: null}|transUtil.retResult|{code, result}}
   */
  createContractData(){
    global.logger.debug("Entering LockTxE20DataCreator::createContractData");
    try{
      if(this.input.chainType === 'WAN'){
        let data = ccUtil.getDataByFuncInterface(this.config.midSCAbi,
          this.config.midSCAddr,
          this.config.lockScFunc,
          this.config.srcSCAddr,
          this.input.hashX,
          this.input.storeman,
          this.input.to,
          ccUtil.tokenToWeiHex(this.input.amount,this.config.tokenDecimals)
        );
        retResult.result    = data;
        retResult.code      = true;
      }else{
        // let data = ccUtil.getDataByFuncInterface(this.config.midSCAbi,
        //   this.config.midSCAddr,
        //   this.config.lockScFunc,
        //   this.config.srcSCAddr,
        //   ccUtil.tokenToWeiHex(this.input.amount,this.config.tokenDecimals),
        //   this.input.hashX,
        //   this.input.storeman,
        //   this.input.to);

        let data = ccUtil.getDataByFuncInterface(this.config.midSCAbi,
          this.config.midSCAddr,
          this.config.lockScFunc,
          this.config.srcSCAddr,
          this.input.hashX,
          this.input.storeman,
          this.input.to,
          ccUtil.tokenToWeiHex(this.input.amount,this.config.tokenDecimals)
          );
        retResult.result    = data;
        retResult.code      = true;
      }

    }catch(error){
      global.logger.error("createContractData: error: ",error);
      retResult.result      = error;
      retResult.code        = false;
    }
    return retResult;
  }
}

module.exports = LockTxE20DataCreator;