mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-27 08:07:58 +00:00
c7a14db792
* meaningfull -> meaningful * initialise -> initialize * tokans -> tokens * incentivise -> incentivize * lenght -> length * incentivisation -> incentivization * doesnt't -> doesn't * overwriten -> overwritten * lifecycle -> life cycle * lifecycle -> life cycle * usefull -> useful * noone -> no one * spaming -> spamming * defered -> deferred * hieght -> height * sumation -> summation * ingore -> ignore * registed -> registered * Auxialary -> Auxiliary * loggin -> logging * independance -> independence * trailling -> trailing * responsability -> responsibility * trunkated -> truncated * Weither -> Whether * informations -> information * Runtume -> Runtime * choosen -> chosen * delcataion -> declaration * Unchekced -> Unchecked * defintion -> definition * scrach -> scratch * imput -> input * transfered -> transferred * endownment -> endowment * Determinator -> Determiner * relevent -> relevant * emited -> emitted * acocunt -> account * proprotional -> proportional * instantiaion -> instantiation * commited -> committed * tombstonedead -> tombstone * uwnrap -> unwrap * acount -> account * specialised -> specialized * existant -> existent * requried -> required * Anull -> Annul * AUTHORITES -> AUTHORITIES * underyling -> underlying * recognisable -> recognizable * Capitalise -> Capitalize * reportfor -> report for * hearbeat -> heartbeat * onlineness -> being online * creater -> creator * Bytearray -> Byte array * Despoit -> Deposit * substratced -> subtracted * Curent -> Current * imbalanes -> imbalances * countfown -> countdown * inexisting -> inexistent * additionaly -> additionally * substracted -> subtracted * auxilary -> auxiliary * parital -> partial * in't -> isn't * compatability -> compatibility * infomation -> information * etected -> detected * extrinsiscs -> extrinsics * reprensentation -> representation * coonfiguration -> configuration * primtives -> primitives * miscelanious -> miscellaneous * VERISON -> VERSION * endcoded -> encoded * Genrates -> Generates * miliseconds -> milliseconds * occured -> occurred * trully -> truely * truely -> truly * conjuction -> conjunction * encouters -> encounters * customised -> customized * deterministicly -> deterministically * finalisation -> finalization * pluggable -> plugable * wakeup -> wake-up * interemdiate -> intermediate * intepreting -> interpreting * finalzied -> finalized * throgh -> through * extinsic -> extrinsic * convient -> convenient * allocater -> allocator * propagateable -> propagatable * succesfuly -> successfully * finalising -> finalizing * publically -> publicly * phrasee -> phrase * substration -> substractions * substractions -> subtractions * neccessarily -> necessarily * Inlucde -> Include * unefficient -> inefficient * thay -> they * funtion -> function * datastructures -> data structures * infromation -> information * propagatable -> propagable * ecountered -> encountered * recognise -> recognize * intergration -> integration * lastet -> latest * datatypes -> data types * datatype -> data type * Strongarming -> Strong Arming * avaible -> available * Commiting -> Committing * Retreiving -> Retrieving * shoud -> should * canonicaliziation -> canonicalization * comitted -> committed * clonable -> cloneable * Uknown -> Unknown * reponse -> response * arbitary -> arbitrary * Capapbilities -> Capabilities * responsbile -> responsible * initialisation -> initialization * cames -> came * intemediate -> intermediate * reqeust -> request * intance -> instance * explcitly -> explicitly * neighor -> neighbor * reolving -> resolving * untill -> until * Validte -> Validate * deserailize -> deserialize * literaly -> literally * preceeding -> preceding * abpve -> above * chcecked -> checked * numbet -> number * Unknow -> Unknown * halfs -> halves * gossup -> gossip * givent -> given * immediatelly -> immediately * slicable -> sliceable * conensus -> consensus * Mimicks -> Mimics * acccept -> accept * serialise -> serialize * exstrinsics -> extrinsics * panicks -> panics * maintaince -> maintenance * repeatidely -> repeatedly * anecstor -> ancestor * becasue -> because * processer -> processor * Prunning -> Pruning * insterested -> interested * unuseful -> not useful * yeided -> yielded * descendfing -> descending * corresponts -> corresponds * survivew -> survive * keps -> keeps * ligh -> light * prerequisities -> prerequisites * positiion -> position * depedency -> dependency * extrinisic -> extrinsic * atomicaly -> atomically * staticly -> statically * resul -> result * timestamb -> timestamp * Utilites -> Utilities * ammount -> amount * pocess -> process * exteral -> external * Update client/finality-grandpa/src/tests.rs * Update primitives/io/src/lib.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update primitives/blockchain/src/lib.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update frame/support/src/weights.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update bin/node/cli/tests/common.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update client/api/src/execution_extensions.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update client/cli/src/params.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update client/executor/common/src/sandbox.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update client/api/src/execution_extensions.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update client/finality-grandpa/src/communication/mod.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update client/state-db/src/pruning.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update frame/contracts/src/tests.rs Co-Authored-By: joe petrowski <25483142+joepetrowski@users.noreply.github.com> * Update client/api/src/execution_extensions.rs * bump impl * timestamb -> timestamp Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com>
188 lines
4.6 KiB
Rust
188 lines
4.6 KiB
Rust
use sp_std::marker::PhantomData;
|
|
use sp_std::vec::Vec;
|
|
#[cfg(feature = "std")]
|
|
use serde::{Serialize, Deserialize};
|
|
use codec::{Encode, Decode};
|
|
use sp_core::{U256, H256, H160};
|
|
use sp_runtime::traits::UniqueSaturatedInto;
|
|
use frame_support::storage::{StorageMap, StorageDoubleMap};
|
|
use sha3::{Keccak256, Digest};
|
|
use evm::Config;
|
|
use evm::backend::{Backend as BackendT, ApplyBackend, Apply};
|
|
use crate::{Trait, Accounts, AccountStorages, AccountCodes, Module, Event};
|
|
|
|
#[derive(Clone, Eq, PartialEq, Encode, Decode, Default)]
|
|
#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))]
|
|
/// Ethereum account nonce, balance and code. Used by storage.
|
|
pub struct Account {
|
|
/// Account nonce.
|
|
pub nonce: U256,
|
|
/// Account balance.
|
|
pub balance: U256,
|
|
}
|
|
|
|
#[derive(Clone, Eq, PartialEq, Encode, Decode)]
|
|
#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))]
|
|
/// Ethereum log. Used for `deposit_event`.
|
|
pub struct Log {
|
|
/// Source address of the log.
|
|
pub address: H160,
|
|
/// Topics of the log.
|
|
pub topics: Vec<H256>,
|
|
/// Byte array data of the log.
|
|
pub data: Vec<u8>,
|
|
}
|
|
|
|
#[derive(Clone, Eq, PartialEq, Encode, Decode, Default)]
|
|
#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))]
|
|
/// External input from the transaction.
|
|
pub struct Vicinity {
|
|
/// Current transaction gas price.
|
|
pub gas_price: U256,
|
|
/// Origin of the transaction.
|
|
pub origin: H160,
|
|
}
|
|
|
|
/// Gasometer config used for executor. Currently this is hard-coded to
|
|
/// Istanbul hard fork.
|
|
pub static GASOMETER_CONFIG: Config = Config::istanbul();
|
|
|
|
/// Substrate backend for EVM.
|
|
pub struct Backend<'vicinity, T> {
|
|
vicinity: &'vicinity Vicinity,
|
|
_marker: PhantomData<T>,
|
|
}
|
|
|
|
impl<'vicinity, T> Backend<'vicinity, T> {
|
|
/// Create a new backend with given vicinity.
|
|
pub fn new(vicinity: &'vicinity Vicinity) -> Self {
|
|
Self { vicinity, _marker: PhantomData }
|
|
}
|
|
}
|
|
|
|
impl<'vicinity, T: Trait> BackendT for Backend<'vicinity, T> {
|
|
fn gas_price(&self) -> U256 { self.vicinity.gas_price }
|
|
fn origin(&self) -> H160 { self.vicinity.origin }
|
|
|
|
fn block_hash(&self, number: U256) -> H256 {
|
|
if number > U256::from(u32::max_value()) {
|
|
H256::default()
|
|
} else {
|
|
let number = T::BlockNumber::from(number.as_u32());
|
|
H256::from_slice(frame_system::Module::<T>::block_hash(number).as_ref())
|
|
}
|
|
}
|
|
|
|
fn block_number(&self) -> U256 {
|
|
let number: u128 = frame_system::Module::<T>::block_number().unique_saturated_into();
|
|
U256::from(number)
|
|
}
|
|
|
|
fn block_coinbase(&self) -> H160 {
|
|
H160::default()
|
|
}
|
|
|
|
fn block_timestamp(&self) -> U256 {
|
|
let now: u128 = pallet_timestamp::Module::<T>::get().unique_saturated_into();
|
|
U256::from(now)
|
|
}
|
|
|
|
fn block_difficulty(&self) -> U256 {
|
|
U256::zero()
|
|
}
|
|
|
|
fn block_gas_limit(&self) -> U256 {
|
|
U256::zero()
|
|
}
|
|
|
|
fn chain_id(&self) -> U256 {
|
|
U256::from(sp_io::misc::chain_id())
|
|
}
|
|
|
|
fn exists(&self, _address: H160) -> bool {
|
|
true
|
|
}
|
|
|
|
fn basic(&self, address: H160) -> evm::backend::Basic {
|
|
let account = Accounts::get(&address);
|
|
|
|
evm::backend::Basic {
|
|
balance: account.balance,
|
|
nonce: account.nonce,
|
|
}
|
|
}
|
|
|
|
fn code_size(&self, address: H160) -> usize {
|
|
AccountCodes::decode_len(&address).unwrap_or(0)
|
|
}
|
|
|
|
fn code_hash(&self, address: H160) -> H256 {
|
|
H256::from_slice(Keccak256::digest(&AccountCodes::get(&address)).as_slice())
|
|
}
|
|
|
|
fn code(&self, address: H160) -> Vec<u8> {
|
|
AccountCodes::get(&address)
|
|
}
|
|
|
|
fn storage(&self, address: H160, index: H256) -> H256 {
|
|
AccountStorages::get(address, index)
|
|
}
|
|
}
|
|
|
|
impl<'vicinity, T: Trait> ApplyBackend for Backend<'vicinity, T> {
|
|
fn apply<A, I, L>(
|
|
&mut self,
|
|
values: A,
|
|
logs: L,
|
|
delete_empty: bool,
|
|
) where
|
|
A: IntoIterator<Item=Apply<I>>,
|
|
I: IntoIterator<Item=(H256, H256)>,
|
|
L: IntoIterator<Item=evm::backend::Log>,
|
|
{
|
|
for apply in values {
|
|
match apply {
|
|
Apply::Modify {
|
|
address, basic, code, storage, reset_storage,
|
|
} => {
|
|
Accounts::mutate(&address, |account| {
|
|
account.balance = basic.balance;
|
|
account.nonce = basic.nonce;
|
|
});
|
|
|
|
if let Some(code) = code {
|
|
AccountCodes::insert(address, code);
|
|
}
|
|
|
|
if reset_storage {
|
|
AccountStorages::remove_prefix(address);
|
|
}
|
|
|
|
for (index, value) in storage {
|
|
if value == H256::default() {
|
|
AccountStorages::remove(address, index);
|
|
} else {
|
|
AccountStorages::insert(address, index, value);
|
|
}
|
|
}
|
|
|
|
if delete_empty {
|
|
Module::<T>::remove_account_if_empty(&address);
|
|
}
|
|
},
|
|
Apply::Delete { address } => {
|
|
Module::<T>::remove_account(&address)
|
|
},
|
|
}
|
|
}
|
|
|
|
for log in logs {
|
|
Module::<T>::deposit_event(Event::Log(Log {
|
|
address: log.address,
|
|
topics: log.topics,
|
|
data: log.data,
|
|
}));
|
|
}
|
|
}
|
|
}
|