code: async function contractCallStatic (source, address, name, args = [], { top, options = {} } = {}) {
    const opt = R.merge(this.Ae.defaults, options)
  
    // Prepare `call` transaction
    const tx = await this.contractCallTx(R.merge(opt, {
      callerId: await this.address(),
      contractId: address,
      callData: await this.contractEncodeCall(source, name, args)
    }))
  
    // Get block hash by height
    if (top && !isNaN(top)) {
      top = (await this.getKeyBlock(top)).hash
    }
  
    // Dry-run
    const [{ result: status, callObj, reason }] = (await this.txDryRun([tx], [{
      amount: opt.amount,
      pubKey: await this.address()
    }], top)).results
  
    // check response
    if (status !== 'ok') throw new Error('Dry run error, ' + reason)
    const { returnType, returnValue } = callObj
    if (returnType !== 'ok') {
      await this.handleCallError(callObj)
    }
    return {
      result: callObj,
      decode: (type) => this.contractDecodeData(type, returnValue)
    }
  }
docs: Static contract call(using dry-run)
  @function
  @alias module:@aeternity/aepp-sdk/es/ae/contract
  @category async
  @param {String} source Contract source code
  @param {String} address Contract address
  @param {String} name Name of function to call
  @param {Array} args  Argument's for call function
  @param {Object} options [options={}]  Options
  @param {String} top [options.top] Block hash on which you want to call contract
  @param {String} options [options.options]  Transaction options (fee, ttl, gas, amount, deposit)
  @return {Promise<Object>} Result object
  @example
  const callResult = await client.contractCallStatic(source, address, fnName, args = [], { top, options = {} })
  {
  result: TX_DATA,
  decode: (type) => Decode call result
  }