code: func (c *BoundContract) Call(opts *CallOpts, result interface{}, method string, params ...interface{}) error {
  	// Don't crash on a lazy user
  	if opts == nil {
  		opts = new(CallOpts)
  	}
  	// Pack the input, call and unpack the results
  	input, err := c.abi.Pack(method, params...)
  	if err != nil {
  		return err
  	}
  	var (
  		msg    = ethereum.CallMsg{From: opts.From, To: &c.address, Data: input}
  		ctx    = ensureContext(opts.Context)
  		code   []byte
  		output []byte
  	)
  	if opts.Pending {
  		pb, ok := c.caller.(PendingContractCaller)
  		if !ok {
  			return ErrNoPendingState
  		}
  		output, err = pb.PendingCallContract(ctx, msg)
  		if err == nil && len(output) == 0 {
  			// Make sure we have a contract to operate on, and bail out otherwise.
  			if code, err = pb.PendingCodeAt(ctx, c.address); err != nil {
  				return err
  			} else if len(code) == 0 {
  				return ErrNoCode
  			}
  		}
  	} else {
  		output, err = c.caller.CallContract(ctx, msg, opts.BlockNumber)
  		if err == nil && len(output) == 0 {
  			// Make sure we have a contract to operate on, and bail out otherwise.
  			if code, err = c.caller.CodeAt(ctx, c.address, opts.BlockNumber); err != nil {
  				return err
  			} else if len(code) == 0 {
  				return ErrNoCode
  			}
  		}
  	}
  	if err != nil {
  		return err
  	}
  	return c.abi.Unpack(result, method, output)
  }
docs: // Call invokes the (constant) contract method with params as input values and
  // sets the output to result. The result type might be a single field for simple
  // returns, a slice of interfaces for anonymous returns and a struct for named
  // returns.