mod dynamic;
mod precompiled;
pub use self::dynamic::*;
pub use self::precompiled::*;
use bigint::{Address, Gas, H160, U256};
pub trait AccountPatch {
fn initial_nonce(&self) -> U256;
fn initial_create_nonce(&self) -> U256;
fn empty_considered_exists(&self) -> bool;
fn allow_partial_change(&self) -> bool {
self.empty_considered_exists()
}
}
#[derive(Default, Copy, Clone)]
pub struct EmbeddedAccountPatch;
#[rustfmt::skip]
impl AccountPatch for EmbeddedAccountPatch {
fn initial_nonce(&self) -> U256 { U256::zero() }
fn initial_create_nonce(&self) -> U256 { self.initial_nonce() }
fn empty_considered_exists(&self) -> bool { true }
}
pub trait Patch {
type Account: AccountPatch;
fn account_patch(&self) -> &Self::Account;
fn code_deposit_limit(&self) -> Option<usize>;
fn callstack_limit(&self) -> usize;
fn gas_extcode(&self) -> Gas;
fn gas_balance(&self) -> Gas;
fn gas_sload(&self) -> Gas;
fn gas_suicide(&self) -> Gas;
fn gas_suicide_new_account(&self) -> Gas;
fn gas_call(&self) -> Gas;
fn gas_expbyte(&self) -> Gas;
fn gas_transaction_create(&self) -> Gas;
fn force_code_deposit(&self) -> bool;
fn has_delegate_call(&self) -> bool;
fn has_static_call(&self) -> bool;
fn has_revert(&self) -> bool;
fn has_return_data(&self) -> bool;
fn has_bitwise_shift(&self) -> bool;
fn has_create2(&self) -> bool;
fn has_extcodehash(&self) -> bool;
fn has_reduced_sstore_gas_metering(&self) -> bool;
fn err_on_call_with_more_gas(&self) -> bool;
fn call_create_l64_after_gas(&self) -> bool;
fn memory_limit(&self) -> usize;
fn is_precompiled_contract_enabled(&self, address: &Address) -> bool;
fn precompileds(&self) -> &[(Address, Option<&[u8]>, &dyn Precompiled)];
}
#[rustfmt::skip]
pub static EMBEDDED_PRECOMPILEDS: [(Address, Option<&'static [u8]>, &'static Precompiled); 4] = [
(H160([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x01]),
None,
&ECREC_PRECOMPILED),
(H160([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x02]),
None,
&SHA256_PRECOMPILED),
(H160([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x03]),
None,
&RIP160_PRECOMPILED),
(H160([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x04]),
None,
&ID_PRECOMPILED),
];
#[derive(Default, Copy, Clone)]
pub struct VMTestPatch(pub EmbeddedAccountPatch);
#[rustfmt::skip]
impl Patch for VMTestPatch {
type Account = EmbeddedAccountPatch;
fn account_patch(&self) -> &Self::Account { &self.0 }
fn code_deposit_limit(&self) -> Option<usize> { None }
fn callstack_limit(&self) -> usize { 2 }
fn gas_extcode(&self) -> Gas { Gas::from(20usize) }
fn gas_balance(&self) -> Gas { Gas::from(20usize) }
fn gas_sload(&self) -> Gas { Gas::from(50usize) }
fn gas_suicide(&self) -> Gas { Gas::from(0usize) }
fn gas_suicide_new_account(&self) -> Gas { Gas::from(0usize) }
fn gas_call(&self) -> Gas { Gas::from(40usize) }
fn gas_expbyte(&self) -> Gas { Gas::from(10usize) }
fn gas_transaction_create(&self) -> Gas { Gas::from(0usize) }
fn force_code_deposit(&self) -> bool { true }
fn has_delegate_call(&self) -> bool { true }
fn has_static_call(&self) -> bool { true }
fn has_revert(&self) -> bool { true }
fn has_return_data(&self) -> bool { true }
fn has_bitwise_shift(&self) -> bool { true }
fn has_create2(&self) -> bool { true }
fn has_extcodehash(&self) -> bool { true }
fn has_reduced_sstore_gas_metering(&self) -> bool { false }
fn err_on_call_with_more_gas(&self) -> bool { true }
fn call_create_l64_after_gas(&self) -> bool { false }
fn memory_limit(&self) -> usize { usize::max_value() }
fn is_precompiled_contract_enabled(&self, address: &Address) -> bool {
match address.low_u64() {
0x1 | 0x2 | 0x3 | 0x4 => true,
_ => false,
}
}
fn precompileds(&self) -> &'static [(Address, Option<&'static [u8]>, &'static dyn Precompiled)] {
&EMBEDDED_PRECOMPILEDS
}
}
#[derive(Default, Copy, Clone)]
pub struct EmbeddedPatch(pub EmbeddedAccountPatch);
#[rustfmt::skip]
impl Patch for EmbeddedPatch {
type Account = EmbeddedAccountPatch;
fn account_patch(&self) -> &Self::Account { &self.0 }
fn code_deposit_limit(&self) -> Option<usize> { None }
fn callstack_limit(&self) -> usize { 1024 }
fn gas_extcode(&self) -> Gas { Gas::from(700usize) }
fn gas_balance(&self) -> Gas { Gas::from(400usize) }
fn gas_sload(&self) -> Gas { Gas::from(200usize) }
fn gas_suicide(&self) -> Gas { Gas::from(5000usize) }
fn gas_suicide_new_account(&self) -> Gas { Gas::from(25000usize) }
fn gas_call(&self) -> Gas { Gas::from(700usize) }
fn gas_expbyte(&self) -> Gas { Gas::from(50usize) }
fn gas_transaction_create(&self) -> Gas { Gas::from(32000usize) }
fn force_code_deposit(&self) -> bool { false }
fn has_delegate_call(&self) -> bool { true }
fn has_static_call(&self) -> bool { false }
fn has_revert(&self) -> bool { false }
fn has_return_data(&self) -> bool { false }
fn has_bitwise_shift(&self) -> bool { false }
fn has_create2(&self) -> bool { false }
fn has_extcodehash(&self) -> bool { false }
fn has_reduced_sstore_gas_metering(&self) -> bool { false }
fn err_on_call_with_more_gas(&self) -> bool { false }
fn call_create_l64_after_gas(&self) -> bool { true }
fn memory_limit(&self) -> usize { usize::max_value() }
fn is_precompiled_contract_enabled(&self, address: &Address) -> bool {
match address.low_u64() {
0x1 | 0x2 | 0x3 | 0x4 => true,
_ => false,
}
}
fn precompileds(&self) -> &'static [(Address, Option<&'static [u8]>, &'static dyn Precompiled)] {
&EMBEDDED_PRECOMPILEDS
}
}