git / moonbite-network / mobile/tool/sign_spend.dart · raw
// Dev/verification tool (not part of the app build).//// Reads a JSON job from stdin and prints the on-device-signed raw transaction,// so an external moonbited can validate what the wallet produces.//// stdin JSON:// {// "network": "testnet",// "mnemonic": "...",// "toAddress": "tbig1...",// "amountSats": 100000000,// "feeRateSatPerVByte": 1.0,// "utxos": [ { "txid","vout","amount","scriptPubKey","height","confirmations" } ]// }import 'dart:convert';import 'dart:io';import 'package:moonbite_mobile/models/chain_models.dart';import 'package:moonbite_mobile/wallet/moonbite_network.dart';import 'package:moonbite_mobile/wallet/hd_wallet_service.dart';import 'package:moonbite_mobile/wallet/tx_builder.dart';Future<void> main() async { final raw = await stdin.transform(utf8.decoder).join(); final cfg = jsonDecode(raw) as Map<String, dynamic>; final net = MoonBiteNetwork.byId(cfg['network'] as String); final svc = HdWalletService(net); final acct0 = svc.deriveAccount(cfg['mnemonic'] as String, index: 0); final utxos = (cfg['utxos'] as List) .map((e) => Utxo.fromJson(e as Map<String, dynamic>)) .toList(); final signed = TxBuilder(net).buildSpend( utxos: utxos, toAddress: cfg['toAddress'] as String, amountSats: (cfg['amountSats'] as num).toInt(), changeAddress: acct0.bech32Address, wif: acct0.wif, feeRateSatPerVByte: (cfg['feeRateSatPerVByte'] as num).toDouble(), ); stdout.writeln(jsonEncode({ 'rawHex': signed.rawHex, 'txid': signed.txid, 'feeSats': signed.feeSats, 'changeSats': signed.changeSats, 'inputs': signed.inputs.length, }));}