Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions mm2src/coins/utxo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ use futures::lock::{Mutex as AsyncMutex, MutexGuard as AsyncMutexGuard};
use futures::stream::StreamExt;
use futures01::Future;
use keys::bytes::Bytes;
pub use keys::{Address, AddressFormat as UtxoAddressFormat, KeyPair, Private, Public, Secret, Type};
pub use keys::{Address, AddressFormat as UtxoAddressFormat, KeyPair, Private, Public, Secret, Type as ScriptType};
#[cfg(test)] use mocktopus::macros::*;
use num_traits::ToPrimitive;
use primitives::hash::{H256, H264, H512};
Expand Down Expand Up @@ -1197,7 +1197,7 @@ pub trait UtxoCoinBuilder {
hrp: conf.bech32_hrp.clone(),
addr_format,
};
let my_script_pubkey = output_script(&my_address).to_bytes();
let my_script_pubkey = output_script(&my_address, ScriptType::P2PKH).to_bytes();
let rpc_client = try_s!(self.rpc_client().await);
let tx_fee = try_s!(self.tx_fee(&rpc_client).await);
let decimals = try_s!(self.decimals(&rpc_client).await);
Expand Down Expand Up @@ -1990,10 +1990,13 @@ fn script_sig(message: &H256, key_pair: &KeyPair, fork_id: u32) -> Result<Bytes,
Ok(sig_script)
}

pub fn output_script(address: &Address) -> Script {
pub fn output_script(address: &Address, script_type: ScriptType) -> Script {
match address.addr_format {
UtxoAddressFormat::Segwit => Builder::build_p2wpkh(&address.hash),
_ => Builder::build_p2pkh(&address.hash),
_ => match script_type {
ScriptType::P2PKH => Builder::build_p2pkh(&address.hash),
ScriptType::P2SH => Builder::build_p2sh(&address.hash),
},
}
}

Expand Down
6 changes: 3 additions & 3 deletions mm2src/coins/utxo/rpc_clients.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ use futures01::{Future, Sink, Stream};
use http::header::AUTHORIZATION;
use http::Uri;
use http::{Request, StatusCode};
use keys::Address;
use keys::{Address, Type as ScriptType};
#[cfg(test)] use mocktopus::macros::*;
use rpc::v1::types::{Bytes as BytesJson, Transaction as RpcTransaction, H256 as H256Json};
use serde_json::{self as json, Value as Json};
Expand Down Expand Up @@ -1478,7 +1478,7 @@ impl ElectrumClient {
#[cfg_attr(test, mockable)]
impl UtxoRpcClientOps for ElectrumClient {
fn list_unspent(&self, address: &Address, _decimals: u8) -> UtxoRpcFut<Vec<UnspentInfo>> {
let script = output_script(address);
let script = output_script(address, ScriptType::P2PKH);
let script_hash = electrum_script_hash(&script);
Box::new(
self.scripthash_list_unspent(&hex::encode(script_hash))
Expand Down Expand Up @@ -1538,7 +1538,7 @@ impl UtxoRpcClientOps for ElectrumClient {
}

fn display_balance(&self, address: Address, decimals: u8) -> RpcRes<BigDecimal> {
let hash = electrum_script_hash(&output_script(&address));
let hash = electrum_script_hash(&output_script(&address, ScriptType::P2PKH));
let hash_str = hex::encode(hash);
Box::new(self.scripthash_get_balance(&hash_str).map(move |result| {
BigDecimal::from(result.confirmed + result.unconfirmed) / BigDecimal::from(10u64.pow(decimals as u32))
Expand Down
30 changes: 21 additions & 9 deletions mm2src/coins/utxo/utxo_common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ use futures::compat::Future01CompatExt;
use futures::future::{FutureExt, TryFutureExt};
use futures01::future::Either;
use keys::bytes::Bytes;
use keys::{Address, AddressFormat as UtxoAddressFormat, AddressHash, KeyPair, Public, SegwitAddress, Type};
use keys::{Address, AddressFormat as UtxoAddressFormat, AddressHash, KeyPair, Public, SegwitAddress,
Type as ScriptType};
use primitives::hash::H512;
use rpc::v1::types::{Bytes as BytesJson, TransactionInputEnum, H256 as H256Json};
use script::{Builder, Opcode, Script, ScriptAddress, SignatureVersion, TransactionInputSigner,
Expand Down Expand Up @@ -189,8 +190,8 @@ pub fn addresses_from_script(coin: &UtxoCoinFields, script: &Script) -> Result<V
.into_iter()
.map(|dst| {
let (prefix, t_addr_prefix) = match dst.kind {
Type::P2PKH => (conf.pub_addr_prefix, conf.pub_t_addr_prefix),
Type::P2SH => (conf.p2sh_addr_prefix, conf.p2sh_t_addr_prefix),
ScriptType::P2PKH => (conf.pub_addr_prefix, conf.pub_t_addr_prefix),
ScriptType::P2SH => (conf.p2sh_addr_prefix, conf.p2sh_t_addr_prefix),
};

Address {
Expand Down Expand Up @@ -290,7 +291,7 @@ where
let dust: u64 = coin.as_ref().dust_amount;
let lock_time = (now_ms() / 1000) as u32;

let change_script_pubkey = output_script(&coin.as_ref().my_address).to_bytes();
let change_script_pubkey = output_script(&coin.as_ref().my_address, ScriptType::P2PKH).to_bytes();
let coin_tx_fee = match fee {
Some(f) => f,
None => coin.get_tx_fee().await?,
Expand Down Expand Up @@ -738,7 +739,7 @@ where
);
let fut = async move {
let fee = try_s!(coin.get_htlc_spend_fee().await);
let script_pubkey = output_script(&coin.as_ref().my_address).to_bytes();
let script_pubkey = output_script(&coin.as_ref().my_address, ScriptType::P2PKH).to_bytes();
let output = TransactionOutput {
value: prev_tx.outputs[0].value - fee,
script_pubkey,
Expand Down Expand Up @@ -785,7 +786,7 @@ where
);
let fut = async move {
let fee = try_s!(coin.get_htlc_spend_fee().await);
let script_pubkey = output_script(&coin.as_ref().my_address).to_bytes();
let script_pubkey = output_script(&coin.as_ref().my_address, ScriptType::P2PKH).to_bytes();
let output = TransactionOutput {
value: prev_tx.outputs[0].value - fee,
script_pubkey,
Expand Down Expand Up @@ -829,7 +830,7 @@ where
);
let fut = async move {
let fee = try_s!(coin.get_htlc_spend_fee().await);
let script_pubkey = output_script(&coin.as_ref().my_address).to_bytes();
let script_pubkey = output_script(&coin.as_ref().my_address, ScriptType::P2PKH).to_bytes();
let output = TransactionOutput {
value: prev_tx.outputs[0].value - fee,
script_pubkey,
Expand Down Expand Up @@ -873,7 +874,7 @@ where
);
let fut = async move {
let fee = try_s!(coin.get_htlc_spend_fee().await);
let script_pubkey = output_script(&coin.as_ref().my_address).to_bytes();
let script_pubkey = output_script(&coin.as_ref().my_address, ScriptType::P2PKH).to_bytes();
let output = TransactionOutput {
value: prev_tx.outputs[0].value - fee,
script_pubkey,
Expand Down Expand Up @@ -1378,7 +1379,18 @@ where
.address_from_str(&req.to)
.map_to_mm(WithdrawError::InvalidAddress)?;

let script_pubkey = output_script(&to).to_bytes();
let is_p2pkh = to.prefix == conf.pub_addr_prefix && to.t_addr_prefix == conf.pub_t_addr_prefix;
let is_p2sh = to.prefix == conf.p2sh_addr_prefix && to.t_addr_prefix == conf.p2sh_t_addr_prefix && conf.segwit;

let script_type = if is_p2pkh {
ScriptType::P2PKH
} else if is_p2sh {
ScriptType::P2SH
} else {
return MmError::err(WithdrawError::InvalidAddress("Expected either P2PKH or P2SH".into()));
};

let script_pubkey = output_script(&to, script_type).to_bytes();

let signature_version = match coin.as_ref().my_address.addr_format {
UtxoAddressFormat::Segwit => SignatureVersion::WitnessV0,
Expand Down
Loading