diff --git a/libraries/plugins/peerplays_sidechain/bitcoin/bitcoin_address.cpp b/libraries/plugins/peerplays_sidechain/bitcoin/bitcoin_address.cpp index c9cf88db..cd928800 100755 --- a/libraries/plugins/peerplays_sidechain/bitcoin/bitcoin_address.cpp +++ b/libraries/plugins/peerplays_sidechain/bitcoin/bitcoin_address.cpp @@ -255,21 +255,23 @@ bytes btc_multisig_segwit_address::get_address_bytes( const bytes& script_hash ) return address_bytes; } -btc_weighted_multisig_address::btc_weighted_multisig_address(const std::vector > &keys_data) : - keys_data_(keys_data) + +btc_weighted_multisig_address::btc_weighted_multisig_address(const std::vector > &keys_data, + network network_type) : + network_type_(network_type) { - create_redeem_script(); + create_redeem_script(keys_data); create_witness_script(); create_segwit_address(); type = payment_type::P2WSH; } -void btc_weighted_multisig_address::create_redeem_script() +void btc_weighted_multisig_address::create_redeem_script(const std::vector>& keys_data) { script_builder builder; uint32_t total_weight = 0; builder << uint32_t(0); - for (auto &p : keys_data_) { + for (auto &p : keys_data) { total_weight += p.second; builder << op::SWAP; builder << p.first.serialize(); @@ -284,6 +286,9 @@ void btc_weighted_multisig_address::create_redeem_script() builder << op::GREATERTHANOREQUAL; redeem_script_ = builder; + + fc::sha256 sh = fc::sha256::hash(redeem_script_); + raw_address = bytes(sh.data(), sh.data() + sh.data_size()); } void btc_weighted_multisig_address::create_witness_script() @@ -297,7 +302,22 @@ void btc_weighted_multisig_address::create_witness_script() void btc_weighted_multisig_address::create_segwit_address() { - + std::string hrp; + switch(network_type_) + { + case(network::mainnet): + hrp = "bc"; + break; + case(network::testnet): + hrp = "tb"; + break; + case(network::regtest): + hrp = "bcrt"; + break; + } + fc::sha256 sh = fc::sha256::hash(redeem_script_); + std::vector hash_data(sh.data(), sh.data() + sh.data_size()); + address = segwit_addr::encode(hrp, 0, hash_data); } } } } diff --git a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/bitcoin/bitcoin_address.hpp b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/bitcoin/bitcoin_address.hpp index f4afa6e5..c1ee1075 100755 --- a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/bitcoin/bitcoin_address.hpp +++ b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/bitcoin/bitcoin_address.hpp @@ -127,23 +127,31 @@ class btc_weighted_multisig_address : public bitcoin_address { public: + enum network + { + mainnet, + testnet, + regtest + }; btc_weighted_multisig_address() = default; - btc_weighted_multisig_address( const std::vector>& keys_data ); + btc_weighted_multisig_address( const std::vector>& keys_data, + network network_type = network::regtest); + bytes get_redeem_script() const { return redeem_script_; } bytes get_witness_script() const { return witness_script_; } - + network get_network_type() const { return network_type_; } private: - void create_redeem_script(); + void create_redeem_script(const std::vector>& keys_data); void create_witness_script(); void create_segwit_address(); public: + network network_type_; bytes redeem_script_; bytes witness_script_; - std::vector> keys_data_; }; } } } @@ -154,3 +162,13 @@ FC_REFLECT_DERIVED( graphene::peerplays_sidechain::bitcoin::btc_multisig_address (redeem_script)(keys_required)(witnesses_keys) ); FC_REFLECT_DERIVED( graphene::peerplays_sidechain::bitcoin::btc_multisig_segwit_address, (graphene::peerplays_sidechain::bitcoin::btc_multisig_address), (witness_script) ); + +FC_REFLECT_ENUM(graphene::peerplays_sidechain::bitcoin::btc_weighted_multisig_address::network, + (mainnet) + (testnet) + (regtest) + ) + +FC_REFLECT_DERIVED( graphene::peerplays_sidechain::bitcoin::btc_weighted_multisig_address, + (graphene::peerplays_sidechain::bitcoin::bitcoin_address), + (network_type_)(redeem_script_)(witness_script_) );