1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
use super::{BlockchainApi, ManagedTypeApi};
use crate::types::{
BigUint, CodeMetadata, DctTokenPayment, ManagedAddress, ManagedArgBuffer, ManagedBuffer,
ManagedVec, TokenIdentifier,
};
pub trait SendApi: ManagedTypeApi + BlockchainApi {
type SendApiImpl: SendApiImpl;
fn send_api_impl() -> Self::SendApiImpl;
}
/// API that groups methods that either send MOAX or DCT, or that call other contracts.
pub trait SendApiImpl {
/// Sends MOAX to a given address, directly.
/// Used especially for sending MOAX to regular accounts.
fn direct_moax<M, D>(&self, to: &ManagedAddress<M>, amount: &BigUint<M>, data: D)
where
M: ManagedTypeApi,
D: Into<ManagedBuffer<M>>;
/// Sends MOAX to an address (optionally) and executes like an async call, but without callback.
fn direct_moax_execute<M: ManagedTypeApi>(
&self,
to: &ManagedAddress<M>,
amount: &BigUint<M>,
gas_limit: u64,
endpoint_name: &ManagedBuffer<M>,
arg_buffer: &ManagedArgBuffer<M>,
) -> Result<(), &'static [u8]>;
/// Sends DCT to an address and executes like an async call, but without callback.
fn direct_dct_execute<M: ManagedTypeApi>(
&self,
to: &ManagedAddress<M>,
token: &TokenIdentifier<M>,
amount: &BigUint<M>,
gas_limit: u64,
endpoint_name: &ManagedBuffer<M>,
arg_buffer: &ManagedArgBuffer<M>,
) -> Result<(), &'static [u8]>;
/// Sends DCT NFT to an address and executes like an async call, but without callback.
#[allow(clippy::too_many_arguments)]
fn direct_dct_nft_execute<M: ManagedTypeApi>(
&self,
to: &ManagedAddress<M>,
token: &TokenIdentifier<M>,
nonce: u64,
amount: &BigUint<M>,
gas_limit: u64,
endpoint_name: &ManagedBuffer<M>,
arg_buffer: &ManagedArgBuffer<M>,
) -> Result<(), &'static [u8]>;
fn direct_multi_dct_transfer_execute<M: ManagedTypeApi>(
&self,
to: &ManagedAddress<M>,
payments: &ManagedVec<M, DctTokenPayment<M>>,
gas_limit: u64,
endpoint_name: &ManagedBuffer<M>,
arg_buffer: &ManagedArgBuffer<M>,
) -> Result<(), &'static [u8]>;
/// Sends an asynchronous call to another contract.
/// Calling this method immediately terminates tx execution.
/// Using it directly is generally discouraged.
///
/// The data is expected to be of the form `functionName@<arg1-hex>@<arg2-hex>@...`.
/// Use a `HexCallDataSerializer` to prepare this field.
fn async_call_raw<M: ManagedTypeApi>(
&self,
to: &ManagedAddress<M>,
amount: &BigUint<M>,
endpoint_name: &ManagedBuffer<M>,
arg_buffer: &ManagedArgBuffer<M>,
) -> !;
/// Deploys a new contract in the same shard.
/// Unlike `async_call_raw`, the deployment is synchronous and tx execution continues afterwards.
/// Also unlike `async_call_raw`, it uses an argument buffer to pass arguments
/// If the deployment fails, Option::None is returned
fn deploy_contract<M: ManagedTypeApi>(
&self,
gas: u64,
amount: &BigUint<M>,
code: &ManagedBuffer<M>,
code_metadata: CodeMetadata,
arg_buffer: &ManagedArgBuffer<M>,
) -> (ManagedAddress<M>, ManagedVec<M, ManagedBuffer<M>>);
/// Deploys a new contract in the same shard by re-using the code of an already deployed source contract.
/// The deployment is done synchronously and the new contract's address is returned.
/// If the deployment fails, Option::None is returned
fn deploy_from_source_contract<M: ManagedTypeApi>(
&self,
gas: u64,
amount: &BigUint<M>,
source_contract_address: &ManagedAddress<M>,
code_metadata: CodeMetadata,
arg_buffer: &ManagedArgBuffer<M>,
) -> (ManagedAddress<M>, ManagedVec<M, ManagedBuffer<M>>);
fn upgrade_from_source_contract<M: ManagedTypeApi>(
&self,
sc_address: &ManagedAddress<M>,
gas: u64,
amount: &BigUint<M>,
source_contract_address: &ManagedAddress<M>,
code_metadata: CodeMetadata,
arg_buffer: &ManagedArgBuffer<M>,
);
/// Upgrades a child contract of the currently executing contract.
/// The upgrade is synchronous, and the current transaction will fail if the upgrade fails.
/// The child contract's new init function will be called with the provided arguments
fn upgrade_contract<M: ManagedTypeApi>(
&self,
sc_address: &ManagedAddress<M>,
gas: u64,
amount: &BigUint<M>,
code: &ManagedBuffer<M>,
code_metadata: CodeMetadata,
arg_buffer: &ManagedArgBuffer<M>,
);
/// Same shard, in-line execution of another contract.
fn execute_on_dest_context_raw<M: ManagedTypeApi>(
&self,
gas: u64,
address: &ManagedAddress<M>,
value: &BigUint<M>,
endpoint_name: &ManagedBuffer<M>,
arg_buffer: &ManagedArgBuffer<M>,
) -> ManagedVec<M, ManagedBuffer<M>>;
/// Same shard, in-line execution of another contract.
/// Allows the contract to specify which result range to extract as sync call result.
/// This is a workaround to handle nested sync calls.
/// Please do not use this method unless there is absolutely no other option.
/// Will be eliminated after some future Arwen hook redesign.
/// `range_closure` takes the number of results before, the number of results after,
/// and is expected to return the start index (inclusive) and end index (exclusive).
fn execute_on_dest_context_raw_custom_result_range<M, F>(
&self,
gas: u64,
address: &ManagedAddress<M>,
value: &BigUint<M>,
endpoint_name: &ManagedBuffer<M>,
arg_buffer: &ManagedArgBuffer<M>,
range_closure: F,
) -> ManagedVec<M, ManagedBuffer<M>>
where
M: ManagedTypeApi,
F: FnOnce(usize, usize) -> (usize, usize);
fn execute_on_dest_context_by_caller_raw<M: ManagedTypeApi>(
&self,
gas: u64,
address: &ManagedAddress<M>,
value: &BigUint<M>,
endpoint_name: &ManagedBuffer<M>,
arg_buffer: &ManagedArgBuffer<M>,
) -> ManagedVec<M, ManagedBuffer<M>>;
fn execute_on_same_context_raw<M: ManagedTypeApi>(
&self,
gas: u64,
address: &ManagedAddress<M>,
value: &BigUint<M>,
endpoint_name: &ManagedBuffer<M>,
arg_buffer: &ManagedArgBuffer<M>,
) -> ManagedVec<M, ManagedBuffer<M>>;
fn execute_on_dest_context_readonly_raw<M: ManagedTypeApi>(
&self,
gas: u64,
address: &ManagedAddress<M>,
endpoint_name: &ManagedBuffer<M>,
arg_buffer: &ManagedArgBuffer<M>,
) -> ManagedVec<M, ManagedBuffer<M>>;
/// Used to store data between async call and callback.
fn storage_store_tx_hash_key<M: ManagedTypeApi>(&self, data: &ManagedBuffer<M>);
/// Used to store data between async call and callback.
fn storage_load_tx_hash_key<M: ManagedTypeApi>(&self) -> ManagedBuffer<M>;
/// Allows synchronously calling a local function by name. Execution is resumed afterwards.
/// You should never have to call this function directly.
/// Use the other specific methods instead.
fn call_local_dct_built_in_function<M: ManagedTypeApi>(
&self,
gas: u64,
endpoint_name: &ManagedBuffer<M>,
arg_buffer: &ManagedArgBuffer<M>,
) -> ManagedVec<M, ManagedBuffer<M>>;
}