This EIP proposes a standardized set of Ethereum addresses and private keys derived from a specific mnemonic phrase for use in testing and development environments. These addresses are already widely used in popular development frameworks such as Hardhat and Foundry.
Ethereum developers frequently need a set of known addresses and private keys for testing smart contracts and applications. While various development frameworks provide such addresses, there's no standardized set across all tools. This leads to inconsistencies and potential confusion when moving between different development environments.
Additionally there is no warning in wallets about when well-known keys are being used, this leads to accidents and confusion where people may sign-up or use services with a test account leading to loss of funds or KYC checks which are meaningless in practice.
By standardizing on a specific set of addresses derived from a known mnemonic, we can:
The standard test addresses and private keys shall be derived from the following mnemonic phrase:
test test test test test test test test test test test junk
This mnemonic should be used with BIP39 (Mnemonic code for generating deterministic keys) to generate the seed, and then BIP32 (Hierarchical Deterministic Wallets) for key derivation. The derivation path follows the pattern:
m/44'/60'/0'/0/{account_index}
Where {account_index}
starts at 0 and increments for each subsequent address. The first 20 derived addresses (0-19) shall be considered the standard test addresses.
Here are the first 10 addresses (0-9) derived from this mnemonic:
0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
0x70997970C51812dc3A010C7d01b50e0d17dc79C8
0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC
0x90F79bf6EB2c4f870365E785982E1f101E93b906
0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65
0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc
0x976EA74026E726554dB657fA54763abd0C3a0aa9
0x14dC79964da2C08b23698B3D3cc7Ca32193d9955
0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f
0xa0Ee7A142d267C1f36714E4a8F75612F20a79720
Here are the corresponding private keys for the first 10 addresses:
0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d
0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a
0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6
0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a
0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba
0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e
0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356
0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97
0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6
(Note: The full list of 20 private keys and their corresponding addresses can be derived using the Python code in the appendix)
The chosen mnemonic test test test test test test test test test test test junk
is already widely. By standardizing on this mnemonic, we leverage existing adoption while providing a clear specification for other tools to implement.
The derivation path m/44'/60'/0'/0/{account_index}
follows the standard for Ethereum accounts as per BIP44 (Multi-Account Hierarchy for Deterministic Wallets), ensuring compatibility with existing wallet software and hardware.
Twenty addresses are specified to provide a sufficient number for most testing scenarios while keeping the list manageable.
This EIP is fully backwards compatible as it does not introduce any changes to the Ethereum protocol. It merely standardizes a set of addresses already in use by many developers.
The private keys and addresses specified in this EIP should NEVER be used on any production network or to store real assets. They are intended for testing purposes only.
Developers and users should be aware that these addresses and private keys are publicly known and should treat them accordingly in their development and testing processes.
Copyright and related rights waived via CC0.
Uses the following Python packages via python -m pip install eth-account hdwallet
:
from hdwallet import BIP44HDWallet
from hdwallet.cryptocurrencies import EthereumMainnet
from hdwallet.derivations import BIP44Derivation
from eth_account import Account
MNEMONIC = "test test test test test test test test test test test junk"
w = BIP44HDWallet(cryptocurrency=EthereumMainnet)
w.from_mnemonic(mnemonic=MNEMONIC, language="english")
for i in range(20):
w.clean_derivation()
w.from_path(path=BIP44Derivation(
cryptocurrency=EthereumMainnet, account=0, change=False, address=i
))
account = Account.from_key(w.private_key())
print(f"{i}. {account.address} 0x{w.private_key()}")