decryptPayload method
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();
}
}
}