Skip to main content

EVM-Based Chain Support

Keplr enables seamless interaction with EVM-based chains, allowing users to utilize its features on Ethereum and other compatible networks. Developers can access the EVM provider through the evm object, which is a member of the Keplr instance object. Throughout this documentation, we refer to these objects as keplr and keplr.ethereum.

Enabling Connection

To interact with EVM-based chains, you first need to call the keplr.ethereum.enable method, which prompts the user for permission via a popup.

enable(): Promise<void>
Starknet Enable Chain Example Image

Requesting Ethereum Signatures

Keplr supports native Ethereum signing for EVM-based chains, including EVM-compatible Cosmos chains like Evmos. Developers can use the window.keplr.signEthereum method to sign:

signEthereum(
chainId: string,
signer: string,
data: string | Uint8Array,
type: 'message' | 'transaction' | 'eip-712'
);

Notes:

  • The signer field supports both Bech32 and Ethereum hex addresses.
  • The data parameter can be a stringified JSON (for transactions) or a plain text message (for messages). Byte arrays are also supported.

Sending Ethereum Transactions

Keplr allows sending Ethereum transactions through the keplr.sendEthereumTx method. It broadcasts the transaction and returns the transaction hash upon success.

sendEthereumTx(chainId: string, tx: Uint8Array): Promise<string>;

Suggesting ERC20 Tokens

Users can suggest ERC20 tokens to be added to a chain using the keplr.suggestERC20 method. This process requires user approval.

suggestERC20(chainId: string, contractAddress: string);

EVM JSON-RPC Requests

Keplr handles EVM JSON-RPC requests via the keplr.ethereum object, enabling dApps to interact with EVM chains. Supported methods include those for managing accounts, transactions, subscriptions, and chain configurations.

Supported Request Types

  • eth_chainId: Returns the current chain's EVM chain ID.

  • net_version: Retrieves the network version.

  • eth_accounts & eth_requestAccounts: Returns the selected address.

  • eth_sendTransaction: Sends a signed transaction and returns the transaction hash.

    params: [
    {
    chainId: string | number,
    from: string,
    gas?: string,
    gasLimit?: string,
    },
    ];
  • eth_signTransaction: Signs a transaction and returns the signed data.

    params: [
    {
    chainId?: string | number,
    from: string,
    gas?: string,
    gasLimit?: string,
    },
    ];
  • personal_sign: Signs a personal message.

    params: [message: string];
  • eth_signTypedData_v3 & eth_signTypedData_v4: Signs EIP-712 typed data.

    params: [signer: string];
  • eth_subscribe & eth_unsubscribe: Manages subscriptions via WebSocket.

  • wallet_switchEthereumChain: Switches to a specified chain.

    params: [
    {
    chainId: string,
    },
    ];
  • wallet_addEthereumChain: Adds a new EVM chain.

    params: [
    {
    chainId: string,
    chainName: string,
    nativeCurrency: {
    name: string,
    symbol: string,
    decimals: number,
    },
    rpcUrls: string[],
    iconUrls?: string[],
    },
    ];
  • wallet_getPermissions, wallet_requestPermissions: Requests or returns permissions.

  • wallet_revokePermissions: Revokes permissions.

    params: [
    {
    eth_accounts: object
    },
    ]
  • wallet_watchAsset: Adds an ERC20 asset.

    params: {
    type: string,
    options: {
    address: string,
    symbol?: string,
    decimals?: number,
    image?: string,
    tokenId?: string,
    },
    };

Ethereum-Native Methods

  • eth_call, eth_estimateGas, eth_getTransactionCount, eth_getTransactionByHash, eth_getTransactionByBlockHashAndIndex, eth_getTransactionByBlockNumberAndIndex, eth_getTransactionReceipt, eth_sendRawTransaction, eth_protocolVersion, eth_syncing, eth_getCode, eth_getLogs, eth_getProof, eth_getStorageAt, eth_getBalance, eth_blockNumber, eth_getBlockByHash, eth_getBlockByNumber, eth_gasPrice, eth_feeHistory, eth_maxPriorityFeePerGas

Keplr supports Ethereum-native methods following EIP-1193 and EIP-2255 standards. For a complete list, refer to the Ethereum JSON-RPC API.

Example Usage

Requesting Permissions

keplr.ethereum.request({
method: "wallet_requestPermissions",
});

Revoking Permissions

keplr.ethereum.request({
method: "wallet_revokePermissions",
params: [
{
eth_accounts: "eth_accounts",
},
],
});

Events

The EVM provider offers event listeners to track changes in accounts and chain.

accountsChanged

Listen for changes to the user's exposed account address.

Interface

interface KeplrEvmProvider {
on: (event: 'accountsChanged', handler: (accounts: Array<string>) => void) => void;
off: (event: 'accountsChanged', handler: (accounts: Array<string>) => void) => void;
}

Example

const handleAccountsChanged = (accounts) => {
console.log('Accounts changed:', accounts);
};

// Add listener
window.keplr.ethereum.on('accountsChanged', handleAccountsChanged);

// Remove listener
window.keplr.ethereum.off('accountsChanged', handleAccountsChanged);

chainChanged

Listen for changes to the current chain.

Interface

interface KeplrEvmProvider {
on: (event: 'chainChanged', handler: (chainIdHexString: string) => void) => void;
off: (event: 'chainChanged', handler: (chainIdHexString: string) => void) => void;
}

Example

const handleChainChanged = (chainIdHexString) => {
console.log('Chain changed:', chainIdHexString);
};

// Add listener
window.keplr.ethereum.on('chainChanged', handleChainChanged);

// Remove listener
window.keplr.ethereum.off('chainChanged', handleChainChanged);