203 lines
6.1 KiB
Dart
203 lines
6.1 KiB
Dart
import 'dart:math';
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/services.dart';
|
|
import 'package:http/http.dart' as http;
|
|
import 'dart:convert';
|
|
import 'package:flutter_bitcoin/flutter_bitcoin.dart';
|
|
import 'package:bip39/bip39.dart' as bip39;
|
|
import 'package:bip32/bip32.dart' as bip32;
|
|
import 'package:crypto/crypto.dart';
|
|
import 'dart:typed_data';
|
|
import 'package:firewallet/hns.dart' as hns;
|
|
|
|
class SendPage extends StatefulWidget {
|
|
SendPage({Key? key, required this.uuid, required this.wallet})
|
|
: super(key: key);
|
|
|
|
final String uuid;
|
|
String wallet;
|
|
|
|
@override
|
|
_SendPageState createState() => _SendPageState();
|
|
}
|
|
|
|
class _SendPageState extends State<SendPage> {
|
|
late double walletBalance = 0;
|
|
bool balanceLoaded = false;
|
|
final TextEditingController addressController = TextEditingController();
|
|
final TextEditingController amountController = TextEditingController();
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
// Dispose of the controllers when the widget is disposed
|
|
addressController.dispose();
|
|
amountController.dispose();
|
|
super.dispose();
|
|
}
|
|
|
|
Future<void> fetchWalletBalance() async {
|
|
if (widget.wallet.isEmpty) {
|
|
walletBalance = 0;
|
|
return;
|
|
}
|
|
|
|
if (balanceLoaded) {
|
|
return;
|
|
}
|
|
|
|
final response = await http.get(Uri.parse(
|
|
'https://api.firewallet.au/wallet/balance?uuid=${widget.uuid}&name=${widget.wallet}'));
|
|
if (response.statusCode == 200) {
|
|
final data = jsonDecode(response.body);
|
|
print(data);
|
|
|
|
setState(() {
|
|
walletBalance = data['available'];
|
|
});
|
|
} else {
|
|
// Handle error
|
|
print('Failed to load wallet balance');
|
|
}
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
appBar: AppBar(
|
|
title: Text('${widget.wallet} - Send HNS'),
|
|
),
|
|
// Get wallet list from api and display here
|
|
body: Center(
|
|
child: LayoutBuilder(
|
|
builder: (BuildContext context, BoxConstraints constraints) {
|
|
return ListView(
|
|
padding: const EdgeInsets.all(16),
|
|
children: <Widget>[
|
|
// Display the wallet balance
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
Text(
|
|
'Max ${(walletBalance - 0.02).toStringAsFixed(2)} HNS'),
|
|
TextButton(
|
|
onPressed: fetchWalletBalance,
|
|
child: const Icon(Icons.refresh)),
|
|
],
|
|
),
|
|
// Address input field
|
|
TextField(
|
|
decoration: const InputDecoration(
|
|
border: OutlineInputBorder(),
|
|
labelText: 'Address',
|
|
),
|
|
keyboardType: TextInputType.text,
|
|
inputFormatters: [
|
|
FilteringTextInputFormatter.allow(RegExp(r'[a-zA-Z0-9]')),
|
|
],
|
|
controller: addressController,
|
|
),
|
|
SizedBox(height: 16),
|
|
// Amount input field
|
|
TextField(
|
|
decoration: const InputDecoration(
|
|
border: OutlineInputBorder(),
|
|
labelText: 'Amount',
|
|
suffix: Text('HNS'),
|
|
),
|
|
keyboardType: TextInputType.number,
|
|
inputFormatters: [
|
|
FilteringTextInputFormatter.allow(RegExp(r'[0-9.]')),
|
|
],
|
|
controller: amountController,
|
|
),
|
|
TextButton(
|
|
onPressed: () => amountController.text =
|
|
(walletBalance - 0.02).toStringAsFixed(2),
|
|
child: const Text('Max')),
|
|
SizedBox(height: 16),
|
|
// Send button
|
|
ElevatedButton(
|
|
onPressed: sendHNS,
|
|
child: const Text('Send'),
|
|
),
|
|
],
|
|
);
|
|
},
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
void sendHNS() {
|
|
// Send HNS to the address
|
|
String toAddress = addressController.text;
|
|
double amount = double.parse(amountController.text);
|
|
print('Send $amount HNS to $toAddress');
|
|
if (amount > (walletBalance - 0.01)) {
|
|
// Not enough balance
|
|
ScaffoldMessenger.of(context).showSnackBar(
|
|
const SnackBar(
|
|
content: Text('Not enough balance'),
|
|
),
|
|
);
|
|
return;
|
|
}
|
|
bool sendMax = false;
|
|
if (amount >= (walletBalance - 0.02)) {
|
|
sendMax = true;
|
|
}
|
|
|
|
print(sendMax);
|
|
// https://api.firewallet.au/wallet/send?uuid=99879737-0c27-497b-b357-f75720feb32e&name=hot&address=hs1qca9n20ew7ph6l5galfnftmwme6kwmu26mzjgtx&amount=2
|
|
http
|
|
.post(
|
|
Uri.parse(
|
|
'https://api.firewallet.au/wallet/send?uuid=${widget.uuid}&name=${widget.wallet}&address=$toAddress&amount=$amount'),
|
|
headers: <String, String>{
|
|
'Content-Type': 'application/json; charset=UTF-8',
|
|
},
|
|
body: '{}',
|
|
)
|
|
.then((response) {
|
|
if (response.statusCode == 200) {
|
|
final data = jsonDecode(response.body);
|
|
print(data);
|
|
ScaffoldMessenger.of(context).showSnackBar(
|
|
SnackBar(
|
|
content: Text('Sent $amount HNS to $toAddress'),
|
|
),
|
|
);
|
|
|
|
String seedPhrase = 'abandon abandon abandon abandon abandon abandon ' +
|
|
'abandon abandon abandon abandon abandon about';
|
|
print(hns.getXpub(seedPhrase));
|
|
hns.signTX(seedPhrase, data).then((tx) {
|
|
print(tx);
|
|
});
|
|
|
|
if (sendMax) {
|
|
// amountController.text = '';
|
|
} else {
|
|
amountController.text =
|
|
min(amount, walletBalance - 0.02).toStringAsFixed(2);
|
|
}
|
|
fetchWalletBalance();
|
|
} else {
|
|
// Handle error
|
|
print('Failed to send HNS');
|
|
ScaffoldMessenger.of(context).showSnackBar(
|
|
const SnackBar(
|
|
content: Text('Failed to send HNS'),
|
|
),
|
|
);
|
|
}
|
|
});
|
|
}
|
|
}
|