Precompiles
A precompile is a common functionality used in smart contracts that has been compiled in advance, so Ethereum nodes can run it more efficiently. From a contract's perspective, this is a single command like an opcode.
The Frontier EVM used on Astar network provides several useful precompiled contracts. These contracts are implemented in our ecosystem as a native implementation. The precompiled contracts 0x01
through 0x08
are the same as those in Ethereum (see list below). Additionally, Astar implements precompiled contracts starting from 0x5001
, that support new Astar features.
Ethereum Native Precompiles
Precompile | Address |
---|---|
ECRecover | 0x0000000000000000000000000000000000000001 |
Sha256 | 0x0000000000000000000000000000000000000002 |
Ripemd160 | 0x0000000000000000000000000000000000000003 |
Identity | 0x0000000000000000000000000000000000000004 |
Modexp | 0x0000000000000000000000000000000000000005 |
Bn128Add | 0x0000000000000000000000000000000000000006 |
Bn128Mul | 0x0000000000000000000000000000000000000007 |
Bn128Pairing | 0x0000000000000000000000000000000000000008 |
Non-Ethereum Native Precompiles
Precompile | Address |
---|---|
Sha3FIPS256 | 0x0000000000000000000000000000000000000400 |
Dispatch | 0x0000000000000000000000000000000000000401 |
ECRecoverPublicKey | 0x0000000000000000000000000000000000000402 |
Ed25519Verify | 0x0000000000000000000000000000000000000403 |
Astar Specific Precompiles
Precompile | Address |
---|---|
DappsStaking | 0x0000000000000000000000000000000000005001 |
Sr25519 | 0x0000000000000000000000000000000000005002 |
SubstrateEcdsa | 0x0000000000000000000000000000000000005003 |
XCM | 0x0000000000000000000000000000000000005004 |
assets-erc20 | ASSET_PRECOMPILE_ADDRESS_PREFIX |
The interface descriptions for these precompiles can be found in the precompiles
folder: Astar repo.
The Addresses can be checked in the Astar repo for each runtime in precompile.rs
files.
Usage Example
Here we'll demonstrate how to interact with the dApp staking precompile using Remix IDE. Other precompiles can be accessed in a similar manner.
import "./DappsStaking.sol";
contract A {
DappsStaking public constant DAPPS_STAKING = DappsStaking(0x0000000000000000000000000000000000005001);
/// @notice Check current era
function checkCurrentEra() public view {
uint256 currentEra = DAPPS_STAKING.read_current_era();
}
}
Example use: check current era
and total staked amount
in the pallet-dapps-staking
for Shiden Network. For this example we will use Remix.
- Copy
DappsStaking.sol
from Astar repo and create new contract in Remix:
- Compile the dAppStaking contract:
- The precompile does not need to be deployed since it is already on the network, but you will need to tell Remix where to find it.
After you connect your EVM wallet to Shiden Network (same applies for Astar Network and for Shibuya Testnet) follow these steps:
- Open the Deploy tab.
- Use injected Web3 environment. It should point to Shiden Mainnet with
ChainId 336
. - Make sure you have the selected dAppStaking contract.
- Provide the address of the precompiled contract
0x0000000000000000000000000000000000005001
. - The dApp Staking contract will appear under Deployed contracts.
- Interact with the contract.
- Check the current era.
- Use the current era as input to check total staked amount on the network.