use base64::engine::general_purpose::STANDARD;
use base64::Engine;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use strum::IntoStaticStr;
use tonlib_core::types::TonHashParseError;
use tonlib_core::TonHash;
use crate::tl::stack::TvmStackEntry;
use crate::tl::types::{
AccountAddress, BlockId, BlockIdExt, BlocksAccountTransactionId, InternalTransactionId,
Options, SmcLibraryQueryExt, SmcMethodId,
};
use crate::tl::Base64Standard;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct TonLibraryId {
pub id: Vec<u8>,
}
impl Serialize for TonLibraryId {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str(&STANDARD.encode(&self.id))
}
}
impl<'de> Deserialize<'de> for TonLibraryId {
fn deserialize<D>(deserializer: D) -> Result<TonLibraryId, D::Error>
where
D: Deserializer<'de>,
{
let s: String = Deserialize::deserialize(deserializer)?;
let bytes = match STANDARD.decode(s) {
Ok(decoded) => decoded,
Err(_) => return Err(serde::de::Error::custom("Invalid base64 string")),
};
Ok(TonLibraryId { id: bytes })
}
}
impl From<TonHash> for TonLibraryId {
fn from(value: TonHash) -> Self {
TonLibraryId { id: value.to_vec() }
}
}
impl TryFrom<TonLibraryId> for TonHash {
type Error = TonHashParseError;
fn try_from(value: TonLibraryId) -> Result<Self, Self::Error> {
value.id.try_into()
}
}
#[derive(IntoStaticStr, Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Hash)]
#[serde(tag = "@type", rename_all = "camelCase")]
pub enum TonFunction {
LiteServerInfo {
now: i64,
version: i32,
capabilities: i64,
},
Init {
options: Options,
},
#[serde(rename = "raw.sendMessageReturnHash")]
RawSendMessageReturnHash {
#[serde(with = "Base64Standard")]
body: Vec<u8>,
},
#[serde(rename = "sync")]
Sync {},
#[serde(rename = "raw.getAccountState")]
RawGetAccountState {
account_address: AccountAddress,
},
#[serde(rename = "raw.getAccountStateByTransaction")]
RawGetAccountStateByTransaction {
account_address: AccountAddress,
transaction_id: InternalTransactionId,
},
#[serde(rename = "raw.getTransactions")]
RawGetTransactions {
account_address: AccountAddress,
from_transaction_id: InternalTransactionId,
},
#[serde(rename = "raw.getTransactionsV2")]
RawGetTransactionsV2 {
account_address: AccountAddress,
from_transaction_id: InternalTransactionId,
count: u32,
try_decode_messages: bool,
},
#[serde(rename = "raw.sendMessage")]
RawSendMessage {
#[serde(with = "Base64Standard")]
body: Vec<u8>,
},
#[serde(rename = "getAccountState")]
GetAccountState {
account_address: AccountAddress,
},
#[serde(rename = "getConfigParam")]
GetConfigParam {
mode: u32,
param: u32,
},
#[serde(rename = "getConfigAll")]
GetConfigAll {
mode: u32,
},
#[serde(rename = "smc.load")]
SmcLoad {
account_address: AccountAddress,
},
#[serde(rename = "smc.loadByTransaction")]
SmcLoadByTransaction {
account_address: AccountAddress,
transaction_id: InternalTransactionId,
},
#[serde(rename = "smc.forget")]
SmcForget {
id: i64,
},
#[serde(rename = "smc.getCode")]
SmcGetCode {
id: i64,
},
#[serde(rename = "smc.getData")]
SmcGetData {
id: i64,
},
#[serde(rename = "smc.getState")]
SmcGetState {
id: i64,
},
#[serde(rename = "smc.runGetMethod")]
SmcRunGetMethod {
id: i64,
method: SmcMethodId,
stack: Vec<TvmStackEntry>,
},
#[serde(rename = "smc.getLibraries")]
SmcGetLibraries {
library_list: Vec<TonLibraryId>,
},
#[serde(rename = "smc.getLibrariesExt")]
SmcGetLibrariesExt {
list: Vec<SmcLibraryQueryExt>,
},
#[serde(rename = "blocks.getMasterchainInfo")]
BlocksGetMasterchainInfo {},
#[serde(rename = "blocks.getShards")]
BlocksGetShards {
id: BlockIdExt,
},
#[serde(rename = "blocks.lookupBlock")]
BlocksLookupBlock {
mode: i32,
id: BlockId,
lt: i64,
utime: i32,
},
#[serde(rename = "blocks.getTransactions")]
BlocksGetTransactions {
id: BlockIdExt,
mode: u32,
count: u32,
after: BlocksAccountTransactionId,
},
#[serde(rename = "blocks.getTransactionsExt")]
BlocksGetTransactionsExt {
id: BlockIdExt,
mode: u32,
count: u32,
after: BlocksAccountTransactionId,
},
#[serde(rename = "blocks.getBlockHeader")]
GetBlockHeader {
id: BlockIdExt,
},
#[serde(rename = "liteServer.getInfo")]
LiteServerGetInfo {},
SetLogVerbosityLevel {
new_verbosity_level: u32,
},
GetLogVerbosityLevel {},
}