use core::marker::PhantomData;
use pro_env::{
call::{
utils::ReturnType,
CallParams,
CreateParams,
},
hash::{
CryptoHash,
HashOutput,
},
Environment,
Result,
};
use pro_primitives::Key;
use crate::ChainExtensionInstance;
pub trait ContractEnv {
type Env: ::pro_env::Environment;
}
pub trait Env {
type EnvAccess;
fn env(self) -> Self::EnvAccess;
}
pub trait StaticEnv {
type EnvAccess;
fn env() -> Self::EnvAccess;
}
#[derive(Copy, Clone)]
pub struct EnvAccess<'a, T> {
marker: PhantomData<fn() -> &'a T>,
}
impl<'a, T> Default for EnvAccess<'a, T> {
#[inline]
fn default() -> Self {
Self {
marker: Default::default(),
}
}
}
impl<'a, E> core::fmt::Debug for EnvAccess<'a, E> {
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
f.debug_struct("EnvAccess").finish()
}
}
impl<'a, T> EnvAccess<'a, T>
where
T: Environment,
<T as Environment>::ChainExtension: ChainExtensionInstance,
{
pub fn extension(
self,
) -> <<T as Environment>::ChainExtension as ChainExtensionInstance>::Instance {
<<T as Environment>::ChainExtension as ChainExtensionInstance>::instantiate()
}
}
impl<'a, T> EnvAccess<'a, T>
where
T: Environment,
{
pub fn caller(self) -> T::AccountId {
pro_env::caller::<T>().expect("couldn't decode caller")
}
pub fn transferred_balance(self) -> T::Balance {
pro_env::transferred_balance::<T>().expect("couldn't decode transferred balance")
}
pub fn weight_to_fee(self, gas: u64) -> T::Balance {
pro_env::weight_to_fee::<T>(gas).expect("couldn't decode weight fee")
}
pub fn gas_left(self) -> T::Balance {
pro_env::gas_left::<T>().expect("couldn't decode gas left")
}
pub fn block_timestamp(self) -> T::Timestamp {
pro_env::block_timestamp::<T>().expect("couldn't decode block time stamp")
}
pub fn account_id(self) -> T::AccountId {
pro_env::account_id::<T>().expect("couldn't decode contract account ID")
}
pub fn balance(self) -> T::Balance {
pro_env::balance::<T>().expect("couldn't decode contract balance")
}
pub fn rent_allowance(self) -> T::Balance {
pro_env::rent_allowance::<T>().expect("couldn't decode contract rent allowance")
}
pub fn block_number(self) -> T::BlockNumber {
pro_env::block_number::<T>().expect("couldn't decode block number")
}
pub fn minimum_balance(self) -> T::Balance {
pro_env::minimum_balance::<T>().expect("couldn't decode minimum account balance")
}
pub fn tombstone_deposit(self) -> T::Balance {
pro_env::tombstone_deposit::<T>().expect("couldn't decode tombstone deposits")
}
pub fn set_rent_allowance(self, new_value: T::Balance) {
pro_env::set_rent_allowance::<T>(new_value)
}
pub fn invoke_contract<Args>(self, params: &CallParams<T, Args, ()>) -> Result<()>
where
Args: scale::Encode,
{
pro_env::invoke_contract::<T, Args>(params)
}
pub fn eval_contract<Args, R>(
self,
params: &CallParams<T, Args, ReturnType<R>>,
) -> Result<R>
where
Args: scale::Encode,
R: scale::Decode,
{
pro_env::eval_contract::<T, Args, R>(params)
}
pub fn instantiate_contract<Args, Salt, C>(
self,
params: &CreateParams<T, Args, Salt, C>,
) -> Result<T::AccountId>
where
Args: scale::Encode,
Salt: AsRef<[u8]>,
{
pro_env::instantiate_contract::<T, Args, Salt, C>(params)
}
pub fn restore_contract(
self,
account_id: T::AccountId,
code_hash: T::Hash,
rent_allowance: T::Balance,
filtered_keys: &[Key],
) {
pro_env::restore_contract::<T>(
account_id,
code_hash,
rent_allowance,
filtered_keys,
)
}
pub fn terminate_contract(self, beneficiary: T::AccountId) -> ! {
pro_env::terminate_contract::<T>(beneficiary)
}
pub fn transfer(self, destination: T::AccountId, value: T::Balance) -> Result<()> {
pro_env::transfer::<T>(destination, value)
}
pub fn random(self, subject: &[u8]) -> T::Hash {
pro_env::random::<T>(subject).expect("couldn't decode randomized hash")
}
pub fn hash_bytes<H>(self, input: &[u8]) -> <H as HashOutput>::Type
where
H: CryptoHash,
{
let mut output = <H as HashOutput>::Type::default();
pro_env::hash_bytes::<H>(input, &mut output);
output
}
pub fn hash_encoded<H, V>(self, value: &V) -> <H as HashOutput>::Type
where
H: CryptoHash,
V: scale::Encode,
{
let mut output = <H as HashOutput>::Type::default();
pro_env::hash_encoded::<H, V>(value, &mut output);
output
}
}