anchor.diff:                  data = DataJSON
               }
       end;
  -decode_response_graph(2, null) ->
  +% Covers all versions since 2
  +decode_response_graph(_, null) ->
       #gs_resp_graph{};
  -decode_response_graph(2, Map) when map_size(Map) == 0 ->
  +decode_response_graph(_, Map) when map_size(Map) == 0 ->
       #gs_resp_graph{};
  -decode_response_graph(2, DataJSON) ->
  +decode_response_graph(_, DataJSON) ->
       FormatStr = maps:get(<<"format">>, DataJSON),
       #gs_resp_graph{
           data_format = str_to_data_format(FormatStr),
  
positive.code: -type message_subtype() :: handshake | rpc | graph | unsub | nosub | error.
  
  % Clients authorization, used during handshake or auth override.
  -type client_auth() :: undefined | {macaroon, Macaroon :: binary(), DischMacaroons :: [binary()]}.
  
  % Used to override the client authorization established on connection level, per
  % request. Can be used for example by providers to authorize a certain request
  
negative.code: string_to_subtype(<<"error">>) -> error.
  
  
  -spec json_to_client_auth(null | json_map() | binary()) -> client_auth().
  json_to_client_auth(null) ->
      undefined;
  json_to_client_auth(<<"nobody">>) ->
      nobody;
  json_to_client_auth(#{<<"macaroon">> := Macaroon} = Json) ->
      {macaroon, Macaroon, maps:get(<<"discharge-macaroons">>, Json, [])}.
  
  
  -spec client_auth_to_json(client_auth()) -> null | json_map() | binary().
  client_auth_to_json(undefined) ->
      null;
  client_auth_to_json(nobody) ->
      <<"nobody">>;
  client_auth_to_json({macaroon, Macaroon, DischargeMacaroons}) -> #{
      <<"macaroon">> => Macaroon,
      <<"discharge-macaroons">> => DischargeMacaroons
  