isSessionCompatible static method

bool isSessionCompatible(
  1. SessionData session,
  2. Map<String, RequiredNamespace> requiredNamespaces
)

Implementation

static bool isSessionCompatible(
  SessionData session,
  Map<String, RequiredNamespace> requiredNamespaces,
) {
  List<String> sessionKeys = session.namespaces.keys.toList();
  List<String> paramsKeys = requiredNamespaces.keys.toList();
  bool compatible = true;

  if (!hasOverlap(paramsKeys, sessionKeys)) return false;

  sessionKeys.forEach((key) {
    Namespace namespace = session.namespaces[key]!;
    List<String> accounts = namespace.accounts;
    List<dynamic> methods = namespace.methods;
    List<dynamic> events = namespace.events;
    List<BaseNamespace>? extension = namespace.extension;
    List<String> chains = NamespaceUtils.getAccountsChains(accounts);
    RequiredNamespace requiredNamespace = requiredNamespaces[key]!;

    if (!hasOverlap(requiredNamespace.chains, chains) ||
        !hasOverlap(requiredNamespace.methods, methods) ||
        !hasOverlap(requiredNamespace.events, events)) {
      compatible = false;
    }

    if (compatible && extension != null) {
      extension.forEach((extensionNamespace) {
        if (requiredNamespace.extension != null) {
          List<String> accounts = extensionNamespace.accounts;
          List<dynamic> methods = extensionNamespace.methods;
          List<dynamic> events = extensionNamespace.events;
          List<String> chains = NamespaceUtils.getAccountsChains(accounts);

          bool overlap = requiredNamespace.extension!.any((ext) =>
              hasOverlap(ext.chains, chains) &&
              hasOverlap(ext.methods, methods) &&
              hasOverlap(ext.events, events));
          if (!overlap) {
            compatible = false;
          }
        } else {
          compatible = false;
        }
      });
    }
  });

  return compatible;
}