multiversx_chain_vm/builtin_functions/
builtin_func_trait.rs1use crate::{
2 host::context::{BlockchainUpdate, TxCache, TxInput, TxResult, TxTokenTransfer},
3 host::runtime::{RuntimeInstanceCallLambda, RuntimeRef},
4 types::VMAddress,
5};
6
7pub trait BuiltinFunction {
8 fn name(&self) -> &str;
12
13 fn extract_esdt_transfers(&self, tx_input: &TxInput) -> BuiltinFunctionEsdtTransferInfo {
15 BuiltinFunctionEsdtTransferInfo::empty(tx_input)
16 }
17
18 fn execute<F>(
23 &self,
24 tx_input: TxInput,
25 tx_cache: TxCache,
26 runtime: &RuntimeRef,
27 lambda: F,
28 ) -> (TxResult, BlockchainUpdate)
29 where
30 F: RuntimeInstanceCallLambda;
31}
32
33pub struct BuiltinFunctionEsdtTransferInfo {
36 pub real_recipient: VMAddress,
37 pub transfers: Vec<TxTokenTransfer>,
38}
39
40impl BuiltinFunctionEsdtTransferInfo {
41 pub fn empty(tx_input: &TxInput) -> Self {
42 BuiltinFunctionEsdtTransferInfo {
43 real_recipient: tx_input.to.clone(),
44 transfers: Vec::new(),
45 }
46 }
47
48 pub fn is_empty(&self) -> bool {
49 self.transfers.is_empty()
50 }
51}