Newer
Older
import 'dart:io';
import 'package:crypto/crypto.dart';
import 'package:fast_base58/fast_base58.dart';
import 'package:flutter/material.dart';
import 'package:polkawallet_sdk/api/types/networkParams.dart';
import 'package:polkawallet_sdk/api/types/txInfoData.dart';
import 'package:polkawallet_sdk/polkawallet_sdk.dart';
import 'package:polkawallet_sdk/storage/keyring.dart';
class SubstrateSdk with ChangeNotifier {
final List subNode = ['127.0.0.1:9944', '192.168.1.85:9944'];
final bool isSsl = false;
final WalletSDK sdk = WalletSDK();
final Keyring keyring = Keyring();
bool sdkReady = false;
bool nodeConnected = false;
int blocNumber = 0;
TextEditingController jsonKeystore = TextEditingController();
TextEditingController keystorePassword = TextEditingController();
Future<void> initApi() async {
await sdk.init(keyring);
sdkReady = true;
notifyListeners();
}
Future<void> connectNode() async {
final String socketKind = isSsl ? 'wss' : 'ws';
List<NetworkParams> node = [];
for (final sn in subNode) {
final n = NetworkParams();
n.name = 'duniter';
n.endpoint = '$socketKind://$sn';
n.ss58 = ss58;
node.add(n);
}
final res = await sdk.api.connectNode(keyring, node).timeout(
const Duration(seconds: 10),
onTimeout: () => null,
);
if (res != null) {
nodeConnected = true;
notifyListeners();
}
// Subscribe bloc number
sdk.api.setting.subscribeBestNumber((res) {
blocNumber = int.parse(res.toString());
notifyListeners();
});
}
Future<bool> importAccount({bool fromMnemonic = false}) async {
final KeyType keytype;
final String keyToImport;
if (fromMnemonic) {
keytype = KeyType.mnemonic;
keyToImport = generatedMnemonic;
} else {
keytype = KeyType.keystore;
keyToImport = jsonKeystore.text.replaceAll("'", "\\'");
}
importIsLoading = true;
notifyListeners();
final clipboardData = await Clipboard.getData(Clipboard.kTextPlain);
if (clipboardData?.text != null) jsonKeystore.text = clipboardData!.text!;
final json = await sdk.api.keyring
.importAccount(
)
.catchError((e) {
importIsLoading = false;
notifyListeners();
});
if (json == null) return false;
try {
final acc = await sdk.api.keyring.addAccount(
keyring,
keyType: KeyType.mnemonic,
acc: json,
password: keystorePassword.text,
);
Clipboard.setData(ClipboardData(text: jsonEncode(acc.toJson())));
} catch (e) {
await Future.delayed(const Duration(milliseconds: 20));
Future<List<AddressInfo>> getKeyStoreAddress() async {
List<AddressInfo> result = [];
// sdk.api.account.unsubscribeBalance();
for (var element in keyring.allAccounts) {
// Clipboard.setData(ClipboardData(text: jsonEncode(element)));
final account = AddressInfo(address: element.address);
// await sdk.api.account.subscribeBalance(element.address, (p0) {
// account.balance = int.parse(p0.freeBalance) / 100;
// });
// sdk.api.setting.unsubscribeBestNumber();
if (nodeConnected) {
final brutBalance = await sdk.api.account.queryBalance(element.address);
account.balance = int.parse(brutBalance!.freeBalance) / 100;
}
result.add(account);
Future<void> deleteAllAccounts() async {
for (var account in keyring.allAccounts) {
await sdk.api.keyring.deleteAccount(keyring, account);
}
}
Future<bool> generateMnemonic() async {
final gen = await sdk.api.keyring.generateMnemonic(ss58);
final res = await importAccount(fromMnemonic: true);
return res;
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
pay(BuildContext context, String address, double amount,
String password) async {
final sender = TxSenderData(
keyring.current.address,
keyring.current.pubKey,
);
final txInfo = TxInfoData('balances', 'transfer', sender);
try {
final hash = await sdk.api.tx.signAndSend(
txInfo,
[address, amount * 100],
password,
onStatusChange: (status) {
print('status: ' + status);
if (status == 'Ready') {
snack(context, 'Paiement effectué avec succès !');
}
},
);
print(hash.toString());
} catch (err) {
print(err.toString());
}
}
}
void snack(BuildContext context, String message, {int duration = 2}) {
final snackBar =
SnackBar(content: Text(message), duration: Duration(seconds: duration));
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
class AddressInfo {
final String? address;
double balance;
AddressInfo({@required this.address, this.balance = 0});
}
String getShortPubkey(String pubkey) {
List<int> pubkeyByte = Base58Decode(pubkey);
Digest pubkeyS256 = sha256.convert(sha256.convert(pubkeyByte).bytes);
String pubkeyCheksum = Base58Encode(pubkeyS256.bytes);
String pubkeyChecksumShort =
truncate(pubkeyCheksum, 3, omission: "", position: TruncatePosition.end);
String pubkeyShort = truncate(pubkey, 5,
omission: String.fromCharCode(0x2026),
position: TruncatePosition.end) +
truncate(pubkey, 4, omission: "", position: TruncatePosition.start) +
':$pubkeyChecksumShort';
return pubkeyShort;