Skip to content

Commit

Permalink
tx payment - file reorg
Browse files Browse the repository at this point in the history
  • Loading branch information
andrei-marinica committed Mar 22, 2024
1 parent 5a7aff2 commit 647a1a1
Show file tree
Hide file tree
Showing 9 changed files with 268 additions and 236 deletions.
6 changes: 0 additions & 6 deletions framework/base/src/types/interaction/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,6 @@ mod tx_env_sc;
mod tx_from;
mod tx_gas;
mod tx_payment;
mod tx_payment_egld;
mod tx_payment_egld_value;
mod tx_payment_normalize;
mod tx_proxy;
mod tx_result_handler;
mod tx_rh_list;
Expand Down Expand Up @@ -73,9 +70,6 @@ pub use tx_env_sc::*;
pub use tx_from::*;
pub use tx_gas::*;
pub use tx_payment::*;
pub use tx_payment_egld::*;
pub use tx_payment_egld_value::TxEgldValue;
pub use tx_payment_normalize::TxPaymentNormalize;
pub use tx_proxy::*;
pub use tx_result_handler::*;
pub use tx_rh_list::*;
Expand Down
236 changes: 42 additions & 194 deletions framework/base/src/types/interaction/tx_payment.rs
Original file line number Diff line number Diff line change
@@ -1,54 +1,25 @@
mod tx_payment_egld;
mod tx_payment_egld_value;
mod tx_payment_multi_esdt;
mod tx_payment_none;
mod tx_payment_normalize;
mod tx_payment_other;
mod tx_payment_single_esdt;

pub use tx_payment_egld::{Egld, EgldPayment};
pub use tx_payment_egld_value::TxEgldValue;
pub use tx_payment_normalize::TxPaymentNormalize;

use crate::{
api::ManagedTypeApi,
contract_base::SendRawWrapper,
imports::{BigUint, ManagedBuffer},
types::{
EgldOrEsdtTokenPayment, EgldOrMultiEsdtPayment, EsdtTokenPayment, ManagedAddress,
MultiEsdtPayment,
BigUint, EgldOrEsdtTokenPayment, EgldOrMultiEsdtPayment, EsdtTokenPayment, ManagedAddress,
ManagedBuffer, MultiEsdtPayment,
},
};

use super::{Egld, FunctionCall, TxEnv};

#[derive(Clone)]
pub struct AnnotatedEgldPayment<Api>
where
Api: ManagedTypeApi,
{
pub value: BigUint<Api>,
pub annotation: ManagedBuffer<Api>,
}

impl<Api> AnnotatedEgldPayment<Api>
where
Api: ManagedTypeApi,
{
pub fn new_egld(value: BigUint<Api>) -> Self {
let annotation = value.to_display();
AnnotatedEgldPayment { value, annotation }
}
}

#[derive(Clone)]
pub struct FullPaymentData<Api>
where
Api: ManagedTypeApi,
{
pub egld: Option<AnnotatedEgldPayment<Api>>,
pub multi_esdt: MultiEsdtPayment<Api>,
}

impl<Api> Default for FullPaymentData<Api>
where
Api: ManagedTypeApi,
{
fn default() -> Self {
Self {
egld: None,
multi_esdt: Default::default(),
}
}
}
use super::{FunctionCall, TxEnv};

/// Describes a payment that is part of a transaction.
pub trait TxPayment<Env>
Expand All @@ -68,177 +39,54 @@ where
fn into_full_payment_data(self, env: &Env) -> FullPaymentData<Env::Api>;
}

impl<Env> TxPayment<Env> for ()
/// Marks a payment object that only contains EGLD or nothing at all.
pub trait TxPaymentEgldOnly<Env>: TxPayment<Env>
where
Env: TxEnv,
{
fn is_no_payment(&self) -> bool {
true
}

fn perform_transfer_execute(
self,
env: &Env,
to: &ManagedAddress<Env::Api>,
gas_limit: u64,
fc: FunctionCall<Env::Api>,
) {
Egld(BigUint::zero()).perform_transfer_execute(env, to, gas_limit, fc);
}
fn with_egld_value<F, R>(&self, f: F) -> R
where
F: FnOnce(&BigUint<Env::Api>) -> R;

fn into_full_payment_data(self, _env: &Env) -> FullPaymentData<Env::Api> {
FullPaymentData::default()
}
fn into_egld_payment(self, env: &Env) -> BigUint<Env::Api>;
}

impl<Env> TxPayment<Env> for EsdtTokenPayment<Env::Api>
where
Env: TxEnv,
{
fn is_no_payment(&self) -> bool {
self.amount == 0u32
}

fn perform_transfer_execute(
self,
env: &Env,
to: &ManagedAddress<Env::Api>,
gas_limit: u64,
fc: FunctionCall<Env::Api>,
) {
MultiEsdtPayment::from_single_item(self).perform_transfer_execute(env, to, gas_limit, fc);
}

fn into_full_payment_data(self, _env: &Env) -> FullPaymentData<Env::Api> {
FullPaymentData {
egld: None,
multi_esdt: MultiEsdtPayment::from_single_item(self),
}
}
}

impl<Env> TxPayment<Env> for &MultiEsdtPayment<Env::Api>
#[derive(Clone)]
pub struct AnnotatedEgldPayment<Api>
where
Env: TxEnv,
Api: ManagedTypeApi,
{
fn is_no_payment(&self) -> bool {
self.is_empty()
}

fn perform_transfer_execute(
self,
_env: &Env,
to: &ManagedAddress<Env::Api>,
gas_limit: u64,
fc: FunctionCall<Env::Api>,
) {
let _ = SendRawWrapper::<Env::Api>::new().multi_esdt_transfer_execute(
to,
self,
gas_limit,
&fc.function_name,
&fc.arg_buffer,
);
}

fn into_full_payment_data(self, _env: &Env) -> FullPaymentData<Env::Api> {
FullPaymentData {
egld: None,
multi_esdt: self.clone(),
}
}
pub value: BigUint<Api>,
pub annotation: ManagedBuffer<Api>,
}

impl<Env> TxPayment<Env> for MultiEsdtPayment<Env::Api>
impl<Api> AnnotatedEgldPayment<Api>
where
Env: TxEnv,
Api: ManagedTypeApi,
{
fn is_no_payment(&self) -> bool {
self.is_empty()
}

fn perform_transfer_execute(
self,
env: &Env,
to: &ManagedAddress<Env::Api>,
gas_limit: u64,
fc: FunctionCall<Env::Api>,
) {
(&self).perform_transfer_execute(env, to, gas_limit, fc);
}

fn into_full_payment_data(self, _env: &Env) -> FullPaymentData<Env::Api> {
FullPaymentData {
egld: None,
multi_esdt: self,
}
pub fn new_egld(value: BigUint<Api>) -> Self {
let annotation = value.to_display();
AnnotatedEgldPayment { value, annotation }
}
}

impl<Env> TxPayment<Env> for EgldOrEsdtTokenPayment<Env::Api>
#[derive(Clone)]
pub struct FullPaymentData<Api>
where
Env: TxEnv,
Api: ManagedTypeApi,
{
fn is_no_payment(&self) -> bool {
self.amount == 0u32
}

fn perform_transfer_execute(
self,
env: &Env,
to: &ManagedAddress<Env::Api>,
gas_limit: u64,
fc: FunctionCall<Env::Api>,
) {
self.map_egld_or_esdt(
(to, fc),
|(to, fc), amount| Egld(amount).perform_transfer_execute(env, to, gas_limit, fc),
|(to, fc), esdt_payment| esdt_payment.perform_transfer_execute(env, to, gas_limit, fc),
)
}

fn into_full_payment_data(self, env: &Env) -> FullPaymentData<Env::Api> {
self.map_egld_or_esdt(
(),
|(), amount| TxPayment::<Env>::into_full_payment_data(Egld(amount), env),
|(), esdt_payment| TxPayment::<Env>::into_full_payment_data(esdt_payment, env),
)
}
pub egld: Option<AnnotatedEgldPayment<Api>>,
pub multi_esdt: MultiEsdtPayment<Api>,
}

impl<Env> TxPayment<Env> for EgldOrMultiEsdtPayment<Env::Api>
impl<Api> Default for FullPaymentData<Api>
where
Env: TxEnv,
Api: ManagedTypeApi,
{
fn is_no_payment(&self) -> bool {
self.is_empty()
}

fn perform_transfer_execute(
self,
env: &Env,
to: &ManagedAddress<Env::Api>,
gas_limit: u64,
fc: FunctionCall<Env::Api>,
) {
match self {
EgldOrMultiEsdtPayment::Egld(egld_amount) => {
Egld(egld_amount).perform_transfer_execute(env, to, gas_limit, fc)
},
EgldOrMultiEsdtPayment::MultiEsdt(multi_esdt_payment) => {
multi_esdt_payment.perform_transfer_execute(env, to, gas_limit, fc)
},
}
}

fn into_full_payment_data(self, env: &Env) -> FullPaymentData<Env::Api> {
match self {
EgldOrMultiEsdtPayment::Egld(egld_amount) => {
TxPayment::<Env>::into_full_payment_data(Egld(egld_amount), env)
},
EgldOrMultiEsdtPayment::MultiEsdt(multi_esdt_payment) => {
TxPayment::<Env>::into_full_payment_data(multi_esdt_payment, env)
},
fn default() -> Self {
Self {
egld: None,
multi_esdt: Default::default(),
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ use crate::{
};

use super::{
AnnotatedEgldPayment, FullPaymentData, FunctionCall, TxEgldValue, TxEnv,
TxPayment,
AnnotatedEgldPayment, FullPaymentData, FunctionCall, TxEgldValue, TxEnv, TxPayment,
TxPaymentEgldOnly,
};

/// Indicates the EGLD payment in a transaction.
Expand Down Expand Up @@ -48,34 +48,6 @@ where
}
}

/// Marks a payment object that only contains EGLD or nothing at all.
pub trait TxPaymentEgldOnly<Env>: TxPayment<Env>
where
Env: TxEnv,
{
fn with_egld_value<F, R>(&self, f: F) -> R
where
F: FnOnce(&BigUint<Env::Api>) -> R;

fn into_egld_payment(self, env: &Env) -> BigUint<Env::Api>;
}

impl<Env> TxPaymentEgldOnly<Env> for ()
where
Env: TxEnv,
{
fn with_egld_value<F, R>(&self, f: F) -> R
where
F: FnOnce(&BigUint<Env::Api>) -> R,
{
f(&BigUint::zero())
}

fn into_egld_payment(self, _env: &Env) -> BigUint<Env::Api> {
BigUint::zero()
}
}

impl<Env, EgldValue> TxPaymentEgldOnly<Env> for Egld<EgldValue>
where
Env: TxEnv,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::types::BigUint;
use crate::types::{AnnotatedValue, BigUint};

use super::{AnnotatedValue, TxEnv};
use super::TxEnv;

pub trait TxEgldValue<Env>: AnnotatedValue<Env, BigUint<Env::Api>>
where
Expand Down
Loading

0 comments on commit 647a1a1

Please sign in to comment.