feat: Start with signing txs

This commit is contained in:
2024-06-04 17:08:25 +10:00
parent 3bd61ae1ee
commit 7ca9c5f735
4 changed files with 169 additions and 3 deletions

75
lib/hns.dart Normal file
View File

@@ -0,0 +1,75 @@
import 'package:flutter/services.dart';
import 'package:flutter_bitcoin/flutter_bitcoin.dart' as bitcoin;
import 'dart:typed_data';
import 'package:hex/hex.dart';
import 'package:crypto/crypto.dart';
import 'package:bip39/bip39.dart' as bip39;
import 'package:bip32/bip32.dart' as bip32;
final bip32.NetworkType hnsMainnet = bip32.NetworkType(
bip32: bip32.Bip32Type(public: 0x0488b21e, private: 0x0488ade4),
wif: 0x80,
);
final bitcoin.NetworkType hnsMainnetBitcoin = bitcoin.NetworkType(
messagePrefix: '\x18Handshake Signed Message:\n',
bech32: 'hs',
bip32: bitcoin.Bip32Type(public: 0x0488b21e, private: 0x0488ade4),
pubKeyHash: 0x00,
scriptHash: 0x05,
wif: 0x80);
String getXpub(String seedPhrase) {
List<int> seedints = bip39.mnemonicToSeed(seedPhrase);
Uint8List seed = Uint8List.fromList(seedints);
bip32.BIP32 master = bip32.BIP32.fromSeed(seed, hnsMainnet);
return master.derivePath("m/44'/5353'/0'").neutered().toBase58();
}
Future<String> signTX(String seedPhrase, Map<String, dynamic> txData) async {
final seed = bip39.mnemonicToSeed(seedPhrase);
final master = bip32.BIP32.fromSeed(seed, hnsMainnet);
final txb = bitcoin.TransactionBuilder(
network: hnsMainnetBitcoin,
);
// for (var input in txData['inputs']) {
// final prevout = input['prevout'];
// final vin = input['vin'];
// if (vin != null && vin is int) {
// final hash = prevout['hash'];
// final index = prevout['index'];
// bitcoin.ECPair keyPair = bitcoin.ECPair.fromPrivateKey(
// master.derivePath("m/44'/5353'/0'/0/$vin").privateKey!,
// network: hnsMainnetBitcoin);
// txb.addInput(hash, index);
// txb.sign(vin: vin, keyPair: keyPair);
// } else {
// print('vin is not an int');
// print(input);
// }
// }
for (var input in txData['inputs']) {
final prevout = input['prevout'];
final coin = input['coin'];
final index = prevout['index'];
final hash = prevout['hash'];
final vin = coin['height'];
print(input);
bitcoin.ECPair keyPair = bitcoin.ECPair.fromPrivateKey(
master.derivePath("m/44'/5353'/0'/0/$vin").privateKey!,
network: hnsMainnetBitcoin,
);
txb.addInput(hash, index);
txb.sign(vin: int.parse(vin.toString()), keyPair: keyPair);
}
for (var output in txData['outputs']) {
txb.addOutput(output['address'], output['value']);
}
return txb.build().toHex();
}

View File

@@ -4,7 +4,12 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'package:qr_flutter/qr_flutter.dart';
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})
@@ -168,8 +173,16 @@ class _SendPageState extends State<SendPage> {
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 = '';
// amountController.text = '';
} else {
amountController.text =
min(amount, walletBalance - 0.02).toStringAsFixed(2);