Fix Polkadot staking, add USDT bridge, update dashboard card

- Restore staking module to Nova upstream (fix Polkadot ACTIVE/shimmer)
- Add USDT(DOT) <-> USDT(HEZ) bridge option to Buy/Sell screen
- Dashboard card: add telegram_welcome image, info text, Non-Citizen role
- Add non-citizen info text to all 12 locale files
- Simplify ComputationalCache (remove stale scope recreation)
This commit is contained in:
2026-02-18 02:43:53 +03:00
parent 9c7bb7c6e9
commit 14519d7818
39 changed files with 458 additions and 315 deletions
@@ -6,7 +6,6 @@ import io.novafoundation.nova.common.utils.flowOfAll
import io.novafoundation.nova.common.utils.inBackground
import io.novafoundation.nova.common.utils.invokeOnCompletion
import io.novafoundation.nova.common.utils.singleReplaySharedFlow
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
@@ -14,7 +13,6 @@ import kotlinx.coroutines.cancel
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
@@ -74,25 +72,18 @@ internal class RealComputationalCache : ComputationalCache, CoroutineScope by Co
cachedAction: AwaitableConstructor<T>
): T {
val awaitable = mutex.withLock {
val existing = memory[key]
if (existing != null && existing.aggregateScope.isActive) {
if (key in memory) {
Log.d(LOG_TAG, "Key $key requested - already present")
existing.dependents += scope
val entry = memory.getValue(key)
existing.awaitable
entry.dependents += scope
entry.awaitable
} else {
if (existing != null) {
Log.d(LOG_TAG, "Key $key requested - stale (aggregateScope cancelled), recreating")
memory.remove(key)
} else {
Log.d(LOG_TAG, "Key $key requested - creating new operation")
}
Log.d(LOG_TAG, "Key $key requested - creating new operation")
val exceptionHandler = CoroutineExceptionHandler { _, throwable ->
Log.e(LOG_TAG, "Key $key - upstream error in aggregateScope", throwable)
}
val aggregateScope = CoroutineScope(Dispatchers.Default + exceptionHandler)
val aggregateScope = CoroutineScope(Dispatchers.Default)
val awaitable = cachedAction(aggregateScope)
memory[key] = Entry(dependents = mutableSetOf(scope), aggregateScope, awaitable)
Binary file not shown.

After

Width:  |  Height:  |  Size: 388 KiB

@@ -2029,6 +2029,7 @@
<!-- Bridge Screen -->
<string name="wallet_asset_bridge">Puente DOT ↔ HEZ</string>
<string name="wallet_asset_bridge_usdt">Puente USDT(DOT) ↔ USDT(HEZ)</string>
<string name="bridge_title">Puente DOT ↔ HEZ</string>
<string name="bridge_you_send">Envías</string>
<string name="bridge_you_receive">Recibes (estimado)</string>
@@ -2048,4 +2049,5 @@
<string name="pezkuwi_dashboard_title">Pezkuwi</string>
<string name="pezkuwi_dashboard_trust_score">Puntuación de confianza</string>
<string name="pezkuwi_dashboard_basvuru">Solicitar y Acciones</string>
<string name="pezkuwi_dashboard_info">Usa nuestro Telegram MiniApp para servicios de ciudadanía del Kurdistán Digital.\n\nPara ganar recompensas PEZ, debes tener un ticket Welatî y haber apostado al menos 10 HEZ.\n\nLos no ciudadanos solo pueden beneficiarse de las recompensas HEZ.</string>
</resources>
@@ -2029,6 +2029,7 @@
<!-- Bridge Screen -->
<string name="wallet_asset_bridge">Pont DOT ↔ HEZ</string>
<string name="wallet_asset_bridge_usdt">Pont USDT(DOT) ↔ USDT(HEZ)</string>
<string name="bridge_title">Pont DOT ↔ HEZ</string>
<string name="bridge_you_send">Vous envoyez</string>
<string name="bridge_you_receive">Vous recevez (estimé)</string>
@@ -2048,4 +2049,5 @@
<string name="pezkuwi_dashboard_title">Pezkuwi</string>
<string name="pezkuwi_dashboard_trust_score">Score de confiance</string>
<string name="pezkuwi_dashboard_basvuru">Demande et Actions</string>
<string name="pezkuwi_dashboard_info">Utilisez notre Telegram MiniApp pour les services de citoyenneté du Kurdistan numérique.\n\nPour gagner des récompenses PEZ, vous devez détenir un ticket Welatî et avoir staké au moins 10 HEZ.\n\nLes non-citoyens ne peuvent bénéficier que des récompenses HEZ.</string>
</resources>
@@ -2029,6 +2029,7 @@
<!-- Bridge Screen -->
<string name="wallet_asset_bridge">DOT ↔ HEZ híd</string>
<string name="wallet_asset_bridge_usdt">USDT(DOT) ↔ USDT(HEZ) híd</string>
<string name="bridge_title">DOT ↔ HEZ híd</string>
<string name="bridge_you_send">Küldöd</string>
<string name="bridge_you_receive">Kapod (becsült)</string>
@@ -2015,6 +2015,7 @@
<!-- Bridge Screen -->
<string name="wallet_asset_bridge">Jembatan DOT ↔ HEZ</string>
<string name="wallet_asset_bridge_usdt">Jembatan USDT(DOT) ↔ USDT(HEZ)</string>
<string name="bridge_title">Jembatan DOT ↔ HEZ</string>
<string name="bridge_you_send">Anda kirim</string>
<string name="bridge_you_receive">Anda terima (perkiraan)</string>
@@ -2034,4 +2035,5 @@
<string name="pezkuwi_dashboard_title">Pezkuwi</string>
<string name="pezkuwi_dashboard_trust_score">Skor Kepercayaan</string>
<string name="pezkuwi_dashboard_basvuru">Ajukan &amp; Tindakan</string>
<string name="pezkuwi_dashboard_info">Gunakan Telegram MiniApp kami untuk layanan kewarganegaraan Kurdistan Digital.\n\nUntuk mendapatkan hadiah PEZ, Anda harus memiliki tiket Welatî dan telah staking minimal 10 HEZ.\n\nNon-warga negara hanya dapat memperoleh manfaat dari hadiah HEZ.</string>
</resources>
@@ -2029,6 +2029,7 @@
<!-- Bridge Screen -->
<string name="wallet_asset_bridge">Ponte DOT ↔ HEZ</string>
<string name="wallet_asset_bridge_usdt">Ponte USDT(DOT) ↔ USDT(HEZ)</string>
<string name="bridge_title">Ponte DOT ↔ HEZ</string>
<string name="bridge_you_send">Invii</string>
<string name="bridge_you_receive">Ricevi (stimato)</string>
@@ -2015,6 +2015,7 @@
<!-- Bridge Screen -->
<string name="wallet_asset_bridge">DOT ↔ HEZ ブリッジ</string>
<string name="wallet_asset_bridge_usdt">USDT(DOT) ↔ USDT(HEZ) ブリッジ</string>
<string name="bridge_title">DOT ↔ HEZ ブリッジ</string>
<string name="bridge_you_send">送金額</string>
<string name="bridge_you_receive">受取額(概算)</string>
@@ -2034,4 +2035,5 @@
<string name="pezkuwi_dashboard_title">Pezkuwi</string>
<string name="pezkuwi_dashboard_trust_score">信頼スコア</string>
<string name="pezkuwi_dashboard_basvuru">申請とアクション</string>
<string name="pezkuwi_dashboard_info">デジタルクルディスタンの市民サービスにはTelegram MiniAppをご利用ください。\n\nPEZ報酬を獲得するには、Welatîチケットを保有し、最低10 HEZをステーキングする必要があります。\n\n非市民はHEZ報酬のみを受け取ることができます。</string>
</resources>
@@ -2015,6 +2015,7 @@
<!-- Bridge Screen -->
<string name="wallet_asset_bridge">DOT ↔ HEZ 브릿지</string>
<string name="wallet_asset_bridge_usdt">USDT(DOT) ↔ USDT(HEZ) 브릿지</string>
<string name="bridge_title">DOT ↔ HEZ 브릿지</string>
<string name="bridge_you_send">보내는 금액</string>
<string name="bridge_you_receive">받는 금액 (예상)</string>
@@ -2034,4 +2035,5 @@
<string name="pezkuwi_dashboard_title">Pezkuwi</string>
<string name="pezkuwi_dashboard_trust_score">신뢰 점수</string>
<string name="pezkuwi_dashboard_basvuru">신청 및 작업</string>
<string name="pezkuwi_dashboard_info">디지털 쿠르디스탄 시민권 서비스를 위해 Telegram MiniApp을 사용하세요.\n\nPEZ 보상을 받으려면 Welatî 티켓을 보유하고 최소 10 HEZ를 스테이킹해야 합니다.\n\n비시민권자는 HEZ 보상만 받을 수 있습니다.</string>
</resources>
@@ -2742,6 +2742,7 @@
<!-- Bridge Screen -->
<string name="wallet_asset_bridge">Pira DOT ↔ HEZ</string>
<string name="wallet_asset_bridge_usdt">Pira USDT(DOT) ↔ USDT(HEZ)</string>
<string name="bridge_title">Pira DOT ↔ HEZ</string>
<string name="bridge_you_send">Tu dişînî</string>
<string name="bridge_you_receive">Tu distînî (texmîn)</string>
@@ -2761,4 +2762,5 @@
<string name="pezkuwi_dashboard_title">Pezkuwi</string>
<string name="pezkuwi_dashboard_trust_score">Pûana Pêbaweriyê</string>
<string name="pezkuwi_dashboard_basvuru">Serlêdan û Karên</string>
<string name="pezkuwi_dashboard_info">Ji bo karên hemwelatîbûna Kurdistana Dîjîtal MiniApp\'a me ya Telegram bikar bînin.\n\nJi bo qezenckirina xelatên PEZ, divê hûn xwediyê bilêta Welatî bin û herî kêm 10 HEZ stake kiribe bin.\n\nKesên ne-hemwelatî tenê dikarin ji xelatên HEZ sûd werbigirin.</string>
</resources>
@@ -2057,6 +2057,7 @@
<!-- Bridge Screen -->
<string name="wallet_asset_bridge">Most DOT ↔ HEZ</string>
<string name="wallet_asset_bridge_usdt">Most USDT(DOT) ↔ USDT(HEZ)</string>
<string name="bridge_title">Most DOT ↔ HEZ</string>
<string name="bridge_you_send">Wysyłasz</string>
<string name="bridge_you_receive">Otrzymasz (szacunkowo)</string>
@@ -2029,6 +2029,7 @@
<!-- Bridge Screen -->
<string name="wallet_asset_bridge">Ponte DOT ↔ HEZ</string>
<string name="wallet_asset_bridge_usdt">Ponte USDT(DOT) ↔ USDT(HEZ)</string>
<string name="bridge_title">Ponte DOT ↔ HEZ</string>
<string name="bridge_you_send">Você envia</string>
<string name="bridge_you_receive">Você recebe (estimado)</string>
@@ -2048,4 +2049,5 @@
<string name="pezkuwi_dashboard_title">Pezkuwi</string>
<string name="pezkuwi_dashboard_trust_score">Pontuação de confiança</string>
<string name="pezkuwi_dashboard_basvuru">Candidatura e Ações</string>
<string name="pezkuwi_dashboard_info">Use nosso Telegram MiniApp para serviços de cidadania do Curdistão Digital.\n\nPara ganhar recompensas PEZ, você deve possuir um bilhete Welatî e ter pelo menos 10 HEZ em stake.\n\nNão-cidadãos só podem se beneficiar das recompensas HEZ.</string>
</resources>
@@ -2057,6 +2057,7 @@
<!-- Bridge Screen -->
<string name="wallet_asset_bridge">Мост DOT ↔ HEZ</string>
<string name="wallet_asset_bridge_usdt">Мост USDT(DOT) ↔ USDT(HEZ)</string>
<string name="bridge_title">Мост DOT ↔ HEZ</string>
<string name="bridge_you_send">Вы отправляете</string>
<string name="bridge_you_receive">Вы получите (примерно)</string>
@@ -2076,4 +2077,5 @@
<string name="pezkuwi_dashboard_title">Pezkuwi</string>
<string name="pezkuwi_dashboard_trust_score">Рейтинг доверия</string>
<string name="pezkuwi_dashboard_basvuru">Заявка и Действия</string>
<string name="pezkuwi_dashboard_info">Используйте наше Telegram MiniApp для услуг цифрового гражданства Курдистана.\n\nДля получения наград PEZ необходимо иметь билет Welatî и застейкать минимум 10 HEZ.\n\nНе-граждане могут получать только награды HEZ.</string>
</resources>
@@ -3,4 +3,5 @@
<string name="pezkuwi_dashboard_title">Pezkuwi</string>
<string name="pezkuwi_dashboard_trust_score">Güven Puanı</string>
<string name="pezkuwi_dashboard_basvuru">Başvuru ve İşlemler</string>
<string name="pezkuwi_dashboard_info">Dijital Kurdistan vatandaşlık işlemleri için Telegram MiniApp\'imizi kullanın.\n\nPEZ ödülleri kazanmak için Welatî tikesi sahibi olmanız ve en az 10 HEZ stake etmiş olmanız gereklidir.\n\nVatandaş olmayanlar yalnızca HEZ ödüllerinden yararlanabilir.</string>
</resources>
@@ -2015,6 +2015,7 @@
<!-- Bridge Screen -->
<string name="wallet_asset_bridge">Cầu nối DOT ↔ HEZ</string>
<string name="wallet_asset_bridge_usdt">Cầu nối USDT(DOT) ↔ USDT(HEZ)</string>
<string name="bridge_title">Cầu nối DOT ↔ HEZ</string>
<string name="bridge_you_send">Bạn gửi</string>
<string name="bridge_you_receive">Bạn nhận (ước tính)</string>
@@ -2034,4 +2035,5 @@
<string name="pezkuwi_dashboard_title">Pezkuwi</string>
<string name="pezkuwi_dashboard_trust_score">Điểm tin cậy</string>
<string name="pezkuwi_dashboard_basvuru">Đăng ký &amp; Hành động</string>
<string name="pezkuwi_dashboard_info">Sử dụng Telegram MiniApp của chúng tôi cho dịch vụ công dân Kurdistan kỹ thuật số.\n\nĐể nhận phần thưởng PEZ, bạn phải sở hữu vé Welatî và đã stake ít nhất 10 HEZ.\n\nNgười không phải công dân chỉ có thể hưởng lợi từ phần thưởng HEZ.</string>
</resources>
@@ -2015,6 +2015,7 @@
<!-- Bridge Screen -->
<string name="wallet_asset_bridge">DOT ↔ HEZ 跨链桥</string>
<string name="wallet_asset_bridge_usdt">USDT(DOT) ↔ USDT(HEZ) 跨链桥</string>
<string name="bridge_title">DOT ↔ HEZ 跨链桥</string>
<string name="bridge_you_send">发送</string>
<string name="bridge_you_receive">接收(预计)</string>
@@ -2034,4 +2035,5 @@
<string name="pezkuwi_dashboard_title">Pezkuwi</string>
<string name="pezkuwi_dashboard_trust_score">信任评分</string>
<string name="pezkuwi_dashboard_basvuru">申请与操作</string>
<string name="pezkuwi_dashboard_info">使用我们的 Telegram MiniApp 进行数字库尔德斯坦公民服务。\n\n要获得 PEZ 奖励,您必须持有 Welatî 票并至少质押 10 HEZ。\n\n非公民只能从 HEZ 奖励中受益。</string>
</resources>
+3
View File
@@ -351,6 +351,7 @@
<string name="wallet_asset_sell_tokens">Sell tokens</string>
<string name="wallet_asset_buy_tokens">Buy tokens</string>
<string name="wallet_asset_bridge">Bridge DOT ↔ HEZ</string>
<string name="wallet_asset_bridge_usdt">Bridge USDT(DOT) ↔ USDT(HEZ)</string>
<!-- Bridge Screen -->
<string name="bridge_title">DOT ↔ HEZ Bridge</string>
@@ -368,6 +369,7 @@
<string name="bridge_enter_amount">Enter amount</string>
<string name="bridge_hez_to_dot_warning">HEZ→DOT swaps may have limited availability based on current liquidity.</string>
<string name="bridge_hez_to_dot_blocked">HEZ→DOT swaps are temporarily unavailable. Please try again when DOT liquidity is sufficient.</string>
<string name="bridge_wusdt_to_usdt_blocked">USDT(Pez)→USDT(Pol) swaps are temporarily unavailable. Waiting for 1:1 liquidity to be established.</string>
<string name="wallet_asset_buy_sell">Buy/Sell</string>
@@ -2763,4 +2765,5 @@
<string name="pezkuwi_dashboard_title">Pezkuwi</string>
<string name="pezkuwi_dashboard_trust_score">Trust Score</string>
<string name="pezkuwi_dashboard_basvuru">Apply &amp; Actions</string>
<string name="pezkuwi_dashboard_info">Use our Telegram MiniApp for Digital Kurdistan citizenship services.\n\nTo earn PEZ rewards, you must hold a Welatî ticket and stake at least 10 HEZ.\n\nNon-citizens can only benefit from HEZ rewards.</string>
</resources>