connect method

  1. @override
Future<ConnectResponse> connect({
  1. required Map<String, RequiredNamespace> requiredNamespaces,
  2. String? pairingTopic,
  3. List<Relay>? relays,
})
override

Implementation

@override
Future<ConnectResponse> connect({
  required Map<String, RequiredNamespace> requiredNamespaces,
  String? pairingTopic,
  List<Relay>? relays,
}) async {
  _checkInitialized();

  await _isValidConnect(
    requiredNamespaces,
    pairingTopic,
    relays,
  );
  String? topic = pairingTopic;
  Uri? uri;
  bool active = false;

  if (topic != null) {
    final PairingInfo pairing = core.pairing.getStore().get(topic)!;
    active = pairing.active;
  }

  if (topic == null || !active) {
    final CreateResponse newTopicAndUri = await core.pairing.create();
    topic = newTopicAndUri.topic;
    uri = newTopicAndUri.uri;
    // print('connect generated topic: $topic');
  }

  final publicKey = await core.crypto.generateKeyPair();
  final int id = PairingUtils.payloadId();

  final WcSessionProposeRequest request = WcSessionProposeRequest(
    relays: relays == null
        ? [Relay(WalletConnectConstants.RELAYER_DEFAULT_PROTOCOL)]
        : relays,
    requiredNamespaces: requiredNamespaces,
    proposer: ConnectionMetadata(
      publicKey: publicKey,
      metadata: selfMetadata,
    ),
  );

  final expiry = WalletConnectUtils.calculateExpiry(
    WalletConnectConstants.FIVE_MINUTES,
  );
  final ProposalData proposal = ProposalData(
    id: id,
    expiry: expiry,
    relays: request.relays,
    proposer: request.proposer,
    requiredNamespaces: request.requiredNamespaces,
    pairingTopic: topic,
  );
  await _setProposal(
    id,
    proposal,
  );

  Completer completer = Completer.sync();

  pendingProposals[id] = SessionProposalCompleter(
    publicKey,
    topic,
    request.requiredNamespaces,
    completer,
  );
  connectResponseHandler(
    topic,
    request,
    id,
  );

  final ConnectResponse resp = ConnectResponse(
    session: completer,
    uri: uri,
  );

  return resp;
}