exportPrivateKey method

  1. @override
Future<void> exportPrivateKey(
  1. String chain,
  2. String accountAddress
)
override

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);
}