use std::collections::BTreeSet;
use crate::{
data_access_layer::BalanceIdentifier,
system::{
burn::{BurnArgs, BurnError},
runtime_native::{Config as NativeRuntimeConfig, TransferConfig},
transfer::{TransferArgs, TransferError},
},
tracking_copy::TrackingCopyCache,
};
use casper_types::{
account::AccountHash, execution::Effects, Digest, InitiatorAddr, ProtocolVersion, RuntimeArgs,
TransactionHash, Transfer, U512,
};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BalanceIdentifierTransferArgs {
to: Option<AccountHash>,
source: BalanceIdentifier,
target: BalanceIdentifier,
amount: U512,
arg_id: Option<u64>,
}
impl BalanceIdentifierTransferArgs {
pub fn new(
to: Option<AccountHash>,
source: BalanceIdentifier,
target: BalanceIdentifier,
amount: U512,
arg_id: Option<u64>,
) -> Self {
BalanceIdentifierTransferArgs {
to,
source,
target,
amount,
arg_id,
}
}
pub fn to(&self) -> Option<AccountHash> {
self.to
}
pub fn source(&self) -> &BalanceIdentifier {
&self.source
}
pub fn target(&self) -> &BalanceIdentifier {
&self.target
}
pub fn amount(&self) -> U512 {
self.amount
}
pub fn arg_id(&self) -> Option<u64> {
self.arg_id
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum TransferRequestArgs {
Raw(RuntimeArgs),
Explicit(TransferArgs),
Indirect(Box<BalanceIdentifierTransferArgs>),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TransferRequest {
config: NativeRuntimeConfig,
state_hash: Digest,
protocol_version: ProtocolVersion,
transaction_hash: TransactionHash,
initiator: InitiatorAddr,
authorization_keys: BTreeSet<AccountHash>,
args: TransferRequestArgs,
}
impl TransferRequest {
#[allow(clippy::too_many_arguments)]
pub fn new(
config: NativeRuntimeConfig,
state_hash: Digest,
protocol_version: ProtocolVersion,
transaction_hash: TransactionHash,
initiator: InitiatorAddr,
authorization_keys: BTreeSet<AccountHash>,
args: TransferArgs,
) -> Self {
let args = TransferRequestArgs::Explicit(args);
Self {
config,
state_hash,
protocol_version,
transaction_hash,
initiator,
authorization_keys,
args,
}
}
#[allow(clippy::too_many_arguments)]
pub fn with_runtime_args(
config: NativeRuntimeConfig,
state_hash: Digest,
protocol_version: ProtocolVersion,
transaction_hash: TransactionHash,
initiator: InitiatorAddr,
authorization_keys: BTreeSet<AccountHash>,
args: RuntimeArgs,
) -> Self {
let args = TransferRequestArgs::Raw(args);
Self {
config,
state_hash,
protocol_version,
transaction_hash,
initiator,
authorization_keys,
args,
}
}
#[allow(clippy::too_many_arguments)]
pub fn new_indirect(
config: NativeRuntimeConfig,
state_hash: Digest,
protocol_version: ProtocolVersion,
transaction_hash: TransactionHash,
initiator: InitiatorAddr,
authorization_keys: BTreeSet<AccountHash>,
args: BalanceIdentifierTransferArgs,
) -> Self {
let args = TransferRequestArgs::Indirect(Box::new(args));
Self {
config,
state_hash,
protocol_version,
transaction_hash,
initiator,
authorization_keys,
args,
}
}
pub fn config(&self) -> &NativeRuntimeConfig {
&self.config
}
pub fn transfer_config(&self) -> &TransferConfig {
self.config.transfer_config()
}
pub fn state_hash(&self) -> Digest {
self.state_hash
}
pub fn initiator(&self) -> &InitiatorAddr {
&self.initiator
}
pub fn authorization_keys(&self) -> &BTreeSet<AccountHash> {
&self.authorization_keys
}
pub fn protocol_version(&self) -> ProtocolVersion {
self.protocol_version
}
pub fn transaction_hash(&self) -> TransactionHash {
self.transaction_hash
}
pub fn args(&self) -> &TransferRequestArgs {
&self.args
}
pub fn into_args(self) -> TransferRequestArgs {
self.args
}
#[doc(hidden)]
pub fn set_state_hash_and_config(&mut self, state_hash: Digest, config: NativeRuntimeConfig) {
self.state_hash = state_hash;
self.config = config;
}
}
#[derive(Debug, Clone)]
pub enum TransferResult {
RootNotFound,
Success {
transfers: Vec<Transfer>,
effects: Effects,
cache: TrackingCopyCache,
},
Failure(TransferError),
}
impl TransferResult {
pub fn effects(&self) -> Effects {
match self {
TransferResult::RootNotFound | TransferResult::Failure(_) => Effects::new(),
TransferResult::Success { effects, .. } => effects.clone(),
}
}
pub fn transfers(&self) -> Vec<Transfer> {
match self {
TransferResult::RootNotFound | TransferResult::Failure(_) => vec![],
TransferResult::Success { transfers, .. } => transfers.clone(),
}
}
pub fn error(&self) -> Option<TransferError> {
if let Self::Failure(error) = self {
Some(error.clone())
} else {
None
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum BurnRequestArgs {
Raw(RuntimeArgs),
Explicit(BurnArgs),
}
pub struct BurnRequest {
config: NativeRuntimeConfig,
state_hash: Digest,
protocol_version: ProtocolVersion,
transaction_hash: TransactionHash,
initiator: InitiatorAddr,
authorization_keys: BTreeSet<AccountHash>,
args: BurnRequestArgs,
}
impl BurnRequest {
#[allow(clippy::too_many_arguments)]
pub fn new(
config: NativeRuntimeConfig,
state_hash: Digest,
protocol_version: ProtocolVersion,
transaction_hash: TransactionHash,
initiator: InitiatorAddr,
authorization_keys: BTreeSet<AccountHash>,
args: BurnArgs,
) -> Self {
let args = BurnRequestArgs::Explicit(args);
Self {
config,
state_hash,
protocol_version,
transaction_hash,
initiator,
authorization_keys,
args,
}
}
#[allow(clippy::too_many_arguments)]
pub fn with_runtime_args(
config: NativeRuntimeConfig,
state_hash: Digest,
protocol_version: ProtocolVersion,
transaction_hash: TransactionHash,
initiator: InitiatorAddr,
authorization_keys: BTreeSet<AccountHash>,
args: RuntimeArgs,
) -> Self {
let args = BurnRequestArgs::Raw(args);
Self {
config,
state_hash,
protocol_version,
transaction_hash,
initiator,
authorization_keys,
args,
}
}
pub fn config(&self) -> &NativeRuntimeConfig {
&self.config
}
pub fn state_hash(&self) -> Digest {
self.state_hash
}
pub fn initiator(&self) -> &InitiatorAddr {
&self.initiator
}
pub fn authorization_keys(&self) -> &BTreeSet<AccountHash> {
&self.authorization_keys
}
pub fn protocol_version(&self) -> ProtocolVersion {
self.protocol_version
}
pub fn transaction_hash(&self) -> TransactionHash {
self.transaction_hash
}
pub fn args(&self) -> &BurnRequestArgs {
&self.args
}
pub fn into_args(self) -> BurnRequestArgs {
self.args
}
#[doc(hidden)]
pub fn set_state_hash_and_config(&mut self, state_hash: Digest, config: NativeRuntimeConfig) {
self.state_hash = state_hash;
self.config = config;
}
}
#[derive(Debug, Clone)]
pub enum BurnResult {
RootNotFound,
Success {
effects: Effects,
cache: TrackingCopyCache,
},
Failure(BurnError),
}
impl BurnResult {
pub fn effects(&self) -> Effects {
match self {
BurnResult::RootNotFound | BurnResult::Failure(_) => Effects::new(),
BurnResult::Success { effects, .. } => effects.clone(),
}
}
pub fn error(&self) -> Option<BurnError> {
if let Self::Failure(error) = self {
Some(error.clone())
} else {
None
}
}
}