code: func NewEVMContext(msg Message, header *types.Header, chain ChainContext, author *common.Address) vm.Context {
  	// If we don't have an explicit author (i.e. not mining), extract from the header
  	var beneficiary common.Address
  	if author == nil {
  		beneficiary, _ = chain.Engine().Author(header) // Ignore error, we're past header validation
  	} else {
  		beneficiary = *author
  	}
  	return vm.Context{
  		CanTransfer: CanTransfer,
  		Transfer:    Transfer,
  		GetHash:     GetHashFn(header, chain),
  		Origin:      msg.From(),
  		Coinbase:    beneficiary,
  		BlockNumber: new(big.Int).Set(header.Number),
  		Time:        new(big.Int).SetUint64(header.Time),
  		Difficulty:  new(big.Int).Set(header.Difficulty),
  		GasLimit:    header.GasLimit,
  		GasPrice:    new(big.Int).Set(msg.GasPrice()),
  	}
  }
docs: // NewEVMContext creates a new context for use in the EVM.