Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
385b860
update to PrecompileHandle (no tests)
nanocryk May 4, 2022
f6b9b84
testing util + change log util
nanocryk May 5, 2022
dc038b9
update assets-erc20 tests
nanocryk May 5, 2022
1b782f4
update author-mapping tests
nanocryk May 5, 2022
2462a9e
update balances-erc20 tests
nanocryk May 6, 2022
81b6c09
update pallet-democracy tests
nanocryk May 6, 2022
f2798c1
update crowdloan-rewards tests
nanocryk May 6, 2022
4a641a6
update parachain-staking tests
nanocryk May 6, 2022
d068c16
update relay-encoder tests
nanocryk May 6, 2022
8d2f870
update xcm_transactor tests
nanocryk May 10, 2022
ea61bdf
update xtokens tests
nanocryk May 10, 2022
970220d
rename test functions
nanocryk May 10, 2022
03214ca
update moonriver tests
nanocryk May 10, 2022
ebedfd5
update moonbeam tests
nanocryk May 10, 2022
7d2346f
update moonbase tests
nanocryk May 10, 2022
6c35dcf
temp: use custom branches
nanocryk May 10, 2022
01ac7df
Merge remote-tracking branch 'origin/master' into jeremy-precompile-h…
nanocryk May 10, 2022
67bcc0a
Merge remote-tracking branch 'origin/master' into jeremy-precompile-h…
nanocryk May 10, 2022
ffd9579
typos
nanocryk May 11, 2022
d0249a7
improve util
nanocryk May 11, 2022
3e5e792
bump evm (now records call opcode cost)
nanocryk May 12, 2022
2feb91a
PrecompileSubcall tracing event
nanocryk May 12, 2022
e14460b
bump evm (tracing)
nanocryk May 12, 2022
ce5c838
path gasometer crate (fixes tracing)
nanocryk May 12, 2022
8f0d561
bump evm (fix duplicate exit event making tracing crash)
nanocryk May 12, 2022
152e86f
Merge remote-tracking branch 'origin/master' into jeremy-precompile-h…
nanocryk May 13, 2022
9e0565f
succeed util function
nanocryk May 13, 2022
d8b8d1a
lint + toml_sort
nanocryk May 13, 2022
9896cf7
apply EVM PR suggestions
nanocryk May 16, 2022
50c17e1
bump evm
nanocryk May 16, 2022
60be63a
fix tests
nanocryk May 16, 2022
cc32a3c
Merge remote-tracking branch 'origin/master' into jeremy-precompile-h…
nanocryk May 18, 2022
36cf6a9
bump frontier (simpler Precompile trait) + utils
nanocryk May 19, 2022
4ec0516
Merge remote-tracking branch 'origin/master' into jeremy-precompile-h…
nanocryk May 19, 2022
a2644e1
don't use patch for evm
nanocryk May 20, 2022
6ba5967
fix tracing runtime build
librelois May 20, 2022
b98e6dc
Merge remote-tracking branch 'origin/master' into jeremy-precompile-h…
nanocryk May 23, 2022
6012c6e
Merge remote-tracking branch 'origin/master' into jeremy-precompile-h…
nanocryk May 24, 2022
7060872
Merge remote-tracking branch 'origin/master' into jeremy-precompile-h…
nanocryk May 24, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 23 additions & 27 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,15 @@ members = [
"pallets/migrations",
"pallets/moonbeam-orbiters",
"pallets/proxy-genesis-companion",
"precompiles/author-mapping",
"precompiles/balances-erc20",
"precompiles/crowdloan-rewards",
"precompiles/pallet-democracy",
"precompiles/parachain-staking",
"precompiles/relay-encoder",
"precompiles/utils/macro",
"precompiles/xcm_transactor",
"precompiles/xtokens",
"runtime/moonbase",
"runtime/moonbeam",
"runtime/moonriver",
Expand Down
91 changes: 41 additions & 50 deletions precompiles/assets-erc20/src/eip2612.rs
Original file line number Diff line number Diff line change
Expand Up @@ -186,25 +186,26 @@ where
// Translated from
// https://github.com/Uniswap/v2-core/blob/master/contracts/UniswapV2ERC20.sol#L81
pub(crate) fn permit(
address: H160,
asset_id: AssetIdOf<Runtime, Instance>,
input: &mut EvmDataReader,
gasometer: &mut Gasometer,
handle: &mut impl PrecompileHandle,
) -> EvmResult<PrecompileOutput> {
gasometer.record_cost(RuntimeHelper::<Runtime>::db_read_gas_cost())?;
handle.record_cost(RuntimeHelper::<Runtime>::db_read_gas_cost())?;

let mut input = handle.read_input()?;
let owner: H160 = input.read::<Address>()?.into();
let spender: H160 = input.read::<Address>()?.into();
let value: U256 = input.read()?;
let deadline: U256 = input.read()?;
let v: u8 = input.read()?;
let r: H256 = input.read()?;
let s: H256 = input.read()?;

let owner: H160 = input.read::<Address>(gasometer)?.into();
let spender: H160 = input.read::<Address>(gasometer)?.into();
let value: U256 = input.read(gasometer)?;
let deadline: U256 = input.read(gasometer)?;
let v: u8 = input.read(gasometer)?;
let r: H256 = input.read(gasometer)?;
let s: H256 = input.read(gasometer)?;
let address = handle.code_address();

// pallet_timestamp is in ms while Ethereum use second timestamps.
let timestamp: U256 = (pallet_timestamp::Pallet::<Runtime>::get()).into() / 1000;

ensure!(deadline >= timestamp, gasometer.revert("permit expired"));
ensure!(deadline >= timestamp, revert("permit expired"));

let nonce = NoncesStorage::<Instance>::get(address, owner);

Expand All @@ -217,68 +218,58 @@ where
sig[64] = v;

let signer = sp_io::crypto::secp256k1_ecdsa_recover(&sig, &permit)
.map_err(|_| gasometer.revert("invalid permit"))?;
.map_err(|_| revert("invalid permit"))?;
let signer = H160::from(H256::from_slice(keccak_256(&signer).as_slice()));

ensure!(
signer != H160::zero() && signer == owner,
gasometer.revert("invalid permit")
revert("invalid permit")
);

NoncesStorage::<Instance>::insert(address, owner, nonce + U256::one());

Erc20AssetsPrecompileSet::<Runtime, IsLocal, Instance>::approve_inner(
asset_id, gasometer, owner, spender, value,
asset_id, handle, owner, spender, value,
)?;

Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gasometer.used_gas(),
output: vec![],
logs: LogsBuilder::new(address)
.log3(
SELECTOR_LOG_APPROVAL,
owner,
spender,
EvmDataWriter::new().write(value).build(),
)
.build(),
})
let log_builder = LogsBuilder::new(address);
log_builder
.log3(
SELECTOR_LOG_APPROVAL,
owner,
spender,
EvmDataWriter::new().write(value).build(),
)
.record(handle)?;

Ok(succeed([]))
}

pub(crate) fn nonces(
address: H160,
input: &mut EvmDataReader,
gasometer: &mut Gasometer,
_asset_id: AssetIdOf<Runtime, Instance>,
handle: &mut impl PrecompileHandle,
) -> EvmResult<PrecompileOutput> {
gasometer.record_cost(RuntimeHelper::<Runtime>::db_read_gas_cost())?;
handle.record_cost(RuntimeHelper::<Runtime>::db_read_gas_cost())?;

let owner: H160 = input.read::<Address>(gasometer)?.into();
let mut input = handle.read_input()?;
let owner: H160 = input.read::<Address>()?.into();

let nonce = NoncesStorage::<Instance>::get(address, owner);
let nonce = NoncesStorage::<Instance>::get(handle.code_address(), owner);

Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gasometer.used_gas(),
output: EvmDataWriter::new().write(nonce).build(),
logs: vec![],
})
Ok(succeed(EvmDataWriter::new().write(nonce).build()))
}

pub(crate) fn domain_separator(
address: H160,
asset_id: AssetIdOf<Runtime, Instance>,
gasometer: &mut Gasometer,
handle: &mut impl PrecompileHandle,
) -> EvmResult<PrecompileOutput> {
gasometer.record_cost(RuntimeHelper::<Runtime>::db_read_gas_cost())?;
handle.record_cost(RuntimeHelper::<Runtime>::db_read_gas_cost())?;

let domain_separator: H256 = Self::compute_domain_separator(address, asset_id).into();
let domain_separator: H256 =
Self::compute_domain_separator(handle.code_address(), asset_id).into();

Ok(PrecompileOutput {
exit_status: ExitSucceed::Returned,
cost: gasometer.used_gas(),
output: EvmDataWriter::new().write(domain_separator).build(),
logs: vec![],
})
Ok(succeed(
EvmDataWriter::new().write(domain_separator).build(),
))
}
}
Loading