@@ -4,11 +4,14 @@ import 'package:substrate/future/constant/constant.dart';
4
4
import 'package:substrate/future/controllers/app.dart' ;
5
5
import 'package:substrate/future/forms/models/metadata.dart' ;
6
6
import 'package:substrate/future/state_manager/state_managment.dart' ;
7
+ import 'package:substrate/future/widgets/widgets/button.dart' ;
7
8
import 'package:substrate/future/widgets/widgets/progress_bar/progress.dart' ;
8
9
import 'package:substrate/substrate/api/api.dart' ;
9
10
import 'package:substrate/substrate/models/extrinsic.dart' ;
10
11
import 'package:flutter/material.dart' ;
11
12
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' ;
12
15
13
16
enum ExtrinsicPage {
14
17
createPayload ("create_payload" ),
@@ -25,6 +28,8 @@ class ExtrinsicPayloadFieldsStateController extends StateController {
25
28
ExtrinsicPayloadFieldsStateController ({required this .appController});
26
29
ExtrinsicPage _page = ExtrinsicPage .createPayload;
27
30
ExtrinsicPage get page => _page;
31
+ BlockHashWithEra ? _blockWithEra;
32
+ BlockHashWithEra ? get blockWithEra => _blockWithEra;
28
33
final APPStateController appController;
29
34
SubstrateApi get api => appController.substrate;
30
35
final GlobalKey <FormState > formState =
@@ -91,7 +96,6 @@ class ExtrinsicPayloadFieldsStateController extends StateController {
91
96
final callEncode = _encodeCallPayload ();
92
97
final byte = callEncode.$1;
93
98
final List extrinsicInfo = [callEncode.$2];
94
- // final Map<String, dynamic> extrinsicInfo = callEncode.$2;
95
99
final String callData = BytesUtils .toHexString (byte.toBytes ());
96
100
for (int i = 1 ; i < extrinsicPayloadValidators.length; i++ ) {
97
101
final form = extrinsicPayloadValidators[i];
@@ -181,6 +185,7 @@ class ExtrinsicPayloadFieldsStateController extends StateController {
181
185
if (payload.payload != _payloadInfo? .payload) return ;
182
186
_payloadInfo = payload;
183
187
if (payload.hasSignature) {
188
+ _filedExtrinsicFields ();
184
189
_page = ExtrinsicPage .createExtrinsic;
185
190
}
186
191
notify ();
@@ -206,7 +211,7 @@ class ExtrinsicPayloadFieldsStateController extends StateController {
206
211
progressKey.backToIdle ();
207
212
}
208
213
209
- void _init () {
214
+ Future < void > _init () async {
210
215
final fields = api.buildExtrinsicFields ();
211
216
extrinsicLookupField = fields.extrinsicInfo;
212
217
if (fields.address == null || fields.signature == null ) {
@@ -217,15 +222,139 @@ class ExtrinsicPayloadFieldsStateController extends StateController {
217
222
MetadataFormValidator .fromType (fields.signature! ),
218
223
...fields.extrinsicValidators
219
224
.map ((e) => MetadataFormValidator .fromType (e))
220
- ];
225
+ ].toImutableList ;
221
226
}
222
-
223
227
extrinsicPayloadValidators = [
224
228
MetadataFormValidator .fromType (fields.call),
225
229
...fields.extrinsicPayloadValidators
226
230
.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 ();
229
358
}
230
359
231
360
Future <void > broadcastTx () async {
0 commit comments