Skip to content

Commit 0b66c31

Browse files
Merge pull request #2246 from multiversx/multi-transfer-marker-constraints
MultiTransfer marker - constrained argument
2 parents 14f83a8 + 3f030c2 commit 0b66c31

File tree

3 files changed

+26
-4
lines changed

3 files changed

+26
-4
lines changed

framework/base/src/types/interaction/tx_payment/tx_payment_multi_transfer_marker.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
use crate::{
22
contract_base::{SendRawWrapper, TransferExecuteFailed},
3-
types::{BigUint, ManagedAddress, MultiTransfer, PaymentVec, TxFrom, TxToSpecified},
3+
types::{
4+
BigUint, ManagedAddress, MultiTransfer, MultiTransferMarkerArg, PaymentVec, TxFrom,
5+
TxToSpecified,
6+
},
47
};
58

69
use super::{FullPaymentData, FunctionCall, TxEnv, TxPayment};
710

811
impl<Env, P> TxPayment<Env> for MultiTransfer<P>
912
where
1013
Env: TxEnv,
11-
P: AsRef<PaymentVec<Env::Api>>,
14+
P: MultiTransferMarkerArg + AsRef<PaymentVec<Env::Api>>,
1215
{
1316
fn is_no_payment(&self, _env: &Env) -> bool {
1417
let pv = self.0.as_ref();

framework/base/src/types/managed/wrapped/token.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ pub use esdt_token_data::EsdtTokenData;
2020
pub use esdt_token_identifier::{EsdtTokenIdentifier, TokenIdentifier};
2121
pub use esdt_token_payment::{EsdtTokenPayment, EsdtTokenPaymentRefs, MultiEsdtPayment};
2222
pub use multi_egld_or_esdt_token_payment::MultiEgldOrEsdtPayment;
23-
pub use multi_transfer_marker::MultiTransfer;
23+
pub use multi_transfer_marker::{MultiTransfer, MultiTransferMarkerArg};
2424
pub use payment::Payment;
2525
pub use payment_refs::PaymentRefs;
2626
pub use payment_vec::PaymentVec;
Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,26 @@
1+
use crate::{
2+
api::ManagedTypeApi,
3+
types::{ManagedRef, PaymentVec},
4+
};
5+
16
/// A wrapper that forces payments to go via MultiESDTtransfer, even if it wouldn't be necessary, such as:
27
/// - Just EGLD
38
/// - Single fungible ESDT transfers,
49
/// - Single NFT transfers.
510
///
611
/// This contrasts with unwrapped PaymentVec, tries to use the simplest possible transfer type.
7-
pub struct MultiTransfer<P>(pub P);
12+
pub struct MultiTransfer<P>(pub P)
13+
where
14+
P: MultiTransferMarkerArg;
15+
16+
/// Marks an allowed generic argument for MultiTransfer.
17+
#[diagnostic::on_unimplemented(
18+
message = "Type `{Self}` cannot be used in `MultiTransfer`",
19+
label = "unsupported MultiTransfer argument",
20+
note = "only `PaymentVec` and its references can be used as `MultiTransfer` arguments for now, please do signal the team if any other type is desired"
21+
)]
22+
pub trait MultiTransferMarkerArg {}
23+
24+
impl<M: ManagedTypeApi> MultiTransferMarkerArg for PaymentVec<M> {}
25+
impl<M: ManagedTypeApi> MultiTransferMarkerArg for &PaymentVec<M> {}
26+
impl<M: ManagedTypeApi> MultiTransferMarkerArg for ManagedRef<'_, M, PaymentVec<M>> {}

0 commit comments

Comments
 (0)