From 5eac0220943e288f985d4eb3e513247a3460c3bf Mon Sep 17 00:00:00 2001
From: clangenb <37865735+clangenb@users.noreply.github.com>
Date: Tue, 19 Mar 2024 21:45:15 -0700
Subject: [PATCH] Fix app stale at sending extrinsics aka fix occasional
invalid extrinsic (#1665)
* [tx] log extrinsic update value, which might contain information about the invalid error
* [tx] immediately refresh encointer balance and reputations after claiming rewards
* [tx_builder] ensure that block number and block hash are corresponding to the same block
* [tx_builder] construct extrinsic based on finalized block data
---
app/lib/service/tx/lib/src/send_tx_dart.dart | 2 +-
.../service/tx/lib/src/submit_tx_wrappers.dart | 3 ++-
app/lib/service/tx/lib/src/tx_builder.dart | 17 ++++++++++++-----
3 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/app/lib/service/tx/lib/src/send_tx_dart.dart b/app/lib/service/tx/lib/src/send_tx_dart.dart
index 6725bf57f..550c89b1a 100644
--- a/app/lib/service/tx/lib/src/send_tx_dart.dart
+++ b/app/lib/service/tx/lib/src/send_tx_dart.dart
@@ -127,7 +127,7 @@ class EWAuthorApi
{
String? blockHashHex;
final sub = await submitAndWatchExtrinsic(extrinsic, (xtUpdate) async {
- Log.d('ExtrinsicUpdate: ${xtUpdate.type}');
+ Log.d('ExtrinsicUpdate: type: ${xtUpdate.type}, value: ${xtUpdate.value}');
if (xtUpdate.type == 'ready') {
Log.p('Xt is ready');
diff --git a/app/lib/service/tx/lib/src/submit_tx_wrappers.dart b/app/lib/service/tx/lib/src/submit_tx_wrappers.dart
index 5aeddcb02..8d428b932 100644
--- a/app/lib/service/tx/lib/src/submit_tx_wrappers.dart
+++ b/app/lib/service/tx/lib/src/submit_tx_wrappers.dart
@@ -78,7 +78,8 @@ Future submitClaimRewards(
onFinish: (BuildContext txPageContext, ExtrinsicReport report) {
// Claiming the rewards creates a new reputation if successful.
// Hence, we should update the state afterwards.
- store.dataUpdate.setInvalidated();
+ store.encointer.getEncointerBalance();
+ webApi.encointer.getReputations();
return report;
},
);
diff --git a/app/lib/service/tx/lib/src/tx_builder.dart b/app/lib/service/tx/lib/src/tx_builder.dart
index 31ecb5a96..cf7579461 100644
--- a/app/lib/service/tx/lib/src/tx_builder.dart
+++ b/app/lib/service/tx/lib/src/tx_builder.dart
@@ -31,8 +31,8 @@ class TxBuilder {
// fetch recent relevant data from chain
final runtimeVersion = await _getRuntimeVersion();
- final blockNumber = await _getBlockNumber();
- final blockHash = await _getBlockHash();
+ final finalizedHash = await _getLatestFinalizedHash();
+ final blockNumber = await _getBlockNumber(hash: finalizedHash);
final genesisHash = await _getBlockHash(blockNumber: 0);
final accountInfo = await encointerKusama.query.system.account(pair.publicKey.bytes);
@@ -49,7 +49,7 @@ class TxBuilder {
specVersion: runtimeVersion.specVersion,
transactionVersion: runtimeVersion.transactionVersion,
genesisHash: genesisHash,
- blockHash: blockHash,
+ blockHash: finalizedHash,
blockNumber: blockNumber,
eraPeriod: 64,
nonce: accountInfo.nonce,
@@ -85,8 +85,15 @@ class TxBuilder {
return hash.replaceFirst('0x', '');
}
- Future _getBlockNumber() async {
- final block = await provider.send('chain_getBlock', []);
+ Future _getLatestFinalizedHash() async {
+ final hash = (await provider.send('chain_getFinalizedHead', [])).result as String;
+ return hash.replaceFirst('0x', '');
+ }
+
+ Future _getBlockNumber({String? hash}) async {
+ final params = hash != null ? [hash.replaceFirst('0x', '')] : [];
+
+ final block = await provider.send('chain_getBlock', params);
// ignore: avoid_dynamic_calls
final blockNumber = int.parse(block.result['block']['header']['number'] as String);