exportPrivateKey method
Opens the export UI after wallet:export step-up checks. No private-key material crosses the SDK bridge.
Implementation
@override
Future<void> exportPrivateKey(String chain, String accountAddress) async {
Future<void> instrumentationOperation() async {
final operationScope = _state.flowScope.capture(replace: false);
await operationScope.ready();
operationScope.commit(() {
_state.elevatedAccessTokens = _state.elevatedAccessTokens?.map((validElevation) => (validElevation.expiresAtMs > DateTime.now().millisecondsSinceEpoch ? validElevation : null)).where((v) => v != null).map((v) => v!).toList() ?? const [];
_state.elevatedAccessTokensChanged.emit(_state.elevatedAccessTokens);
});
final elevationGrant = firstOrNull(_state.elevatedAccessTokens?.map((matchingElevation) => ((matchingElevation.scopes.split(' ').where((word) => word.isNotEmpty).toList()).contains("wallet:export") ? matchingElevation : null)).where((v) => v != null).map((v) => v!).toList() ?? const []);
final elevation = elevationGrant?.token;
operationScope.commit(() {
_state.elevatedAccessTokens = _state.elevatedAccessTokens?.map((retainedElevation) => (!retainedElevation.singleUse || retainedElevation.token != elevation ? retainedElevation : null)).where((v) => v != null).map((v) => v!).toList() ?? const [];
_state.elevatedAccessTokensChanged.emit(_state.elevatedAccessTokens);
});
if (!_state.initialized) {
throw DynamicStateException("call initialize() before using the client");
}
final authToken = _state.token;
if (authToken == null) {
throw DynamicStateException("not authenticated — sign in first");
}
final waasSessionId = _state.user?.sessionId;
if (waasSessionId == null) {
throw DynamicStateException("no sessionId — sign in (or call refreshUser) first");
}
operationScope.check();
final sessionSignature = await _sessionSigner.sign(waasSessionId);
operationScope.check();
operationScope.check();
final nonceResponse = await _api.get<NonceResponse>(path: "/nonce", token: null, sessionPublicKey: _state.sessionPublicKey, parse: NonceResponse.fromJson);
operationScope.check();
final nonce = nonceResponse.nonce;
operationScope.check();
final nonceSignature = await _sessionSigner.sign(nonce);
operationScope.check();
final signedSessionId = "${sessionSignature}/${nonceSignature}/${nonce}";
operationScope.check();
await _exportPrivateKeyEngine.exportPrivateKey(_config.environmentId, (chain == "SOL" ? "SVM" : chain), accountAddress, authToken, _config.apiBaseUrl, signedSessionId, elevation, _config.universalLink);
operationScope.check();
_logger.log("info", "private key export completed");
}
return await _api.instrumentation.runAsync("exportPrivateKey.exportPrivateKey", instrumentationOperation);
}