firewallet-mobile/lib/hns.dart

76 lines
2.4 KiB
Dart

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();
}