Releases: VaultaFoundation/evm-node
EVM Node v2.0.0
Introduction
Vaulta EVM Node v2.0.0 builds upon the previously introduced Gas Fee Algorithm architecture with key enhancements that improve fairness and updateability of transaction fees.
Read on for more details.
New Features
Gas Fee Algorithm v3
PRs
- (414)[ 2.0 ] Update silkworm to v2.0.0
Dual-Component Gas Fee Model
The Gas v3 algorithm introduces a dual-component gas fee model, separating transaction costs into:
- Computational Gas: Charges associated with CPU usage for executing operations.
- Storage Gas: Charges related to RAM usage for storing data.
Each component has its own pricing:
overhead_price: Cost per unit of computational gasstorage_price: Cost per unit of storage gas
To maintain compatibility with existing tools and interfaces, the system calculates a unified gas_price as the maximum of overhead_price and storage_price. The total gas_used is the sum of computational and storage gas, adjusted for any applicable discounts or refunds.
Gas Discount and Refund Mechanism
This release also introduces a transaction-level gas discount and refund mechanism that adjusts for scenarios where overcharging occurs in the new dual-component model.
- If the
inclusion_priceexceeds zero, miners receiveinclusion_price * computational_gasas their fee. Theinclusion_price * storage_gasportion is not collected in the final fee because the storage gas is discounted to effectively refund that excess fee back to the sender. - Depending on which of
overhead_priceorstorage_priceis greater, either discounts are applied to storage gas used or an explicit refund of gas usage occurs at the end of the transaction to prevent overcharging.
Safer Pricing Adjustments for Resource Cost Variability
Vaulta’s resource layer, specifically RAM, is subject to market-based pricing volatility. This release improves the handling for updates to gas pricing without breaking deployed application functionality.
The operation updtgasparam changes the gas usage for storage-manipulating operations and opcodes (such as SSTORE) and should only be used in select scenarios where RAM price changes drastically. Instead, setgasprices, can now be used to reflect RAM cost changes dynamically by updating storage_price with minimal disruption.
Building, compatibility, and upgrading
Building
The README in the evm-node repository contains instructions on how to build Vaulta EVM Node and Vaulta EVM RPC.
Compatibility and upgrading
Vaulta EVM Node and Vaulta EVM RPC can be upgraded from the prior 1.x.x version by replacing the binaries.
Further details on changes since last release
Contributors
Special thanks to the contributors that submitted patches for this release:
Full list of changes since last release
PRs
- (234)[1.0 -> main] Update silkworm 1.0.1
- (236)[1.0 -> main] add get transaction & get transaction receipt from rpc test
- (235)[1.0 -> main] Bump 1.0.0-rc3 version
- (248)[1.0 -> main] fix estimate gas
- (249)[1.0 -> main] Update silkworm 1.0.2
- (255)[1.0 -> main] add estimate_gas test
- (256)[1.0 -> main] Bump 1.0.0-rc4 version
- (257)[1.0 -> main] dynamic chainid
- (274)[1.0 -> main] Update CICD to use Spring
- (275)[1.0 -> main] Update silkworm with kGasCap=100M
- (276)[1.0 -> main] Update to silkworm 1.0.3
- (277)[1.0 -> main] Bump 1.0.0 version
- (278) Save overhead/storage price in block extra data
- (281)[1.0 -> main] Fix eth_call when evm_version>0
- (286)[1.0->main] Kayan 1.0 to main test savanna
- (291)[1.0.1 -> main] Update silkworm with fixes for EVMExecutor/TraceCallExecutor
- (294)[1.0.1 -> main] Bump 1.0.1 version
- (298)[1.0.2 -> main] Change to BSL licensing scheme
- (300)[1.0.2 -> main] Update versions/branches to use for CI dependencies
- (304) recover performance
- (313)[1.0 -> main] forword evmtx ordering fix to main
- (308) Block buggy debug calls in nginx
- (322)[1.0 -> main] Fix gas estimation and traces
- (326)[1.0 -> main] Bump 1.0.3 version
- (331)[1.0 ->main] integration test for evmtx order
- (332)[1.0 -> main] Add eth_getLogs integration test
- (333)[1.0 -> main] Update silkworm version to 1.0.8
- (334)[1.0 -> main] Remove blocks ack request from ship client
- (343)[1.0->main] Pull fixes to enable eth_gasPrice
- (350)[1.0 ->main] Forward 1.0.5 to main
- (353) Update silkworm (last gas v3)
- (356)[1.0 -> main] Disable EIP2 enforcement by default
- (357) Update silkworm with default EIP2 enforcing when evm_version >= 3
- (363) fix gas v3
- (342) gas v3 test
- (365) Modify the eth_estimateGas API to enable conservative gas estimation
- (359)[1.0 -> main] Bump 1.0.6 version
- (367) Modify how gas_prices are set when creating EVM blocks
- (370)[1.0] Encode transaction properly in the tx removal step during fork
- (373)[1.0] Bump version to 1.0.7
- (374)[1.0->main] Encode transaction properly in the tx removal step during fork
- (375)[1.0] Exit instead of silently continue for exceptions when processing blocks
- (377)[2.0] Update silkworm 2.0.0-rc1
- (376)[1.0->2.0] Exit properly when encounter unrecoverable issues when processing blocks
- (381)[2.0] Bump 2.0.0-rc1 version
- (386)[1.0] fix gas param fork test
- (387)[1.0] fix unstable different gas token test, use instant finality
- (388)[1.0-> 2.0] Fix unstable integration tests & use savanna finality (gas param fork test, different gas token test)
- (394)[2.0] Change references to eos
- (398)[2.0] Update silkworm
- (396)[1.0] activate instant finality in integration tests
- (400)[1.0->2.0] Ensure integration tests all use Savanna consensus
- (403)[2.0] Bump 2.0.0-rc2 version
- (414)[ 2.0 ] Update silkworm to v2.0.0
- (418)[2.0] Bump 2.0.0 version
Full Changelog: v1.0.6...v2.0.0
Vaulta EVM Node v2.0.0-rc2
Introduction
Vaulta EVM Node v2.0.0-rc2 introduces branding updates in alignment with the transition from EOS to Vaulta.
Read on for more details.
Updates
Vaulta branding
PRs
- (394)[2.0] Change references to eos
References to EOS have been removed or replaced with Vaulta across documentation and code to reflect the network's rebranding.
Building
The README in the evm-node repository contains instructions on how to build Vaulta EVM Node and Vaulta EVM RPC.
Compatibility and upgrading
Vaulta EVM Node and Vaulta EVM RPC can be upgraded from the prior 1.x.x version or v2.0.0-rc1 by replacing the binaries.
Deprecations, removals, and dropped support
Deprecations
eos-evm-node configuration option
As part of the renaming process, a new mirror of the eos-evm-node configuration option has been introduced called evm-node.
Further details on changes since last release
Contributors
Special thanks to the contributors that submitted patches for this release:
Full list of changes since last release
PRs
Full Changelog: v2.0.0-rc1...v2.0.0-rc2
Vaulta EVM Node v2.0.0-rc1
Introduction
Vaulta EVM Node v2.0.0-rc1 builds upon the previously introduced Gas Fee Algorithm architecture with key enhancements that improve fairness and updateability of transaction fees.
Read on for more details.
New Features
Gas Fee Algorithm V3
PRs
- (377) [2.0] Update silkworm 2.0.0-rc1
Dual-Component Gas Fee Model
The Gas V3 algorithm introduces a dual-component gas fee model, separating transaction costs into:
- Computational Gas: Charges associated with CPU usage for executing operations.
- Storage Gas: Charges related to RAM usage for storing data.
Each component has its own pricing:
overhead_price: Cost per unit of computational gasstorage_price: Cost per unit of storage gas
To maintain compatibility with existing tools and interfaces, the system calculates a unified gas_price as the maximum of overhead_price and storage_price. The total gas_used is the sum of computational and storage gas, adjusted for any applicable discounts or refunds.
Gas Discount and Refund Mechanism
This release also introduces a transaction-level gas discount and refund mechanism that adjusts for scenarios where overcharging occurs in the new dual-component model.
- If the
inclusion_priceexceeds zero, miners receiveinclusion_price * computational_gasas their fee. Theinclusion_price * storage_gasportion is not collected in the final fee because the storage gas is discounted to effectively refund that excess fee back to the sender. - Depending on which of
overhead_priceorstorage_priceis greater, either discounts are applied to storage gas used or an explicit refund of gas usage occurs at the end of the transaction to prevent overcharging.
Safer Pricing Adjustments for Resource Cost Variability
Vaulta’s resource layer, specifically RAM, is subject to market-based pricing volatility. This release improves the handling for updates to gas pricing without breaking deployed application functionality.
The operation updtgasparam changes the gas usage for storage-manipulating operations and opcodes (such as SSTORE) and should only be used in select scenarios where RAM price changes drastically. Instead, setgasprices, can now be used to reflect RAM cost changes dynamically by updating storage_price with minimal disruption.
Building, compatibility, and upgrading
Building
The README in the evm-node repository contains instructions on how to build Vaulta EVM Node and Vaulta EVM RPC.
Compatibility and upgrading
Vaulta EVM Node and Vaulta EVM RPC can be upgraded from the prior 1.x.x version by replacing the binaries.
Further details on changes since last release
Contributors
Special thanks to the contributors that submitted patches for this release:
Full list of changes since last release
PRs
- (234) [1.0 -> main] Update silkworm 1.0.1
- (236) [1.0 -> main] add get transaction & get transaction receipt from rpc test
- (235) [1.0 -> main] Bump 1.0.0-rc3 version
- (248) [1.0 -> main] fix estimate gas
- (249) [1.0 -> main] Update silkworm 1.0.2
- (255) [1.0 -> main] add estimate_gas test
- (256) [1.0 -> main] Bump 1.0.0-rc4 version
- (257) [1.0 -> main] dynamic chainid
- (274) [1.0 -> main] Update CICD to use Spring
- (275) [1.0 -> main] Update silkworm with kGasCap=100M
- (276) [1.0 -> main] Update to silkworm 1.0.3
- (277) [1.0 -> main] Bump 1.0.0 version
- (278) Save overhead/storage price in block extra data
- (281) [1.0 -> main] Fix eth_call when evm_version>0
- (286) [1.0->main] Kayan 1.0 to main test savanna
- (291) [1.0.1 -> main] Update silkworm with fixes for EVMExecutor/TraceCallExecutor
- (294) [1.0.1 -> main] Bump 1.0.1 version
- (298) [1.0.2 -> main] Change to BSL licensing scheme
- (300) [1.0.2 -> main] Update versions/branches to use for CI dependencies
- (304) recover performance
- (313) [1.0 -> main] forward evmtx ordering fix to main
- (308) Block buggy debug calls in nginx
- (322) [1.0 -> main] Fix gas estimation and traces
- (326) [1.0 -> main] Bump 1.0.3 version
- (331) [1.0 ->main] integration test for evmtx order
- (332) [1.0 -> main] Add eth_getLogs integration test
- (333) [1.0 -> main] Update silkworm version to 1.0.8
- (334) [1.0 -> main] Remove blocks ack request from ship client
- (343) [1.0->main] Pull fixes to enable eth_gasPrice
- (350) [1.0 ->main] Forward 1.0.5 to main
- (353) Update silkworm (last gas v3)
- (356) [1.0 -> main] Disable EIP2 enforcement by default
- (357) Update silkworm with default EIP2 enforcing when evm_version >= 3
- (363) fix gas v3
- (342) gas v3 test
- (365) Modify the eth_estimateGas API to enable conservative gas estimation
- (359) [1.0 -> main] Bump 1.0.6 version
- (367) Modify how gas_prices are set when creating EVM blocks
- (370) [1.0] Encode transaction properly in the tx removal step during fork
- (373) [1.0] Bump version to 1.0.7
- (374) [1.0->main] Encode transaction properly in the tx removal step during fork
- (375) [1.0] Exit instead of silently continue for exceptions when processing blocks
- (377) [2.0] Update silkworm 2.0.0-rc1
- (376) [1.0->2.0] Exit properly when encounter unrecoverable issues when processing blocks
- (381) [2.0] Bump 2.0.0-rc1 version
Full Changelog: v1.0.6...v2.0.0-rc1
EOS EVM Node v1.0.6
Introduction
The latest patch release of EOS EVM Node introduces and update to the default configuration of EIP-2 enforcement.
Read on for more details.
Updates
Disable EIP-2 enforcement by default
The default configuration of EOS EVM Node has been set to disable EIP-2 enforcement, which is now enforced by the contract by default.
Building, compatibility, and upgrading
Building
The README in the eos-evm-node repository contains instructions on how to build EOS EVM Node and EOS EVM RPC.
Compatibility and upgrading
EOS EVM Node and EOS EVM RPC can be upgraded from the prior 1.0.x version by replacing the binaries.
Further details on changes since last release
Contributors
Special thanks to the contributors that submitted patches for this release:
Full list of changes since last release
PRs
Full Changelog: v1.0.5...v1.0.6
EOS EVM Node v1.0.5
Introduction
The latest patch release of EOS EVM Node introduces batch request functionality for eth_gasPrice and a temporary fix for processing transactions with high s value signatures.
Read on for more details.
Updates
Enable eth_gasPrice in batch requests
In order to properly support Gnosis Safe, batch requests have been enabled for eth_gasPrice.
Temporarily accept high s values in signature validation
The EOS EVM contract was discovered to be incorrectly accepting high s value signatures in transactions. Because transactions with these values already made it on chain, the node has been updated to temporarily accept these values to allow them to be processed successfully.
In future releases, EOS EVM will block high s values at the contract level so that no more of them get into the blockchain.
Building, compatibility, and upgrading
Building
The README in the eos-evm-node repository contains instructions on how to build EOS EVM Node and EOS EVM RPC.
Compatibility and upgrading
EOS EVM Node and EOS EVM RPC can be upgraded from the prior 1.0.x version by replacing the binaries.
Further details on changes since last release
Contributors
Special thanks to the contributors that submitted patches for this release:
Full list of changes since last release
PRs
Full Changelog: v1.0.4...v1.0.5
EOS EVM Node v1.0.4
Introduction
The latest patch release of EOS EVM Node introduces fixes for edge cases where state history connections may enter a stuck state and where call_eth would return insufficient gas values.
Read on for more details.
Updates
Improper use of state history's get_blocks_ack_request_v0 leading to "stuck" state history connection
EOS EVM Node was incorrectly using the get_blocks_ack_request_v0 interface, which could lead to the state history connection entering a stuck state. send_get_blocks_ack_request has been removed to fix this issue.
call_eth returns insufficient gas when called with from field
When called with the from field, call_eth was returning insufficient gas values due to max_fee_per_gas, which had be previously added to resolve a prior assertion error. Because this issue was previously fixed, this part has been removed.
Building, compatibility, and upgrading
Building
The README in the eos-evm-node repository contains instructions on how to build EOS EVM Node and EOS EVM RPC.
Compatibility and upgrading
EOS EVM Node and EOS EVM RPC can be upgraded from the prior 1.0.x version by replacing the binaries.
Further details on changes since last release
Contributors
Special thanks to the contributors that submitted patches for this release:
Full list of changes since last release
PRs
Full Changelog: v1.0.3...v1.0.4
EOS EVM Node v1.0.3
Introduction
The latest patch release of EOS EVM Node introduces fixes to gas estimation failures.
Read on for more details.
Updates
Gas estimation failing when the contract accesses EvmHost::get_tx_context
It was observed that the effective_gas_price was being calculated incorrectly in EvmHost::get_tx_context impacting gas estimation and traces.
Building, compatibility, and upgrading
Building
The README in the eos-evm-node repository contains instructions on how to build EOS EVM Node and EOS EVM RPC.
Compatibility and upgrading
EOS EVM Node and EOS EVM RPC can be upgraded from the prior 1.0.x version by replacing the binaries.
Further details on changes since last release
Contributors
Special thanks to the contributors that submitted patches for this release:
Full list of changes since last release
PRs
Full Changelog: v1.0.2...v1.0.3
EOS EVM Node v1.0.2
Introduction
The latest patch release of EOS EVM Node introduces a fix to an EOS EVM transaction ordering edge case and the application of a Business Service License (BSL) for the EOS EVM Node codebase.
Read on for more details.
Updates
EOS EVM Transaction Order Discrepancy
Edge cases were discovered where transactions may be incorrectly ordered if more than one EOS transaction took place from the same address within one block. An update has been made to ensure transactions use the evmtx parent sequence number. No instances of this scenario have occurred for EOS EVM Mainnet.
Business Service License
PRs
The EOS EVM Node codebase has transitioned to a Business Service License (BSL), which introduces a structured licensing framework that promotes responsible and open use of the code. The BSL allows for commercial use while encouraging contributors and users to adhere to the terms outlined in the license. This change supports continued innovation within the EOS ecosystem and ensures that all users have a consistent and fair understanding of usage rights. More information can be found in the repo’s license file.
Building, compatibility, and upgrading
Building
The README in the eos-evm-node repository contains instructions on how to build EOS EVM Node and EOS EVM RPC.
Compatibility and upgrading
EOS EVM Node and EOS EVM RPC can be upgraded from the prior 1.0.x version by replacing the binaries.
Further details on changes since last release
Contributors
Special thanks to the contributors that submitted patches for this release:
Full list of changes since last release
PRs
Full Changelog: v1.0.1...v1.0.2
EOS EVM Node v1.0.1
Introduction
The latest patch release of EOS EVM Node introduces fixes to the TraceCallExecutor and EVMExecutor related to newly introduced EOS EVM versions and gas parameters. This update improves the accuracy of gas calculations and resolves specific refund handling issues.
Read on for more details.
Updates
EVMExecutor using the wrong refund algorithm for certain EOS EVM versions
It was discovered that the refund mechanism was incorrectly implemented for EOS EVM versions greater than 0. Specifically, EVMExecutor was applying a refund algorithm that miscalculated gas refunds.
Perform a gas bailout when no from address is specified for EVMExecutor
It was discovered that EVMExecutor could encounter issues during transaction execution when no from address was specified, resulting in execution errors or incomplete transactions. This update introduces a gas bailout to manage these cases.
TraceCallExecutor using incorrect gas parameters for the transaction being traced
It was discovered that TraceCallExecutor was not correctly assigning gas parameters when tracing transactions, causing discrepancies in gas usage and tracing accuracy.
Building, compatibility, and upgrading
Building
The README in the eos-evm-node repository contains instructions on how to build EOS EVM Node and EOS EVM RPC.
Compatibility and upgrading
EOS EVM Node and EOS EVM RPC can be upgraded from the prior 1.0.0 version by replacing the binaries.
Further details on changes since last release
Contributors
Special thanks to the contributors that submitted patches for this release:
Full list of changes since last release
PRs
Full Changelog: v1.0.0...v1.0.1
EOS EVM Node v1.0.0
Introduction
The latest release of EOS EVM introduces support for Shanghai and London Hard Fork and their comprised features, a new gas fee algorithm to more accurately price transactions for underlying resource costs involved, and configuration settings to adjust the base token of the network.
Read on for more details.
New features
London Fork Compatibility
EIP-1559: Transaction Fee Reform
PRs
A critical component of the London Hard Fork is EIP-1559, which introduces a new transaction fee mechanism. This update changes how gas fees are estimated on the EOS EVM network with new components including a base fee and priority fee combined to calculate the overall cost of a transaction based on units of gas used.
Base fee
The base fee, implemented as the base_fee_per_gas, is the minimum amount of gas required for a transaction to be included in a block. This fee is burned in the Ethereum implementation, but is instead credited to the contract for EOS EVM. The base_fee_per_gas is now part of the block header information and is returned in both eth_getBlockByNumber and eth_getBlockByHash API calls.
Priority fee
The priority fee, implemented as the inclusion_price, is a fee historically designed so that users can pay to miners to incentivize them to prioritize their transactions over others, but is not applicable to EOS EVM. For the EOS EVM, this instead evaluates the updated gas fee algorithm (explained further in later section) to properly manage a minimum inclusion price. This fee is not burned but goes directly to the miners.
The priority fee or inclusion_price can be calculated as min(max_priority_fee_per_gas, max_fee_per_gas - base_fee_per_gas).
Max fee
Users may now specify a maximum fee they are willing to pay for the sum of base and priority fees. If the max fee is higher than the sum of the base fee and the priority fee, the difference is refunded to the user. This ensures users don't overpay beyond what is necessary to get their transactions processed.
Overall transaction fee
The overall cost of a transaction fee utilizes a price per gas unit implemented as the effective_gas_price, which can be calculated as
inclusion_price + base_fee_per_gas. The overall cost of any given transaction is then calculated as the product ofeffective_gas_price * gas_used.
Fee distribution
The fees associated with transactions are now distributed to where the contract receives base_fee_per_gas*gas_used and the miner receives inclusion_price*gas_used.
Feature activation for wallet users
The flag for the EIP-1559 network support is cached, so users will have to refresh their network selection by changing the active network to another network and go back to eos-evm in order for many common wallets like Metamask to start sending EIP-1559 transactions.
Shanghai Fork Compatibility
PUSH0 Opcode Support
Support has been added for the PUSH0 opcode as introduced in the Shanghai Hard Fork. This opcode pushes a zero onto the stack, optimizing certain types of smart contract code and potentially reducing gas costs for operations that frequently use zero values.
Gas Fee Algorithm Enhancements
PRs
A new gas fee algorithm has been introduced to alleviate challenges with a prior one-size-fits-all gas fee structure. Because the previous method used to calculate gas fees did not account for the varying computational resources required by transactions, many transactions were priced higher than their resource costs for the safety of the network.
To accomplish this, five new parameters are now tracked including:
- Additional gas consumed when creating a new non-contract account due to a message-call transaction that sends positive value to an empty account. This value defaults to 0 and is denoted as
G_txnewaccount. - Additional gas consumed when creating a new non-contract account due to the
CALLorSELFDESTRUCTopcodes. This value defaults to to 25000 and is denoted asG_newaccount. - Static gas consumed in the
CREATEandCREATE2opcodes and also acts as the additional gas consumed in a contract-creating transaction. This value defaults to 32000 and is denotedG_txcreate. - Factor that multiplies the deployed code size within
CREATEandCREATE2opcodes, as well as contract-creating transactions, to determine the code deposit cost. This value defaults to 200 and is denoted asG_codedeposit. - Gas consumed when an
SSTOREopcode causes the storage value to go from zero to non-zero. This value defaults to 20000 and is denoted asG_sset.
These five new parameters can be calculated as follows:
G_txnewaccount=account_bytes * gas_per_byteG_newaccount=account_bytes * gas_per_byteG_txcreate=contract_fixed_bytes * gas_per_byteG_codedeposit=gas_per_byteG_sset= 2900 +storage_slot_bytes * gas_per_byte
Each of these five parameters are accounted for an stored when establishing an updated gas cost.
Change max gas refund in ExecutionProcessor to 100% with a limit in the minimum gas used of 21k
The max refund setting of 20% as part of the standard protocol has been updated to 100% to improve overall user experience as the next generation of the gas fee algorithm is developed.
Increase kGasCap in EstimateGasOracle to 100M
The new gas fee parameters result in gas consumption estimates larger than the previous 25M limit set in the gas fee oracle. This cap has been increased to 100M in order to support these new value ranges.
General Hard Fork Solution
EOS EVM now officially supports multiple versions and the ability to perform a hard forks when required for future versions such as London Hard Fork detailed above.
This release implements a linear versioning system for EOS EVM hard forks, mapping each EOSEVM version to a corresponding EVMC revision:
| EOSEVM Version | EVMC Revision |
|---|---|
| 0 | ISTANBUL |
| 1 | SHANGHAI |
Note: for this release, EOS EVM is moving directly from Instanbul to Shanghai, including all support for London Hard Fork within that version.
Bug fixes
MDBX configuration creating mapsize issue
The shared and exculsive flags set for MDBX were leading to an MDBX_MAP_FULL error.
Error building with ARM
There was an issue where the ARM version of protobuf was not being fetched properly and causing CMAKE to fail.
Building, compatibility, and upgrading
Building
The README in the eos-evm-node repository contains instructions on how to build EOS EVM Node and EOS EVM RPC.
Compatibility and upgrading
EOS EVM Node and EOS EVM RPC can be upgraded from the prior 0.7.x version by replacing the binaries. If upgrading from v1.0.0-rc1 or v1.0.0-rc2 replay is needed.
Further details on changes since last release
Contributors
Special thanks to the contributors that submitted patches for this release:
Full list of changes since last release
PRs
- (144) bump abieos submodule
- (157) [0.7 -> main] blockchain-plugin: Shutdown node on error during block processing
- (162) [0.7 -> main] Merge nginx config change for long connection
- (164) [0.7 -> main] Update silkworm with fixes in fork switching
- (165) [0.7->main] Merge in nginx docker file fix for WS_ENDPOINT
- (168) [0.7 -> main] Bump 0.7.0-rc2 version
- ([174](https://github.com/eosnetworkfoundation/eos-evm-...