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
use super::{
BigIntApi, BigUintApi, BlockchainApi, CallValueApi, CryptoApi, ErrorApi, SendApi,
StorageReadApi, StorageWriteApi,
};
use crate::storage;
/// Interface to be used by the actual smart contract code.
///
/// Note: contracts and the api are not mutable.
/// They simply pass on/retrieve data to/from the protocol.
/// When mocking the blockchain state, we use the Rc/RefCell pattern
/// to isolate mock state mutability from the contract interface.
pub trait ContractSelfApi<BigInt, BigUint>: Sized
where
BigInt: BigIntApi<BigUint> + 'static,
BigUint: BigUintApi + 'static,
{
/// Abstracts the lower-level storage functionality.
type Storage: StorageReadApi + StorageWriteApi + ErrorApi + Clone + 'static;
/// Abstracts the call value handling at the beginning of a function call.
type CallValue: CallValueApi<BigUint> + ErrorApi + Clone + 'static;
/// Abstracts the sending of MOAX & DCT transactions, as well as async calls.
type SendApi: SendApi<BigUint> + Clone + 'static;
type BlockchainApi: BlockchainApi<BigUint> + Clone + 'static;
type CryptoApi: CryptoApi + Clone + 'static;
/// Gateway into the lower-level storage functionality.
/// Storage related annotations make use of this.
/// Using it directly is not recommended.
fn get_storage_raw(&self) -> Self::Storage;
/// Gateway into the call value retrieval functionality.
/// The payment annotations should normally be the ones to handle this,
/// but the developer is also given direct access to the API.
fn call_value(&self) -> Self::CallValue;
/// Gateway to the functionality related to sending transactions from the current contract.
fn send(&self) -> Self::SendApi;
/// Gateway blockchain info related to the current transaction and to accounts.
fn blockchain(&self) -> Self::BlockchainApi;
/// Stateless crypto functions provided by the Arwen VM.
fn crypto(&self) -> Self::CryptoApi;
/// Retrieves validator rewards, as set by the protocol.
/// TODO: move to the storage API, once BigUint gets refactored
#[inline]
fn storage_load_cumulated_validator_reward(&self) -> BigUint {
storage::storage_get(
self.get_storage_raw(),
storage::protected_keys::DHARITRI_REWARD_KEY,
)
}
}