Skip to content

Commit c717957

Browse files
committed
Autofill Extrinsic fields
1 parent 162dfc9 commit c717957

File tree

15 files changed

+460
-63
lines changed

15 files changed

+460
-63
lines changed

lib/future/controllers/app.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@ class APPStateController extends StateController with RepositoryStorage {
3737
Future<LatestChain> _initChains() async {
3838
final lastChain = await latestChain();
3939
final importedChains = await loadChains();
40-
// print(StringUtils.fromJson(APPConst.defaultNetwork.toJson()));
41-
4240
_chains = [
4341
...importedChains,
4442
...defaultChains.map((e) => NetworkInfo.fromJson(e)),

lib/future/controllers/extrinsic_payload.dart

Lines changed: 135 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@ import 'package:substrate/future/constant/constant.dart';
44
import 'package:substrate/future/controllers/app.dart';
55
import 'package:substrate/future/forms/models/metadata.dart';
66
import 'package:substrate/future/state_manager/state_managment.dart';
7+
import 'package:substrate/future/widgets/widgets/button.dart';
78
import 'package:substrate/future/widgets/widgets/progress_bar/progress.dart';
89
import 'package:substrate/substrate/api/api.dart';
910
import 'package:substrate/substrate/models/extrinsic.dart';
1011
import 'package:flutter/material.dart';
1112
import 'package:polkadot_dart/polkadot_dart.dart';
13+
import 'package:substrate/substrate/models/signature.dart';
14+
import 'package:substrate/substrate/provider/client/models/block_with_era.dart';
1215

1316
enum ExtrinsicPage {
1417
createPayload("create_payload"),
@@ -25,6 +28,8 @@ class ExtrinsicPayloadFieldsStateController extends StateController {
2528
ExtrinsicPayloadFieldsStateController({required this.appController});
2629
ExtrinsicPage _page = ExtrinsicPage.createPayload;
2730
ExtrinsicPage get page => _page;
31+
BlockHashWithEra? _blockWithEra;
32+
BlockHashWithEra? get blockWithEra => _blockWithEra;
2833
final APPStateController appController;
2934
SubstrateApi get api => appController.substrate;
3035
final GlobalKey<FormState> formState =
@@ -91,7 +96,6 @@ class ExtrinsicPayloadFieldsStateController extends StateController {
9196
final callEncode = _encodeCallPayload();
9297
final byte = callEncode.$1;
9398
final List extrinsicInfo = [callEncode.$2];
94-
// final Map<String, dynamic> extrinsicInfo = callEncode.$2;
9599
final String callData = BytesUtils.toHexString(byte.toBytes());
96100
for (int i = 1; i < extrinsicPayloadValidators.length; i++) {
97101
final form = extrinsicPayloadValidators[i];
@@ -181,6 +185,7 @@ class ExtrinsicPayloadFieldsStateController extends StateController {
181185
if (payload.payload != _payloadInfo?.payload) return;
182186
_payloadInfo = payload;
183187
if (payload.hasSignature) {
188+
_filedExtrinsicFields();
184189
_page = ExtrinsicPage.createExtrinsic;
185190
}
186191
notify();
@@ -206,7 +211,7 @@ class ExtrinsicPayloadFieldsStateController extends StateController {
206211
progressKey.backToIdle();
207212
}
208213

209-
void _init() {
214+
Future<void> _init() async {
210215
final fields = api.buildExtrinsicFields();
211216
extrinsicLookupField = fields.extrinsicInfo;
212217
if (fields.address == null || fields.signature == null) {
@@ -217,15 +222,139 @@ class ExtrinsicPayloadFieldsStateController extends StateController {
217222
MetadataFormValidator.fromType(fields.signature!),
218223
...fields.extrinsicValidators
219224
.map((e) => MetadataFormValidator.fromType(e))
220-
];
225+
].toImutableList;
221226
}
222-
223227
extrinsicPayloadValidators = [
224228
MetadataFormValidator.fromType(fields.call),
225229
...fields.extrinsicPayloadValidators
226230
.map((e) => MetadataFormValidator.fromType(e))
227-
];
228-
progressKey.backToIdle();
231+
].toImutableList;
232+
await _filedPayloadFields();
233+
// progressKey.backToIdle();
234+
}
235+
236+
E? _getPayloadField<E extends MetadataFormValidator>(String name) {
237+
try {
238+
for (final i in extrinsicPayloadValidators) {
239+
final field = i.findField<E>(name);
240+
if (field != null) return field;
241+
}
242+
} catch (_) {}
243+
return null;
244+
}
245+
246+
E? _getExtrinsicField<E extends MetadataFormValidator>(String name) {
247+
try {
248+
for (final i in extrinsicValidators!) {
249+
final field = i.findField<E>(name);
250+
if (field != null) return field;
251+
}
252+
} catch (_) {}
253+
return null;
254+
}
255+
256+
void _filedExtrinsicFields() {
257+
final nonce =
258+
_getPayloadField<MetadataFormValidatorNumeric>("T::Nonce")?.value.value;
259+
final exNonce =
260+
_getExtrinsicField<MetadataFormValidatorNumeric>("CheckNonce");
261+
if (nonce != null) {
262+
exNonce?.setValue(nonce);
263+
}
264+
final tip =
265+
_getPayloadField<MetadataFormValidatorBigInt>("tip")?.value.value;
266+
final exTip = _getExtrinsicField<MetadataFormValidatorBigInt>("tip");
267+
if (tip != null) {
268+
exTip?.setValue(tip);
269+
}
270+
final era = _getPayloadField<MetadataFormValidatorVariant>("Era") ??
271+
_getPayloadField<MetadataFormValidatorVariant>("CheckMortality");
272+
final exEra =
273+
_getExtrinsicField<MetadataFormValidatorVariant>("CheckMortality");
274+
if (era != null && exEra != null) {
275+
final eraVariant = exEra.info.variants
276+
.firstWhereNullable((e) => e.name == era.variant?.name);
277+
if (eraVariant != null) {
278+
final indexType = api.getTypeInfo(eraVariant);
279+
exEra.setVariant(variant: eraVariant, type: indexType);
280+
MethodUtils.nullOnException(() {
281+
exEra.validator?.cast<MetadataFormValidatorNumeric>().setValue(
282+
era.validator!.cast<MetadataFormValidatorNumeric>().value.value!);
283+
});
284+
}
285+
}
286+
final payloadSignature = payloadInfo.signature;
287+
if (payloadSignature != null) {
288+
if (payloadSignature.type == SignatureType.ethereum) {
289+
_getExtrinsicField<MetadataFormValidatorBytes>("Signature")
290+
?.setValue(payloadSignature.signature);
291+
} else {
292+
final signature =
293+
_getExtrinsicField<MetadataFormValidatorVariant>("Signature");
294+
if (signature != null) {
295+
final sigVariant = signature.info.variants.firstWhereNullable(
296+
(e) => e.name == payloadSignature.type.identifier);
297+
if (sigVariant != null) {
298+
final indexType = api.getTypeInfo(sigVariant);
299+
signature.setVariant(variant: sigVariant, type: indexType);
300+
MethodUtils.nullOnException(() {
301+
signature.validator
302+
?.cast<MetadataFormValidatorBytes>()
303+
.setValue(payloadSignature.signature);
304+
});
305+
}
306+
}
307+
}
308+
}
309+
}
310+
311+
Future<void> updateFinalizBlock() async {
312+
progressKey.progressText("retrieving_finalized_block_please_wait".tr);
313+
final r = await MethodUtils.call(() async {
314+
return api.client.blockWithEra();
315+
});
316+
if (r.hasError) {
317+
progressKey.errorText(r.error!.tr,
318+
backToIdle: false,
319+
showBackButton: _blockWithEra == null ? false : true,
320+
button: _blockWithEra == null
321+
? FixedElevatedButton(
322+
onPressed: updateFinalizBlock, child: Text("try_again".tr))
323+
: null);
324+
} else {
325+
_blockWithEra = r.result;
326+
_filledEra();
327+
progressKey.backToIdle();
328+
}
329+
}
330+
331+
void _filledEra() {
332+
final finalizedBlock = _blockWithEra;
333+
if (finalizedBlock == null) return;
334+
_getPayloadField<MetadataFormValidatorBytes>("CheckMortality")
335+
?.setValue(finalizedBlock.hash);
336+
final era = _getPayloadField<MetadataFormValidatorVariant>("Era") ??
337+
_getPayloadField<MetadataFormValidatorVariant>("CheckMortality");
338+
final eraVariant = era?.info.variants
339+
.firstWhereNullable((e) => e.name == finalizedBlock.eraIndex);
340+
if (eraVariant != null) {
341+
final indexType = api.getTypeInfo(eraVariant);
342+
era?.setVariant(variant: eraVariant, type: indexType);
343+
MethodUtils.nullOnException(() => era?.validator
344+
?.cast<MetadataFormValidatorNumeric>()
345+
.setInt(finalizedBlock.eraValue));
346+
}
347+
}
348+
349+
Future<void> _filedPayloadFields() async {
350+
// final r = await MethodUtils.call(() => api.client.blockWithEra());
351+
_getPayloadField<MetadataFormValidatorInt>("CheckTxVersion")
352+
?.setInt(api.runtimeVersion.transactionVersion);
353+
_getPayloadField<MetadataFormValidatorInt>("CheckSpecVersion")
354+
?.setInt(api.runtimeVersion.specVersion);
355+
_getPayloadField<MetadataFormValidatorBytes>("CheckGenesis")
356+
?.setValue(api.client.genesisBlock.toHex());
357+
await updateFinalizBlock();
229358
}
230359

231360
Future<void> broadcastTx() async {

lib/future/controllers/storage.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ class StorageFieldsStateController extends StateController {
4646
fromTemplate: false);
4747
});
4848
if (r.hasError) {
49-
// print(r.trace);
5049
progressKey.errorText(r.error!.tr,
5150
backToIdle: false, showBackButton: true);
5251
} else {

lib/future/forms/models/metadata.dart

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,13 @@ abstract class MetadataFormValidator<METADATA extends MetadataTypeInfo> {
9090
void dispose();
9191

9292
Object? toJson();
93+
94+
E? findField<E extends MetadataFormValidator<MetadataTypeInfo>>(String name) {
95+
if (info.name == name && this is E) {
96+
return cast<E>();
97+
}
98+
return null;
99+
}
93100
}
94101

95102
abstract class MetadataFormValidatorPromitive<T extends MetadataTypeInfo>
@@ -238,6 +245,10 @@ abstract class MetadataFormValidatorNumeric<T extends MetadataTypeInfoNumeric>
238245
this._value.value = value;
239246
}
240247

248+
void setInt(int value) {
249+
setValue(BigRational.from(value));
250+
}
251+
241252
void setPow(int? pow) {
242253
if (pow == null) return;
243254
if (pow == maxScale) {
@@ -289,6 +300,14 @@ abstract class MetadataFormValidatorNumeric<T extends MetadataTypeInfoNumeric>
289300
Object? toJson() {
290301
return getResult();
291302
}
303+
304+
@override
305+
E? findField<E extends MetadataFormValidator<MetadataTypeInfo>>(String name) {
306+
if (info.name == name && this is E) {
307+
return cast<E>();
308+
}
309+
return null;
310+
}
292311
}
293312

294313
class MetadataFormValidatorBigInt
@@ -387,6 +406,17 @@ class MetadataFormValidatorTuple<T extends MetadataTypeInfo>
387406
i.dispose();
388407
}
389408
}
409+
410+
@override
411+
E? findField<E extends MetadataFormValidator<MetadataTypeInfo>>(String name) {
412+
for (final i in validators) {
413+
final field = i.findField<E>(name);
414+
if (field != null) {
415+
return field;
416+
}
417+
}
418+
return null;
419+
}
390420
}
391421

392422
class MetadataFormValidatorComposit<T extends MetadataTypeInfo>
@@ -446,6 +476,17 @@ class MetadataFormValidatorComposit<T extends MetadataTypeInfo>
446476
.where((e) => e != null)
447477
.toList();
448478
}
479+
480+
@override
481+
E? findField<E extends MetadataFormValidator<MetadataTypeInfo>>(String name) {
482+
for (final i in validators) {
483+
final field = i.findField<E>(name);
484+
if (field != null) {
485+
return field;
486+
}
487+
}
488+
return null;
489+
}
449490
}
450491

451492
enum ArrayFieldType {
@@ -567,6 +608,17 @@ class MetadataFormValidatorSequence<T extends MetadataTypeInfo>
567608
.where((e) => e != null)
568609
.toList();
569610
}
611+
612+
@override
613+
E? findField<E extends MetadataFormValidator<MetadataTypeInfo>>(String name) {
614+
for (final i in validators) {
615+
final field = i.findField<E>(name);
616+
if (field != null) {
617+
return field;
618+
}
619+
}
620+
return null;
621+
}
570622
}
571623

572624
class MetadataFormValidatorBytes
@@ -680,7 +732,8 @@ class MetadataFormValidatorVariant
680732
void setVariant(
681733
{required Si1Variant variant, required MetadataTypeInfo type}) {
682734
_variant = variant;
683-
_validator.value = MetadataFormValidator.fromType(type);
735+
_validator.value =
736+
MetadataFormValidator.fromType(type.copyWith(name: _variant?.name));
684737
_validator.notify();
685738
}
686739

@@ -705,4 +758,12 @@ class MetadataFormValidatorVariant
705758
Object? toJson() {
706759
return getResult();
707760
}
761+
762+
@override
763+
E? findField<E extends MetadataFormValidator<MetadataTypeInfo>>(String name) {
764+
if (info.name == name && this is E) {
765+
return this as E;
766+
}
767+
return _validator.value?.findField<E>(name);
768+
}
708769
}

lib/future/localization/localization.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,12 @@ class Localization {
174174
"number_to_decimal": "10^___1__ (___2__)",
175175
"switching_network_please_wait": "Switching network, please wait.",
176176
"api_http_client_error":
177-
"ClientException: An error occurred on the client side during the request."
177+
"ClientException: An error occurred on the client side during the request.",
178+
"extersinc_auto_validate_desc":
179+
"If you use an auto-generated value for CheckMortality and Era, ensure you click the refresh button before filling out the form. Once refreshed, you have 10 minutes to send the transaction to the network.",
180+
"retrieving_finalized_block_please_wait":
181+
"Retrieving the finalized block, please wait.",
182+
"try_again": "Try again"
178183
}
179184
};
180185
}

0 commit comments

Comments
 (0)