use ergo_lib::ergo_chain_types::EcPoint;
use ergo_lib::ergotree_ir::serialization::SigmaSerializable;
use ergo_lib::ergotree_ir::sigma_protocol::sigma_boolean::ProveDlog;
use wasm_bindgen::prelude::*;
use crate::{ergo_tree::ErgoTree, error_conversion::to_js};
extern crate derive_more;
use derive_more::{From, Into};
#[wasm_bindgen]
#[repr(u8)]
#[derive(PartialEq, Eq, Debug, Clone, Copy)]
pub enum NetworkPrefix {
Mainnet = 0,
Testnet = 16,
}
impl From<NetworkPrefix> for ergo_lib::ergotree_ir::chain::address::NetworkPrefix {
fn from(v: NetworkPrefix) -> Self {
use ergo_lib::ergotree_ir::chain::address::NetworkPrefix::*;
match v {
NetworkPrefix::Mainnet => Mainnet,
NetworkPrefix::Testnet => Testnet,
}
}
}
impl From<ergo_lib::ergotree_ir::chain::address::NetworkPrefix> for NetworkPrefix {
fn from(v: ergo_lib::ergotree_ir::chain::address::NetworkPrefix) -> Self {
use NetworkPrefix::*;
match v {
ergo_lib::ergotree_ir::chain::address::NetworkPrefix::Mainnet => Mainnet,
ergo_lib::ergotree_ir::chain::address::NetworkPrefix::Testnet => Testnet,
}
}
}
#[wasm_bindgen]
#[repr(u8)]
pub enum AddressTypePrefix {
P2Pk = 1,
Pay2Sh = 2,
Pay2S = 3,
}
impl From<AddressTypePrefix> for ergo_lib::ergotree_ir::chain::address::AddressTypePrefix {
fn from(v: AddressTypePrefix) -> Self {
use ergo_lib::ergotree_ir::chain::address::AddressTypePrefix::*;
match v {
AddressTypePrefix::P2Pk => P2Pk,
AddressTypePrefix::Pay2Sh => Pay2Sh,
AddressTypePrefix::Pay2S => Pay2S,
}
}
}
impl From<ergo_lib::ergotree_ir::chain::address::AddressTypePrefix> for AddressTypePrefix {
fn from(v: ergo_lib::ergotree_ir::chain::address::AddressTypePrefix) -> Self {
use AddressTypePrefix::*;
match v {
ergo_lib::ergotree_ir::chain::address::AddressTypePrefix::P2Pk => P2Pk,
ergo_lib::ergotree_ir::chain::address::AddressTypePrefix::Pay2Sh => Pay2Sh,
ergo_lib::ergotree_ir::chain::address::AddressTypePrefix::Pay2S => Pay2S,
}
}
}
#[wasm_bindgen]
#[derive(PartialEq, Eq, Debug, Clone, From, Into)]
pub struct Address(pub(crate) ergo_lib::ergotree_ir::chain::address::Address);
#[wasm_bindgen]
impl Address {
pub fn recreate_from_ergo_tree(ergo_tree: &ErgoTree) -> Result<Address, JsValue> {
ergo_lib::ergotree_ir::chain::address::Address::recreate_from_ergo_tree(
&ergo_tree.clone().into(),
)
.map(Address)
.map_err(to_js)
}
pub fn p2pk_from_pk_bytes(bytes: &[u8]) -> Result<Address, JsValue> {
ergo_lib::ergotree_ir::chain::address::Address::p2pk_from_pk_bytes(bytes)
.map(Address)
.map_err(to_js)
}
pub fn from_testnet_str(s: &str) -> Result<Address, JsValue> {
ergo_lib::ergotree_ir::chain::address::AddressEncoder::new(
ergo_lib::ergotree_ir::chain::address::NetworkPrefix::Testnet,
)
.parse_address_from_str(s)
.map(Address)
.map_err(to_js)
}
pub fn from_mainnet_str(s: &str) -> Result<Address, JsValue> {
ergo_lib::ergotree_ir::chain::address::AddressEncoder::new(
ergo_lib::ergotree_ir::chain::address::NetworkPrefix::Mainnet,
)
.parse_address_from_str(s)
.map(Address)
.map_err(to_js)
}
#[allow(clippy::should_implement_trait)]
pub fn from_base58(s: &str) -> Result<Address, JsValue> {
ergo_lib::ergotree_ir::chain::address::AddressEncoder::unchecked_parse_address_from_str(s)
.map(Address)
.map_err(to_js)
}
pub fn to_base58(&self, network_prefix: NetworkPrefix) -> String {
ergo_lib::ergotree_ir::chain::address::AddressEncoder::encode_address_as_string(
network_prefix.into(),
&self.0,
)
}
pub fn from_bytes(data: Vec<u8>) -> Result<Address, JsValue> {
ergo_lib::ergotree_ir::chain::address::AddressEncoder::unchecked_parse_address_from_bytes(
&data,
)
.map(Address)
.map_err(to_js)
}
pub fn to_bytes(&self, network_prefix: NetworkPrefix) -> Vec<u8> {
ergo_lib::ergotree_ir::chain::address::AddressEncoder::encode_address_as_bytes(
network_prefix.into(),
&self.0,
)
}
pub fn content_bytes(&self) -> Vec<u8> {
self.0.content_bytes()
}
pub fn address_type_prefix(&self) -> AddressTypePrefix {
self.0.address_type_prefix().into()
}
pub fn from_public_key(bytes: &[u8]) -> Result<Address, JsValue> {
EcPoint::sigma_parse_bytes(bytes)
.map(|point| {
ergo_lib::ergotree_ir::chain::address::Address::P2Pk(ProveDlog::new(point))
})
.map(Address)
.map_err(to_js)
}
pub fn to_ergo_tree(&self) -> Result<ErgoTree, JsValue> {
self.0.script().map(|script| script.into()).map_err(to_js)
}
}
#[wasm_bindgen]
#[derive(PartialEq, Eq, Debug, Clone)]
pub struct NetworkAddress(ergo_lib::ergotree_ir::chain::address::NetworkAddress);
#[wasm_bindgen]
impl NetworkAddress {
pub fn new(network: NetworkPrefix, address: &Address) -> NetworkAddress {
NetworkAddress(ergo_lib::ergotree_ir::chain::address::NetworkAddress::new(
network.into(),
&address.clone().into(),
))
}
pub fn from_base58(s: &str) -> Result<NetworkAddress, JsValue> {
ergo_lib::ergotree_ir::chain::address::AddressEncoder::unchecked_parse_network_address_from_str(s)
.map(NetworkAddress)
.map_err(to_js)
}
pub fn to_base58(&self) -> String {
self.0.to_base58()
}
pub fn from_bytes(data: Vec<u8>) -> Result<NetworkAddress, JsValue> {
ergo_lib::ergotree_ir::chain::address::AddressEncoder::unchecked_parse_network_address_from_bytes(
&data,
)
.map(NetworkAddress)
.map_err(to_js)
}
pub fn to_bytes(&self) -> Vec<u8> {
ergo_lib::ergotree_ir::chain::address::AddressEncoder::encode_address_as_bytes(
self.network().into(),
&self.address().into(),
)
}
pub fn network(&self) -> NetworkPrefix {
self.0.network().into()
}
pub fn address(&self) -> Address {
self.0.address().into()
}
}