crossmintPendingSignerOperation function

CrossmintPendingSignerOperation? crossmintPendingSignerOperation(
  1. CrossmintWalletSigner signer,
  2. String chain
)

Returns the pending operation blocking a signer's approval on the given chain, or null if none. Mirrors getPendingSignerOperation in the JS SDK: Solana/Stellar surface pending transactions via signer.raw['transaction']; EVM chains surface pending per-chain signatures via signer.raw['chains'][chain].

Implementation

CrossmintPendingSignerOperation? crossmintPendingSignerOperation(
  CrossmintWalletSigner signer,
  String chain,
) {
  bool isPendingStatus(Object? status) =>
      status == 'pending' || status == 'awaiting-approval';

  if (crossmintIsSolanaChain(chain) || crossmintIsStellarChain(chain)) {
    final Object? transaction = signer.raw['transaction'];
    if (transaction is Map<Object?, Object?>) {
      final Object? status = transaction['status'];
      final Object? id = transaction['id'];
      if (isPendingStatus(status) && id is String && id.trim().isNotEmpty) {
        return CrossmintPendingSignerOperation(type: 'transaction', id: id);
      }
    }
    return null;
  }

  final Object? chains = signer.raw['chains'];
  if (chains is Map<Object?, Object?>) {
    final Object? entry = chains[chain];
    if (entry is Map<Object?, Object?>) {
      final Object? status = entry['status'];
      final Object? id = entry['id'];
      if (isPendingStatus(status) && id is String && id.trim().isNotEmpty) {
        // An `onChain` entry marks a deployImmediately registration: the
        // pending operation is a transaction, not a signature request.
        final String type = entry.containsKey('onChain')
            ? 'transaction'
            : 'signature';
        return CrossmintPendingSignerOperation(type: type, id: id);
      }
    }
  }
  return null;
}