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
use engine_shared::stored_value::StoredValue; use engine_storage::global_state::StateReader; use standard_payment::{AccountProvider, MintProvider, ProofOfStakeProvider, StandardPayment}; use types::{system_contract_errors, ApiError, Key, RuntimeArgs, URef, U512}; use crate::{execution, runtime::Runtime}; pub const METHOD_GET_PAYMENT_PURSE: &str = "get_payment_purse"; impl<'a, R> AccountProvider for Runtime<'a, R> where R: StateReader<Key, StoredValue>, R::Error: Into<execution::Error>, { fn get_main_purse(&self) -> Result<URef, ApiError> { self.context .get_main_purse() .map_err(|_| ApiError::InvalidPurse) } } impl<'a, R> MintProvider for Runtime<'a, R> where R: StateReader<Key, StoredValue>, R::Error: Into<execution::Error>, { fn transfer_purse_to_purse( &mut self, source: URef, target: URef, amount: U512, ) -> Result<(), ApiError> { let mint_contract_hash = self.get_mint_contract(); self.mint_transfer(mint_contract_hash, source, target, amount) .map_err(|error| match error { execution::Error::SystemContract(system_contract_errors::Error::Mint( mint_error, )) => ApiError::from(mint_error), _ => ApiError::Unhandled, }) } } impl<'a, R> ProofOfStakeProvider for Runtime<'a, R> where R: StateReader<Key, StoredValue>, R::Error: Into<execution::Error>, { fn get_payment_purse(&mut self) -> Result<URef, ApiError> { let pos_contract_hash = self.get_pos_contract(); let cl_value = self .call_contract( pos_contract_hash, METHOD_GET_PAYMENT_PURSE, RuntimeArgs::new(), ) .map_err(|_| { ApiError::ProofOfStake( system_contract_errors::pos::Error::PaymentPurseNotFound as u8, ) })?; let payment_purse_ref: URef = cl_value.into_t()?; Ok(payment_purse_ref) } } impl<'a, R> StandardPayment for Runtime<'a, R> where R: StateReader<Key, StoredValue>, R::Error: Into<execution::Error>, { }