signMessage method

  1. @override
Future<String> signMessage(
  1. String from,
  2. String message
)
override

Signs a message with WalletSigner. Does not call a chain endpoint.

Implementation

@override
Future<String> signMessage(String from, String message) async {
  Future<String> instrumentationOperation() async {
    final operationScope = _state.flowScope.capture(replace: false);
    await operationScope.ready();
    final signerCredential = firstOrNull(_state.user?.verifiedCredentials?.map((signerCandidate) => (((signerCandidate.format == "blockchain") && ((switch ((signerCandidate.chain ?? "")) { "eip155" => "EVM", "solana" => "SOL", "bip122" => "BTC", _ => (signerCandidate.chain ?? "").toUpperCase() }) == "SUI")) && ((("SUI" == "EVM" ? (signerCandidate.address ?? "").toLowerCase() : (signerCandidate.address ?? "")) == ("SUI" == "EVM" ? from.toLowerCase() : from)) || (firstOrNull(signerCandidate.walletAdditionalAddresses?.map((additionalAddress) => (("SUI" == "EVM" ? additionalAddress.address.toLowerCase() : additionalAddress.address) == ("SUI" == "EVM" ? from.toLowerCase() : from) ? additionalAddress : null)).where((v) => v != null).map((v) => v!).toList() ?? const []) != null)) ? signerCandidate : null)).where((v) => v != null).map((v) => v!).toList() ?? const []);
    final embeddedSigner = _client.findCapability<EmbeddedWalletSigner>();
    final externalSigner = _client.findCapability<ExternalWalletSigner>();
    if (!((signerCredential != null) || !((embeddedSigner != null) && (externalSigner != null)))) {
      throw DynamicStateException("wallet ownership is unknown; cannot choose between embedded and external signers");
    }
    final WalletSigner? selectedSigner = signerCredential != null ? (signerCredential?.walletProvider == "embeddedWallet" ? embeddedSigner : externalSigner) : _client.findCapability<WalletSigner>();
    final signer = selectedSigner;
    if (signer == null) {
      throw DynamicStateException("no WalletSigner installed to sign with (e.g. useWaas) — add one first");
    }
    operationScope.check();
    final signature = await signer.signMessage("SUI", from, message);
    operationScope.check();
    return signature;
  }
  return await _api.instrumentation.runAsync("sui.signMessage", instrumentationOperation);
}