Users can use one extension/wallet, and a single Substrate account to interact with the Substrate runtime, contracts in EVM, and wasm contracts or a hybrid of these. If a user wants to use a particular Ethereum address, then simply link it with his/her Substrate address (basically proving the user owns both addresses), thereafter the user can just use the Substrate account with Polkadot{js} extension or alike to sign any Ethereum transactions seamlessly.
This allows users to use all functionalities within Acala and cross-chain capabilities without managing multiple accounts or wallets.
A user on Acala will always have a Substrate-based account that enables users to easily navigate multiple blockchains and sign any (EVM and Susbtrate) transactions with a single account. Read more on Acala Substrate Account here. Follow the guide here or here to generate a Substrate account.
To enable Single Account and use Acala EVM, you either
- Bind an auto-generated Ethereum address OR
- Bind an existing Ethereum account to the Substrate account
A user can generate an EVM address for each Substrate account. The user then can bind the EVM address to the Substrate account, so balances of native tokens e.g. DOT, renBTC, aUSD etc. on the Substrate account, are then available on the EVM address to use.
In the Acala EVM, if funds are sent to a Substrate account without an associated EVM address, an EVM address will be automatically generated and bound with the Substrate account.
Balances are automatically synchronized between the Substrate account and the associated EVM address. For example, a user teleports 10 renBTC to Acala, his/her balance will be shown in the Substrate account, the balance will also be shown and transferrable in the EVM address.
The EVM Address is generated using the blake2_256
hash function with a prefix evm
and the associated Substrate account as input. Check out the source code here.
blake2_256("evm:" ++ account_id)[0..20]
Navigate to the Polkadot.js web app. The ability to claim the default EVM address can be found under Extrinsics
in the Developer
tab.
Step 1: Select the Polkadot account
If you haven't yet installed the Polkadot{js} extension and created an account, please do so by following the steps here.
If the account is created and the extension is installed correctly, the account should be available in the using the selected account
dropdown.
In case you have no funds in the Substrate account, please use the #acala-testnet-faucet channel in our Discord, to get some. You will need the funds to sent the transaction to bind the Substrate and EVM accounts.
Step 2: Select the correct extrinsic
To claim the default EVM address, select evmAddress
from the submit the following extrinsic
dropdown and select the claimDefaultAccount()
option.
Step 3: Claim the account
Using the Send transaction
, the Substrate wallet should prompt you to sign the transaction. Once the transaction is signed and added to the blockchain, your accounts should be bound.
Step 4: Validate the account binding
Once the accounts have been bound, you can validate the binding of the accounts, using the same Polkadot.js web app.
The chain state is validated using state queries, which can be found under Developer
dropdown's Chain state
option.
Select the evmAccounts
from the selected state query
dropdown. The evmAddress(AccountId32)
option should return the EVM address bound to the Substrate account selected in the dropdown below.
Pressing the +
button should query the chain for the associated EVM address and return it:
In any case, if users want to use an existing Ethereum account in Acala EVM, this address will need to be claimed and bound to their Subatrate account.
One Substrate account can only be associated with one Ethereum address. A Substrate address already linked to a generated EVM address can no longer link to an existing Ethereum address and vice versa.
Binding an existing Ethereum account requires users to prove they own the Ethereum account private key, by signing a message, include it in a claim
transaction and send it to the Acala network.
- Select the Metadata from the Settings Section of the Polkadot App
- Copy the Genesis Hash hex string
- Select the Developer tab, then Chain state from the dropdown
- Select Constant and then evm from the constant query dropdown
- Choose chainId from the method/action dropdown
- Click the + button on the right
Step 3: Create the signature of the claim on the EVM+ Playground
- Select the right account in Metamask
- Fill in the Substrate address, Chain id & Genesis hash
- Click Sign & copy the signature to the next step
Step 4: Claim Account on the Developer Section of the Polkadot App
The ethAddress should be the same as your Metamask wallet address that you used above to generate the signature.
- Select evmAcounts from the extrinsic dropdown menu
- Select claimAccount(ethAddress, ethSignature) from the method/action dropdown
- Fill in the ethAddress & ethSignature
- Click Submit Transaction
- Select the Developer tab, then Chain state from the dropdown
- Select Storage and then evmAccounts from the state query dropdown
- Click the + button on the right
- Double check that the evmAccounts.evmAddresses is indeed the right one.
Below are two potential use cases of binding an existing Ethereum address.
Use Case 1
For example, a DeFi protocol on Ethereum is now expanding its operation to Polkadot, by deploying their contracts on the Acala network. They will this new branch by airdropping tokens to their existing users if they also use the protocols on Acala.
The easiest way is to airdrop tokens to existing Ethereum addresses on Acala. Hence users would just bind their current Ethereum address to a Substrate address, use it for any EVM transactions, and receive airdrops.
Use Case 2
For DApps like Linkdrop, users are required to sign messages using Ethereum private key. Using Linkdrop on Acala, would require users to claim their existing Ethereum address, and bind it to their Substrate account. Thereafter they can send transactions on behalf of the Ethereum account.