code: func EncodeFunctionCall(abiData, funcName string, logger *logging.Logger, args ...interface{}) ([]byte, *FunctionSpec, error) {
  	logger.TraceMsg("Packing Call via ABI",
  		"spec", abiData,
  		"function", funcName,
  		"arguments", fmt.Sprintf("%v", args),
  	)
  
  	abiSpec, err := ReadAbiSpec([]byte(abiData))
  	if err != nil {
  		logger.InfoMsg("Failed to decode abi spec",
  			"abi", abiData,
  			"error", err.Error(),
  		)
  		return nil, nil, err
  	}
  
  	packedBytes, funcSpec, err := abiSpec.Pack(funcName, args...)
  	if err != nil {
  		logger.InfoMsg("Failed to encode abi spec",
  			"abi", abiData,
  			"error", err.Error(),
  		)
  		return nil, nil, err
  	}
  
  	return packedBytes, funcSpec, nil
  }
docs: // EncodeFunctionCall ABI encodes a function call based on ABI in string abiData
  // and the arguments specified as strings.
  // The fname specifies which function should called, if
  // it doesn't exist exist the fallback function will be called. If fname is the empty
  // string, the constructor is called. The arguments must be specified in args. The count
  // must match the function being called.
  // Returns the ABI encoded function call, whether the function is constant according
  // to the ABI (which means it does not modified contract state)