use crate::ChainExtensionInstance;
use core::marker::PhantomData;
use ink_env::{
call::{
Call,
CallParams,
CreateParams,
DelegateCall,
},
hash::{
CryptoHash,
HashOutput,
},
Environment,
Error,
Result,
};
#[derive(Copy, Clone)]
pub struct EnvAccess<'a, E> {
marker: PhantomData<fn() -> &'a E>,
}
impl<'a, E> Default for EnvAccess<'a, E> {
#[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, E> EnvAccess<'a, E>
where
E: Environment,
<E as Environment>::ChainExtension: ChainExtensionInstance,
{
pub fn extension(
self,
) -> <<E as Environment>::ChainExtension as ChainExtensionInstance>::Instance {
<<E as Environment>::ChainExtension as ChainExtensionInstance>::instantiate()
}
}
impl<'a, E> EnvAccess<'a, E>
where
E: Environment,
{
pub fn caller(self) -> E::AccountId {
ink_env::caller::<E>()
}
pub fn transferred_value(self) -> E::Balance {
ink_env::transferred_value::<E>()
}
pub fn weight_to_fee(self, gas: u64) -> E::Balance {
ink_env::weight_to_fee::<E>(gas)
}
pub fn gas_left(self) -> u64 {
ink_env::gas_left::<E>()
}
pub fn block_timestamp(self) -> E::Timestamp {
ink_env::block_timestamp::<E>()
}
pub fn account_id(self) -> E::AccountId {
ink_env::account_id::<E>()
}
pub fn balance(self) -> E::Balance {
ink_env::balance::<E>()
}
pub fn block_number(self) -> E::BlockNumber {
ink_env::block_number::<E>()
}
pub fn minimum_balance(self) -> E::Balance {
ink_env::minimum_balance::<E>()
}
pub fn instantiate_contract<Args, Salt, C>(
self,
params: &CreateParams<E, Args, Salt, C>,
) -> Result<E::AccountId>
where
Args: scale::Encode,
Salt: AsRef<[u8]>,
{
ink_env::instantiate_contract::<E, Args, Salt, C>(params)
}
pub fn invoke_contract<Args, R>(
self,
params: &CallParams<E, Call<E>, Args, R>,
) -> Result<R>
where
Args: scale::Encode,
R: scale::Decode,
{
ink_env::invoke_contract::<E, Args, R>(params)
}
pub fn invoke_contract_delegate<Args, R>(
self,
params: &CallParams<E, DelegateCall<E>, Args, R>,
) -> Result<R>
where
Args: scale::Encode,
R: scale::Decode,
{
ink_env::invoke_contract_delegate::<E, Args, R>(params)
}
pub fn terminate_contract(self, beneficiary: E::AccountId) -> ! {
ink_env::terminate_contract::<E>(beneficiary)
}
pub fn transfer(self, destination: E::AccountId, value: E::Balance) -> Result<()> {
ink_env::transfer::<E>(destination, value)
}
pub fn random(self, subject: &[u8]) -> (E::Hash, E::BlockNumber) {
ink_env::random::<E>(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();
ink_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();
ink_env::hash_encoded::<H, V>(value, &mut output);
output
}
pub fn ecdsa_recover(
self,
signature: &[u8; 65],
message_hash: &[u8; 32],
) -> Result<[u8; 33]> {
let mut output = [0; 33];
ink_env::ecdsa_recover(signature, message_hash, &mut output)
.map(|_| output)
.map_err(|_| Error::EcdsaRecoveryFailed)
}
pub fn ecdsa_to_eth_address(self, pubkey: &[u8; 33]) -> Result<[u8; 20]> {
let mut output = [0; 20];
ink_env::ecdsa_to_eth_address(pubkey, &mut output)
.map(|_| output)
.map_err(|_| Error::EcdsaRecoveryFailed)
}
pub fn is_contract(self, account_id: &E::AccountId) -> bool {
ink_env::is_contract::<E>(account_id)
}
pub fn caller_is_origin(self) -> bool {
ink_env::caller_is_origin::<E>()
}
pub fn code_hash(self, account_id: &E::AccountId) -> Result<E::Hash> {
ink_env::code_hash::<E>(account_id)
}
pub fn own_code_hash(self) -> Result<E::Hash> {
ink_env::own_code_hash::<E>()
}
}