use candid::CandidType;
use serde::{Deserialize, Serialize};
use crate::{
canister::{call::call_canister, fetch_tuple0, types::CanisterCallResult},
identity::{AccountIdentifier, CanisterId, Subaccount},
};
#[derive(CandidType, Serialize, Deserialize, Debug, Clone)]
pub struct LedgerName {
name: String,
}
#[allow(unused)]
pub async fn ledger_name(canister_id: CanisterId) -> CanisterCallResult<LedgerName> {
call_canister::<_, (LedgerName,)>(canister_id, "name", ())
.await
.map(fetch_tuple0)
}
#[allow(unused)]
pub async fn ledger_name_by(canister_id: CanisterId) -> CanisterCallResult<String> {
ledger_name(canister_id).await.map(|n| n.name)
}
#[derive(CandidType, Serialize, Deserialize, Debug, Clone)]
pub struct LedgerSymbol {
symbol: String,
}
#[allow(unused)]
pub async fn ledger_symbol(canister_id: CanisterId) -> CanisterCallResult<LedgerSymbol> {
call_canister::<_, (LedgerSymbol,)>(canister_id, "symbol", ())
.await
.map(fetch_tuple0)
}
#[allow(unused)]
pub async fn ledger_symbol_by(canister_id: CanisterId) -> CanisterCallResult<String> {
ledger_symbol(canister_id).await.map(|s| s.symbol)
}
#[derive(CandidType, Serialize, Deserialize, Debug, Clone)]
pub struct LedgerDecimals {
decimals: u32,
}
#[allow(unused)]
pub async fn ledger_decimals(canister_id: CanisterId) -> CanisterCallResult<LedgerDecimals> {
call_canister::<_, (LedgerDecimals,)>(canister_id, "decimals", ())
.await
.map(fetch_tuple0)
}
#[allow(unused)]
pub async fn ledger_decimals_by(canister_id: CanisterId) -> CanisterCallResult<u32> {
ledger_decimals(canister_id).await.map(|d| d.decimals)
}
#[derive(CandidType, Serialize, Deserialize, Debug, Clone)]
pub struct LedgerBinaryAccountBalanceArgs {
pub account: LedgerAccountIdentifier,
}
#[derive(CandidType, Serialize, Deserialize, Debug, Clone)]
pub struct LedgerTokens {
pub e8s: u64,
}
#[allow(unused)]
pub async fn ledger_account_balance(
canister_id: CanisterId,
args: LedgerBinaryAccountBalanceArgs,
) -> CanisterCallResult<LedgerTokens> {
call_canister::<_, (LedgerTokens,)>(canister_id, "account_balance", (args,))
.await
.map(fetch_tuple0)
}
#[allow(unused)]
pub async fn ledger_account_balance_by(
canister_id: CanisterId,
account: LedgerAccountIdentifier,
) -> CanisterCallResult<u64> {
ledger_account_balance(canister_id, LedgerBinaryAccountBalanceArgs { account })
.await
.map(|b| b.e8s)
}
#[derive(CandidType, Serialize, Deserialize, Debug, Clone)]
pub struct LedgerTransferFeeArg {}
#[derive(CandidType, Serialize, Deserialize, Debug, Clone)]
pub struct LedgerTransferFee {
pub transfer_fee: LedgerTokens,
}
#[allow(unused)]
pub async fn ledger_transfer_fee(
canister_id: CanisterId,
) -> CanisterCallResult<LedgerTransferFee> {
call_canister::<_, (LedgerTransferFee,)>(
canister_id,
"transfer_fee",
(LedgerTransferFeeArg {},),
)
.await
.map(fetch_tuple0)
}
#[allow(unused)]
pub async fn ledger_transfer_fee_by(canister_id: CanisterId) -> CanisterCallResult<u64> {
ledger_transfer_fee(
canister_id,
)
.await
.map(|f| f.transfer_fee.e8s)
}
pub type LedgerMemo = u64; #[derive(CandidType, Serialize, Deserialize, Debug, Clone)]
pub struct LedgerTimestamp {
pub timestamp_nanos: u64,
}
pub type LedgerAccountIdentifier = AccountIdentifier;
pub type LedgerSubaccount = Subaccount;
#[derive(CandidType, Serialize, Deserialize, Debug, Clone)]
pub struct LedgerTransferArgs {
pub from_subaccount: Option<LedgerSubaccount>,
pub to: LedgerAccountIdentifier,
pub amount: LedgerTokens,
pub fee: LedgerTokens,
pub memo: LedgerMemo,
pub created_at_time: Option<LedgerTimestamp>,
}
pub type LedgerBlockIndex = u64;
#[derive(CandidType, Serialize, Deserialize, Debug, Clone)]
pub enum LedgerTransferError {
BadFee {
expected_fee: LedgerTokens,
},
InsufficientFunds {
balance: LedgerTokens,
},
TxTooOld {
allowed_window_nanos: u64,
},
TxCreatedInFuture,
TxDuplicate {
duplicate_of: LedgerBlockIndex,
},
}
pub type LedgerTransferResult = Result<LedgerBlockIndex, LedgerTransferError>;
#[allow(unused)]
pub async fn ledger_transfer(
canister_id: CanisterId,
args: LedgerTransferArgs,
) -> CanisterCallResult<LedgerTransferResult> {
call_canister::<_, (LedgerTransferResult,)>(canister_id, "transfer", (args,))
.await
.map(fetch_tuple0)
}
#[allow(unused)]
pub async fn ledger_transfer_by(
canister_id: CanisterId,
to: LedgerAccountIdentifier,
amount: u64,
fee: u64,
memo: u64,
) -> CanisterCallResult<LedgerTransferResult> {
ledger_transfer(
canister_id,
LedgerTransferArgs {
from_subaccount: None,
to,
amount: LedgerTokens { e8s: amount },
fee: LedgerTokens { e8s: fee },
memo,
created_at_time: None,
},
)
.await
}