@@ -129,6 +129,30 @@ class Client extends QueryClient {
129
129
}
130
130
}
131
131
132
+ List <int > _getMyEventsPhaseId (List <dynamic > events) {
133
+ final Set <int > phaseIds = Set ();
134
+ for (final event in events) {
135
+ if (event["event" ] != null &&
136
+ event["event" ].key == "TransactionPayment" &&
137
+ ListEquality ().equals (
138
+ event["event" ].value.value[0 ], keypair! .publicKey.bytes)) {
139
+ phaseIds.add (event['phase' ].value);
140
+ }
141
+ }
142
+ return phaseIds.toList ();
143
+ }
144
+
145
+ List <dynamic > _filterMyEvents (List <dynamic > events) {
146
+ final List <dynamic > myEvents = [];
147
+ final phaseIds = _getMyEventsPhaseId (events);
148
+ for (final event in events) {
149
+ if (phaseIds.contains (event["phase" ].value)) {
150
+ myEvents.add (event["event" ]);
151
+ }
152
+ }
153
+ return myEvents;
154
+ }
155
+
132
156
Future <void > apply (RuntimeCall runtimeCall) async {
133
157
if (provider == null ) {
134
158
throw Exception ("Provider is not initialized" );
@@ -153,10 +177,8 @@ class Client extends QueryClient {
153
177
.result
154
178
.replaceAll ('0x' , '' );
155
179
156
- final keyring = await KeyPair .sr25519.fromMnemonic (mnemonic);
157
-
158
180
final encodedCall = runtimeCall.encode ();
159
- final nonce = await api.rpc.system.accountNextIndex (keyring. address);
181
+ final nonce = await api.rpc.system.accountNextIndex (address);
160
182
final metadata = await api.rpc.state.getMetadata ();
161
183
162
184
// await api.rpc.state.queryStorageAt(keys)
@@ -176,93 +198,86 @@ class Client extends QueryClient {
176
198
177
199
final payload = payloadToSign.encode (api.registry);
178
200
179
- final signature = keyring .sign (payload);
201
+ final signature = keypair ! .sign (payload);
180
202
181
203
// final hexSignature = hex.encode(signature);
182
204
183
205
// final publicKey = hex.encode(keyring.publicKey.bytes);
184
-
206
+ final signatureType = keypairType == "sr25519"
207
+ ? SignatureType .sr25519
208
+ : SignatureType .ed25519;
185
209
final extrinsic = ExtrinsicPayload (
186
- signer: Uint8List .fromList (keyring .bytes ()),
210
+ signer: Uint8List .fromList (keypair ! .bytes ()),
187
211
method: encodedCall,
188
212
signature: signature,
189
213
eraPeriod: 64 ,
190
214
blockNumber: blockNumber,
191
215
nonce: nonce,
192
216
tip: 0 )
193
- .encode (api.registry, SignatureType .sr25519);
194
-
195
- final hexExtrinsic = hex.encode (extrinsic);
196
- final input = Input .fromHex (hexExtrinsic);
197
- final dynamic extrinsicDecoded =
198
- ExtrinsicsCodec (chainInfo: metadata.chainInfo).decode (input);
199
- print (extrinsicDecoded);
200
-
201
- final submit = await AuthorApi (provider! ).submitAndWatchExtrinsic (
217
+ .encode (api.registry, signatureType);
218
+
219
+ // final hexExtrinsic = hex.encode(extrinsic);
220
+ // final input = Input.fromHex(hexExtrinsic);
221
+ // final dynamic extrinsicDecoded =
222
+ // ExtrinsicsCodec(chainInfo: metadata.chainInfo).decode(input);
223
+ // print(extrinsicDecoded);
224
+ Completer <void > _complete = Completer ();
225
+ final StreamSubscription subscription =
226
+ await AuthorApi (provider! ).submitAndWatchExtrinsic (
202
227
extrinsic,
203
228
(p0) async {
204
229
print ("Extrinsic result: ${p0 .type } - ${p0 .value }" );
205
230
if (p0.type == 'inBlock' ) {
206
- try {
207
- final finalizedBlockHash = p0.value;
208
- print (finalizedBlockHash.runtimeType);
209
- final moduleHash =
210
- Hasher .twoxx128.hash (Uint8List .fromList ('System' .codeUnits));
211
- final storageHash =
212
- Hasher .twoxx128.hash (Uint8List .fromList ('Events' .codeUnits));
213
- Uint8List storageKey = Uint8List .fromList ([
214
- ...moduleHash,
215
- ...storageHash,
216
- ]);
217
- final finalizedBlockHashBytes = hexToBytes (finalizedBlockHash);
218
- final changes = await stateApi
219
- .queryStorageAt ([storageKey], at: finalizedBlockHashBytes);
220
- if (changes != Null && changes.isNotEmpty) {
221
- for (var changeSet in changes) {
222
- print ("Change Set:" );
223
- for (var change in changeSet.changes) {
224
- Uint8List key = change.key;
225
- Uint8List value = change.value! ;
226
-
227
- final input = Input .fromBytes (value);
228
- final List <dynamic > decodedEvents =
229
- metadata.chainInfo.scaleCodec.decode ('EventCodec' , input);
230
- // try {
231
- // List<Map<String, dynamic>> jsonEvents =
232
- // decodedEvents.map((dynamic entry) {
233
- // Map<String, dynamic> convertedEntry = {};
234
-
235
- // entry.forEach((key, value) {
236
- // if (value is MapEntry) {
237
- // // Replace MapEntry with {}
238
- // convertedEntry[key] = value.value;
239
- // } else {
240
- // convertedEntry[key] = value;
241
- // }
242
- // });
243
-
244
- // return convertedEntry;
245
- // }).toList();
246
-
247
- // String jsonOutput = jsonEncode(jsonEvents);
248
-
249
- // print("Converted JSON:");
250
- // print(jsonOutput);
251
- // } catch (e) {
252
- // print("Error converting events: $e");
253
- // }
231
+ final finalizedBlockHash = p0.value;
232
+ final moduleHash =
233
+ Hasher .twoxx128.hash (Uint8List .fromList ('System' .codeUnits));
234
+ final storageHash =
235
+ Hasher .twoxx128.hash (Uint8List .fromList ('Events' .codeUnits));
236
+ Uint8List storageKey = Uint8List .fromList ([
237
+ ...moduleHash,
238
+ ...storageHash,
239
+ ]);
240
+ final finalizedBlockHashBytes = hexToBytes (finalizedBlockHash);
241
+ final changes = await stateApi
242
+ .queryStorageAt ([storageKey], at: finalizedBlockHashBytes);
243
+ if (changes != Null && changes.isNotEmpty) {
244
+ for (var changeSet in changes) {
245
+ for (var change in changeSet.changes) {
246
+ Uint8List key = change.key;
247
+ Uint8List value = change.value! ;
248
+
249
+ final input = Input .fromBytes (value);
250
+ final List <dynamic > decodedEvents =
251
+ metadata.chainInfo.scaleCodec.decode ('EventCodec' , input);
252
+ final myEvents = _filterMyEvents (decodedEvents);
253
+ bool targetModuleEventOccur = false ;
254
+ for (final event in myEvents) {
255
+ if (event.key == "System" &&
256
+ event.value.key == "ExtrinsicFailed" ) {
257
+ // TODO: get the error name and type
258
+ final error = event.value.value["DispatchError" ].value;
259
+ final errorType = event.value.value["DispatchError" ].key;
260
+ _complete.completeError (
261
+ "Failed to apply extrinsic: ${errorType }${error }" );
262
+ } else if (event.key == runtimeCall.runtimeType.toString ()) {
263
+ targetModuleEventOccur = true ;
264
+ } else if (targetModuleEventOccur &&
265
+ event.key == "System" &&
266
+ event.value.key == "ExtrinsicSuccess" ) {
267
+ print ("Extrinsic is applied successfully" );
268
+ _complete.complete ();
269
+ return ;
270
+ }
254
271
}
255
272
}
256
- } else {
257
- print ("No events found in the block" );
258
273
}
259
- } catch (e) {
260
- print ( 'Error decoding events: $ e ' );
274
+ } else {
275
+ _complete. completeError ( "No events found in the block" );
261
276
}
262
277
}
263
278
},
264
279
);
265
-
266
- // print(submit );
280
+ await _complete.future;
281
+ subscription. cancel ( );
267
282
}
268
283
}
0 commit comments