code: func (c *Client) dial(logger *logging.Logger) error {
  	if c.transactClient == nil {
  		conn, err := grpc.Dial(c.ChainAddress, grpc.WithInsecure())
  		if err != nil {
  			return err
  		}
  		c.transactClient = rpctransact.NewTransactClient(conn)
  		c.queryClient = rpcquery.NewQueryClient(conn)
  		c.executionEventsClient = rpcevents.NewExecutionEventsClient(conn)
  		if c.KeysClientAddress == "" {
  			logger.InfoMsg("Using mempool signing since no keyClient set, pass --keys to sign locally or elsewhere")
  			c.MempoolSigning = true
  			c.keyClient, err = keys.NewRemoteKeyClient(c.ChainAddress, logger)
  		} else {
  			logger.InfoMsg("Using keys server", "server", c.KeysClientAddress)
  			c.keyClient, err = keys.NewRemoteKeyClient(c.KeysClientAddress, logger)
  		}
  
  		if err != nil {
  			return err
  		}
  		ctx, cancel := context.WithTimeout(context.Background(), c.timeout)
  		defer cancel()
  
  		stat, err := c.queryClient.Status(ctx, &rpcquery.StatusParam{})
  		if err != nil {
  			return err
  		}
  		c.chainID = stat.ChainID
  	}
  	return nil
  }
docs: // Connect GRPC clients using ChainURL