From 43e602b71ec17eb833405a4494f5768419e17a56 Mon Sep 17 00:00:00 2001 From: M Date: Tue, 8 Dec 2020 23:47:08 +0200 Subject: [PATCH] Added p2sh address to output script. --- lib/bitcoin/address_to_output_script.dart | 25 +++++++++++++++++++++++ lib/bitcoin/bitcoin_wallet.dart | 4 +++- lib/main.dart | 1 - 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 lib/bitcoin/address_to_output_script.dart diff --git a/lib/bitcoin/address_to_output_script.dart b/lib/bitcoin/address_to_output_script.dart new file mode 100644 index 000000000..2f6698ff0 --- /dev/null +++ b/lib/bitcoin/address_to_output_script.dart @@ -0,0 +1,25 @@ +import 'dart:typed_data'; +import 'package:bs58check/bs58check.dart' as bs58check; +import 'package:bitcoin_flutter/src/utils/constants/op.dart'; +import 'package:bitcoin_flutter/src/utils/script.dart' as bscript; +import 'package:bitcoin_flutter/src/address.dart'; + + +Uint8List p2shAddressToOutputScript(String address) { + final decodeBase58 = bs58check.decode(address); + final hash = decodeBase58.sublist(1); + return bscript.compile([OPS['OP_HASH160'], hash, OPS['OP_EQUAL']]); +} + +Uint8List addressToOutputScript(String address) { + try { + // FIXME: improve validation for p2sh addresses + if (address.startsWith('3')) { + return p2shAddressToOutputScript(address); + } + + return Address.addressToOutputScript(address); + } catch (_) { + return Uint8List(0); + } +} \ No newline at end of file diff --git a/lib/bitcoin/bitcoin_wallet.dart b/lib/bitcoin/bitcoin_wallet.dart index d6f1ce8f0..cc9680c63 100644 --- a/lib/bitcoin/bitcoin_wallet.dart +++ b/lib/bitcoin/bitcoin_wallet.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:convert'; +import 'package:cake_wallet/bitcoin/address_to_output_script.dart'; import 'package:cake_wallet/bitcoin/bitcoin_mnemonic.dart'; import 'package:mobx/mobx.dart'; import 'package:flutter/foundation.dart'; @@ -302,7 +303,8 @@ abstract class BitcoinWalletBase extends WalletBase with Store { } }); - txb.addOutput(transactionCredentials.address, amount); + txb.addOutput( + addressToOutputScript(transactionCredentials.address), amount); if (changeValue > 0) { txb.addOutput(changeAddress, changeValue); diff --git a/lib/main.dart b/lib/main.dart index 42f76eb5c..9cd55e054 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,3 @@ -import 'package:cake_wallet/bitcoin/bitcoin_mnemonic.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:hive/hive.dart';