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);