use crate::tx::{Transaction, TransactionOutput};
use kaspa_addresses::{Address, Prefix};
use kaspa_consensus_core::{
config::params::{Params, DEVNET_PARAMS, MAINNET_PARAMS},
constants::*,
mass::{self, MassCalculator},
};
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub enum NetworkType {
Mainnet,
Testnet,
}
pub(crate) const MINIMUM_RELAY_TRANSACTION_FEE: u64 = 1000;
pub fn minimum_required_transaction_relay_fee(mass: u64) -> u64 {
let mut minimum_fee = (mass * MINIMUM_RELAY_TRANSACTION_FEE) / 1000;
if minimum_fee == 0 {
minimum_fee = MINIMUM_RELAY_TRANSACTION_FEE;
}
minimum_fee = minimum_fee.min(MAX_SOMPI);
minimum_fee
}
#[wasm_bindgen(js_name=isTransactionOutputDust)]
pub fn is_transaction_output_dust(transaction_output: &TransactionOutput) -> bool {
if transaction_output.get_script_public_key().script().len() < 33 {
return true;
}
let output = transaction_output.clone().try_into().unwrap();
let total_serialized_size = mass::transaction_output_estimated_serialized_size(&output) + 148;
let value = output.value;
match value.checked_mul(1000) {
Some(value_1000) => value_1000 / (3 * total_serialized_size) < MINIMUM_RELAY_TRANSACTION_FEE,
None => (value as u128 * 1000 / (3 * total_serialized_size as u128)) < MINIMUM_RELAY_TRANSACTION_FEE as u128,
}
}
pub fn calculate_mass(tx: &Transaction, params: &Params, estimate_signature_mass: bool) -> u64 {
let mass_calculator = MassCalculator::new(params.mass_per_tx_byte, params.mass_per_script_pub_key_byte, params.mass_per_sig_op);
let mut mass = mass_calculator.calc_tx_mass(&tx.try_into().unwrap());
if !estimate_signature_mass {
return mass;
}
let sig_op_count = 1;
mass += (sig_op_count * tx.inner().inputs.len() as u64) * params.mass_per_sig_op;
let signature_mass = transaction_estimate_signature_mass(tx, params);
mass + signature_mass
}
pub fn transaction_estimate_signature_mass(tx: &Transaction, params: &Params) -> u64 {
let signature_script_size = 66; tx.inner().inputs.len() as u64 * signature_script_size * params.mass_per_tx_byte
}
pub fn calculate_minimum_transaction_fee(tx: &Transaction, params: &Params, estimate_signature_mass: bool) -> u64 {
minimum_required_transaction_relay_fee(calculate_mass(tx, params, estimate_signature_mass))
}
pub fn get_consensus_params_by_address(address: &Address) -> Params {
match address.prefix {
Prefix::Mainnet => MAINNET_PARAMS,
_ => DEVNET_PARAMS,
}
}
pub fn get_consensus_params_by_network(network: &NetworkType) -> Params {
match network {
NetworkType::Mainnet => MAINNET_PARAMS,
_ => DEVNET_PARAMS,
}
}