diff --git a/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/data/repository/TssRepository.kt b/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/data/repository/TssRepository.kt index 98e62d39..062880d7 100644 --- a/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/data/repository/TssRepository.kt +++ b/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/data/repository/TssRepository.kt @@ -2089,8 +2089,39 @@ class TssRepository @Inject constructor( android.util.Log.d("TssRepository", "[EXPORT] - publicKey length: ${share.publicKey.length}") android.util.Log.d("TssRepository", "[EXPORT] - encryptedShare length: ${share.encryptedShare.length}") - android.util.Log.d("TssRepository", "[EXPORT] Converting to ShareBackup...") - val backup = ShareBackup.fromShareRecord(share.toShareRecord()) + // If partyId is empty (legacy data from before MIGRATION_2_3), fetch it from backend + var effectivePartyId = share.partyId + if (effectivePartyId.isEmpty()) { + android.util.Log.w("TssRepository", "[EXPORT] partyId is empty (legacy data), fetching from backend...") + try { + val sessionStatusResult = getSessionStatus(share.sessionId) + if (sessionStatusResult.isSuccess) { + val sessionStatus = sessionStatusResult.getOrThrow() + // Find participant by partyIndex + val participant = sessionStatus.participants.find { it.partyIndex == share.partyIndex } + if (participant != null && participant.partyId.isNotEmpty()) { + effectivePartyId = participant.partyId + android.util.Log.d("TssRepository", "[EXPORT] Retrieved partyId from backend: $effectivePartyId") + + // Also update the database for future exports + val updatedShare = share.copy(partyId = effectivePartyId) + shareRecordDao.insertShare(updatedShare) + android.util.Log.d("TssRepository", "[EXPORT] Updated partyId in database") + } else { + android.util.Log.w("TssRepository", "[EXPORT] Could not find participant with partyIndex=${share.partyIndex} in session") + } + } else { + android.util.Log.w("TssRepository", "[EXPORT] Failed to get session status: ${sessionStatusResult.exceptionOrNull()?.message}") + } + } catch (e: Exception) { + android.util.Log.w("TssRepository", "[EXPORT] Error fetching partyId from backend: ${e.message}") + } + } + + android.util.Log.d("TssRepository", "[EXPORT] Converting to ShareBackup with partyId: $effectivePartyId") + // Create ShareRecord with effective partyId (may be fetched from backend) + val shareRecord = share.toShareRecord().copy(partyId = effectivePartyId) + val backup = ShareBackup.fromShareRecord(shareRecord) android.util.Log.d("TssRepository", "[EXPORT] ShareBackup created, version: ${backup.version}") android.util.Log.d("TssRepository", "[EXPORT] Serializing to JSON...")