From ab58e1702fcc772ed0211f44f5329fbcdc010a40 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Fri, 26 Jan 2024 10:24:20 +0100 Subject: [PATCH 01/35] [service/tx] add naive implementation of txbuilder --- app/lib/service/tx/lib/src/tx_builder.dart | 75 +++++++++++++++++++++ app/lib/service/tx/lib/tx.dart | 76 ++++++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 app/lib/service/tx/lib/src/tx_builder.dart diff --git a/app/lib/service/tx/lib/src/tx_builder.dart b/app/lib/service/tx/lib/src/tx_builder.dart new file mode 100644 index 000000000..0df17defd --- /dev/null +++ b/app/lib/service/tx/lib/src/tx_builder.dart @@ -0,0 +1,75 @@ +import 'package:convert/convert.dart'; +import 'package:encointer_wallet/service/substrate_api/core/reconnecting_ws_provider.dart'; +import 'package:ew_keyring/ew_keyring.dart'; +import 'package:ew_polkadart/ew_polkadart.dart'; +import 'package:ew_polkadart/runtime_call.dart'; + +class TxApi { + TxApi(this.provider); + + final ReconnectingWsProvider provider; + + Future createSignedExtrinsic(Sr25519KeyPair pair, RuntimeCall call) async { + final encointerKusama = EncointerKusama(provider); + + // fetch recent relevant data from chain + final runtimeVersion = await _getRuntimeVersion(); + final blockNumber = await _getBlockNumber(); + final blockHash = await _getBlockHash(); + final genesisHash = await _getBlockHash(blockNumber: 0); + final accountInfo = await encointerKusama.query.system.account(pair.publicKey.bytes); + + final encodedCall = hex.encode(call.encode()); + + final payloadToSign = SigningPayload( + method: encodedCall, + specVersion: runtimeVersion.specVersion, + transactionVersion: runtimeVersion.transactionVersion, + genesisHash: genesisHash, + blockHash: blockHash, + blockNumber: blockNumber, + eraPeriod: 64, + nonce: accountInfo.nonce, + tip: 0, + ); + + final payload = payloadToSign.encode(encointerKusama.registry); + + final signature = pair.sign(payload); + final hexSignature = hex.encode(signature); + + final publicKey = hex.encode(pair.publicKey.bytes); + final extrinsic = Extrinsic( + signer: publicKey, + method: encodedCall, + signature: hexSignature, + eraPeriod: 64, + blockNumber: blockNumber, + nonce: 0, + tip: 0, + ); + + return extrinsic; + } + + Future _getRuntimeVersion() async { + final stateApi = StateApi(provider); + final runtimeVersion = await stateApi.getRuntimeVersion(); + return runtimeVersion; + } + + Future _getBlockHash({int? blockNumber}) async { + final params = blockNumber != null ? [blockNumber] : []; + final hash = (await provider.send('chain_getBlockHash', params)).result as String; + + return hash.replaceFirst('0x', ''); + } + + Future _getBlockNumber() async { + final block = await provider.send('chain_getBlock', []); + + // ignore: avoid_dynamic_calls + final blockNumber = int.parse(block.result['block']['header']['number'] as String); + return blockNumber; + } +} diff --git a/app/lib/service/tx/lib/tx.dart b/app/lib/service/tx/lib/tx.dart index 09ee74c89..ed92705fc 100644 --- a/app/lib/service/tx/lib/tx.dart +++ b/app/lib/service/tx/lib/tx.dart @@ -1,3 +1,79 @@ +import 'package:convert/convert.dart'; +import 'package:encointer_wallet/service/substrate_api/core/reconnecting_ws_provider.dart'; +import 'package:ew_keyring/ew_keyring.dart'; +import 'package:ew_polkadart/ew_polkadart.dart'; +import 'package:ew_polkadart/runtime_call.dart'; + /// Contains all things about sending extrinsics. export 'src/params.dart'; export 'src/submit_tx_wrappers.dart'; + +class TxApi { + TxApi(this.provider); + + final ReconnectingWsProvider provider; + + Future createSignedExtrinsic(Sr25519KeyPair pair, RuntimeCall call) async { + final encointerKusama = EncointerKusama(provider); + + // fetch recent relevant data from chain + final runtimeVersion = await _getRuntimeVersion(); + final blockNumber = await _getBlockNumber(); + final blockHash = await _getBlockHash(); + final genesisHash = await _getBlockHash(blockNumber: 0); + final accountInfo = await encointerKusama.query.system.account(pair.publicKey.bytes); + + final encodedCall = hex.encode(call.encode()); + + final payloadToSign = SigningPayload( + method: encodedCall, + specVersion: runtimeVersion.specVersion, + transactionVersion: runtimeVersion.transactionVersion, + genesisHash: genesisHash, + blockHash: blockHash, + blockNumber: blockNumber, + eraPeriod: 64, + nonce: accountInfo.nonce, + tip: 0, + ); + + final payload = payloadToSign.encode(encointerKusama.registry); + + final signature = pair.sign(payload); + final hexSignature = hex.encode(signature); + + final publicKey = hex.encode(pair.publicKey.bytes); + final extrinsic = Extrinsic( + signer: publicKey, + method: encodedCall, + signature: hexSignature, + eraPeriod: 64, + blockNumber: blockNumber, + nonce: 0, + tip: 0, + ); + + return extrinsic; + } + + Future _getRuntimeVersion() async { + final stateApi = StateApi(provider); + final runtimeVersion = await stateApi.getRuntimeVersion(); + return runtimeVersion; + } + + Future _getBlockHash({int? blockNumber}) async { + final params = blockNumber != null ? [blockNumber] : []; + final hash = (await provider.send('chain_getBlockHash', params)).result as String; + + return hash.replaceFirst('0x', ''); + } + + Future _getBlockNumber() async { + final block = await provider.send('chain_getBlock', []); + + // ignore: avoid_dynamic_calls + final blockNumber = int.parse(block.result['block']['header']['number'] as String); + return blockNumber; + } +} From 5f92388d946b26177ce4c12ee51ca1d50b84da95 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Fri, 26 Jan 2024 10:53:18 +0100 Subject: [PATCH 02/35] add multiaddress extensions for keys --- packages/ew_polkadart/lib/encointer_types.dart | 4 ++++ .../ew_primitives/lib/src/type_extensions.dart | 14 +++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/packages/ew_polkadart/lib/encointer_types.dart b/packages/ew_polkadart/lib/encointer_types.dart index 5ac260c2f..477b13543 100644 --- a/packages/ew_polkadart/lib/encointer_types.dart +++ b/packages/ew_polkadart/lib/encointer_types.dart @@ -1,5 +1,9 @@ /// Re-export well defined-types. +// export primitive types +export 'generated/encointer_kusama/types/sp_runtime/multiaddress/multi_address.dart' show MultiAddress, Index, Id, Raw, Address32; +export 'generated/encointer_kusama/types/sp_runtime/multi_signature.dart' show MultiSignature, Sr25519; + // export types from balances export 'generated/encointer_kusama/types/encointer_primitives/balances/balance_entry.dart' show BalanceEntry; diff --git a/packages/ew_primitives/lib/src/type_extensions.dart b/packages/ew_primitives/lib/src/type_extensions.dart index f6f19c157..f93bb6045 100644 --- a/packages/ew_primitives/lib/src/type_extensions.dart +++ b/packages/ew_primitives/lib/src/type_extensions.dart @@ -1,4 +1,4 @@ -import 'package:ew_keyring/ew_keyring.dart' show Sr25519KeyPair; +import 'package:ew_keyring/ew_keyring.dart' show KeyringAccount, Sr25519KeyPair; import 'package:ew_polkadart/encointer_types.dart'; import 'package:ew_polkadart/ew_polkadart.dart'; import 'package:ew_polkadart/generated/encointer_kusama/types/sp_core/crypto/account_id32.dart'; @@ -7,6 +7,18 @@ import 'package:ew_polkadart/generated/encointer_kusama/types/substrate_fixed/fi import 'package:ew_polkadart/generated/encointer_kusama/types/tuples.dart'; import 'package:ew_substrate_fixed/substrate_fixed.dart'; +extension KeyringAccountMultiAddressExt on KeyringAccount { + MultiAddress multiAddress() { + return MultiAddress.values.id(pubKey); + } +} + +extension KeyringAccountDataMultiAddressExt on Sr25519KeyPair { + MultiAddress multiAddress() { + return MultiAddress.values.id(publicKey.bytes); + } +} + abstract class LocationFactory { static Location fromDouble({ required double lat, From 3af19a3030431f8f19912b27c08e8a79587fee72 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Fri, 26 Jan 2024 10:53:42 +0100 Subject: [PATCH 03/35] [service/tx] rename TxApi to TxBuilder --- app/lib/service/tx/lib/src/tx_builder.dart | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/app/lib/service/tx/lib/src/tx_builder.dart b/app/lib/service/tx/lib/src/tx_builder.dart index 0df17defd..746ab6193 100644 --- a/app/lib/service/tx/lib/src/tx_builder.dart +++ b/app/lib/service/tx/lib/src/tx_builder.dart @@ -1,15 +1,16 @@ +import 'dart:typed_data'; + import 'package:convert/convert.dart'; -import 'package:encointer_wallet/service/substrate_api/core/reconnecting_ws_provider.dart'; import 'package:ew_keyring/ew_keyring.dart'; import 'package:ew_polkadart/ew_polkadart.dart'; import 'package:ew_polkadart/runtime_call.dart'; -class TxApi { - TxApi(this.provider); +class TxBuilder { + TxBuilder(this.provider); - final ReconnectingWsProvider provider; + final Provider provider; - Future createSignedExtrinsic(Sr25519KeyPair pair, RuntimeCall call) async { + Future createSignedExtrinsic(Sr25519KeyPair pair, RuntimeCall call) async { final encointerKusama = EncointerKusama(provider); // fetch recent relevant data from chain @@ -19,6 +20,13 @@ class TxApi { final genesisHash = await _getBlockHash(blockNumber: 0); final accountInfo = await encointerKusama.query.system.account(pair.publicKey.bytes); + print('RuntimeVersion: $runtimeVersion'); + print('blockNumber: $blockNumber'); + print('blockHash: $blockHash'); + print('genesisHash: $genesisHash'); + print('accountInfo: $accountInfo'); + + final encodedCall = hex.encode(call.encode()); final payloadToSign = SigningPayload( @@ -49,7 +57,7 @@ class TxApi { tip: 0, ); - return extrinsic; + return extrinsic.encode(encointerKusama.registry, SignatureType.sr25519); } Future _getRuntimeVersion() async { From ab13ede23196a5648c0de8a2073410cc79d3c8d7 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Fri, 26 Jan 2024 10:54:18 +0100 Subject: [PATCH 04/35] [service/tx] try to send tx with dart generate code, tx-validation fails. Probably because it can't understand the signed extensions --- .../service/tx/lib/send_tx_dart_test.dart | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/app/test/service/tx/lib/send_tx_dart_test.dart b/app/test/service/tx/lib/send_tx_dart_test.dart index f63f716f7..5b2ee4bd5 100644 --- a/app/test/service/tx/lib/send_tx_dart_test.dart +++ b/app/test/service/tx/lib/send_tx_dart_test.dart @@ -1,26 +1,37 @@ // ignore_for_file: avoid_print -@Skip('Skip these tests as they need a specific setup.') +// @Skip('Skip these tests as they need a specific setup.') import 'dart:async'; +import 'package:convert/convert.dart'; import 'package:encointer_wallet/service/tx/lib/src/send_tx_dart.dart'; +import 'package:encointer_wallet/service/tx/lib/src/tx_builder.dart'; +import 'package:ew_keyring/ew_keyring.dart'; -import 'package:ew_polkadart/ew_polkadart.dart' show Provider; +import 'package:ew_polkadart/ew_polkadart.dart' show EncointerKusama, Provider; +import 'package:ew_primitives/ew_primitives.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { group('submit xt', () { test('send alice to bob works', () async { - final polkadart = Provider.fromUri(Uri.parse('ws://localhost:9944')); - final author = EWAuthorApi(polkadart); + final provider = Provider.fromUri(Uri.parse('ws://localhost:9944')); + final author = EWAuthorApi(provider); + final encointerKusama = EncointerKusama(provider); + + final keyring = await testKeyring(); + final accounts = keyring.accountsIter; + final alice = accounts.first; + final bob = accounts.first; + + final transfer = encointerKusama.tx.balances.transfer(dest: bob.multiAddress(), value: BigInt.from(1000000000000)); + + final txBuilder = TxBuilder(provider); + final xt = await txBuilder.createSignedExtrinsic(alice.pair, transfer); - // note this contains some nonce and will not work on an arbitrary setup. Instead, - // it will throw a bad signature error, see https://github.com/leonardocustodio/polkadart/pull/337. - const xtHex = - '0xd1018400d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d01ae256b85be1cc6f2af4684f44588457f536d332a03689d433df622dc5dca250fa4911531a6e90be32f1838055b6fe5966da4c8caf69af079bf81a5aa8ce8f58535037000003d0073716d3176f08c911c00'; - final xt = Extrinsic.fromHex(xtHex); + print('Sending XT: ${hex.encode(xt)}'); - final report = await author.submitAndWatchExtrinsicWithReport(xt); + final report = await author.submitAndWatchExtrinsicWithReport(Extrinsic(xt)); print('Got extrinsic report: $report'); if (report.isExtrinsicSuccess) { From 775117f88c665f81bb0d8cc45f23be5620cec8e9 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Fri, 26 Jan 2024 11:46:41 +0100 Subject: [PATCH 05/35] [service/tx] verify that encoded call ist correct. --- app/lib/service/tx/lib/src/tx_builder.dart | 2 ++ app/test/service/tx/lib/send_tx_dart_test.dart | 10 ++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/lib/service/tx/lib/src/tx_builder.dart b/app/lib/service/tx/lib/src/tx_builder.dart index 746ab6193..cf154a0c2 100644 --- a/app/lib/service/tx/lib/src/tx_builder.dart +++ b/app/lib/service/tx/lib/src/tx_builder.dart @@ -29,6 +29,8 @@ class TxBuilder { final encodedCall = hex.encode(call.encode()); + print('encodedCall: $encodedCall'); + final payloadToSign = SigningPayload( method: encodedCall, specVersion: runtimeVersion.specVersion, diff --git a/app/test/service/tx/lib/send_tx_dart_test.dart b/app/test/service/tx/lib/send_tx_dart_test.dart index 5b2ee4bd5..67cddb63d 100644 --- a/app/test/service/tx/lib/send_tx_dart_test.dart +++ b/app/test/service/tx/lib/send_tx_dart_test.dart @@ -20,11 +20,13 @@ void main() { final encointerKusama = EncointerKusama(provider); final keyring = await testKeyring(); - final accounts = keyring.accountsIter; - final alice = accounts.first; - final bob = accounts.first; + final accounts = keyring.accounts; + final alice = accounts[0]; + final bob = accounts[1]; - final transfer = encointerKusama.tx.balances.transfer(dest: bob.multiAddress(), value: BigInt.from(1000000000000)); + // Checked that the encoded call matches the one from polkadot-js. + const _1ERT = 1000000000000; + final transfer = encointerKusama.tx.balances.transfer(dest: bob.multiAddress(), value: BigInt.from(_1ERT)); final txBuilder = TxBuilder(provider); final xt = await txBuilder.createSignedExtrinsic(alice.pair, transfer); From 37bfd00013ce85dff5f44a11005e4fd86b6c768b Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Fri, 26 Jan 2024 12:16:26 +0100 Subject: [PATCH 06/35] [service/tx] rename our extrinsic type to opaque extrinsic --- app/lib/service/substrate_api/account_api.dart | 2 +- app/lib/service/tx/lib/src/send_tx_dart.dart | 14 +++++++------- app/test/service/tx/lib/send_tx_dart_test.dart | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/lib/service/substrate_api/account_api.dart b/app/lib/service/substrate_api/account_api.dart index f9c150b86..8f68b4c5e 100644 --- a/app/lib/service/substrate_api/account_api.dart +++ b/app/lib/service/substrate_api/account_api.dart @@ -60,7 +60,7 @@ class AccountApi { final res = await getSignedTx(txInfo, params, rawParam: rawParam); final report = - await EWAuthorApi(provider).submitAndWatchExtrinsicWithReport(Extrinsic.fromHex(res['xt'] as String)); + await EWAuthorApi(provider).submitAndWatchExtrinsicWithReport(OpaqueExtrinsic.fromHex(res['xt'] as String)); if (report.isExtrinsicSuccess) { final hash = report.blockHash; 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 1eaeeb680..25652ef0f 100644 --- a/app/lib/service/tx/lib/src/send_tx_dart.dart +++ b/app/lib/service/tx/lib/src/send_tx_dart.dart @@ -97,7 +97,7 @@ class EWAuthorApi

{ final P _provider; /// Submit a fully formatted extrinsic for block inclusion. - Future submitExtrinsic(Extrinsic extrinsic) async { + Future submitExtrinsic(OpaqueExtrinsic extrinsic) async { final params = [extrinsic.hexPrefixed]; final response = await _provider.send('author_submitExtrinsic', params); @@ -113,13 +113,13 @@ class EWAuthorApi

{ /// Submit a fully formatted extrinsic and return a subscription /// which emits txStatus updates. Future> submitAndWatchExtrinsic( - Extrinsic extrinsic, + OpaqueExtrinsic extrinsic, dynamic Function(ExtrinsicStatus) onData, ) { return AuthorApi(_provider).submitAndWatchExtrinsic(extrinsic._encoded, onData); } - Future submitAndWatchExtrinsicWithReport(Extrinsic extrinsic) async { + Future submitAndWatchExtrinsicWithReport(OpaqueExtrinsic extrinsic) async { final hash = extrinsic.hash; final completer = Completer(); @@ -187,11 +187,11 @@ class ChainApi

{ } } -class Extrinsic { - Extrinsic(this._encoded); +class OpaqueExtrinsic { + OpaqueExtrinsic(this._encoded); - factory Extrinsic.fromHex(String hexString) { - return Extrinsic(hexToUint8(hexString)); + factory OpaqueExtrinsic.fromHex(String hexString) { + return OpaqueExtrinsic(hexToUint8(hexString)); } final Uint8List _encoded; diff --git a/app/test/service/tx/lib/send_tx_dart_test.dart b/app/test/service/tx/lib/send_tx_dart_test.dart index 67cddb63d..9cb52bc02 100644 --- a/app/test/service/tx/lib/send_tx_dart_test.dart +++ b/app/test/service/tx/lib/send_tx_dart_test.dart @@ -33,7 +33,7 @@ void main() { print('Sending XT: ${hex.encode(xt)}'); - final report = await author.submitAndWatchExtrinsicWithReport(Extrinsic(xt)); + final report = await author.submitAndWatchExtrinsicWithReport(OpaqueExtrinsic(xt)); print('Got extrinsic report: $report'); if (report.isExtrinsicSuccess) { From 49c6fa5c02c982320e2c5ee68484f31b2d2c6ad6 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Fri, 26 Jan 2024 14:37:19 +0100 Subject: [PATCH 07/35] change branch of our polkadart for --- app/pubspec.lock | 20 +++++++------- app/pubspec.yaml | 8 +++--- app/pubspec_overrides.yaml | 8 +++--- packages/ew_encointer_utils/pubspec.lock | 16 ++++++------ packages/ew_encointer_utils/pubspec.yaml | 6 ++--- .../ew_encointer_utils/pubspec_overrides.yaml | 6 ++--- packages/ew_keyring/pubspec.lock | 10 +++---- packages/ew_keyring/pubspec.yaml | 4 +-- packages/ew_keyring/pubspec_overrides.yaml | 2 +- packages/ew_polkadart/pubspec.lock | 26 +++++++++---------- packages/ew_polkadart/pubspec.yaml | 16 ++++++------ packages/ew_polkadart/pubspec_overrides.yaml | 8 +++--- packages/ew_primitives/pubspec.lock | 16 ++++++------ packages/ew_primitives/pubspec.yaml | 4 +-- packages/ew_primitives/pubspec_overrides.yaml | 4 +-- 15 files changed, 77 insertions(+), 77 deletions(-) diff --git a/app/pubspec.lock b/app/pubspec.lock index 093f456f4..3b854fd8d 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -1227,26 +1227,26 @@ packages: dependency: "direct overridden" description: path: "packages/polkadart" - ref: main - resolved-ref: "900ecf83ca1fc9388580d421286ce9938dc58981" + ref: "cl/encointer-signed-extensions" + resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" url: "https://github.com/encointer/polkadart" source: git - version: "0.3.0" + version: "0.3.1" polkadart_keyring: dependency: "direct overridden" description: path: "packages/polkadart_keyring" - ref: main - resolved-ref: "900ecf83ca1fc9388580d421286ce9938dc58981" + ref: "cl/encointer-signed-extensions" + resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" url: "https://github.com/encointer/polkadart" source: git - version: "0.2.1" + version: "0.3.0" polkadart_scale_codec: dependency: "direct overridden" description: path: "packages/polkadart_scale_codec" - ref: main - resolved-ref: "900ecf83ca1fc9388580d421286ce9938dc58981" + ref: "cl/encointer-signed-extensions" + resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" @@ -1651,8 +1651,8 @@ packages: dependency: "direct overridden" description: path: "packages/substrate_metadata" - ref: main - resolved-ref: "900ecf83ca1fc9388580d421286ce9938dc58981" + ref: "cl/encointer-signed-extensions" + resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" diff --git a/app/pubspec.yaml b/app/pubspec.yaml index ba53602bc..504f46c0d 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -118,28 +118,28 @@ dependency_overrides: # path: ../../../polkadart/packages/polkadart git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart polkadart_scale_codec: # path: ../../../polkadart/packages/polkadart_scale_codec git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart_scale_codec substrate_metadata: # path: ../../../polkadart/packages/substrate_metadata git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/substrate_metadata polkadart_keyring: # path: ../../../polkadart/packages/polkadart_keyring git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart_keyring flutter_icons: diff --git a/app/pubspec_overrides.yaml b/app/pubspec_overrides.yaml index 445c41137..9fe884450 100644 --- a/app/pubspec_overrides.yaml +++ b/app/pubspec_overrides.yaml @@ -19,20 +19,20 @@ dependency_overrides: polkadart: git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart polkadart_keyring: git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart_keyring polkadart_scale_codec: git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart_scale_codec substrate_metadata: git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/substrate_metadata diff --git a/packages/ew_encointer_utils/pubspec.lock b/packages/ew_encointer_utils/pubspec.lock index 3f3d79cf1..dfe7bb734 100644 --- a/packages/ew_encointer_utils/pubspec.lock +++ b/packages/ew_encointer_utils/pubspec.lock @@ -361,26 +361,26 @@ packages: dependency: "direct overridden" description: path: "packages/polkadart" - ref: main - resolved-ref: "900ecf83ca1fc9388580d421286ce9938dc58981" + ref: "cl/encointer-signed-extensions" + resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" url: "https://github.com/encointer/polkadart" source: git - version: "0.3.0" + version: "0.3.1" polkadart_keyring: dependency: "direct overridden" description: path: "packages/polkadart_keyring" - ref: main - resolved-ref: "900ecf83ca1fc9388580d421286ce9938dc58981" + ref: "cl/encointer-signed-extensions" + resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" url: "https://github.com/encointer/polkadart" source: git - version: "0.2.1" + version: "0.3.0" polkadart_scale_codec: dependency: "direct overridden" description: path: "packages/polkadart_scale_codec" - ref: main - resolved-ref: "900ecf83ca1fc9388580d421286ce9938dc58981" + ref: "cl/encointer-signed-extensions" + resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" diff --git a/packages/ew_encointer_utils/pubspec.yaml b/packages/ew_encointer_utils/pubspec.yaml index 25f56aba3..2db5352e1 100644 --- a/packages/ew_encointer_utils/pubspec.yaml +++ b/packages/ew_encointer_utils/pubspec.yaml @@ -27,17 +27,17 @@ dependency_overrides: # path: ../../../polkadart/packages/polkadart git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart polkadart_scale_codec: # path: ../../../polkadart/packages/polkadart_scale_codec git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart_scale_codec polkadart_keyring: # path: ../../../polkadart/packages/polkadart_keyring git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart_keyring \ No newline at end of file diff --git a/packages/ew_encointer_utils/pubspec_overrides.yaml b/packages/ew_encointer_utils/pubspec_overrides.yaml index 26d798b96..7ac4a0867 100644 --- a/packages/ew_encointer_utils/pubspec_overrides.yaml +++ b/packages/ew_encointer_utils/pubspec_overrides.yaml @@ -11,15 +11,15 @@ dependency_overrides: polkadart: git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart polkadart_keyring: git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart_keyring polkadart_scale_codec: git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart_scale_codec diff --git a/packages/ew_keyring/pubspec.lock b/packages/ew_keyring/pubspec.lock index 5b6d74254..a3c0bd556 100644 --- a/packages/ew_keyring/pubspec.lock +++ b/packages/ew_keyring/pubspec.lock @@ -397,17 +397,17 @@ packages: dependency: "direct main" description: path: "packages/polkadart_keyring" - ref: main - resolved-ref: "900ecf83ca1fc9388580d421286ce9938dc58981" + ref: "cl/encointer-signed-extensions" + resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" url: "https://github.com/encointer/polkadart" source: git - version: "0.2.1" + version: "0.3.0" polkadart_scale_codec: dependency: "direct overridden" description: path: "packages/polkadart_scale_codec" - ref: main - resolved-ref: "900ecf83ca1fc9388580d421286ce9938dc58981" + ref: "cl/encointer-signed-extensions" + resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" diff --git a/packages/ew_keyring/pubspec.yaml b/packages/ew_keyring/pubspec.yaml index 52e1f1e49..6d16320a8 100644 --- a/packages/ew_keyring/pubspec.yaml +++ b/packages/ew_keyring/pubspec.yaml @@ -13,7 +13,7 @@ dependencies: # path: ../../../polkadart/packages/polkadart_scale_codec git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart_keyring ss58: ^1.1.2 substrate_bip39: ^0.2.0 @@ -33,5 +33,5 @@ dependency_overrides: # path: ../../../polkadart/packages/polkadart_scale_codec git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart_scale_codec diff --git a/packages/ew_keyring/pubspec_overrides.yaml b/packages/ew_keyring/pubspec_overrides.yaml index 80a3b1ef6..21981a764 100644 --- a/packages/ew_keyring/pubspec_overrides.yaml +++ b/packages/ew_keyring/pubspec_overrides.yaml @@ -3,5 +3,5 @@ dependency_overrides: polkadart_scale_codec: git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart_scale_codec diff --git a/packages/ew_polkadart/pubspec.lock b/packages/ew_polkadart/pubspec.lock index c87dbb8bf..b8d775d76 100644 --- a/packages/ew_polkadart/pubspec.lock +++ b/packages/ew_polkadart/pubspec.lock @@ -365,35 +365,35 @@ packages: dependency: "direct main" description: path: "packages/polkadart" - ref: main - resolved-ref: "900ecf83ca1fc9388580d421286ce9938dc58981" + ref: "cl/encointer-signed-extensions" + resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" url: "https://github.com/encointer/polkadart" source: git - version: "0.3.0" + version: "0.3.1" polkadart_cli: dependency: "direct dev" description: path: "packages/polkadart_cli" - ref: main - resolved-ref: "900ecf83ca1fc9388580d421286ce9938dc58981" + ref: "cl/encointer-signed-extensions" + resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" url: "https://github.com/encointer/polkadart" source: git - version: "0.3.0" + version: "0.3.1" polkadart_keyring: dependency: "direct overridden" description: path: "packages/polkadart_keyring" - ref: main - resolved-ref: "900ecf83ca1fc9388580d421286ce9938dc58981" + ref: "cl/encointer-signed-extensions" + resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" url: "https://github.com/encointer/polkadart" source: git - version: "0.2.1" + version: "0.3.0" polkadart_scale_codec: dependency: "direct main" description: path: "packages/polkadart_scale_codec" - ref: main - resolved-ref: "900ecf83ca1fc9388580d421286ce9938dc58981" + ref: "cl/encointer-signed-extensions" + resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" @@ -569,8 +569,8 @@ packages: dependency: "direct dev" description: path: "packages/substrate_metadata" - ref: main - resolved-ref: "900ecf83ca1fc9388580d421286ce9938dc58981" + ref: "cl/encointer-signed-extensions" + resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" diff --git a/packages/ew_polkadart/pubspec.yaml b/packages/ew_polkadart/pubspec.yaml index c0edb089a..b12fab8cc 100644 --- a/packages/ew_polkadart/pubspec.yaml +++ b/packages/ew_polkadart/pubspec.yaml @@ -16,13 +16,13 @@ dependencies: # path: ../../../polkadart/packages/polkadart git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart polkadart_scale_codec: # path: ../../../polkadart/packages/polkadart_scale_codec git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart_scale_codec dev_dependencies: @@ -32,13 +32,13 @@ dev_dependencies: # path: ../../../polkadart/packages/polkadart_cli git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart_cli substrate_metadata: # path: ../../../polkadart/packages/substrate_metadata git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/substrate_metadata test: ^1.24.9 @@ -51,28 +51,28 @@ dependency_overrides: # path: ../../../polkadart/packages/polkadart git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart polkadart_scale_codec: # path: ../../../polkadart/packages/polkadart_scale_codec git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart_scale_codec substrate_metadata: # path: ../../../polkadart/packages/substrate_metadata git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/substrate_metadata polkadart_keyring: # path: ../../../polkadart/packages/polkadart_keyring git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart_keyring # This only generates valid files on UNIX machines. diff --git a/packages/ew_polkadart/pubspec_overrides.yaml b/packages/ew_polkadart/pubspec_overrides.yaml index 80419a396..c168c9d92 100644 --- a/packages/ew_polkadart/pubspec_overrides.yaml +++ b/packages/ew_polkadart/pubspec_overrides.yaml @@ -3,20 +3,20 @@ dependency_overrides: polkadart: git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart polkadart_keyring: git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart_keyring polkadart_scale_codec: git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart_scale_codec substrate_metadata: git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/substrate_metadata diff --git a/packages/ew_primitives/pubspec.lock b/packages/ew_primitives/pubspec.lock index 8761dfe53..87a239a36 100644 --- a/packages/ew_primitives/pubspec.lock +++ b/packages/ew_primitives/pubspec.lock @@ -354,26 +354,26 @@ packages: dependency: transitive description: path: "packages/polkadart" - ref: main - resolved-ref: "900ecf83ca1fc9388580d421286ce9938dc58981" + ref: "cl/encointer-signed-extensions" + resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" url: "https://github.com/encointer/polkadart" source: git - version: "0.3.0" + version: "0.3.1" polkadart_keyring: dependency: "direct overridden" description: path: "packages/polkadart_keyring" - ref: main - resolved-ref: "900ecf83ca1fc9388580d421286ce9938dc58981" + ref: "cl/encointer-signed-extensions" + resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" url: "https://github.com/encointer/polkadart" source: git - version: "0.2.1" + version: "0.3.0" polkadart_scale_codec: dependency: "direct overridden" description: path: "packages/polkadart_scale_codec" - ref: main - resolved-ref: "900ecf83ca1fc9388580d421286ce9938dc58981" + ref: "cl/encointer-signed-extensions" + resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" diff --git a/packages/ew_primitives/pubspec.yaml b/packages/ew_primitives/pubspec.yaml index 0fc0d6b71..bdc7faeac 100644 --- a/packages/ew_primitives/pubspec.yaml +++ b/packages/ew_primitives/pubspec.yaml @@ -26,11 +26,11 @@ dependency_overrides: # path: ../../../polkadart/packages/polkadart_scale_codec git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart_scale_codec polkadart_keyring: # path: ../../../polkadart/packages/polkadart_keyring git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart_keyring diff --git a/packages/ew_primitives/pubspec_overrides.yaml b/packages/ew_primitives/pubspec_overrides.yaml index 7b73694f4..f7e30b6fc 100644 --- a/packages/ew_primitives/pubspec_overrides.yaml +++ b/packages/ew_primitives/pubspec_overrides.yaml @@ -9,10 +9,10 @@ dependency_overrides: polkadart_keyring: git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart_keyring polkadart_scale_codec: git: url: https://github.com/encointer/polkadart - ref: main + ref: cl/encointer-signed-extensions path: packages/polkadart_scale_codec From c21a088b182bb33e25fe73e0c3919561417e2e8b Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Fri, 26 Jan 2024 14:37:46 +0100 Subject: [PATCH 08/35] [tx_builder] minor fix and successfully send a tx with native currency --- app/lib/service/tx/lib/src/tx_builder.dart | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/app/lib/service/tx/lib/src/tx_builder.dart b/app/lib/service/tx/lib/src/tx_builder.dart index cf154a0c2..b7d37fd5d 100644 --- a/app/lib/service/tx/lib/src/tx_builder.dart +++ b/app/lib/service/tx/lib/src/tx_builder.dart @@ -44,19 +44,15 @@ class TxBuilder { ); final payload = payloadToSign.encode(encointerKusama.registry); - final signature = pair.sign(payload); final hexSignature = hex.encode(signature); final publicKey = hex.encode(pair.publicKey.bytes); - final extrinsic = Extrinsic( + final extrinsic = Extrinsic.withSigningPayload( signer: publicKey, method: encodedCall, signature: hexSignature, - eraPeriod: 64, - blockNumber: blockNumber, - nonce: 0, - tip: 0, + payload: payloadToSign ); return extrinsic.encode(encointerKusama.registry, SignatureType.sr25519); From 30222a3ebdf0c17112da9d67d37299ce9b5cac52 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Fri, 26 Jan 2024 14:53:39 +0100 Subject: [PATCH 09/35] bump polkadart --- app/pubspec.lock | 48 ++---------------------- packages/ew_encointer_utils/pubspec.lock | 6 +-- packages/ew_keyring/pubspec.lock | 12 +----- packages/ew_polkadart/pubspec.lock | 10 ++--- packages/ew_primitives/pubspec.lock | 6 +-- 5 files changed, 17 insertions(+), 65 deletions(-) diff --git a/app/pubspec.lock b/app/pubspec.lock index 3b854fd8d..8007b9b0b 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -807,14 +807,6 @@ packages: url: "https://pub.dev" source: hosted version: "4.8.1" - json_schema2: - dependency: transitive - description: - name: json_schema2 - sha256: "094e60d3605333c0816eeb2e5310b4f71ffaea2c0abc026b27418c1ac41a5db3" - url: "https://pub.dev" - source: hosted - version: "2.0.4+9" json_serializable: dependency: "direct dev" description: @@ -1228,7 +1220,7 @@ packages: description: path: "packages/polkadart" ref: "cl/encointer-signed-extensions" - resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" + resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" url: "https://github.com/encointer/polkadart" source: git version: "0.3.1" @@ -1237,7 +1229,7 @@ packages: description: path: "packages/polkadart_keyring" ref: "cl/encointer-signed-extensions" - resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" + resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" url: "https://github.com/encointer/polkadart" source: git version: "0.3.0" @@ -1246,7 +1238,7 @@ packages: description: path: "packages/polkadart_scale_codec" ref: "cl/encointer-signed-extensions" - resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" + resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" @@ -1346,14 +1338,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.2" - rest_client: - dependency: transitive - description: - name: rest_client - sha256: "90473416250779b85f8d620e9dc277f38ea67acf84d3c6299e005ce08caedd69" - url: "https://pub.dev" - source: hosted - version: "2.4.0" ristretto255: dependency: transitive description: @@ -1652,7 +1636,7 @@ packages: description: path: "packages/substrate_metadata" ref: "cl/encointer-signed-extensions" - resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" + resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" @@ -1752,14 +1736,6 @@ packages: url: "https://pub.dev" source: hosted version: "8.4.0" - uri: - dependency: transitive - description: - name: uri - sha256: "889eea21e953187c6099802b7b4cf5219ba8f3518f604a1033064d45b1b8268a" - url: "https://pub.dev" - source: hosted - version: "1.0.0" url_launcher: dependency: "direct main" description: @@ -1824,14 +1800,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.0" - utility: - dependency: transitive - description: - name: utility - sha256: "200d264c3804e87da7ea36aa81bd73fb845d2cb7b2e820f3f357a0a2bd4e37f5" - url: "https://pub.dev" - source: hosted - version: "1.0.3" uuid: dependency: transitive description: @@ -2008,14 +1976,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" - yaon: - dependency: transitive - description: - name: yaon - sha256: fb0dd1654f203e52ef1631ba81a04c7762ddfd72d7bc58a178462d8b84258fd4 - url: "https://pub.dev" - source: hosted - version: "1.1.4" sdks: dart: ">=3.2.0 <4.0.0" flutter: ">=3.16.3" diff --git a/packages/ew_encointer_utils/pubspec.lock b/packages/ew_encointer_utils/pubspec.lock index dfe7bb734..95e771d62 100644 --- a/packages/ew_encointer_utils/pubspec.lock +++ b/packages/ew_encointer_utils/pubspec.lock @@ -362,7 +362,7 @@ packages: description: path: "packages/polkadart" ref: "cl/encointer-signed-extensions" - resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" + resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" url: "https://github.com/encointer/polkadart" source: git version: "0.3.1" @@ -371,7 +371,7 @@ packages: description: path: "packages/polkadart_keyring" ref: "cl/encointer-signed-extensions" - resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" + resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" url: "https://github.com/encointer/polkadart" source: git version: "0.3.0" @@ -380,7 +380,7 @@ packages: description: path: "packages/polkadart_scale_codec" ref: "cl/encointer-signed-extensions" - resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" + resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" diff --git a/packages/ew_keyring/pubspec.lock b/packages/ew_keyring/pubspec.lock index a3c0bd556..adba47758 100644 --- a/packages/ew_keyring/pubspec.lock +++ b/packages/ew_keyring/pubspec.lock @@ -398,7 +398,7 @@ packages: description: path: "packages/polkadart_keyring" ref: "cl/encointer-signed-extensions" - resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" + resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" url: "https://github.com/encointer/polkadart" source: git version: "0.3.0" @@ -407,7 +407,7 @@ packages: description: path: "packages/polkadart_scale_codec" ref: "cl/encointer-signed-extensions" - resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" + resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" @@ -435,14 +435,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.3" - quiver: - dependency: transitive - description: - name: quiver - sha256: b1c1ac5ce6688d77f65f3375a9abb9319b3cb32486bdc7a1e0fdf004d7ba4e47 - url: "https://pub.dev" - source: hosted - version: "3.2.1" ristretto255: dependency: transitive description: diff --git a/packages/ew_polkadart/pubspec.lock b/packages/ew_polkadart/pubspec.lock index b8d775d76..bd50e7cbf 100644 --- a/packages/ew_polkadart/pubspec.lock +++ b/packages/ew_polkadart/pubspec.lock @@ -366,7 +366,7 @@ packages: description: path: "packages/polkadart" ref: "cl/encointer-signed-extensions" - resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" + resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" url: "https://github.com/encointer/polkadart" source: git version: "0.3.1" @@ -375,7 +375,7 @@ packages: description: path: "packages/polkadart_cli" ref: "cl/encointer-signed-extensions" - resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" + resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" url: "https://github.com/encointer/polkadart" source: git version: "0.3.1" @@ -384,7 +384,7 @@ packages: description: path: "packages/polkadart_keyring" ref: "cl/encointer-signed-extensions" - resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" + resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" url: "https://github.com/encointer/polkadart" source: git version: "0.3.0" @@ -393,7 +393,7 @@ packages: description: path: "packages/polkadart_scale_codec" ref: "cl/encointer-signed-extensions" - resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" + resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" @@ -570,7 +570,7 @@ packages: description: path: "packages/substrate_metadata" ref: "cl/encointer-signed-extensions" - resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" + resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" diff --git a/packages/ew_primitives/pubspec.lock b/packages/ew_primitives/pubspec.lock index 87a239a36..9cacb6c9b 100644 --- a/packages/ew_primitives/pubspec.lock +++ b/packages/ew_primitives/pubspec.lock @@ -355,7 +355,7 @@ packages: description: path: "packages/polkadart" ref: "cl/encointer-signed-extensions" - resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" + resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" url: "https://github.com/encointer/polkadart" source: git version: "0.3.1" @@ -364,7 +364,7 @@ packages: description: path: "packages/polkadart_keyring" ref: "cl/encointer-signed-extensions" - resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" + resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" url: "https://github.com/encointer/polkadart" source: git version: "0.3.0" @@ -373,7 +373,7 @@ packages: description: path: "packages/polkadart_scale_codec" ref: "cl/encointer-signed-extensions" - resolved-ref: "1b0627c8cabc2dd720803bbd0b30b7f39169733a" + resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" From b742ba50d6c1027f946d638533dd7651d71e0373 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Fri, 26 Jan 2024 15:03:00 +0100 Subject: [PATCH 10/35] [tx_dart_test] fix variable naming warning --- app/test/service/tx/lib/send_tx_dart_test.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/test/service/tx/lib/send_tx_dart_test.dart b/app/test/service/tx/lib/send_tx_dart_test.dart index 9cb52bc02..80c693ca2 100644 --- a/app/test/service/tx/lib/send_tx_dart_test.dart +++ b/app/test/service/tx/lib/send_tx_dart_test.dart @@ -25,8 +25,8 @@ void main() { final bob = accounts[1]; // Checked that the encoded call matches the one from polkadot-js. - const _1ERT = 1000000000000; - final transfer = encointerKusama.tx.balances.transfer(dest: bob.multiAddress(), value: BigInt.from(_1ERT)); + const oneERT = 1000000000000; + final transfer = encointerKusama.tx.balances.transfer(dest: bob.multiAddress(), value: BigInt.from(oneERT)); final txBuilder = TxBuilder(provider); final xt = await txBuilder.createSignedExtrinsic(alice.pair, transfer); From 45b3ac05980bd2ba6560e14851d7509ef9935589 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Fri, 26 Jan 2024 15:12:57 +0100 Subject: [PATCH 11/35] bump lock file --- app/pubspec.lock | 48 ++++++++++++++++++++++-- packages/ew_encointer_utils/pubspec.lock | 6 +-- packages/ew_keyring/pubspec.lock | 12 +++++- packages/ew_polkadart/pubspec.lock | 10 ++--- packages/ew_primitives/pubspec.lock | 6 +-- 5 files changed, 65 insertions(+), 17 deletions(-) diff --git a/app/pubspec.lock b/app/pubspec.lock index 8007b9b0b..b2cae777d 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -807,6 +807,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.8.1" + json_schema2: + dependency: transitive + description: + name: json_schema2 + sha256: "094e60d3605333c0816eeb2e5310b4f71ffaea2c0abc026b27418c1ac41a5db3" + url: "https://pub.dev" + source: hosted + version: "2.0.4+9" json_serializable: dependency: "direct dev" description: @@ -1220,7 +1228,7 @@ packages: description: path: "packages/polkadart" ref: "cl/encointer-signed-extensions" - resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" + resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 url: "https://github.com/encointer/polkadart" source: git version: "0.3.1" @@ -1229,7 +1237,7 @@ packages: description: path: "packages/polkadart_keyring" ref: "cl/encointer-signed-extensions" - resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" + resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 url: "https://github.com/encointer/polkadart" source: git version: "0.3.0" @@ -1238,7 +1246,7 @@ packages: description: path: "packages/polkadart_scale_codec" ref: "cl/encointer-signed-extensions" - resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" + resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" @@ -1338,6 +1346,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.2" + rest_client: + dependency: transitive + description: + name: rest_client + sha256: "90473416250779b85f8d620e9dc277f38ea67acf84d3c6299e005ce08caedd69" + url: "https://pub.dev" + source: hosted + version: "2.4.0" ristretto255: dependency: transitive description: @@ -1636,7 +1652,7 @@ packages: description: path: "packages/substrate_metadata" ref: "cl/encointer-signed-extensions" - resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" + resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" @@ -1736,6 +1752,14 @@ packages: url: "https://pub.dev" source: hosted version: "8.4.0" + uri: + dependency: transitive + description: + name: uri + sha256: "889eea21e953187c6099802b7b4cf5219ba8f3518f604a1033064d45b1b8268a" + url: "https://pub.dev" + source: hosted + version: "1.0.0" url_launcher: dependency: "direct main" description: @@ -1800,6 +1824,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.0" + utility: + dependency: transitive + description: + name: utility + sha256: "200d264c3804e87da7ea36aa81bd73fb845d2cb7b2e820f3f357a0a2bd4e37f5" + url: "https://pub.dev" + source: hosted + version: "1.0.3" uuid: dependency: transitive description: @@ -1976,6 +2008,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" + yaon: + dependency: transitive + description: + name: yaon + sha256: db080cb998ac25ed993b5c715abb1825b00453b9b62bc7ad2699f5f9c1fec6ce + url: "https://pub.dev" + source: hosted + version: "1.1.4+3" sdks: dart: ">=3.2.0 <4.0.0" flutter: ">=3.16.3" diff --git a/packages/ew_encointer_utils/pubspec.lock b/packages/ew_encointer_utils/pubspec.lock index 95e771d62..a37e1bacf 100644 --- a/packages/ew_encointer_utils/pubspec.lock +++ b/packages/ew_encointer_utils/pubspec.lock @@ -362,7 +362,7 @@ packages: description: path: "packages/polkadart" ref: "cl/encointer-signed-extensions" - resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" + resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 url: "https://github.com/encointer/polkadart" source: git version: "0.3.1" @@ -371,7 +371,7 @@ packages: description: path: "packages/polkadart_keyring" ref: "cl/encointer-signed-extensions" - resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" + resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 url: "https://github.com/encointer/polkadart" source: git version: "0.3.0" @@ -380,7 +380,7 @@ packages: description: path: "packages/polkadart_scale_codec" ref: "cl/encointer-signed-extensions" - resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" + resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" diff --git a/packages/ew_keyring/pubspec.lock b/packages/ew_keyring/pubspec.lock index adba47758..52264dcc5 100644 --- a/packages/ew_keyring/pubspec.lock +++ b/packages/ew_keyring/pubspec.lock @@ -398,7 +398,7 @@ packages: description: path: "packages/polkadart_keyring" ref: "cl/encointer-signed-extensions" - resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" + resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 url: "https://github.com/encointer/polkadart" source: git version: "0.3.0" @@ -407,7 +407,7 @@ packages: description: path: "packages/polkadart_scale_codec" ref: "cl/encointer-signed-extensions" - resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" + resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" @@ -435,6 +435,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.3" + quiver: + dependency: transitive + description: + name: quiver + sha256: b1c1ac5ce6688d77f65f3375a9abb9319b3cb32486bdc7a1e0fdf004d7ba4e47 + url: "https://pub.dev" + source: hosted + version: "3.2.1" ristretto255: dependency: transitive description: diff --git a/packages/ew_polkadart/pubspec.lock b/packages/ew_polkadart/pubspec.lock index bd50e7cbf..f35e13865 100644 --- a/packages/ew_polkadart/pubspec.lock +++ b/packages/ew_polkadart/pubspec.lock @@ -366,7 +366,7 @@ packages: description: path: "packages/polkadart" ref: "cl/encointer-signed-extensions" - resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" + resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 url: "https://github.com/encointer/polkadart" source: git version: "0.3.1" @@ -375,7 +375,7 @@ packages: description: path: "packages/polkadart_cli" ref: "cl/encointer-signed-extensions" - resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" + resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 url: "https://github.com/encointer/polkadart" source: git version: "0.3.1" @@ -384,7 +384,7 @@ packages: description: path: "packages/polkadart_keyring" ref: "cl/encointer-signed-extensions" - resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" + resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 url: "https://github.com/encointer/polkadart" source: git version: "0.3.0" @@ -393,7 +393,7 @@ packages: description: path: "packages/polkadart_scale_codec" ref: "cl/encointer-signed-extensions" - resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" + resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" @@ -570,7 +570,7 @@ packages: description: path: "packages/substrate_metadata" ref: "cl/encointer-signed-extensions" - resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" + resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" diff --git a/packages/ew_primitives/pubspec.lock b/packages/ew_primitives/pubspec.lock index 9cacb6c9b..25df885b1 100644 --- a/packages/ew_primitives/pubspec.lock +++ b/packages/ew_primitives/pubspec.lock @@ -355,7 +355,7 @@ packages: description: path: "packages/polkadart" ref: "cl/encointer-signed-extensions" - resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" + resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 url: "https://github.com/encointer/polkadart" source: git version: "0.3.1" @@ -364,7 +364,7 @@ packages: description: path: "packages/polkadart_keyring" ref: "cl/encointer-signed-extensions" - resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" + resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 url: "https://github.com/encointer/polkadart" source: git version: "0.3.0" @@ -373,7 +373,7 @@ packages: description: path: "packages/polkadart_scale_codec" ref: "cl/encointer-signed-extensions" - resolved-ref: "a06af92b20b258364b49a746d73cb16b5bcafb59" + resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" From ac7cd1a027c063c70c94438d20d077edc77e59af Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Fri, 26 Jan 2024 15:13:24 +0100 Subject: [PATCH 12/35] fix redundant community identifier definition --- .../encointer/encointer_api.dart | 2 +- .../encointer/encointer_dart_api.dart | 2 +- app/test/mock/api/mock_encointer_api.dart | 2 +- .../communities/community_identifier.dart | 175 +++++++++--------- 4 files changed, 90 insertions(+), 91 deletions(-) diff --git a/app/lib/service/substrate_api/encointer/encointer_api.dart b/app/lib/service/substrate_api/encointer/encointer_api.dart index ab04038d3..b8f6dc6ab 100644 --- a/app/lib/service/substrate_api/encointer/encointer_api.dart +++ b/app/lib/service/substrate_api/encointer/encointer_api.dart @@ -26,7 +26,7 @@ import 'package:encointer_wallet/store/app.dart'; import 'package:ew_encointer_utils/ew_encointer_utils.dart' as ew_utils; import 'package:ew_http/ew_http.dart'; import 'package:ew_keyring/ew_keyring.dart'; -import 'package:ew_polkadart/ew_polkadart.dart'; +import 'package:ew_polkadart/ew_polkadart.dart' show BlockHash, Tuple2, StorageChangeSet, SequenceCodec, EncointerKusama, ByteInput; import 'package:ew_polkadart/generated/encointer_kusama/types/sp_core/crypto/account_id32.dart'; import 'package:ew_primitives/ew_primitives.dart'; import 'package:ew_substrate_fixed/substrate_fixed.dart'; diff --git a/app/lib/service/substrate_api/encointer/encointer_dart_api.dart b/app/lib/service/substrate_api/encointer/encointer_dart_api.dart index 75a705225..31fb0c029 100644 --- a/app/lib/service/substrate_api/encointer/encointer_dart_api.dart +++ b/app/lib/service/substrate_api/encointer/encointer_dart_api.dart @@ -11,7 +11,7 @@ import 'package:encointer_wallet/models/index.dart'; import 'package:encointer_wallet/models/location/location.dart'; import 'package:encointer_wallet/service/log/log_service.dart'; import 'package:encointer_wallet/service/substrate_api/core/dart_api.dart'; -import 'package:ew_polkadart/ew_polkadart.dart'; +import 'package:ew_polkadart/ew_polkadart.dart' show BlockHash; const _targetLogger = 'EncointerDartApi'; diff --git a/app/test/mock/api/mock_encointer_api.dart b/app/test/mock/api/mock_encointer_api.dart index 0c7a1c4a8..e6258acc5 100644 --- a/app/test/mock/api/mock_encointer_api.dart +++ b/app/test/mock/api/mock_encointer_api.dart @@ -11,7 +11,7 @@ import 'package:encointer_wallet/models/encointer_balance_data/balance_entry.dar import 'package:encointer_wallet/service/log/log_service.dart'; import 'package:encointer_wallet/service/substrate_api/encointer/encointer_api.dart'; import 'package:ew_http/ew_http.dart'; -import 'package:ew_polkadart/ew_polkadart.dart'; +import 'package:ew_polkadart/ew_polkadart.dart' show BlockHash; import '../data/mock_encointer_data.dart'; import 'mock_js_api.dart'; diff --git a/packages/ew_polkadart/lib/generated/encointer_kusama/types/encointer_primitives/communities/community_identifier.dart b/packages/ew_polkadart/lib/generated/encointer_kusama/types/encointer_primitives/communities/community_identifier.dart index 8c312d8b4..3f0400025 100644 --- a/packages/ew_polkadart/lib/generated/encointer_kusama/types/encointer_primitives/communities/community_identifier.dart +++ b/packages/ew_polkadart/lib/generated/encointer_kusama/types/encointer_primitives/communities/community_identifier.dart @@ -1,90 +1,89 @@ -// ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:typed_data' as _i2; -import 'package:polkadart/scale_codec.dart' as _i1; -import 'package:quiver/collection.dart' as _i3; +// Todo: polkadart is not generic yet over the asset id. So we hardcoded our community identifier there. +// Here we have to re-export that one for now. +export 'package:polkadart/primitives/primitives.dart' show CommunityIdentifier; -class CommunityIdentifier { - const CommunityIdentifier({ - required this.geohash, - required this.digest, - }); - - factory CommunityIdentifier.decode(_i1.Input input) { - return codec.decode(input); - } - - /// [u8; 5] - final List geohash; - - /// [u8; 4] - final List digest; - - static const $CommunityIdentifierCodec codec = $CommunityIdentifierCodec(); - - _i2.Uint8List encode() { - return codec.encode(this); - } - - Map> toJson() => { - 'geohash': geohash.toList(), - 'digest': digest.toList(), - }; - - @override - bool operator ==(Object other) => - identical( - this, - other, - ) || - other is CommunityIdentifier && - _i3.listsEqual( - other.geohash, - geohash, - ) && - _i3.listsEqual( - other.digest, - digest, - ); - - @override - int get hashCode => Object.hash( - geohash, - digest, - ); -} - -class $CommunityIdentifierCodec with _i1.Codec { - const $CommunityIdentifierCodec(); - - @override - void encodeTo( - CommunityIdentifier obj, - _i1.Output output, - ) { - const _i1.U8ArrayCodec(5).encodeTo( - obj.geohash, - output, - ); - const _i1.U8ArrayCodec(4).encodeTo( - obj.digest, - output, - ); - } - - @override - CommunityIdentifier decode(_i1.Input input) { - return CommunityIdentifier( - geohash: const _i1.U8ArrayCodec(5).decode(input), - digest: const _i1.U8ArrayCodec(4).decode(input), - ); - } - - @override - int sizeHint(CommunityIdentifier obj) { - int size = 0; - size = size + const _i1.U8ArrayCodec(5).sizeHint(obj.geohash); - size = size + const _i1.U8ArrayCodec(4).sizeHint(obj.digest); - return size; - } -} +// class CommunityIdentifier { +// const CommunityIdentifier({ +// required this.geohash, +// required this.digest, +// }); +// +// factory CommunityIdentifier.decode(_i1.Input input) { +// return codec.decode(input); +// } +// +// /// [u8; 5] +// final List geohash; +// +// /// [u8; 4] +// final List digest; +// +// static const $CommunityIdentifierCodec codec = $CommunityIdentifierCodec(); +// +// _i2.Uint8List encode() { +// return codec.encode(this); +// } +// +// Map> toJson() => { +// 'geohash': geohash.toList(), +// 'digest': digest.toList(), +// }; +// +// @override +// bool operator ==(Object other) => +// identical( +// this, +// other, +// ) || +// other is CommunityIdentifier && +// _i3.listsEqual( +// other.geohash, +// geohash, +// ) && +// _i3.listsEqual( +// other.digest, +// digest, +// ); +// +// @override +// int get hashCode => Object.hash( +// geohash, +// digest, +// ); +// } +// +// class $CommunityIdentifierCodec with _i1.Codec { +// const $CommunityIdentifierCodec(); +// +// @override +// void encodeTo( +// CommunityIdentifier obj, +// _i1.Output output, +// ) { +// const _i1.U8ArrayCodec(5).encodeTo( +// obj.geohash, +// output, +// ); +// const _i1.U8ArrayCodec(4).encodeTo( +// obj.digest, +// output, +// ); +// } +// +// @override +// CommunityIdentifier decode(_i1.Input input) { +// return CommunityIdentifier( +// geohash: const _i1.U8ArrayCodec(5).decode(input), +// digest: const _i1.U8ArrayCodec(4).decode(input), +// ); +// } +// +// @override +// int sizeHint(CommunityIdentifier obj) { +// int size = 0; +// size = size + const _i1.U8ArrayCodec(5).sizeHint(obj.geohash); +// size = size + const _i1.U8ArrayCodec(4).sizeHint(obj.digest); +// return size; +// } +// } From dbd1edb6c3350b7a2c4d8d1cc1544024fd228f95 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Fri, 26 Jan 2024 15:41:36 +0100 Subject: [PATCH 13/35] [send_tx_dart_test] try to pay with community currency, currently failing --- app/lib/service/tx/lib/src/tx_builder.dart | 27 +++++++++---------- .../service/tx/lib/send_tx_dart_test.dart | 11 +++++++- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/app/lib/service/tx/lib/src/tx_builder.dart b/app/lib/service/tx/lib/src/tx_builder.dart index b7d37fd5d..ef79a1814 100644 --- a/app/lib/service/tx/lib/src/tx_builder.dart +++ b/app/lib/service/tx/lib/src/tx_builder.dart @@ -10,7 +10,11 @@ class TxBuilder { final Provider provider; - Future createSignedExtrinsic(Sr25519KeyPair pair, RuntimeCall call) async { + Future createSignedExtrinsic( + Sr25519KeyPair pair, + RuntimeCall call, { + CommunityIdentifier? paymentAsset, + }) async { final encointerKusama = EncointerKusama(provider); // fetch recent relevant data from chain @@ -20,16 +24,14 @@ class TxBuilder { final genesisHash = await _getBlockHash(blockNumber: 0); final accountInfo = await encointerKusama.query.system.account(pair.publicKey.bytes); - print('RuntimeVersion: $runtimeVersion'); - print('blockNumber: $blockNumber'); - print('blockHash: $blockHash'); - print('genesisHash: $genesisHash'); - print('accountInfo: $accountInfo'); - + // print('RuntimeVersion: $runtimeVersion'); + // print('blockNumber: $blockNumber'); + // print('blockHash: $blockHash'); + // print('genesisHash: $genesisHash'); + // print('accountInfo: $accountInfo'); final encodedCall = hex.encode(call.encode()); - - print('encodedCall: $encodedCall'); + // print('encodedCall: $encodedCall'); final payloadToSign = SigningPayload( method: encodedCall, @@ -41,6 +43,7 @@ class TxBuilder { eraPeriod: 64, nonce: accountInfo.nonce, tip: 0, + assetId: paymentAsset, ); final payload = payloadToSign.encode(encointerKusama.registry); @@ -49,11 +52,7 @@ class TxBuilder { final publicKey = hex.encode(pair.publicKey.bytes); final extrinsic = Extrinsic.withSigningPayload( - signer: publicKey, - method: encodedCall, - signature: hexSignature, - payload: payloadToSign - ); + signer: publicKey, method: encodedCall, signature: hexSignature, payload: payloadToSign); return extrinsic.encode(encointerKusama.registry, SignatureType.sr25519); } diff --git a/app/test/service/tx/lib/send_tx_dart_test.dart b/app/test/service/tx/lib/send_tx_dart_test.dart index 80c693ca2..21f98ace1 100644 --- a/app/test/service/tx/lib/send_tx_dart_test.dart +++ b/app/test/service/tx/lib/send_tx_dart_test.dart @@ -3,10 +3,13 @@ // @Skip('Skip these tests as they need a specific setup.') import 'dart:async'; +import 'dart:convert'; import 'package:convert/convert.dart'; import 'package:encointer_wallet/service/tx/lib/src/send_tx_dart.dart'; import 'package:encointer_wallet/service/tx/lib/src/tx_builder.dart'; +import 'package:encointer_wallet/models/communities/community_identifier.dart' as ew; import 'package:ew_keyring/ew_keyring.dart'; +import 'package:ew_polkadart/encointer_types.dart'; import 'package:ew_polkadart/ew_polkadart.dart' show EncointerKusama, Provider; import 'package:ew_primitives/ew_primitives.dart'; @@ -29,8 +32,14 @@ void main() { final transfer = encointerKusama.tx.balances.transfer(dest: bob.multiAddress(), value: BigInt.from(oneERT)); final txBuilder = TxBuilder(provider); - final xt = await txBuilder.createSignedExtrinsic(alice.pair, transfer); + // mediterranean test community + final paymentAsset = CommunityIdentifier(geohash: utf8.encode('sqm1v'),digest: hex.decode('f08c911c')); + print('payment asset: ${paymentAsset.toJson()}'); + final testCid = ew.CommunityIdentifier.fromPolkadart(paymentAsset); + print('payment asset fmt: ${testCid.toFmtString()}'); + + final xt = await txBuilder.createSignedExtrinsic(alice.pair, transfer, paymentAsset: paymentAsset); print('Sending XT: ${hex.encode(xt)}'); final report = await author.submitAndWatchExtrinsicWithReport(OpaqueExtrinsic(xt)); From 215c78cb3e55550a352c621e5a777f15585e2149 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Fri, 26 Jan 2024 15:48:14 +0100 Subject: [PATCH 14/35] bump polkadart now we can pay with community currency --- app/pubspec.lock | 8 ++++---- packages/ew_encointer_utils/pubspec.lock | 6 +++--- packages/ew_keyring/pubspec.lock | 4 ++-- packages/ew_polkadart/pubspec.lock | 10 +++++----- packages/ew_primitives/pubspec.lock | 6 +++--- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/app/pubspec.lock b/app/pubspec.lock index b2cae777d..595096df6 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -1228,7 +1228,7 @@ packages: description: path: "packages/polkadart" ref: "cl/encointer-signed-extensions" - resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 + resolved-ref: e49a0ed2c89208c008889ef0f4fe9ad04422bf38 url: "https://github.com/encointer/polkadart" source: git version: "0.3.1" @@ -1237,7 +1237,7 @@ packages: description: path: "packages/polkadart_keyring" ref: "cl/encointer-signed-extensions" - resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 + resolved-ref: e49a0ed2c89208c008889ef0f4fe9ad04422bf38 url: "https://github.com/encointer/polkadart" source: git version: "0.3.0" @@ -1246,7 +1246,7 @@ packages: description: path: "packages/polkadart_scale_codec" ref: "cl/encointer-signed-extensions" - resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 + resolved-ref: e49a0ed2c89208c008889ef0f4fe9ad04422bf38 url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" @@ -1652,7 +1652,7 @@ packages: description: path: "packages/substrate_metadata" ref: "cl/encointer-signed-extensions" - resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 + resolved-ref: e49a0ed2c89208c008889ef0f4fe9ad04422bf38 url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" diff --git a/packages/ew_encointer_utils/pubspec.lock b/packages/ew_encointer_utils/pubspec.lock index a37e1bacf..19f3106e2 100644 --- a/packages/ew_encointer_utils/pubspec.lock +++ b/packages/ew_encointer_utils/pubspec.lock @@ -362,7 +362,7 @@ packages: description: path: "packages/polkadart" ref: "cl/encointer-signed-extensions" - resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 + resolved-ref: e49a0ed2c89208c008889ef0f4fe9ad04422bf38 url: "https://github.com/encointer/polkadart" source: git version: "0.3.1" @@ -371,7 +371,7 @@ packages: description: path: "packages/polkadart_keyring" ref: "cl/encointer-signed-extensions" - resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 + resolved-ref: e49a0ed2c89208c008889ef0f4fe9ad04422bf38 url: "https://github.com/encointer/polkadart" source: git version: "0.3.0" @@ -380,7 +380,7 @@ packages: description: path: "packages/polkadart_scale_codec" ref: "cl/encointer-signed-extensions" - resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 + resolved-ref: e49a0ed2c89208c008889ef0f4fe9ad04422bf38 url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" diff --git a/packages/ew_keyring/pubspec.lock b/packages/ew_keyring/pubspec.lock index 52264dcc5..dbb56f1d1 100644 --- a/packages/ew_keyring/pubspec.lock +++ b/packages/ew_keyring/pubspec.lock @@ -398,7 +398,7 @@ packages: description: path: "packages/polkadart_keyring" ref: "cl/encointer-signed-extensions" - resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 + resolved-ref: e49a0ed2c89208c008889ef0f4fe9ad04422bf38 url: "https://github.com/encointer/polkadart" source: git version: "0.3.0" @@ -407,7 +407,7 @@ packages: description: path: "packages/polkadart_scale_codec" ref: "cl/encointer-signed-extensions" - resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 + resolved-ref: e49a0ed2c89208c008889ef0f4fe9ad04422bf38 url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" diff --git a/packages/ew_polkadart/pubspec.lock b/packages/ew_polkadart/pubspec.lock index f35e13865..9d427190a 100644 --- a/packages/ew_polkadart/pubspec.lock +++ b/packages/ew_polkadart/pubspec.lock @@ -366,7 +366,7 @@ packages: description: path: "packages/polkadart" ref: "cl/encointer-signed-extensions" - resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 + resolved-ref: e49a0ed2c89208c008889ef0f4fe9ad04422bf38 url: "https://github.com/encointer/polkadart" source: git version: "0.3.1" @@ -375,7 +375,7 @@ packages: description: path: "packages/polkadart_cli" ref: "cl/encointer-signed-extensions" - resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 + resolved-ref: e49a0ed2c89208c008889ef0f4fe9ad04422bf38 url: "https://github.com/encointer/polkadart" source: git version: "0.3.1" @@ -384,7 +384,7 @@ packages: description: path: "packages/polkadart_keyring" ref: "cl/encointer-signed-extensions" - resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 + resolved-ref: e49a0ed2c89208c008889ef0f4fe9ad04422bf38 url: "https://github.com/encointer/polkadart" source: git version: "0.3.0" @@ -393,7 +393,7 @@ packages: description: path: "packages/polkadart_scale_codec" ref: "cl/encointer-signed-extensions" - resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 + resolved-ref: e49a0ed2c89208c008889ef0f4fe9ad04422bf38 url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" @@ -570,7 +570,7 @@ packages: description: path: "packages/substrate_metadata" ref: "cl/encointer-signed-extensions" - resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 + resolved-ref: e49a0ed2c89208c008889ef0f4fe9ad04422bf38 url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" diff --git a/packages/ew_primitives/pubspec.lock b/packages/ew_primitives/pubspec.lock index 25df885b1..35fa11cb3 100644 --- a/packages/ew_primitives/pubspec.lock +++ b/packages/ew_primitives/pubspec.lock @@ -355,7 +355,7 @@ packages: description: path: "packages/polkadart" ref: "cl/encointer-signed-extensions" - resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 + resolved-ref: e49a0ed2c89208c008889ef0f4fe9ad04422bf38 url: "https://github.com/encointer/polkadart" source: git version: "0.3.1" @@ -364,7 +364,7 @@ packages: description: path: "packages/polkadart_keyring" ref: "cl/encointer-signed-extensions" - resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 + resolved-ref: e49a0ed2c89208c008889ef0f4fe9ad04422bf38 url: "https://github.com/encointer/polkadart" source: git version: "0.3.0" @@ -373,7 +373,7 @@ packages: description: path: "packages/polkadart_scale_codec" ref: "cl/encointer-signed-extensions" - resolved-ref: a06af92b20b258364b49a746d73cb16b5bcafb59 + resolved-ref: e49a0ed2c89208c008889ef0f4fe9ad04422bf38 url: "https://github.com/encointer/polkadart" source: git version: "1.1.2" From 96f9b8fa568cd4000632825b7b8fd359192550e6 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Mon, 29 Jan 2024 09:20:22 +0100 Subject: [PATCH 15/35] [service/tx] rename submitToJs to `submitTxInner` --- .../tx/lib/src/{submit_to_js.dart => submit_to_inner.dart} | 7 ++----- app/lib/service/tx/lib/src/submit_tx_wrappers.dart | 4 ++-- 2 files changed, 4 insertions(+), 7 deletions(-) rename app/lib/service/tx/lib/src/{submit_to_js.dart => submit_to_inner.dart} (95%) diff --git a/app/lib/service/tx/lib/src/submit_to_js.dart b/app/lib/service/tx/lib/src/submit_to_inner.dart similarity index 95% rename from app/lib/service/tx/lib/src/submit_to_js.dart rename to app/lib/service/tx/lib/src/submit_to_inner.dart index 3feb2aa35..4cfdfe8d4 100644 --- a/app/lib/service/tx/lib/src/submit_to_js.dart +++ b/app/lib/service/tx/lib/src/submit_to_inner.dart @@ -22,11 +22,8 @@ import 'package:ew_polkadart/generated/encointer_kusama/types/sp_runtime/dispatc const insufficientFundsError = '1010'; const lowPriorityTx = '1014'; -/// Inner function to submit a tx via the JS interface. -/// -/// Should be private but dart lacks intelligent support to manage privacy. `submitTxWrappers/submitTx` should be -/// called from the outside instead of this one. -Future submitToJS( +/// Inner function to submit a tx handling all the notifications. +Future submitTxInner( BuildContext context, AppStore store, Api api, 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 c83b1a28d..1ae41fb3e 100644 --- a/app/lib/service/tx/lib/src/submit_tx_wrappers.dart +++ b/app/lib/service/tx/lib/src/submit_tx_wrappers.dart @@ -13,7 +13,7 @@ import 'package:encointer_wallet/service/launch/app_launch.dart'; import 'package:encointer_wallet/service/log/log_service.dart'; import 'package:encointer_wallet/service/substrate_api/api.dart'; import 'package:encointer_wallet/service/tx/lib/src/params.dart'; -import 'package:encointer_wallet/service/tx/lib/src/submit_to_js.dart'; +import 'package:encointer_wallet/service/tx/lib/src/submit_to_inner.dart'; import 'package:encointer_wallet/store/app.dart'; import 'package:encointer_wallet/l10n/l10.dart'; import 'package:encointer_wallet/service/notification/lib/notification.dart'; @@ -43,7 +43,7 @@ Future submitTx( final pin = await context.read().getPin(context); if (pin != null) { - return submitToJS( + return submitTxInner( context, store, api, From 80b68bc33c85ceeac63b0fb0e17768f7cccc90cd Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Mon, 29 Jan 2024 11:29:54 +0100 Subject: [PATCH 16/35] wip strongly type whole extrinsic send process --- .../communities/community_identifier.dart | 4 ++ .../profile/contacts/contact_detail_page.dart | 12 +++- .../service/substrate_api/account_api.dart | 15 ++-- app/lib/service/tx/lib/src/params.dart | 21 +++--- .../service/tx/lib/src/submit_to_inner.dart | 32 ++++----- .../tx/lib/src/submit_tx_wrappers.dart | 39 +++++++---- app/lib/store/account/account.dart | 68 +++++++++---------- 7 files changed, 101 insertions(+), 90 deletions(-) diff --git a/app/lib/models/communities/community_identifier.dart b/app/lib/models/communities/community_identifier.dart index c1dc83706..25c517aba 100644 --- a/app/lib/models/communities/community_identifier.dart +++ b/app/lib/models/communities/community_identifier.dart @@ -47,6 +47,10 @@ class CommunityIdentifier { return utf8.decode(geohash) + codec.encode(digest); } + et.CommunityIdentifier toPolkadart() { + return et.CommunityIdentifier(geohash: geohash, digest: digest); + } + // By default, the dart `==` operator returns only true iff both variables point to the same instance. We want to // override this behaviour, such that it is also true if the instances contain the same values. @override diff --git a/app/lib/page/profile/contacts/contact_detail_page.dart b/app/lib/page/profile/contacts/contact_detail_page.dart index e0339396a..8d02907a3 100644 --- a/app/lib/page/profile/contacts/contact_detail_page.dart +++ b/app/lib/page/profile/contacts/contact_detail_page.dart @@ -283,12 +283,22 @@ class EndorseButton extends StatelessWidget { final l10n = context.l10n; final address = AddressUtils.pubKeyHexToAddress(contact.pubKey, prefix: store.settings.endpoint.ss58!); + // Todo: enforce chosen cid + if (bootstrappers != null && bootstrappers.contains(address)) { await _popupDialog(context, l10n.cantEndorseBootstrapper); } else if (store.encointer.currentPhase != CeremonyPhase.Registering) { await _popupDialog(context, l10n.canEndorseInRegisteringPhaseOnly); } else { - await submitEndorseNewcomer(context, store, api, store.encointer.chosenCid, address); + await submitEndorseNewcomer( + context, + store, + api, + store.account.getKeyringAccount(store.account.currentAccountPubKey!), + store.encointer.chosenCid!, + address, + txPaymentAsset: store.encointer.getTxPaymentAsset(store.encointer.chosenCid) + ); } } } diff --git a/app/lib/service/substrate_api/account_api.dart b/app/lib/service/substrate_api/account_api.dart index 8f68b4c5e..fa35c5025 100644 --- a/app/lib/service/substrate_api/account_api.dart +++ b/app/lib/service/substrate_api/account_api.dart @@ -5,6 +5,7 @@ import 'package:encointer_wallet/service/log/log_service.dart'; import 'package:encointer_wallet/service/notification/lib/notification.dart'; import 'package:encointer_wallet/service/substrate_api/api.dart'; import 'package:encointer_wallet/service/substrate_api/core/js_api.dart'; +import 'package:encointer_wallet/service/tx/lib/src/params.dart'; import 'package:encointer_wallet/service/tx/lib/src/send_tx_dart.dart'; import 'package:encointer_wallet/store/account/account.dart'; import 'package:encointer_wallet/store/app.dart'; @@ -52,22 +53,18 @@ class AccountApi { } Future sendTxAndShowNotification( - Map txInfo, - List? params, { - String? rawParam, + OpaqueExtrinsic xt, + TxNotificationData notification, { String? cid, }) async { - final res = await getSignedTx(txInfo, params, rawParam: rawParam); - - final report = - await EWAuthorApi(provider).submitAndWatchExtrinsicWithReport(OpaqueExtrinsic.fromHex(res['xt'] as String)); + final report = await EWAuthorApi(provider).submitAndWatchExtrinsicWithReport(xt); if (report.isExtrinsicSuccess) { final hash = report.blockHash; unawaited(NotificationPlugin.showNotification( int.parse(hash.substring(0, 6)), - '${txInfo['notificationTitle']}', - '${txInfo['notificationBody']}', + notification.title, + notification.body, cid: cid, )); } diff --git a/app/lib/service/tx/lib/src/params.dart b/app/lib/service/tx/lib/src/params.dart index 8bf73eb8d..b738987d6 100644 --- a/app/lib/service/tx/lib/src/params.dart +++ b/app/lib/service/tx/lib/src/params.dart @@ -1,21 +1,18 @@ import 'package:encointer_wallet/models/communities/community_identifier.dart'; import 'package:encointer_wallet/models/proof_of_attendance/proof_of_attendance.dart'; import 'package:encointer_wallet/l10n/l10.dart'; +import 'package:flutter/cupertino.dart'; /// Params for known extrinsics. -Map endorseNewcomerParams(CommunityIdentifier chosenCid, String newbie, AppLocalizations l10n) { - return { - 'title': 'endorse_newcomer', - 'txInfo': { - 'module': 'encointerCeremonies', - 'call': 'endorseNewcomer', - 'cid': chosenCid, - 'notificationTitle': l10n.endorseNewcomerNotificationTitle, - 'notificationBody': l10n.endorseNewcomerNotificationBody, - }, - 'params': [chosenCid, newbie], - }; +@immutable +class TxNotificationData { + const TxNotificationData({required this.title, required this.body}); + + factory TxNotificationData.endorseNewcomer(AppLocalizations l10n) => TxNotificationData(title: l10n.endorseNewcomerNotificationTitle, body: l10n.endorseNewcomerNotificationBody); + + final String title; + final String body; } Map registerParticipantParams( diff --git a/app/lib/service/tx/lib/src/submit_to_inner.dart b/app/lib/service/tx/lib/src/submit_to_inner.dart index 4cfdfe8d4..e3086d07a 100644 --- a/app/lib/service/tx/lib/src/submit_to_inner.dart +++ b/app/lib/service/tx/lib/src/submit_to_inner.dart @@ -15,6 +15,7 @@ import 'package:encointer_wallet/l10n/l10.dart'; import 'package:encointer_wallet/utils/alerts/app_alert.dart'; import 'package:encointer_wallet/config/consts.dart'; import 'package:encointer_wallet/service/launch/app_launch.dart'; +import 'package:encointer_wallet/service/tx/lib/tx.dart'; import 'package:ew_polkadart/generated/encointer_kusama/types/sp_runtime/dispatch_error.dart'; /// Contains most of the logic from the `txConfirmPage.dart`, which was removed. @@ -27,26 +28,18 @@ Future submitTxInner( BuildContext context, AppStore store, Api api, + OpaqueExtrinsic extrinsic, + TxNotificationData notification, bool showStatusSnackBar, { - required Map txParams, void Function(DispatchError error)? onError, - required String password, + dynamic Function(BuildContext, ExtrinsicReport)? onFinish, }) async { final l10n = context.l10n; store.assets.setSubmitting(true); store.account.setTxStatus(TxStatus.Queued); - final txInfo = txParams['txInfo'] as Map; - txInfo['pubKey'] = store.account.currentAccount.pubKey; - txInfo['address'] = store.account.currentAddress; - txInfo['password'] = password; - Log.d('$txInfo', 'submitToJS'); - Log.d('${txParams['params']}', 'submitToJS'); - - final onTxFinishFn = txParams['onFinish'] != null - ? txParams['onFinish'] as dynamic Function(BuildContext, ExtrinsicReport) - : (_, __) => null; + final onTxFinishFn = onFinish ?? (_, __) => null; if (await api.isConnected()) { if (showStatusSnackBar) { @@ -58,9 +51,8 @@ Future submitTxInner( try { final report = await api.account.sendTxAndShowNotification( - txParams['txInfo'] as Map, - txParams['params'] as List?, - rawParam: txParams['rawParam'] as String?, + extrinsic, + notification, cid: store.encointer.community?.cid.toFmtString(), ); @@ -85,9 +77,13 @@ Future submitTxInner( } } else { _showTxStatusSnackBar(l10n.txQueuedOffline, null); - txInfo['notificationTitle'] = l10n.notifySubmittedQueued; - txInfo['txError'] = l10n.txError; - store.account.queueTx(txParams); + // This was unused + // txInfo['notificationTitle'] = l10n.notifySubmittedQueued; + // txInfo['txError'] = l10n.txError; + + // Todo: check when rest of the implementation is finished, + // or maybe remove as it might not be working anyhow. + // store.account.queueTx(txParams); } } 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 1ae41fb3e..3b818e1d7 100644 --- a/app/lib/service/tx/lib/src/submit_tx_wrappers.dart +++ b/app/lib/service/tx/lib/src/submit_tx_wrappers.dart @@ -1,6 +1,8 @@ import 'dart:convert'; import 'package:encointer_wallet/service/tx/lib/src/send_tx_dart.dart'; +import 'package:encointer_wallet/service/tx/lib/src/tx_builder.dart'; +import 'package:ew_keyring/ew_keyring.dart'; import 'package:ew_polkadart/generated/encointer_kusama/types/sp_runtime/dispatch_error.dart'; import 'package:ew_test_keys/ew_test_keys.dart'; import 'package:flutter/cupertino.dart'; @@ -30,27 +32,22 @@ Future submitTx( BuildContext context, AppStore store, Api api, - Map txParams, { + OpaqueExtrinsic xt, + TxNotificationData notification, { dynamic Function(BuildContext txPageContext, ExtrinsicReport report)? onFinish, void Function(DispatchError report)? onError, }) async { - final txPaymentAsset = store.encointer.getTxPaymentAsset(store.encointer.chosenCid); - if (txPaymentAsset != null) { - (txParams['txInfo'] as Map)['txPaymentAsset'] = txPaymentAsset; - } - - txParams['onFinish'] = onFinish ?? ((BuildContext txPageContext, ExtrinsicReport report) => report); - final pin = await context.read().getPin(context); if (pin != null) { return submitTxInner( context, store, api, + xt, + notification, false, - txParams: txParams, - password: pin, onError: onError, + onFinish: onFinish, ); } } @@ -80,15 +77,27 @@ Future submitEndorseNewcomer( BuildContext context, AppStore store, Api api, - CommunityIdentifier? chosenCid, - String? newbie, -) async { - final txParams = endorseNewcomerParams(chosenCid!, newbie!, context.l10n); + KeyringAccount signer, + CommunityIdentifier chosenCid, + String newbie, { + required CommunityIdentifier? txPaymentAsset, +}) async { + final call = api.encointer.encointerKusama.tx.encointerCeremonies.endorseNewcomer( + cid: chosenCid, + newbie: newbie, + ); + final xt = await TxBuilder(api.provider).createSignedExtrinsic( + signer.pair, + call, + paymentAsset: txPaymentAsset?.toPolkadart(), + ); + return submitTx( context, store, api, - txParams, + OpaqueExtrinsic(xt), + TxNotificationData.endorseNewcomer(context.l10n), onFinish: (BuildContext txPageContext, ExtrinsicReport report) { store.encointer.account!.getNumberOfNewbieTicketsForReputable(at: report.blockHashBytes); store.encointer.communityAccount!.getNumberOfNewbieTicketsForBootstrapper(at: report.blockHashBytes); diff --git a/app/lib/store/account/account.dart b/app/lib/store/account/account.dart index c42930288..ce7da82c0 100644 --- a/app/lib/store/account/account.dart +++ b/app/lib/store/account/account.dart @@ -4,8 +4,6 @@ import 'package:convert/convert.dart'; import 'package:mobx/mobx.dart'; import 'package:encointer_wallet/service/log/log_service.dart'; -import 'package:encointer_wallet/service/notification/lib/notification.dart'; -import 'package:encointer_wallet/service/substrate_api/api.dart'; import 'package:encointer_wallet/store/account/services/account_storage_service.dart'; import 'package:encointer_wallet/store/account/services/legacy_encryption_service.dart'; import 'package:encointer_wallet/store/account/types/account_data.dart'; @@ -120,39 +118,39 @@ abstract class _AccountStore with Store { void queueTx(Map tx) { queuedTxs.add(tx); - Timer.periodic(const Duration(seconds: 5), (Timer timer) async { - if (await webApi.isConnected()) { - final cid = rootStore.encointer.community?.cid.toFmtString(); - for (final args in queuedTxs) { - final report = await webApi.account.sendTxAndShowNotification( - args['txInfo'] as Map, - args['params'] as List?, - rawParam: args['rawParam'] as String?, - cid: cid, - ); - - Log.d('Queued tx result: $report', 'AccountStore'); - if (report.isExtrinsicFailed) { - await NotificationPlugin.showNotification( - 0, - '${report.dispatchError!}', - 'Failed to sendTx: ${args['title']} - ${(args['txInfo'] as Map)['module']}.${(args['txInfo'] as Map)['call']}', - cid: cid, - ); - } else { - // if (rootStore.settings.endpointIsEncointer) { - // await rootStore.encointer.account!.setTransferTxs([report], rootStore.account.currentAddress); - // } - } - } - rootStore.assets.setSubmitting(false); - rootStore.account.clearTxStatus(); - timer.cancel(); - queuedTxs = []; - } else { - Log.d('Waiting for the api to reconnect to send ${queuedTxs.length} queued tx(s)', 'AccountStore'); - } - }); + // Timer.periodic(const Duration(seconds: 5), (Timer timer) async { + // if (await webApi.isConnected()) { + // final cid = rootStore.encointer.community?.cid.toFmtString(); + // for (final args in queuedTxs) { + // final report = await webApi.account.sendTxAndShowNotification( + // args['txInfo'] as Map, + // args['params'] as List?, + // rawParam: args['rawParam'] as String?, + // cid: cid, + // ); + // + // Log.d('Queued tx result: $report', 'AccountStore'); + // if (report.isExtrinsicFailed) { + // await NotificationPlugin.showNotification( + // 0, + // '${report.dispatchError!}', + // 'Failed to sendTx: ${args['title']} - ${(args['txInfo'] as Map)['module']}.${(args['txInfo'] as Map)['call']}', + // cid: cid, + // ); + // } else { + // // if (rootStore.settings.endpointIsEncointer) { + // // await rootStore.encointer.account!.setTransferTxs([report], rootStore.account.currentAddress); + // // } + // } + // } + // rootStore.assets.setSubmitting(false); + // rootStore.account.clearTxStatus(); + // timer.cancel(); + // queuedTxs = []; + // } else { + // Log.d('Waiting for the api to reconnect to send ${queuedTxs.length} queued tx(s)', 'AccountStore'); + // } + // }); } @action From 0a1efa71ba58854dad972f0406309dd8abe497dc Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Mon, 29 Jan 2024 11:50:37 +0100 Subject: [PATCH 17/35] [service/tx] extract all tx notification constructors and remove extrinsic param functions --- .../service/substrate_api/account_api.dart | 4 +- app/lib/service/tx/lib/src/params.dart | 133 ------------------ .../service/tx/lib/src/submit_to_inner.dart | 2 +- .../tx/lib/src/submit_tx_wrappers.dart | 6 +- .../service/tx/lib/src/tx_notification.dart | 47 +++++++ app/lib/service/tx/lib/tx.dart | 2 +- 6 files changed, 54 insertions(+), 140 deletions(-) delete mode 100644 app/lib/service/tx/lib/src/params.dart create mode 100644 app/lib/service/tx/lib/src/tx_notification.dart diff --git a/app/lib/service/substrate_api/account_api.dart b/app/lib/service/substrate_api/account_api.dart index fa35c5025..7289df4b0 100644 --- a/app/lib/service/substrate_api/account_api.dart +++ b/app/lib/service/substrate_api/account_api.dart @@ -5,7 +5,7 @@ import 'package:encointer_wallet/service/log/log_service.dart'; import 'package:encointer_wallet/service/notification/lib/notification.dart'; import 'package:encointer_wallet/service/substrate_api/api.dart'; import 'package:encointer_wallet/service/substrate_api/core/js_api.dart'; -import 'package:encointer_wallet/service/tx/lib/src/params.dart'; +import 'package:encointer_wallet/service/tx/lib/src/tx_notification.dart'; import 'package:encointer_wallet/service/tx/lib/src/send_tx_dart.dart'; import 'package:encointer_wallet/store/account/account.dart'; import 'package:encointer_wallet/store/app.dart'; @@ -54,7 +54,7 @@ class AccountApi { Future sendTxAndShowNotification( OpaqueExtrinsic xt, - TxNotificationData notification, { + TxNotification notification, { String? cid, }) async { final report = await EWAuthorApi(provider).submitAndWatchExtrinsicWithReport(xt); diff --git a/app/lib/service/tx/lib/src/params.dart b/app/lib/service/tx/lib/src/params.dart deleted file mode 100644 index b738987d6..000000000 --- a/app/lib/service/tx/lib/src/params.dart +++ /dev/null @@ -1,133 +0,0 @@ -import 'package:encointer_wallet/models/communities/community_identifier.dart'; -import 'package:encointer_wallet/models/proof_of_attendance/proof_of_attendance.dart'; -import 'package:encointer_wallet/l10n/l10.dart'; -import 'package:flutter/cupertino.dart'; - -/// Params for known extrinsics. - -@immutable -class TxNotificationData { - const TxNotificationData({required this.title, required this.body}); - - factory TxNotificationData.endorseNewcomer(AppLocalizations l10n) => TxNotificationData(title: l10n.endorseNewcomerNotificationTitle, body: l10n.endorseNewcomerNotificationBody); - - final String title; - final String body; -} - -Map registerParticipantParams( - CommunityIdentifier chosenCid, - AppLocalizations l10n, { - ProofOfAttendance? proof, -}) { - return { - 'title': 'register_participant', - 'txInfo': { - 'module': 'encointerCeremonies', - 'call': 'registerParticipant', - 'cid': chosenCid, - 'notificationTitle': l10n.registerParticipantNotificationTitle, - 'notificationBody': l10n.registerParticipantNotificationBody, - }, - 'params': [ - chosenCid, - proof, - ], - }; -} - -Map attestAttendeesParams( - CommunityIdentifier chosenCid, - int numberOfParticipantsVote, - List attendees, - AppLocalizations l10n, -) { - return { - 'title': 'attest_claims', - 'txInfo': { - 'module': 'encointerCeremonies', - 'call': 'attestAttendees', - 'cid': chosenCid, - 'notificationTitle': l10n.attestNotificationTitle, - 'notificationBody': l10n.attestNotificationBody, - }, - 'params': [chosenCid, numberOfParticipantsVote, attendees], - }; -} - -Map claimRewardsParams(CommunityIdentifier chosenCid, AppLocalizations l10n) { - return { - 'title': 'claim_rewards', - 'txInfo': { - 'module': 'encointerCeremonies', - 'call': 'claimRewards', - 'cid': chosenCid, - 'notificationTitle': l10n.claimRewardsNotificationTitle, - 'notificationBody': l10n.claimRewardsNotificationBody, - }, - // meetupIndex == null. The chain will figure out our index. - 'params': [chosenCid, null], - }; -} - -Map encointerBalanceTransferParams( - CommunityIdentifier cid, - String recipientAddress, - double? amount, - AppLocalizations l10n, -) { - return { - 'title': 'encointerBalancesTransfer', - 'txInfo': { - 'module': 'encointerBalances', - 'call': 'transfer', - 'cid': cid, - 'notificationTitle': l10n.balanceTransferNotificationTitle, - 'notificationBody': l10n.balanceTransferNotificationBody, - }, - 'params': [ - recipientAddress, - cid, - amount.toString(), - ], - }; -} - -Map unregisterParticipantParams( - CommunityIdentifier cid, - ProofOfAttendance? proof, - AppLocalizations l10n, -) { - final communityCeremony = [proof?.communityIdentifier, proof?.ceremonyIndex]; - - return { - 'title': 'encointerUnregisterParticipant', - 'txInfo': { - 'module': 'encointerCeremonies', - 'call': 'unregisterParticipant', - 'cid': cid, - 'notificationTitle': l10n.unregisterParticipantNotificationTitle, - 'notificationBody': l10n.unregisterParticipantNotificationBody, - }, - 'params': [cid, communityCeremony], - }; -} - -Map faucetDripParams( - String faucetAccount, - CommunityIdentifier cid, - int cIndex, - AppLocalizations l10n, -) { - return { - 'title': 'encointerUnregisterParticipant', - 'txInfo': { - 'module': 'encointerFaucet', - 'call': 'drip', - 'cid': cid, - 'notificationTitle': l10n.submittedFaucetDripTitle, - 'notificationBody': l10n.submittedFaucetDripBody, - }, - 'params': [faucetAccount, cid, cIndex], - }; -} diff --git a/app/lib/service/tx/lib/src/submit_to_inner.dart b/app/lib/service/tx/lib/src/submit_to_inner.dart index e3086d07a..838ad02b3 100644 --- a/app/lib/service/tx/lib/src/submit_to_inner.dart +++ b/app/lib/service/tx/lib/src/submit_to_inner.dart @@ -29,7 +29,7 @@ Future submitTxInner( AppStore store, Api api, OpaqueExtrinsic extrinsic, - TxNotificationData notification, + TxNotification notification, bool showStatusSnackBar, { void Function(DispatchError error)? onError, dynamic Function(BuildContext, ExtrinsicReport)? onFinish, 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 3b818e1d7..acc9e838c 100644 --- a/app/lib/service/tx/lib/src/submit_tx_wrappers.dart +++ b/app/lib/service/tx/lib/src/submit_tx_wrappers.dart @@ -14,7 +14,7 @@ import 'package:encointer_wallet/models/index.dart'; import 'package:encointer_wallet/service/launch/app_launch.dart'; import 'package:encointer_wallet/service/log/log_service.dart'; import 'package:encointer_wallet/service/substrate_api/api.dart'; -import 'package:encointer_wallet/service/tx/lib/src/params.dart'; +import 'package:encointer_wallet/service/tx/lib/src/tx_notification.dart'; import 'package:encointer_wallet/service/tx/lib/src/submit_to_inner.dart'; import 'package:encointer_wallet/store/app.dart'; import 'package:encointer_wallet/l10n/l10.dart'; @@ -33,7 +33,7 @@ Future submitTx( AppStore store, Api api, OpaqueExtrinsic xt, - TxNotificationData notification, { + TxNotification notification, { dynamic Function(BuildContext txPageContext, ExtrinsicReport report)? onFinish, void Function(DispatchError report)? onError, }) async { @@ -97,7 +97,7 @@ Future submitEndorseNewcomer( store, api, OpaqueExtrinsic(xt), - TxNotificationData.endorseNewcomer(context.l10n), + TxNotification.endorseNewcomer(context.l10n), onFinish: (BuildContext txPageContext, ExtrinsicReport report) { store.encointer.account!.getNumberOfNewbieTicketsForReputable(at: report.blockHashBytes); store.encointer.communityAccount!.getNumberOfNewbieTicketsForBootstrapper(at: report.blockHashBytes); diff --git a/app/lib/service/tx/lib/src/tx_notification.dart b/app/lib/service/tx/lib/src/tx_notification.dart new file mode 100644 index 000000000..b8fd20b19 --- /dev/null +++ b/app/lib/service/tx/lib/src/tx_notification.dart @@ -0,0 +1,47 @@ +import 'package:encointer_wallet/l10n/l10.dart'; +import 'package:flutter/cupertino.dart'; + +/// Notification messages for used extrinsics + +@immutable +class TxNotification { + const TxNotification({required this.title, required this.body}); + + factory TxNotification.attestAttendees(AppLocalizations l10n) => TxNotification( + title: l10n.attestNotificationTitle, + body: l10n.attestNotificationBody, + ); + + factory TxNotification.claimRewards(AppLocalizations l10n) => TxNotification( + title: l10n.claimRewardsNotificationTitle, + body: l10n.claimRewardsNotificationBody, + ); + + factory TxNotification.encointerBalanceTransfer(AppLocalizations l10n) => TxNotification( + title: l10n.balanceTransferNotificationTitle, + body: l10n.balanceTransferNotificationBody, + ); + + factory TxNotification.endorseNewcomer(AppLocalizations l10n) => TxNotification( + title: l10n.endorseNewcomerNotificationTitle, + body: l10n.endorseNewcomerNotificationBody, + ); + + factory TxNotification.faucetDrip(AppLocalizations l10n) => TxNotification( + title: l10n.submittedFaucetDripTitle, + body: l10n.submittedFaucetDripBody, + ); + + factory TxNotification.registerParticipant(AppLocalizations l10n) => TxNotification( + title: l10n.registerParticipantNotificationTitle, + body: l10n.registerParticipantNotificationBody, + ); + + factory TxNotification.unregisterParticipant(AppLocalizations l10n) => TxNotification( + title: l10n.unregisterParticipantNotificationTitle, + body: l10n.unregisterParticipantNotificationBody, + ); + + final String title; + final String body; +} diff --git a/app/lib/service/tx/lib/tx.dart b/app/lib/service/tx/lib/tx.dart index ed92705fc..e836f9eca 100644 --- a/app/lib/service/tx/lib/tx.dart +++ b/app/lib/service/tx/lib/tx.dart @@ -5,7 +5,7 @@ import 'package:ew_polkadart/ew_polkadart.dart'; import 'package:ew_polkadart/runtime_call.dart'; /// Contains all things about sending extrinsics. -export 'src/params.dart'; +export 'src/tx_notification.dart'; export 'src/submit_tx_wrappers.dart'; class TxApi { From 7094076c3672165aa99ed6948002d98ba760d01a Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Mon, 29 Jan 2024 12:20:24 +0100 Subject: [PATCH 18/35] [service/tx] fix correct cid type in claim rewards --- app/lib/service/tx/lib/src/submit_tx_wrappers.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 acc9e838c..d09e7c78a 100644 --- a/app/lib/service/tx/lib/src/submit_tx_wrappers.dart +++ b/app/lib/service/tx/lib/src/submit_tx_wrappers.dart @@ -83,7 +83,7 @@ Future submitEndorseNewcomer( required CommunityIdentifier? txPaymentAsset, }) async { final call = api.encointer.encointerKusama.tx.encointerCeremonies.endorseNewcomer( - cid: chosenCid, + cid: chosenCid.toPolkadart(), newbie: newbie, ); final xt = await TxBuilder(api.provider).createSignedExtrinsic( From 13afc5c4d27f02a750cd5fb32798e8a1d225bc9b Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Mon, 29 Jan 2024 12:24:32 +0100 Subject: [PATCH 19/35] [service/tx] use new way for submitClaimRewards and unregisterParticipant --- .../components/unregister_link_button.dart | 20 ++++++- app/lib/page/assets/index.dart | 6 +- .../tx/lib/src/submit_tx_wrappers.dart | 60 ++++++++++++++----- 3 files changed, 69 insertions(+), 17 deletions(-) diff --git a/app/lib/page-encointer/ceremony_box/components/unregister_link_button.dart b/app/lib/page-encointer/ceremony_box/components/unregister_link_button.dart index 120df1c35..bb824da5e 100644 --- a/app/lib/page-encointer/ceremony_box/components/unregister_link_button.dart +++ b/app/lib/page-encointer/ceremony_box/components/unregister_link_button.dart @@ -9,6 +9,7 @@ import 'package:encointer_wallet/service/substrate_api/api.dart'; import 'package:encointer_wallet/l10n/l10.dart'; import 'package:encointer_wallet/service/tx/lib/tx.dart'; import 'package:encointer_wallet/store/app.dart'; +import 'package:encointer_wallet/models/index.dart'; class UnregisteredLinkButton extends StatefulWidget { const UnregisteredLinkButton({super.key}); @@ -24,7 +25,24 @@ class _UnregisteredLinkButtonState extends State { setState(() { _submitting = true; }); - await submitUnRegisterParticipant(context, context.read(), webApi); + + final store = context.read(); + + final lastProofOfAttendance = store.encointer.communityAccount?.participantType?.isReputable ?? false + ? store.encointer.account + ?.lastProofOfAttendance // can still be null if the participant did not register on the same phone. + : null; + + await submitUnRegisterParticipant( + context, + store, + webApi, + store.account.getKeyringAccount(store.account.currentAccountPubKey!), + store.encointer.chosenCid!, + lastProofOfAttendance: lastProofOfAttendance, + txPaymentAsset: store.encointer.getTxPaymentAsset(store.encointer.chosenCid), + ); + setState(() { _submitting = false; }); diff --git a/app/lib/page/assets/index.dart b/app/lib/page/assets/index.dart index ee584dde8..4c413c492 100644 --- a/app/lib/page/assets/index.dart +++ b/app/lib/page/assets/index.dart @@ -256,15 +256,19 @@ class _AssetsViewState extends State { if (snapshot.hasData) { final hasPendingIssuance = snapshot.data!; + final store = widget.store; + if (hasPendingIssuance) { return SubmitButton( key: const Key(EWTestKeys.claimPendingDev), child: Text(l10n.issuancePending, textAlign: TextAlign.center), onPressed: (context) => submitClaimRewards( context, - widget.store, + store, webApi, + store.account.getKeyringAccount(store.account.currentAccountPubKey!), widget.store.encointer.chosenCid!, + txPaymentAsset: store.encointer.getTxPaymentAsset(store.encointer.chosenCid), ), ); } else { 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 d09e7c78a..f0a1f09fb 100644 --- a/app/lib/service/tx/lib/src/submit_tx_wrappers.dart +++ b/app/lib/service/tx/lib/src/submit_tx_wrappers.dart @@ -1,10 +1,5 @@ import 'dart:convert'; -import 'package:encointer_wallet/service/tx/lib/src/send_tx_dart.dart'; -import 'package:encointer_wallet/service/tx/lib/src/tx_builder.dart'; -import 'package:ew_keyring/ew_keyring.dart'; -import 'package:ew_polkadart/generated/encointer_kusama/types/sp_runtime/dispatch_error.dart'; -import 'package:ew_test_keys/ew_test_keys.dart'; import 'package:flutter/cupertino.dart'; import 'package:provider/provider.dart'; @@ -20,6 +15,13 @@ import 'package:encointer_wallet/store/app.dart'; import 'package:encointer_wallet/l10n/l10.dart'; import 'package:encointer_wallet/service/notification/lib/notification.dart'; import 'package:encointer_wallet/modules/login/logic/login_store.dart'; +import 'package:encointer_wallet/models/proof_of_attendance/proof_of_attendance.dart'; +import 'package:encointer_wallet/service/tx/lib/src/send_tx_dart.dart'; +import 'package:encointer_wallet/service/tx/lib/src/tx_builder.dart'; +import 'package:ew_keyring/ew_keyring.dart'; +import 'package:ew_polkadart/generated/encointer_kusama/types/sp_runtime/dispatch_error.dart'; +import 'package:ew_polkadart/generated/encointer_kusama/types/tuples_1.dart'; +import 'package:ew_test_keys/ew_test_keys.dart'; /// Helpers to submit transactions. @@ -56,14 +58,24 @@ Future submitClaimRewards( BuildContext context, AppStore store, Api api, - CommunityIdentifier chosenCid, -) async { - final txParams = claimRewardsParams(chosenCid, context.l10n); + KeyringAccount signer, + CommunityIdentifier chosenCid, { + required CommunityIdentifier? txPaymentAsset, +}) async { + // meetupIndex = null; the chain will figure out the meetup index. + final call = api.encointer.encointerKusama.tx.encointerCeremonies.claimRewards(cid: chosenCid.toPolkadart()); + final xt = await TxBuilder(api.provider).createSignedExtrinsic( + signer.pair, + call, + paymentAsset: txPaymentAsset?.toPolkadart(), + ); + return submitTx( context, store, api, - txParams, + OpaqueExtrinsic(xt), + TxNotification.claimRewards(context.l10n), onFinish: (BuildContext txPageContext, ExtrinsicReport report) { // Claiming the rewards creates a new reputation if successful. // Hence, we should update the state afterwards. @@ -105,17 +117,35 @@ Future submitEndorseNewcomer( ); } -Future submitUnRegisterParticipant(BuildContext context, AppStore store, Api api) { - final lastProofOfAttendance = store.encointer.communityAccount?.participantType?.isReputable ?? false - ? store.encointer.account - ?.lastProofOfAttendance // can still be null if the participant did not register on the same phone. - : null; +Future submitUnRegisterParticipant( + BuildContext context, + AppStore store, + Api api, + KeyringAccount signer, + CommunityIdentifier chosenCid, { + required ProofOfAttendance? lastProofOfAttendance, + required CommunityIdentifier? txPaymentAsset, +}) async { + final call = api.encointer.encointerKusama.tx.encointerCeremonies.unregisterParticipant( + cid: chosenCid.toPolkadart(), + maybeReputationCommunityCeremony: Tuple2( + lastProofOfAttendance?.communityIdentifier.toPolkadart(), + lastProofOfAttendance?.ceremonyIndex, + ), + ); + + final xt = await TxBuilder(api.provider).createSignedExtrinsic( + signer.pair, + call, + paymentAsset: txPaymentAsset?.toPolkadart(), + ); return submitTx( context, store, webApi, - unregisterParticipantParams(store.encointer.chosenCid!, lastProofOfAttendance, context.l10n), + OpaqueExtrinsic(xt), + TxNotification.unregisterParticipant(context.l10n), onFinish: (BuildContext txPageContext, ExtrinsicReport report) async { await Future.wait([ webApi.encointer.getReputations(), From 68050363927029b40de9a4f8b4718e087f40e983 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Mon, 29 Jan 2024 12:36:55 +0100 Subject: [PATCH 20/35] [service/tx] `submitRegisterParticipant` now uses the new way --- .../ceremony_box/ceremony_box.dart | 9 ++++++- .../encointer/encointer_api.dart | 6 +++-- .../tx/lib/src/submit_tx_wrappers.dart | 25 ++++++++++++++++--- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/app/lib/page-encointer/ceremony_box/ceremony_box.dart b/app/lib/page-encointer/ceremony_box/ceremony_box.dart index ddcc5540d..a4ea4e92b 100644 --- a/app/lib/page-encointer/ceremony_box/ceremony_box.dart +++ b/app/lib/page-encointer/ceremony_box/ceremony_box.dart @@ -77,7 +77,14 @@ class CeremonyBox extends StatelessWidget { if (store.dataUpdate.expired) { await awaitDataUpdateWithDialog(context, store); } - await submitRegisterParticipant(context, store, api); + await submitRegisterParticipant( + context, + store, + api, + store.account.getKeyringAccount(store.account.currentAccountPubKey!), + store.encointer.chosenCid!, + txPaymentAsset: store.encointer.getTxPaymentAsset(store.encointer.chosenCid), + ); }), ), if (store.encointer.showRestartCeremonyButton) diff --git a/app/lib/service/substrate_api/encointer/encointer_api.dart b/app/lib/service/substrate_api/encointer/encointer_api.dart index b8f6dc6ab..3a3528006 100644 --- a/app/lib/service/substrate_api/encointer/encointer_api.dart +++ b/app/lib/service/substrate_api/encointer/encointer_api.dart @@ -12,7 +12,6 @@ import 'package:encointer_wallet/models/communities/community_identifier.dart'; import 'package:encointer_wallet/models/communities/community_metadata.dart'; import 'package:encointer_wallet/models/encointer_balance_data/balance_entry.dart'; import 'package:encointer_wallet/models/index.dart'; -import 'package:encointer_wallet/models/proof_of_attendance/proof_of_attendance.dart'; import 'package:encointer_wallet/models/bazaar/businesses.dart'; import 'package:encointer_wallet/models/bazaar/ipfs_product.dart'; import 'package:encointer_wallet/models/bazaar/item_offered.dart'; @@ -26,6 +25,7 @@ import 'package:encointer_wallet/store/app.dart'; import 'package:ew_encointer_utils/ew_encointer_utils.dart' as ew_utils; import 'package:ew_http/ew_http.dart'; import 'package:ew_keyring/ew_keyring.dart'; +import 'package:ew_polkadart/encointer_types.dart' show ProofOfAttendance; import 'package:ew_polkadart/ew_polkadart.dart' show BlockHash, Tuple2, StorageChangeSet, SequenceCodec, EncointerKusama, ByteInput; import 'package:ew_polkadart/generated/encointer_kusama/types/sp_core/crypto/account_id32.dart'; import 'package:ew_primitives/ew_primitives.dart'; @@ -592,6 +592,8 @@ class EncointerApi { /// Gets a proof of attendance for the oldest attended ceremony, if available. /// /// returns null, if none available. + /// + /// Note: this returns the polkadart generated type. ProofOfAttendance? getProofOfAttendance() { final pubKey = store.account.currentAccountPubKey; final cIndex = store.encointer.account?.ceremonyIndexForNextProofOfAttendance; @@ -611,7 +613,7 @@ class EncointerApi { ); Log.d('Proof: ${proof.toJson()}', 'EncointerApi'); - return ProofOfAttendance.fromPolkadart(proof); + return proof; } Future getNumberOfNewbieTicketsForReputable({BlockHash? at}) async { 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 f0a1f09fb..79f74a674 100644 --- a/app/lib/service/tx/lib/src/submit_tx_wrappers.dart +++ b/app/lib/service/tx/lib/src/submit_tx_wrappers.dart @@ -162,16 +162,35 @@ Future submitUnRegisterParticipant( ); } -Future submitRegisterParticipant(BuildContext context, AppStore store, Api api) async { +Future submitRegisterParticipant( + BuildContext context, + AppStore store, + Api api, + KeyringAccount signer, + CommunityIdentifier chosenCid, { + required CommunityIdentifier? txPaymentAsset, +}) async { final proof = api.encointer.getProofOfAttendance(); + final call = api.encointer.encointerKusama.tx.encointerCeremonies.registerParticipant( + cid: chosenCid.toPolkadart(), + proof: proof, + ); + + final xt = await TxBuilder(api.provider).createSignedExtrinsic( + signer.pair, + call, + paymentAsset: txPaymentAsset?.toPolkadart(), + ); + return submitTx( context, store, api, - registerParticipantParams(store.encointer.chosenCid!, context.l10n, proof: proof), + OpaqueExtrinsic(xt), + TxNotification.registerParticipant(context.l10n), onFinish: (BuildContext txPageContext, ExtrinsicReport report) async { - store.encointer.account!.lastProofOfAttendance = proof; + store.encointer.account!.lastProofOfAttendance = (proof != null) ? ProofOfAttendance.fromPolkadart(proof) : null; final data = await webApi.encointer .getAggregatedAccountData(store.encointer.chosenCid!, store.account.currentAccountPubKey!, // Get data at included block to prevent race conditions with `store.chain.latestHead`. From 06c28ccbe42b8f18d8a97734ccdc0128f5ee7968 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Mon, 29 Jan 2024 12:50:08 +0100 Subject: [PATCH 21/35] [service/tx] `submitAttestAttendees` now uses the new way --- .../ceremony_box/ceremony_box.dart | 9 +++++- .../meetup/ceremony_step3_finish.dart | 9 +++++- .../profile/contacts/contact_detail_page.dart | 2 +- .../tx/lib/src/submit_tx_wrappers.dart | 30 ++++++++++++++----- 4 files changed, 40 insertions(+), 10 deletions(-) diff --git a/app/lib/page-encointer/ceremony_box/ceremony_box.dart b/app/lib/page-encointer/ceremony_box/ceremony_box.dart index a4ea4e92b..edd76b6be 100644 --- a/app/lib/page-encointer/ceremony_box/ceremony_box.dart +++ b/app/lib/page-encointer/ceremony_box/ceremony_box.dart @@ -124,7 +124,14 @@ class CeremonyBox extends StatelessWidget { Text(context.l10n.claimsSubmitN(store.encointer.communityAccount!.scannedAttendeesCount)), ], ), - onPressed: () => submitAttestClaims(context, store, api), + onPressed: () => submitAttestAttendees( + context, + store, + api, + store.account.getKeyringAccount(store.account.currentAccountPubKey!), + store.encointer.chosenCid!, + txPaymentAsset: store.encointer.getTxPaymentAsset(store.encointer.chosenCid), + ), ), ) ], diff --git a/app/lib/page-encointer/meetup/ceremony_step3_finish.dart b/app/lib/page-encointer/meetup/ceremony_step3_finish.dart index 625458fd3..02ff02ab1 100644 --- a/app/lib/page-encointer/meetup/ceremony_step3_finish.dart +++ b/app/lib/page-encointer/meetup/ceremony_step3_finish.dart @@ -90,7 +90,14 @@ class CeremonyStep3Finish extends StatelessWidget { Text(l10n.claimsSubmitN(store.encointer.communityAccount!.scannedAttendeesCount)), ], ), - onPressed: (context) => submitAttestClaims(context, store, api), + onPressed: (context) => submitAttestAttendees( + context, + store, + api, + store.account.getKeyringAccount(store.account.currentAccountPubKey!), + store.encointer.chosenCid!, + txPaymentAsset: store.encointer.getTxPaymentAsset(store.encointer.chosenCid), + ), ); } else { return Column( diff --git a/app/lib/page/profile/contacts/contact_detail_page.dart b/app/lib/page/profile/contacts/contact_detail_page.dart index 8d02907a3..06bb20cb2 100644 --- a/app/lib/page/profile/contacts/contact_detail_page.dart +++ b/app/lib/page/profile/contacts/contact_detail_page.dart @@ -297,7 +297,7 @@ class EndorseButton extends StatelessWidget { store.account.getKeyringAccount(store.account.currentAccountPubKey!), store.encointer.chosenCid!, address, - txPaymentAsset: store.encointer.getTxPaymentAsset(store.encointer.chosenCid) + txPaymentAsset: store.encointer.getTxPaymentAsset(store.encointer.chosenCid), ); } } 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 79f74a674..6f381890a 100644 --- a/app/lib/service/tx/lib/src/submit_tx_wrappers.dart +++ b/app/lib/service/tx/lib/src/submit_tx_wrappers.dart @@ -217,19 +217,35 @@ Future submitRegisterParticipant( ); } -Future submitAttestClaims(BuildContext context, AppStore store, Api api) async { - final params = attestAttendeesParams( - store.encointer.chosenCid!, - store.encointer.communityAccount!.participantCountVote!, - store.encointer.communityAccount!.attendees!.toList(), - context.l10n, +Future submitAttestAttendees( + BuildContext context, + AppStore store, + Api api, + KeyringAccount signer, + CommunityIdentifier chosenCid, { + required CommunityIdentifier? txPaymentAsset, +}) async { + final attestations = + store.encointer.communityAccount!.attendees!.map((address) => Address.decode(address).pubkey).toList(); + + final call = api.encointer.encointerKusama.tx.encointerCeremonies.attestAttendees( + cid: chosenCid.toPolkadart(), + numberOfParticipantsVote: store.encointer.communityAccount!.participantCountVote, + attestations: attestations, + ); + + final xt = await TxBuilder(api.provider).createSignedExtrinsic( + signer.pair, + call, + paymentAsset: txPaymentAsset?.toPolkadart(), ); return submitTx( context, store, api, - params, + OpaqueExtrinsic(xt), + TxNotification.attestAttendees(context.l10n), onFinish: (BuildContext txPageContext, ExtrinsicReport report) { store.encointer.communityAccount!.setMeetupCompleted(); Navigator.popUntil(txPageContext, (route) => route.isFirst); From d54a19ab645b998a6dc4da05340c33d7b407ea3f Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Mon, 29 Jan 2024 13:10:18 +0100 Subject: [PATCH 22/35] [service/tx] `submitFaucetDrip` now uses the new way --- .../profile/account/account_manage_page.dart | 6 ++--- .../profile/account/faucet_list_tile.dart | 22 +++++++++++++--- .../tx/lib/src/submit_tx_wrappers.dart | 26 ++++++++++++------- .../ew_keyring/lib/src/address_utils.dart | 9 +++++-- 4 files changed, 45 insertions(+), 18 deletions(-) diff --git a/app/lib/page/profile/account/account_manage_page.dart b/app/lib/page/profile/account/account_manage_page.dart index dd1247429..4f2318ec5 100644 --- a/app/lib/page/profile/account/account_manage_page.dart +++ b/app/lib/page/profile/account/account_manage_page.dart @@ -161,12 +161,12 @@ class _AccountManagePageState extends State { shrinkWrap: true, itemCount: faucets!.length, itemBuilder: (BuildContext context, int index) { - final faucetAccount = faucets!.keys.elementAt(index); + final faucetPubKeyHex = faucets!.keys.elementAt(index); return FaucetListTile( store, userAddress: addressSS58, - faucet: faucets![faucetAccount]!, - faucetAccount: faucetAccount, + faucet: faucets![faucetPubKeyHex]!, + faucetPubKey: faucetPubKeyHex, ); }, ) diff --git a/app/lib/page/profile/account/faucet_list_tile.dart b/app/lib/page/profile/account/faucet_list_tile.dart index 7cdaeec14..c7ac91bb4 100644 --- a/app/lib/page/profile/account/faucet_list_tile.dart +++ b/app/lib/page/profile/account/faucet_list_tile.dart @@ -17,14 +17,14 @@ class FaucetListTile extends StatefulWidget { this.store, { super.key, required this.userAddress, - required this.faucetAccount, + required this.faucetPubKey, required this.faucet, }); final AppStore store; final String userAddress; - final String faucetAccount; + final String faucetPubKey; final Faucet faucet; @override @@ -79,7 +79,11 @@ class _FaucetListTileState extends State { if (snapshot.data!.isNotEmpty) { return SubmitButtonSmall( onPressed: (context) async { - await _submitFaucetDripTxs(context, snapshot.data!, widget.faucetAccount); + await _submitFaucetDripTxs( + context, + snapshot.data!, + widget.faucetPubKey, + ); future = _getUncommittedReputationIds(widget.userAddress); nativeBalance = getNativeFreeBalance(widget.userAddress); setState(() {}); @@ -130,8 +134,18 @@ class _FaucetListTileState extends State { Map ids, String faucetAccount, ) async { + final store = widget.store; final e = ids.entries.first; - return submitFaucetDrip(context, widget.store, webApi, faucetAccount, e.value, e.key); + return submitFaucetDrip( + context, + store, + webApi, + store.account.getKeyringAccount(store.account.currentAccountPubKey!), + faucetAccount, + e.value, + e.key, + txPaymentAsset: store.encointer.getTxPaymentAsset(store.encointer.chosenCid), + ); } Future getNativeFreeBalance(String address) async { 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 6f381890a..7f76bc666 100644 --- a/app/lib/service/tx/lib/src/submit_tx_wrappers.dart +++ b/app/lib/service/tx/lib/src/submit_tx_wrappers.dart @@ -257,22 +257,30 @@ Future submitFaucetDrip( BuildContext context, AppStore store, Api api, - String faucetAccount, + KeyringAccount signer, + String faucetPubKey, CommunityIdentifier cid, - int cIndex, -) async { - final params = faucetDripParams( - faucetAccount, - cid, - cIndex, - context.l10n, + int cIndex, { + required CommunityIdentifier? txPaymentAsset, +}) async { + final call = api.encointer.encointerKusama.tx.encointerFaucet.drip( + faucetAccount: AddressUtils.pubKeyHexToPubKey(faucetPubKey).toList(), + cid: cid.toPolkadart(), + cindex: cIndex, + ); + + final xt = await TxBuilder(api.provider).createSignedExtrinsic( + signer.pair, + call, + paymentAsset: txPaymentAsset?.toPolkadart(), ); return submitTx( context, store, api, - params, + OpaqueExtrinsic(xt), + TxNotification.faucetDrip(context.l10n), ); } diff --git a/packages/ew_keyring/lib/src/address_utils.dart b/packages/ew_keyring/lib/src/address_utils.dart index 3454cd6d8..8353db093 100644 --- a/packages/ew_keyring/lib/src/address_utils.dart +++ b/packages/ew_keyring/lib/src/address_utils.dart @@ -18,8 +18,13 @@ abstract class AddressUtils { /// /// The default SS58 address prefix is 42. static String pubKeyHexToAddress(String pubKey, {int prefix = 42}) { - final pub = hex.decode(pubKey.replaceFirst('0x', '')); - return Address(prefix: prefix, pubkey: Uint8List.fromList(pub)).encode(); + final pub = pubKeyHexToPubKey(pubKey); + return Address(prefix: prefix, pubkey: pub).encode(); + } + + /// Transform a hex pubKey to its byte representation. + static Uint8List pubKeyHexToPubKey(String pubKey) { + return Uint8List.fromList(hex.decode(pubKey.replaceFirst('0x', ''))); } /// Decode an SS58 address to its public key. From 1a052d8fb1c4e9dae8cd08fd3221092bfc201962 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Mon, 29 Jan 2024 13:34:39 +0100 Subject: [PATCH 23/35] [service/tx] `submitEncointerBalance` uses now the dart way --- .../payment_confirmation_page/index.dart | 38 +++++++++++-------- .../tx/lib/src/submit_tx_wrappers.dart | 36 ++++++++++++++++++ 2 files changed, 58 insertions(+), 16 deletions(-) diff --git a/app/lib/page/assets/transfer/payment_confirmation_page/index.dart b/app/lib/page/assets/transfer/payment_confirmation_page/index.dart index 0124668d5..63a3702f5 100644 --- a/app/lib/page/assets/transfer/payment_confirmation_page/index.dart +++ b/app/lib/page/assets/transfer/payment_confirmation_page/index.dart @@ -64,8 +64,10 @@ class _PaymentConfirmationPageState extends State { final cid = params.cid; final recipientAccount = params.recipientAccount; final amount = params.amount; - final recipientAddress = - AddressUtils.pubKeyHexToAddress(recipientAccount.pubKey, prefix: store.settings.endpoint.ss58!); + final recipientAddress = Address( + pubkey: AddressUtils.pubKeyHexToPubKey(recipientAccount.pubKey), + prefix: store.settings.endpoint.ss58!, + ); return Scaffold( appBar: AppBar(title: Text(l10n.payment)), @@ -133,20 +135,28 @@ class _PaymentConfirmationPageState extends State { ); } - Future _submit(BuildContext context, CommunityIdentifier cid, String recipientAddress, double? amount) async { - final params = encointerBalanceTransferParams(cid, recipientAddress, amount, context.l10n); - - setState(() { - _transferState = TransferState.submitting; - }); - + Future _submit( + BuildContext context, + CommunityIdentifier cid, + Address recipientAddress, + double amount, + ) async { final pin = await context.read().getPin(context); if (pin != null) { - await submitTx( + setState(() { + _transferState = TransferState.submitting; + }); + + final store = context.read(); + await submitEncointerTransfer( context, - context.read(), + store, widget.api, - params, + store.account.getKeyringAccount(store.account.currentAccountPubKey!), + cid, + recipientAddress, + amount, + txPaymentAsset: store.encointer.getTxPaymentAsset(store.encointer.chosenCid), onFinish: onFinish, onError: onError, ); @@ -154,10 +164,6 @@ class _PaymentConfirmationPageState extends State { Log.d('TransferState after callback: $_transferState', 'PaymentConfirmationPage'); // trigger rebuild after state update in callback setState(() {}); - } else { - setState(() { - _transferState = TransferState.notStarted; - }); } } 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 7f76bc666..f3d448de0 100644 --- a/app/lib/service/tx/lib/src/submit_tx_wrappers.dart +++ b/app/lib/service/tx/lib/src/submit_tx_wrappers.dart @@ -22,6 +22,8 @@ import 'package:ew_keyring/ew_keyring.dart'; import 'package:ew_polkadart/generated/encointer_kusama/types/sp_runtime/dispatch_error.dart'; import 'package:ew_polkadart/generated/encointer_kusama/types/tuples_1.dart'; import 'package:ew_test_keys/ew_test_keys.dart'; +import 'package:ew_polkadart/generated/encointer_kusama/types/substrate_fixed/fixed_u128.dart'; +import 'package:ew_substrate_fixed/substrate_fixed.dart'; /// Helpers to submit transactions. @@ -284,6 +286,40 @@ Future submitFaucetDrip( ); } +Future submitEncointerTransfer( + BuildContext context, + AppStore store, + Api api, + KeyringAccount signer, + CommunityIdentifier cid, + Address recipientAddress, + double amount, { + required CommunityIdentifier? txPaymentAsset, + dynamic Function(BuildContext txPageContext, ExtrinsicReport report)? onFinish, + void Function(DispatchError report)? onError, +}) async { + final call = api.encointer.encointerKusama.tx.encointerBalances.transfer( + dest: recipientAddress.pubkey, + communityId: cid.toPolkadart(), + amount: FixedU128(bits: u64F64Util.toFixed(amount)), + ); + final xt = await TxBuilder(api.provider).createSignedExtrinsic( + signer.pair, + call, + paymentAsset: txPaymentAsset?.toPolkadart(), + ); + + await submitTx( + context, + context.read(), + api, + OpaqueExtrinsic(xt), + TxNotification.encointerBalanceTransfer(context.l10n), + onFinish: onFinish, + onError: onError, + ); +} + Future> submitReapVoucher( Api api, String voucherUri, From 6453ee60e76a8b0312b988ff863cedfb3b078755 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Mon, 29 Jan 2024 13:51:50 +0100 Subject: [PATCH 24/35] [service/tx] fix `submitEndorseNewcomer` type error --- .../profile/contacts/contact_detail_page.dart | 2 +- .../service/tx/lib/src/submit_tx_wrappers.dart | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/lib/page/profile/contacts/contact_detail_page.dart b/app/lib/page/profile/contacts/contact_detail_page.dart index 06bb20cb2..81b86d1d0 100644 --- a/app/lib/page/profile/contacts/contact_detail_page.dart +++ b/app/lib/page/profile/contacts/contact_detail_page.dart @@ -296,7 +296,7 @@ class EndorseButton extends StatelessWidget { api, store.account.getKeyringAccount(store.account.currentAccountPubKey!), store.encointer.chosenCid!, - address, + Address.decode(address), txPaymentAsset: store.encointer.getTxPaymentAsset(store.encointer.chosenCid), ); } 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 f3d448de0..fe3402b29 100644 --- a/app/lib/service/tx/lib/src/submit_tx_wrappers.dart +++ b/app/lib/service/tx/lib/src/submit_tx_wrappers.dart @@ -93,12 +93,12 @@ Future submitEndorseNewcomer( Api api, KeyringAccount signer, CommunityIdentifier chosenCid, - String newbie, { + Address newbie, { required CommunityIdentifier? txPaymentAsset, }) async { final call = api.encointer.encointerKusama.tx.encointerCeremonies.endorseNewcomer( cid: chosenCid.toPolkadart(), - newbie: newbie, + newbie: newbie.pubkey.toList(), ); final xt = await TxBuilder(api.provider).createSignedExtrinsic( signer.pair, @@ -128,12 +128,16 @@ Future submitUnRegisterParticipant( required ProofOfAttendance? lastProofOfAttendance, required CommunityIdentifier? txPaymentAsset, }) async { + final maybeReputationCommunityCeremony = (lastProofOfAttendance != null) + ? Tuple2( + lastProofOfAttendance.communityIdentifier.toPolkadart(), + lastProofOfAttendance.ceremonyIndex, + ) + : null; + final call = api.encointer.encointerKusama.tx.encointerCeremonies.unregisterParticipant( cid: chosenCid.toPolkadart(), - maybeReputationCommunityCeremony: Tuple2( - lastProofOfAttendance?.communityIdentifier.toPolkadart(), - lastProofOfAttendance?.ceremonyIndex, - ), + maybeReputationCommunityCeremony: maybeReputationCommunityCeremony, ); final xt = await TxBuilder(api.provider).createSignedExtrinsic( From d6d3412fcc8d74e5da3200dd97f3dd846f184dfd Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Mon, 29 Jan 2024 14:22:44 +0100 Subject: [PATCH 25/35] [service/tx] next phase sudo works --- app/lib/page/profile/index.dart | 4 +- .../tx/lib/src/submit_tx_wrappers.dart | 39 +++++++++++++++---- app/lib/service/tx/lib/src/tx_builder.dart | 23 +++++++++-- 3 files changed, 53 insertions(+), 13 deletions(-) diff --git a/app/lib/page/profile/index.dart b/app/lib/page/profile/index.dart index 74d0ce9d0..05f0d57c4 100644 --- a/app/lib/page/profile/index.dart +++ b/app/lib/page/profile/index.dart @@ -240,8 +240,8 @@ class _ProfileState extends State { Text('Next-Phase (only works for local dev-network)'), ], ), - onPressed: (_) async { - final res = await submitNextPhase(webApi); + onPressed: (BuildContext context) async { + final res = await submitNextPhaseWithAlice(context, store, webApi); RootSnackBar.showMsg(res.toString()); }, ), 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 fe3402b29..68a1135ea 100644 --- a/app/lib/service/tx/lib/src/submit_tx_wrappers.dart +++ b/app/lib/service/tx/lib/src/submit_tx_wrappers.dart @@ -324,6 +324,38 @@ Future submitEncointerTransfer( ); } +/// Calls `encointerScheduler.nextPhase()` with Alice. +/// +/// This will only work on the local dev-setup. +Future submitNextPhaseWithAlice(BuildContext context, AppStore store, Api api) async { + // This is valid for the encointer-node dev chain config. + // We currently don't have access to the dev nodes metadata + // so we hardcode the call. + const sudoNextPhaseCall = '0x05003c00'; + final alice = await KeyringAccount.fromUri('Alice', '//Alice'); + + final xt = await TxBuilder(api.provider).createSignedExtrinsicWithEncodedCall( + alice.pair, + sudoNextPhaseCall, + ); + + try { + return submitTx( + context, + store, + api, + OpaqueExtrinsic(xt), + const TxNotification(title: 'Submitting DEV xt', body: 'sudo.nextPhase() This will fail on a non-dev node'), + ); + } catch (e) { + // this will always throw an exception with the current implementation + // because we use the live systems metadata, which does not know the sudo + // pallet. + Log.p("sudo.nextPhase() threw an exception because we can't" + ' decode the the sudo event. This is expected.'); + } +} + Future> submitReapVoucher( Api api, String voucherUri, @@ -379,10 +411,3 @@ Map _getEducationalDialogTexts(ParticipantType type, BuildContex ParticipantType.Bootstrapper => {'title': l10n.bootstrapperTitle, 'content': l10n.bootstrapperContent}, }; } - -/// Calls `encointerScheduler.nextPhase()` with Alice. -/// -/// This will only work on the local dev-setup. -Future submitNextPhase(Api api) async { - return api.js.evalJavascript('encointer.sendNextPhaseTx()'); -} diff --git a/app/lib/service/tx/lib/src/tx_builder.dart b/app/lib/service/tx/lib/src/tx_builder.dart index ef79a1814..31ecb5a96 100644 --- a/app/lib/service/tx/lib/src/tx_builder.dart +++ b/app/lib/service/tx/lib/src/tx_builder.dart @@ -14,8 +14,20 @@ class TxBuilder { Sr25519KeyPair pair, RuntimeCall call, { CommunityIdentifier? paymentAsset, + }) async { + final encodedCall = hex.encode(call.encode()); + // print('encodedCall: $encodedCall'); + return createSignedExtrinsicWithEncodedCall(pair, encodedCall, paymentAsset: paymentAsset); + } + + /// Creates an extrinsic from an opaque call. + Future createSignedExtrinsicWithEncodedCall( + Sr25519KeyPair pair, + String encodedCall, { + CommunityIdentifier? paymentAsset, }) async { final encointerKusama = EncointerKusama(provider); + final call = encodedCall.replaceFirst('0x', ''); // fetch recent relevant data from chain final runtimeVersion = await _getRuntimeVersion(); @@ -30,11 +42,10 @@ class TxBuilder { // print('genesisHash: $genesisHash'); // print('accountInfo: $accountInfo'); - final encodedCall = hex.encode(call.encode()); - // print('encodedCall: $encodedCall'); + // print('encodedCall: call'); final payloadToSign = SigningPayload( - method: encodedCall, + method: call, specVersion: runtimeVersion.specVersion, transactionVersion: runtimeVersion.transactionVersion, genesisHash: genesisHash, @@ -52,7 +63,11 @@ class TxBuilder { final publicKey = hex.encode(pair.publicKey.bytes); final extrinsic = Extrinsic.withSigningPayload( - signer: publicKey, method: encodedCall, signature: hexSignature, payload: payloadToSign); + signer: publicKey, + method: call, + signature: hexSignature, + payload: payloadToSign, + ); return extrinsic.encode(encointerKusama.registry, SignatureType.sr25519); } From f8bb1d5ab656f2e940812a179e8d621f948713ae Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Mon, 29 Jan 2024 14:52:07 +0100 Subject: [PATCH 26/35] [service/tx] reap voucher uses now the dart way --- .../page/reap_voucher/reap_voucher_page.dart | 41 +++++++++++-------- .../service/substrate_api/account_api.dart | 4 +- .../service/tx/lib/src/submit_to_inner.dart | 2 +- .../tx/lib/src/submit_tx_wrappers.dart | 40 ++++++++++++++---- 4 files changed, 57 insertions(+), 30 deletions(-) diff --git a/app/lib/page/reap_voucher/reap_voucher_page.dart b/app/lib/page/reap_voucher/reap_voucher_page.dart index 0418347e2..cc1e66883 100644 --- a/app/lib/page/reap_voucher/reap_voucher_page.dart +++ b/app/lib/page/reap_voucher/reap_voucher_page.dart @@ -46,6 +46,7 @@ class ReapVoucherPage extends StatefulWidget { } class _ReapVoucherPageState extends State { + late KeyringAccount _voucherKeyringAccount; String? _voucherAddress; double? _voucherBalance; @@ -56,8 +57,8 @@ class _ReapVoucherPageState extends State { Log.d('Fetching voucher data...', 'ReapVoucherPage'); final store = context.read(); - final voucherPair = await KeyringAccount.fromUri('Voucher', voucherUri); - _voucherAddress = voucherPair.address(prefix: store.settings.endpoint.ss58 ?? 42).encode(); + _voucherKeyringAccount = await KeyringAccount.fromUri('Voucher', voucherUri); + _voucherAddress = _voucherKeyringAccount.address(prefix: store.settings.endpoint.ss58 ?? 42).encode(); setState(() {}); @@ -96,12 +97,12 @@ class _ReapVoucherPageState extends State { @override Widget build(BuildContext context) { final l10n = context.l10n; - final store = context.watch(); + final store = context.read(); final h2Grey = context.titleLarge.copyWith(color: AppColors.encointerGrey); final h4Grey = context.bodyLarge.copyWith(color: AppColors.encointerGrey); final voucher = widget.voucher; - final recipient = store.account.currentAddress; + final recipient = Address.decode(store.account.currentAddress); return Scaffold( appBar: AppBar(title: Text(l10n.voucher)), @@ -156,7 +157,7 @@ class _ReapVoucherPageState extends State { SubmitButton( key: const Key(EWTestKeys.submitVoucher), onPressed: _isReady - ? (context) => _submitReapVoucher(context, voucher.voucherUri, voucher.cid, recipient) + ? (context) => _submitReapVoucher(context, _voucherKeyringAccount, voucher.cid, recipient) : null, child: Row( mainAxisAlignment: MainAxisAlignment.center, @@ -175,24 +176,28 @@ class _ReapVoucherPageState extends State { Future _submitReapVoucher( BuildContext context, - String voucherUri, + KeyringAccount voucherKeyringAccount, CommunityIdentifier cid, - String recipientAddress, + Address recipientAddress, ) async { // Fixme, use proper threshold here: #589 if (_voucherBalance! < 0.04) return showRedeemFailedDialog(context, context.l10n.voucherBalanceTooLow); - final res = await submitReapVoucher(widget.api, voucherUri, recipientAddress, cid); - - if (res['hash'] == null) { - Log.d('Error redeeming voucher: ${res['error']}', 'ReapVoucherPage'); - await showRedeemFailedDialog(context, res['error'] as String?); - } else { - await VoucherDialogs.showRedeemSuccessDialog( - context: context, - onOK: () => Navigator.of(context).popUntil((route) => route.isFirst), - ); - } + await submitEncointerTransferAll( + context, context.read(), widget.api, voucherKeyringAccount, recipientAddress, cid, + // the voucher obviously has tokens in cid. + txPaymentAsset: cid, + onError: (report) async { + Log.d('Error redeeming voucher: ${report.toJson()}', 'ReapVoucherPage'); + await showRedeemFailedDialog(context, report.toJson().toString()); + }, + onFinish: (context, report) async { + await VoucherDialogs.showRedeemSuccessDialog( + context: context, + onOK: () => Navigator.of(context).popUntil((route) => route.isFirst), + ); + }, + ); } Future _changeNetworkAndCommunityIfNeeded( diff --git a/app/lib/service/substrate_api/account_api.dart b/app/lib/service/substrate_api/account_api.dart index 7289df4b0..c44397c56 100644 --- a/app/lib/service/substrate_api/account_api.dart +++ b/app/lib/service/substrate_api/account_api.dart @@ -54,12 +54,12 @@ class AccountApi { Future sendTxAndShowNotification( OpaqueExtrinsic xt, - TxNotification notification, { + TxNotification? notification, { String? cid, }) async { final report = await EWAuthorApi(provider).submitAndWatchExtrinsicWithReport(xt); - if (report.isExtrinsicSuccess) { + if (report.isExtrinsicSuccess && notification != null) { final hash = report.blockHash; unawaited(NotificationPlugin.showNotification( int.parse(hash.substring(0, 6)), diff --git a/app/lib/service/tx/lib/src/submit_to_inner.dart b/app/lib/service/tx/lib/src/submit_to_inner.dart index 838ad02b3..ae2724982 100644 --- a/app/lib/service/tx/lib/src/submit_to_inner.dart +++ b/app/lib/service/tx/lib/src/submit_to_inner.dart @@ -29,7 +29,7 @@ Future submitTxInner( AppStore store, Api api, OpaqueExtrinsic extrinsic, - TxNotification notification, + TxNotification? notification, bool showStatusSnackBar, { void Function(DispatchError error)? onError, dynamic Function(BuildContext, ExtrinsicReport)? onFinish, 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 68a1135ea..f29a912d2 100644 --- a/app/lib/service/tx/lib/src/submit_tx_wrappers.dart +++ b/app/lib/service/tx/lib/src/submit_tx_wrappers.dart @@ -1,5 +1,3 @@ -import 'dart:convert'; - import 'package:flutter/cupertino.dart'; import 'package:provider/provider.dart'; @@ -37,7 +35,7 @@ Future submitTx( AppStore store, Api api, OpaqueExtrinsic xt, - TxNotification notification, { + TxNotification? notification, { dynamic Function(BuildContext txPageContext, ExtrinsicReport report)? onFinish, void Function(DispatchError report)? onError, }) async { @@ -356,13 +354,37 @@ Future submitNextPhaseWithAlice(BuildContext context, AppStore store, A } } -Future> submitReapVoucher( +Future submitEncointerTransferAll( + BuildContext context, + AppStore store, Api api, - String voucherUri, - String recipientAddress, - CommunityIdentifier cid, -) async { - return api.js.evalJavascript('encointer.reapVoucher("$voucherUri","$recipientAddress", ${jsonEncode(cid)})'); + KeyringAccount signer, + Address recipientAddress, + CommunityIdentifier cid, { + required CommunityIdentifier? txPaymentAsset, + TxNotification? notification, + dynamic Function(BuildContext txPageContext, ExtrinsicReport report)? onFinish, + void Function(DispatchError report)? onError, +}) async { + final call = api.encointer.encointerKusama.tx.encointerBalances.transferAll( + dest: recipientAddress.pubkey, + cid: cid.toPolkadart(), + ); + final xt = await TxBuilder(api.provider).createSignedExtrinsic( + signer.pair, + call, + paymentAsset: txPaymentAsset?.toPolkadart(), + ); + + return submitTx( + context, + context.read(), + api, + OpaqueExtrinsic(xt), + notification, + onFinish: onFinish, + onError: onError, + ); } void _showEducationalDialog(ParticipantType registrationType, BuildContext context) { From bdc632f6332c23249a35cfe3887bc80670c739e1 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Mon, 29 Jan 2024 15:14:34 +0100 Subject: [PATCH 27/35] fmt --- app/lib/service/substrate_api/encointer/encointer_api.dart | 3 ++- app/test/service/tx/lib/send_tx_dart_test.dart | 4 ++-- packages/ew_polkadart/lib/encointer_types.dart | 3 ++- .../communities/community_identifier.dart | 1 - packages/ew_primitives/lib/src/type_extensions.dart | 2 +- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/lib/service/substrate_api/encointer/encointer_api.dart b/app/lib/service/substrate_api/encointer/encointer_api.dart index 3a3528006..b932ddadb 100644 --- a/app/lib/service/substrate_api/encointer/encointer_api.dart +++ b/app/lib/service/substrate_api/encointer/encointer_api.dart @@ -26,7 +26,8 @@ import 'package:ew_encointer_utils/ew_encointer_utils.dart' as ew_utils; import 'package:ew_http/ew_http.dart'; import 'package:ew_keyring/ew_keyring.dart'; import 'package:ew_polkadart/encointer_types.dart' show ProofOfAttendance; -import 'package:ew_polkadart/ew_polkadart.dart' show BlockHash, Tuple2, StorageChangeSet, SequenceCodec, EncointerKusama, ByteInput; +import 'package:ew_polkadart/ew_polkadart.dart' + show BlockHash, Tuple2, StorageChangeSet, SequenceCodec, EncointerKusama, ByteInput; import 'package:ew_polkadart/generated/encointer_kusama/types/sp_core/crypto/account_id32.dart'; import 'package:ew_primitives/ew_primitives.dart'; import 'package:ew_substrate_fixed/substrate_fixed.dart'; diff --git a/app/test/service/tx/lib/send_tx_dart_test.dart b/app/test/service/tx/lib/send_tx_dart_test.dart index 21f98ace1..6f34bd92e 100644 --- a/app/test/service/tx/lib/send_tx_dart_test.dart +++ b/app/test/service/tx/lib/send_tx_dart_test.dart @@ -1,6 +1,6 @@ // ignore_for_file: avoid_print -// @Skip('Skip these tests as they need a specific setup.') +@Skip('Skip these tests as they need a specific setup.') import 'dart:async'; import 'dart:convert'; @@ -34,7 +34,7 @@ void main() { final txBuilder = TxBuilder(provider); // mediterranean test community - final paymentAsset = CommunityIdentifier(geohash: utf8.encode('sqm1v'),digest: hex.decode('f08c911c')); + final paymentAsset = CommunityIdentifier(geohash: utf8.encode('sqm1v'), digest: hex.decode('f08c911c')); print('payment asset: ${paymentAsset.toJson()}'); final testCid = ew.CommunityIdentifier.fromPolkadart(paymentAsset); print('payment asset fmt: ${testCid.toFmtString()}'); diff --git a/packages/ew_polkadart/lib/encointer_types.dart b/packages/ew_polkadart/lib/encointer_types.dart index 477b13543..81feaea9f 100644 --- a/packages/ew_polkadart/lib/encointer_types.dart +++ b/packages/ew_polkadart/lib/encointer_types.dart @@ -1,7 +1,8 @@ /// Re-export well defined-types. // export primitive types -export 'generated/encointer_kusama/types/sp_runtime/multiaddress/multi_address.dart' show MultiAddress, Index, Id, Raw, Address32; +export 'generated/encointer_kusama/types/sp_runtime/multiaddress/multi_address.dart' + show MultiAddress, Index, Id, Raw, Address32; export 'generated/encointer_kusama/types/sp_runtime/multi_signature.dart' show MultiSignature, Sr25519; // export types from balances diff --git a/packages/ew_polkadart/lib/generated/encointer_kusama/types/encointer_primitives/communities/community_identifier.dart b/packages/ew_polkadart/lib/generated/encointer_kusama/types/encointer_primitives/communities/community_identifier.dart index 3f0400025..88462ed59 100644 --- a/packages/ew_polkadart/lib/generated/encointer_kusama/types/encointer_primitives/communities/community_identifier.dart +++ b/packages/ew_polkadart/lib/generated/encointer_kusama/types/encointer_primitives/communities/community_identifier.dart @@ -1,4 +1,3 @@ - // Todo: polkadart is not generic yet over the asset id. So we hardcoded our community identifier there. // Here we have to re-export that one for now. export 'package:polkadart/primitives/primitives.dart' show CommunityIdentifier; diff --git a/packages/ew_primitives/lib/src/type_extensions.dart b/packages/ew_primitives/lib/src/type_extensions.dart index f93bb6045..65de31d74 100644 --- a/packages/ew_primitives/lib/src/type_extensions.dart +++ b/packages/ew_primitives/lib/src/type_extensions.dart @@ -9,7 +9,7 @@ import 'package:ew_substrate_fixed/substrate_fixed.dart'; extension KeyringAccountMultiAddressExt on KeyringAccount { MultiAddress multiAddress() { - return MultiAddress.values.id(pubKey); + return MultiAddress.values.id(pubKey); } } From afd4b3234ec5d4450d3ae74ec96c0695a6286072 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Mon, 29 Jan 2024 15:19:00 +0100 Subject: [PATCH 28/35] [service/tx] remove unused showStatusSnackBar param --- .../service/tx/lib/src/submit_to_inner.dart | 37 +++---------------- .../tx/lib/src/submit_tx_wrappers.dart | 1 - 2 files changed, 5 insertions(+), 33 deletions(-) diff --git a/app/lib/service/tx/lib/src/submit_to_inner.dart b/app/lib/service/tx/lib/src/submit_to_inner.dart index ae2724982..6cc149c1f 100644 --- a/app/lib/service/tx/lib/src/submit_to_inner.dart +++ b/app/lib/service/tx/lib/src/submit_to_inner.dart @@ -3,7 +3,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:encointer_wallet/gen/assets.gen.dart'; import 'package:encointer_wallet/service/log/log_service.dart'; import 'package:encointer_wallet/service/substrate_api/api.dart'; import 'package:encointer_wallet/store/account/types/tx_status.dart'; @@ -29,8 +28,7 @@ Future submitTxInner( AppStore store, Api api, OpaqueExtrinsic extrinsic, - TxNotification? notification, - bool showStatusSnackBar, { + TxNotification? notification, { void Function(DispatchError error)? onError, dynamic Function(BuildContext, ExtrinsicReport)? onFinish, }) async { @@ -42,13 +40,6 @@ Future submitTxInner( final onTxFinishFn = onFinish ?? (_, __) => null; if (await api.isConnected()) { - if (showStatusSnackBar) { - _showTxStatusSnackBar( - getTxStatusTranslation(l10n, store.account.txStatus), - const CupertinoActivityIndicator(), - ); - } - try { final report = await api.account.sendTxAndShowNotification( extrinsic, @@ -57,16 +48,16 @@ Future submitTxInner( ); if (report.isExtrinsicFailed) { - _onTxError(store, showStatusSnackBar); + _onTxError(store); onError?.call(report.dispatchError!); final message = getLocalizedTxErrorMessage(l10n, report.dispatchError!); _showErrorDialog(context, message); } else { - _onTxFinish(context, store, report, onTxFinishFn, showStatusSnackBar); + _onTxFinish(context, store, report, onTxFinishFn); } } catch (e) { Log.e('Caught RPC error while sending extrinsics: $e'); - _onTxError(store, showStatusSnackBar); + _onTxError(store); var msg = ErrorNotificationMsg(title: l10n.transactionError, body: e.toString()); if (e.toString().contains(lowPriorityTx)) { msg = ErrorNotificationMsg(title: l10n.txTooLowPriorityErrorTitle, body: l10n.txTooLowPriorityErrorBody); @@ -87,9 +78,8 @@ Future submitTxInner( } } -void _onTxError(AppStore store, bool mounted) { +void _onTxError(AppStore store) { store.assets.setSubmitting(false); - if (mounted) RootSnackBar.removeCurrent(); } void _showErrorDialog(BuildContext context, ErrorNotificationMsg message) { @@ -135,28 +125,11 @@ void _onTxFinish( AppStore store, ExtrinsicReport report, void Function(BuildContext, ExtrinsicReport) onTxFinish, - bool mounted, ) { Log.d('callback triggered, blockHash: ${report.blockHash}', '_onTxFinish'); store.assets.setSubmitting(false); onTxFinish(context, report); - - if (mounted) { - RootSnackBar.show( - ListTile( - leading: SizedBox( - width: 24, - child: Assets.images.assets.success.image(), - ), - title: Text( - context.l10n.success, - style: const TextStyle(color: Colors.black54), - ), - ), - durationMillis: 2000, - ); - } } String getTxStatusTranslation(AppLocalizations l10n, TxStatus? status) { 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 f29a912d2..2733a0e68 100644 --- a/app/lib/service/tx/lib/src/submit_tx_wrappers.dart +++ b/app/lib/service/tx/lib/src/submit_tx_wrappers.dart @@ -47,7 +47,6 @@ Future submitTx( api, xt, notification, - false, onError: onError, onFinish: onFinish, ); From e3d8da90c63f2b02c0b609ba096cbd0bd819b4de Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Mon, 29 Jan 2024 16:01:07 +0100 Subject: [PATCH 29/35] [service/tx] remove dead `TxApi` --- app/lib/service/tx/lib/tx.dart | 78 +--------------------------------- 1 file changed, 2 insertions(+), 76 deletions(-) diff --git a/app/lib/service/tx/lib/tx.dart b/app/lib/service/tx/lib/tx.dart index e836f9eca..ea5b05413 100644 --- a/app/lib/service/tx/lib/tx.dart +++ b/app/lib/service/tx/lib/tx.dart @@ -1,79 +1,5 @@ -import 'package:convert/convert.dart'; -import 'package:encointer_wallet/service/substrate_api/core/reconnecting_ws_provider.dart'; -import 'package:ew_keyring/ew_keyring.dart'; -import 'package:ew_polkadart/ew_polkadart.dart'; -import 'package:ew_polkadart/runtime_call.dart'; - /// Contains all things about sending extrinsics. + +export 'src/tx_builder.dart'; export 'src/tx_notification.dart'; export 'src/submit_tx_wrappers.dart'; - -class TxApi { - TxApi(this.provider); - - final ReconnectingWsProvider provider; - - Future createSignedExtrinsic(Sr25519KeyPair pair, RuntimeCall call) async { - final encointerKusama = EncointerKusama(provider); - - // fetch recent relevant data from chain - final runtimeVersion = await _getRuntimeVersion(); - final blockNumber = await _getBlockNumber(); - final blockHash = await _getBlockHash(); - final genesisHash = await _getBlockHash(blockNumber: 0); - final accountInfo = await encointerKusama.query.system.account(pair.publicKey.bytes); - - final encodedCall = hex.encode(call.encode()); - - final payloadToSign = SigningPayload( - method: encodedCall, - specVersion: runtimeVersion.specVersion, - transactionVersion: runtimeVersion.transactionVersion, - genesisHash: genesisHash, - blockHash: blockHash, - blockNumber: blockNumber, - eraPeriod: 64, - nonce: accountInfo.nonce, - tip: 0, - ); - - final payload = payloadToSign.encode(encointerKusama.registry); - - final signature = pair.sign(payload); - final hexSignature = hex.encode(signature); - - final publicKey = hex.encode(pair.publicKey.bytes); - final extrinsic = Extrinsic( - signer: publicKey, - method: encodedCall, - signature: hexSignature, - eraPeriod: 64, - blockNumber: blockNumber, - nonce: 0, - tip: 0, - ); - - return extrinsic; - } - - Future _getRuntimeVersion() async { - final stateApi = StateApi(provider); - final runtimeVersion = await stateApi.getRuntimeVersion(); - return runtimeVersion; - } - - Future _getBlockHash({int? blockNumber}) async { - final params = blockNumber != null ? [blockNumber] : []; - final hash = (await provider.send('chain_getBlockHash', params)).result as String; - - return hash.replaceFirst('0x', ''); - } - - Future _getBlockNumber() async { - final block = await provider.send('chain_getBlock', []); - - // ignore: avoid_dynamic_calls - final blockNumber = int.parse(block.result['block']['header']['number'] as String); - return blockNumber; - } -} From b99b62836d2f8120b790a9fc78f3c3860c29ceaf Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Mon, 29 Jan 2024 16:01:35 +0100 Subject: [PATCH 30/35] [service/tx] remove obsolete todo --- app/lib/page/profile/contacts/contact_detail_page.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/lib/page/profile/contacts/contact_detail_page.dart b/app/lib/page/profile/contacts/contact_detail_page.dart index 81b86d1d0..dd9de5e87 100644 --- a/app/lib/page/profile/contacts/contact_detail_page.dart +++ b/app/lib/page/profile/contacts/contact_detail_page.dart @@ -283,8 +283,6 @@ class EndorseButton extends StatelessWidget { final l10n = context.l10n; final address = AddressUtils.pubKeyHexToAddress(contact.pubKey, prefix: store.settings.endpoint.ss58!); - // Todo: enforce chosen cid - if (bootstrappers != null && bootstrappers.contains(address)) { await _popupDialog(context, l10n.cantEndorseBootstrapper); } else if (store.encointer.currentPhase != CeremonyPhase.Registering) { From 65f8ac5f5261d1e38539310fc3c07d7008b90b69 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Mon, 29 Jan 2024 20:01:38 +0100 Subject: [PATCH 31/35] [service/tx] better error handling --- app/lib/service/tx/lib/src/send_tx_dart.dart | 9 ++++++++- .../service/tx/lib/src/submit_tx_wrappers.dart | 15 +++++---------- 2 files changed, 13 insertions(+), 11 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 25652ef0f..43e75a917 100644 --- a/app/lib/service/tx/lib/src/send_tx_dart.dart +++ b/app/lib/service/tx/lib/src/send_tx_dart.dart @@ -136,7 +136,14 @@ class EWAuthorApi

{ final kusama = EncointerKusama(_provider); - final events = await kusama.query.system.events(at: blockHash); + var events = []; + try { + events = await kusama.query.system.events(at: blockHash); + } catch (err) { + Log.e("Couldn't decode events: $err"); + rethrow; + } + final block = await ChainApi(_provider).getBlock(at: blockHash); final timestamp = await kusama.query.timestamp.now(at: blockHash); 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 2733a0e68..2ca24ed4d 100644 --- a/app/lib/service/tx/lib/src/submit_tx_wrappers.dart +++ b/app/lib/service/tx/lib/src/submit_tx_wrappers.dart @@ -337,19 +337,14 @@ Future submitNextPhaseWithAlice(BuildContext context, AppStore store, A ); try { - return submitTx( - context, - store, - api, - OpaqueExtrinsic(xt), - const TxNotification(title: 'Submitting DEV xt', body: 'sudo.nextPhase() This will fail on a non-dev node'), - ); + await EWAuthorApi(api.provider).submitAndWatchExtrinsicWithReport(OpaqueExtrinsic(xt)); + // this is actually unexpected, see exception case below. + return 'successfully called next phase'; } catch (e) { // this will always throw an exception with the current implementation - // because we use the live systems metadata, which does not know the sudo + // because we use the kusama metadata, which does not know the sudo // pallet. - Log.p("sudo.nextPhase() threw an exception because we can't" - ' decode the the sudo event. This is expected.'); + Log.p('sudo.nextPhase() threw an exception, decoding error is expected though: $e'); } } From 79782ac9f36cc629a144df001a44194f8afed804 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Mon, 29 Jan 2024 20:38:38 +0100 Subject: [PATCH 32/35] [service/tx] extract `getExtrinsicReport` from the extrinsic callback --- app/lib/service/tx/lib/src/send_tx_dart.dart | 72 ++++++++++--------- .../tx/lib/src/submit_tx_wrappers.dart | 1 + 2 files changed, 41 insertions(+), 32 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 43e75a917..56d91150b 100644 --- a/app/lib/service/tx/lib/src/send_tx_dart.dart +++ b/app/lib/service/tx/lib/src/send_tx_dart.dart @@ -112,6 +112,9 @@ class EWAuthorApi

{ /// Submit a fully formatted extrinsic and return a subscription /// which emits txStatus updates. + /// + /// Note: be careful with exceptions in `onData` catching fails sometimes + /// for an unidentified reason. Future> submitAndWatchExtrinsic( OpaqueExtrinsic extrinsic, dynamic Function(ExtrinsicStatus) onData, @@ -120,10 +123,8 @@ class EWAuthorApi

{ } Future submitAndWatchExtrinsicWithReport(OpaqueExtrinsic extrinsic) async { - final hash = extrinsic.hash; - final completer = Completer(); - ExtrinsicReport? report; + String? blockHashHex; final sub = await submitAndWatchExtrinsic(extrinsic, (xtUpdate) async { Log.d('ExtrinsicUpdate: ${xtUpdate.type}'); @@ -131,44 +132,51 @@ class EWAuthorApi

{ if (xtUpdate.type == 'ready') { Log.p('Xt is ready'); } else if (xtUpdate.type == 'inBlock' || xtUpdate.type == 'finalized') { - final blockHashHex = xtUpdate.value.toString(); - final blockHash = hexToUint8(blockHashHex); + blockHashHex = xtUpdate.value.toString(); + completer.complete(); + } + }); - final kusama = EncointerKusama(_provider); + await completer.future; + await sub.cancel(); + return getExtrinsicReportData(extrinsic, blockHashHex!); + } - var events = []; - try { - events = await kusama.query.system.events(at: blockHash); - } catch (err) { - Log.e("Couldn't decode events: $err"); - rethrow; - } + Future getExtrinsicReportData(OpaqueExtrinsic extrinsic, String blockHashHex) async { + final hash = extrinsic.hash; + final blockHash = hexToUint8(blockHashHex); - final block = await ChainApi(_provider).getBlock(at: blockHash); - final timestamp = await kusama.query.timestamp.now(at: blockHash); + final kusama = EncointerKusama(_provider); - // ignore: avoid_dynamic_calls - final xts = List.from(block['block']['extrinsics'] as List); - final xtIndex = xts.indexWhere((xt) => xtHash(xt) == hash); + var events = []; + try { + events = await kusama.query.system.events(at: blockHash); + } catch (err) { + throw Exception(["Couldn't decode events: $err"]); + } - if (xtIndex != -1) { - Log.d('found xt in block at index: $xtIndex'); - } else { - throw Exception(["Couldn't find extrinsic hash: $hash in block with hash: $blockHashHex"]); - } + final block = await ChainApi(_provider).getBlock(at: blockHash); + final timestamp = await kusama.query.timestamp.now(at: blockHash); - final xtEvents = - events.where((e) => e.phase is ApplyExtrinsic && (e.phase as ApplyExtrinsic).value0 == xtIndex).toList(); + // ignore: avoid_dynamic_calls + final xts = List.from(block['block']['extrinsics'] as List); + final xtIndex = xts.indexWhere((xt) => xtHash(xt) == hash); - report = ExtrinsicReport(extrinsicHash: hash, blockHash: blockHashHex, timestamp: timestamp, events: xtEvents); + if (xtIndex != -1) { + Log.d('found xt in block at index: $xtIndex'); + } else { + throw Exception(["Couldn't find extrinsic hash: $hash in block with hash: $blockHashHex"]); + } - completer.complete(); - } - }); + final xtEvents = + events.where((e) => e.phase is ApplyExtrinsic && (e.phase as ApplyExtrinsic).value0 == xtIndex).toList(); - await completer.future; - await sub.cancel(); - return report!; + return ExtrinsicReport( + extrinsicHash: hash, + blockHash: blockHashHex, + timestamp: timestamp, + events: xtEvents, + ); } } 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 2ca24ed4d..49aa3fcf2 100644 --- a/app/lib/service/tx/lib/src/submit_tx_wrappers.dart +++ b/app/lib/service/tx/lib/src/submit_tx_wrappers.dart @@ -345,6 +345,7 @@ Future submitNextPhaseWithAlice(BuildContext context, AppStore store, A // because we use the kusama metadata, which does not know the sudo // pallet. Log.p('sudo.nextPhase() threw an exception, decoding error is expected though: $e'); + return "called next phase, but can't evaluate result"; } } From 12f74f7d4a27f3561dc0c208ff15f0d70700b23b Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Mon, 29 Jan 2024 20:40:43 +0100 Subject: [PATCH 33/35] [service/tx] added issue number for catching exception in extrinsic callback --- app/lib/service/tx/lib/src/send_tx_dart.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 56d91150b..581b6295f 100644 --- a/app/lib/service/tx/lib/src/send_tx_dart.dart +++ b/app/lib/service/tx/lib/src/send_tx_dart.dart @@ -114,7 +114,7 @@ class EWAuthorApi

{ /// which emits txStatus updates. /// /// Note: be careful with exceptions in `onData` catching fails sometimes - /// for an unidentified reason. + /// for an unidentified reason #1628. Future> submitAndWatchExtrinsic( OpaqueExtrinsic extrinsic, dynamic Function(ExtrinsicStatus) onData, From 401051d9965addacd716d9587c4e70555437e568 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Mon, 29 Jan 2024 20:51:01 +0100 Subject: [PATCH 34/35] [service/tx] fix punctuation in doc --- app/lib/service/tx/lib/src/send_tx_dart.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 581b6295f..6725bf57f 100644 --- a/app/lib/service/tx/lib/src/send_tx_dart.dart +++ b/app/lib/service/tx/lib/src/send_tx_dart.dart @@ -113,7 +113,7 @@ class EWAuthorApi

{ /// Submit a fully formatted extrinsic and return a subscription /// which emits txStatus updates. /// - /// Note: be careful with exceptions in `onData` catching fails sometimes + /// Note: be careful with exceptions in `onData`; catching fails sometimes /// for an unidentified reason #1628. Future> submitAndWatchExtrinsic( OpaqueExtrinsic extrinsic, From f37976d27027593b03f205eb3e6b58dbaa4ecb20 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Mon, 29 Jan 2024 20:51:17 +0100 Subject: [PATCH 35/35] [service/tx] fix conflicting tuple implementation --- app/lib/service/tx/lib/src/submit_tx_wrappers.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 49aa3fcf2..d1f96a5c4 100644 --- a/app/lib/service/tx/lib/src/submit_tx_wrappers.dart +++ b/app/lib/service/tx/lib/src/submit_tx_wrappers.dart @@ -18,7 +18,7 @@ import 'package:encointer_wallet/service/tx/lib/src/send_tx_dart.dart'; import 'package:encointer_wallet/service/tx/lib/src/tx_builder.dart'; import 'package:ew_keyring/ew_keyring.dart'; import 'package:ew_polkadart/generated/encointer_kusama/types/sp_runtime/dispatch_error.dart'; -import 'package:ew_polkadart/generated/encointer_kusama/types/tuples_1.dart'; +import 'package:ew_polkadart/generated/encointer_kusama/types/tuples.dart'; import 'package:ew_test_keys/ew_test_keys.dart'; import 'package:ew_polkadart/generated/encointer_kusama/types/substrate_fixed/fixed_u128.dart'; import 'package:ew_substrate_fixed/substrate_fixed.dart';