decryptPayload method

Future<Map<String, dynamic>> decryptPayload(
  1. Map<String, String> params
)

Decrypts the data payload returned by Solflare Wallet

Implementation

Future<Map<String, dynamic>> decryptPayload(
  Map<String, String> params,
) async {
  if (params.containsKey('errorCode')) {
    return params;
  }

  final solflareRequest = params['solflareRequest'] ?? '';
  // solflare_encryption_public_key is Solflare publicKey (not solana Address)
  final solflareKey = params['solflare_encryption_public_key'] ?? '';
  _core.logger.d(
    '[$runtimeType] solflare_encryption_public_key $solflareKey',
  );

  if (solflareRequest == 'connect') {
    // executed only once after successful /connect
    _solflarePublicKey = solflareKey;
    await _createSharedSecret();
  }

  if (solflareRequest == 'disconnect') {
    return <String, dynamic>{'solflareRequest': solflareRequest};
  }

  try {
    final data = params['data']!;
    final nonce = params['nonce']!;
    final decryptedData = _sharedSecretBox?.decrypt(
      pncl.ByteList(base58.decode(data)),
      nonce: Uint8List.fromList(base58.decode(nonce)),
    );

    final payload = <String, dynamic>{
      ...JsonDecoder().convert(String.fromCharCodes(decryptedData!)),
      if (solflareKey.isNotEmpty)
        'solflare_encryption_public_key': solflareKey,
      if (solflareRequest.isNotEmpty) 'solflareRequest': solflareRequest,
    };

    _sessionToken = payload['session'] ?? _sessionToken;

    return payload;
  } catch (e) {
    final queryParams = Uri.parse(solflareRequest).queryParameters;
    if (queryParams.containsKey('errorCode')) {
      final errorCode = queryParams['errorCode'];
      final errorMessage = params['errorMessage'];
      return {'errorCode': errorCode, 'errorMessage': errorMessage};
    } else {
      return Errors.getInternalError(
        Errors.MISSING_OR_INVALID,
        context: e.toString(),
      ).toJson();
    }
  }
}