Skip to content

Commit

Permalink
bch standalone activation via task manager
Browse files Browse the repository at this point in the history
  • Loading branch information
mariocynicys committed Sep 12, 2024
1 parent 5d90387 commit 5c9dbac
Show file tree
Hide file tree
Showing 6 changed files with 165 additions and 12 deletions.
23 changes: 12 additions & 11 deletions mm2src/coins/utxo/bch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@ pub type BchUnspentMap = HashMap<Address, BchUnspents>;
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct BchActivationRequest {
#[serde(default)]
allow_slp_unsafe_conf: bool,
bchd_urls: Vec<String>,
pub allow_slp_unsafe_conf: bool,
pub bchd_urls: Vec<String>,
#[serde(flatten)]
pub utxo_params: UtxoActivationParams,
}
Expand Down Expand Up @@ -162,6 +162,15 @@ impl From<serialization::Error> for IsSlpUtxoError {
}

impl BchCoin {
pub fn new(utxo_arc: UtxoArc, slp_addr_prefix: CashAddrPrefix, bchd_urls: Vec<String>) -> Self {
BchCoin {
utxo_arc,
slp_addr_prefix,
bchd_urls,
slp_tokens_infos: Arc::new(Mutex::new(HashMap::new())),
}
}

pub fn slp_prefix(&self) -> &CashAddrPrefix { &self.slp_addr_prefix }

pub fn slp_address(&self, address: &Address) -> Result<CashAddress, String> {
Expand Down Expand Up @@ -631,15 +640,7 @@ pub async fn bch_coin_with_policy(
}

let bchd_urls = params.bchd_urls;
let slp_tokens_infos = Arc::new(Mutex::new(HashMap::new()));
let constructor = {
move |utxo_arc| BchCoin {
utxo_arc,
slp_addr_prefix: slp_addr_prefix.clone(),
bchd_urls: bchd_urls.clone(),
slp_tokens_infos: slp_tokens_infos.clone(),
}
};
let constructor = { move |utxo_arc| BchCoin::new(utxo_arc, slp_addr_prefix.clone(), bchd_urls.clone()) };

let coin = try_s!(
UtxoArcBuilder::new(ctx, ticker, conf, &params.utxo_params, priv_key_policy, constructor)
Expand Down
4 changes: 3 additions & 1 deletion mm2src/coins_activation/src/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ use crate::init_erc20_token_activation::Erc20TokenTaskManagerShared;
use crate::lightning_activation::LightningTaskManagerShared;
#[cfg(feature = "enable-sia")]
use crate::sia_coin_activation::SiaCoinTaskManagerShared;
use crate::utxo_activation::{QtumTaskManagerShared, UtxoStandardTaskManagerShared};
use crate::utxo_activation::{BchTaskManagerShared, QtumTaskManagerShared, UtxoStandardTaskManagerShared};
use crate::z_coin_activation::ZcoinTaskManagerShared;
use mm2_core::mm_ctx::{from_ctx, MmArc};
use rpc_task::RpcTaskManager;
use std::sync::Arc;

pub struct CoinsActivationContext {
pub(crate) init_utxo_standard_task_manager: UtxoStandardTaskManagerShared,
pub(crate) init_bch_task_manager: BchTaskManagerShared,
pub(crate) init_qtum_task_manager: QtumTaskManagerShared,
#[cfg(feature = "enable-sia")]
pub(crate) init_sia_task_manager: SiaCoinTaskManagerShared,
Expand All @@ -30,6 +31,7 @@ impl CoinsActivationContext {
#[cfg(feature = "enable-sia")]
init_sia_task_manager: RpcTaskManager::new_shared(ctx.event_stream_manager.clone()),
init_utxo_standard_task_manager: RpcTaskManager::new_shared(ctx.event_stream_manager.clone()),
init_bch_task_manager: RpcTaskManager::new_shared(ctx.event_stream_manager.clone()),
init_qtum_task_manager: RpcTaskManager::new_shared(ctx.event_stream_manager.clone()),
init_z_coin_task_manager: RpcTaskManager::new_shared(ctx.event_stream_manager.clone()),
init_eth_task_manager: RpcTaskManager::new_shared(ctx.event_stream_manager.clone()),
Expand Down
5 changes: 5 additions & 0 deletions mm2src/coins_activation/src/prelude.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#[cfg(feature = "enable-sia")]
use coins::siacoin::SiaCoinActivationParams;
use coins::utxo::bch::BchActivationRequest;
use coins::utxo::UtxoActivationParams;
use coins::z_coin::ZcoinActivationParams;
use coins::{coin_conf, CoinBalance, CoinProtocol, DerivationMethodResponse, MmCoinEnum};
Expand All @@ -22,6 +23,10 @@ impl TxHistory for UtxoActivationParams {
fn tx_history(&self) -> bool { self.tx_history }
}

impl TxHistory for BchActivationRequest {
fn tx_history(&self) -> bool { self.utxo_params.tx_history }
}

#[cfg(feature = "enable-sia")]
impl TxHistory for SiaCoinActivationParams {
fn tx_history(&self) -> bool { self.tx_history }
Expand Down
116 changes: 116 additions & 0 deletions mm2src/coins_activation/src/utxo_activation/init_bch_activation.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
use crate::context::CoinsActivationContext;
use crate::prelude::TryFromCoinProtocol;
use crate::standalone_coin::{InitStandaloneCoinActivationOps, InitStandaloneCoinTaskHandleShared,
InitStandaloneCoinTaskManagerShared};
use crate::utxo_activation::common_impl::{get_activation_result, priv_key_build_policy,
start_history_background_fetching};
use crate::utxo_activation::init_utxo_standard_activation_error::InitUtxoStandardError;
use crate::utxo_activation::init_utxo_standard_statuses::{UtxoStandardAwaitingStatus, UtxoStandardInProgressStatus,
UtxoStandardUserAction};
use crate::utxo_activation::utxo_standard_activation_result::UtxoStandardActivationResult;
use async_trait::async_trait;
use coins::my_tx_history_v2::TxHistoryStorage;
use coins::utxo::bch::CashAddrPrefix;
use coins::utxo::bch::{BchActivationRequest, BchCoin};
use coins::utxo::utxo_builder::{UtxoArcBuilder, UtxoCoinBuilder};
use coins::CoinProtocol;
use mm2_core::mm_ctx::MmArc;
use mm2_err_handle::prelude::*;
use mm2_metrics::MetricsArc;
use mm2_number::BigDecimal;
use serde_json::Value as Json;
use std::collections::HashMap;
use std::str::FromStr;

pub type BchTaskManagerShared = InitStandaloneCoinTaskManagerShared<BchCoin>;
pub type BchRpcTaskHandleShared = InitStandaloneCoinTaskHandleShared<BchCoin>;

#[derive(Clone)]
pub struct BchProtocolInfo {
slp_prefix: String,
}

impl TryFromCoinProtocol for BchProtocolInfo {
fn try_from_coin_protocol(proto: CoinProtocol) -> Result<Self, MmError<CoinProtocol>>
where
Self: Sized,
{
match proto {
CoinProtocol::BCH { slp_prefix } => Ok(BchProtocolInfo { slp_prefix }),
protocol => MmError::err(protocol),
}
}
}

#[async_trait]
impl InitStandaloneCoinActivationOps for BchCoin {
type ActivationRequest = BchActivationRequest;
type StandaloneProtocol = BchProtocolInfo;
type ActivationResult = UtxoStandardActivationResult;
type ActivationError = InitUtxoStandardError;
type InProgressStatus = UtxoStandardInProgressStatus;
type AwaitingStatus = UtxoStandardAwaitingStatus;
type UserAction = UtxoStandardUserAction;

fn rpc_task_manager(activation_ctx: &CoinsActivationContext) -> &BchTaskManagerShared {
&activation_ctx.init_bch_task_manager
}

async fn init_standalone_coin(
ctx: MmArc,
ticker: String,
coin_conf: Json,
activation_request: &Self::ActivationRequest,
protocol_info: Self::StandaloneProtocol,
_task_handle: BchRpcTaskHandleShared,
) -> Result<Self, MmError<Self::ActivationError>> {
if activation_request.bchd_urls.is_empty() && !activation_request.allow_slp_unsafe_conf {
Err(InitUtxoStandardError::CoinCreationError {
ticker: ticker.clone(),
error: "Using empty bchd_urls is unsafe for SLP users!".into(),
})?;
}
let prefix = CashAddrPrefix::from_str(&protocol_info.slp_prefix).map_err(|e| {
InitUtxoStandardError::CoinCreationError {
ticker: ticker.clone(),
error: format!("Couldn't parse cash address prefix: {e:?}"),
}
})?;
let priv_key_policy = priv_key_build_policy(&ctx, activation_request.utxo_params.priv_key_policy)?;

let bchd_urls = activation_request.bchd_urls.clone();
let constructor = { move |utxo_arc| BchCoin::new(utxo_arc, prefix.clone(), bchd_urls.clone()) };

let coin = UtxoArcBuilder::new(
&ctx,
&ticker,
&coin_conf,
&activation_request.utxo_params,
priv_key_policy,
constructor,
)
.build()
.await
.mm_err(|e| InitUtxoStandardError::from_build_err(e, ticker.clone()))?;

Ok(coin)
}

async fn get_activation_result(
&self,
ctx: MmArc,
task_handle: BchRpcTaskHandleShared,
activation_request: &Self::ActivationRequest,
) -> MmResult<Self::ActivationResult, InitUtxoStandardError> {
get_activation_result(&ctx, self, task_handle, &activation_request.utxo_params).await
}

fn start_history_background_fetching(
&self,
metrics: MetricsArc,
storage: impl TxHistoryStorage,
current_balances: HashMap<String, BigDecimal>,
) {
start_history_background_fetching(self.clone(), metrics, storage, current_balances)
}
}
2 changes: 2 additions & 0 deletions mm2src/coins_activation/src/utxo_activation/mod.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
mod common_impl;
mod init_bch_activation;
mod init_qtum_activation;
mod init_utxo_standard_activation;
mod init_utxo_standard_activation_error;
mod init_utxo_standard_statuses;
mod utxo_standard_activation_result;

pub use init_bch_activation::BchTaskManagerShared;
pub use init_qtum_activation::QtumTaskManagerShared;
pub use init_utxo_standard_activation::UtxoStandardTaskManagerShared;

Expand Down
27 changes: 27 additions & 0 deletions mm2src/mm2_main/src/rpc/dispatcher/dispatcher.rs
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,10 @@ async fn rpc_task_dispatcher(
"create_new_account::init" => handle_mmrpc(ctx, request, init_create_new_account).await,
"create_new_account::status" => handle_mmrpc(ctx, request, init_create_new_account_status).await,
"create_new_account::user_action" => handle_mmrpc(ctx, request, init_create_new_account_user_action).await,
"enable_bch::cancel" => handle_mmrpc(ctx, request, cancel_init_standalone_coin::<BchCoin>).await,
"enable_bch::init" => handle_mmrpc(ctx, request, init_standalone_coin::<BchCoin>).await,
"enable_bch::status" => handle_mmrpc(ctx, request, init_standalone_coin_status::<BchCoin>).await,
"enable_bch::user_action" => handle_mmrpc(ctx, request, init_standalone_coin_user_action::<BchCoin>).await,
"enable_qtum::cancel" => handle_mmrpc(ctx, request, cancel_init_standalone_coin::<QtumCoin>).await,
"enable_qtum::init" => handle_mmrpc(ctx, request, init_standalone_coin::<QtumCoin>).await,
"enable_qtum::status" => handle_mmrpc(ctx, request, init_standalone_coin_status::<QtumCoin>).await,
Expand All @@ -276,6 +280,29 @@ async fn rpc_task_dispatcher(
"enable_erc20::init" => handle_mmrpc(ctx, request, init_token::<EthCoin>).await,
"enable_erc20::status" => handle_mmrpc(ctx, request, init_token_status::<EthCoin>).await,
"enable_erc20::user_action" => handle_mmrpc(ctx, request, init_token_user_action::<EthCoin>).await,
// // FIXME: tendermint with tokens
// "enable_tendermint::cancel" => {
// handle_mmrpc(ctx, request, cancel_init_platform_coin_with_tokens::<TendermintCoin>).await
// },
// "enable_tendermint::init" => handle_mmrpc(ctx, request, init_platform_coin_with_tokens::<TendermintCoin>).await,
// "enable_tendermint::status" => {
// handle_mmrpc(ctx, request, init_platform_coin_with_tokens_status::<TendermintCoin>).await
// },
// "enable_tendermint::user_action" => {
// handle_mmrpc(
// ctx,
// request,
// init_platform_coin_with_tokens_user_action::<TendermintCoin>,
// )
// .await
// },
// // FIXME: tendermint tokens
// "enable_tendermint_token::cancel" => handle_mmrpc(ctx, request, cancel_init_token::<TendermintToken>).await,
// "enable_tendermint_token::init" => handle_mmrpc(ctx, request, init_token::<TendermintToken>).await,
// "enable_tendermint_token::status" => handle_mmrpc(ctx, request, init_token_status::<TendermintToken>).await,
// "enable_tendermint_token::user_action" => {
// handle_mmrpc(ctx, request, init_token_user_action::<TendermintToken>).await
// },
"get_new_address::cancel" => handle_mmrpc(ctx, request, cancel_get_new_address).await,
"get_new_address::init" => handle_mmrpc(ctx, request, init_get_new_address).await,
"get_new_address::status" => handle_mmrpc(ctx, request, init_get_new_address_status).await,
Expand Down

0 comments on commit 5c9dbac

Please sign in to comment.