# RPC related cheatcodes

Description: RPC related cheatcodes documentation

Note: This document was authored using MDX

  Source: https://github.com/NomicFoundation/hardhat-website/tree/main/src/content/docs/docs/reference/cheatcodes/RPC/rpc.mdx

{/* This document contains content copied/adapted from the Foundry Book (MIT licensed). See LICENSE in the parent directory. */}

### Signature

```solidity
struct Rpc {
  /// The alias of the RPC URL.
  string key;
  /// The RPC URL.
  string url;
}
// Returns the URL for a configured alias
function rpcUrl(string calldata alias) external returns (string memory);
// Returns all configured (alias, URL) pairs
function rpcUrls() external returns(string[2][] memory);
// Returns all rpc urls and their aliases as structs.
function rpcUrlStructs() external view returns (Rpc[] memory urls);
/// Performs an Ethereum JSON-RPC request to the current fork URL.
function rpc(string calldata method, string calldata params) external returns (bytes memory data);
/// Performs an Ethereum JSON-RPC request to the given endpoint.
function rpc(string calldata urlOrAlias, string calldata method, string calldata params) external returns (bytes memory data);
```

### Description

Provides cheatcodes to access all RPC endpoints configured in the `forking.rpcEndpoints` object of the [Solidity tests configuration](https://hardhat.org/docs/reference/configuration#solidity-tests-configuration), and the ability to make `rpc` calls using the configured fork URL.

### Examples

The following `rpcEndpoints` in [Solidity tests configuration](/docs/reference/configuration#solidity-tests-configuration) registers two RPC aliases:

- `optimism` references the URL directly
- `mainnet` references the `RPC_MAINNET` configuration variable that is expected to contain the actual URL

For more details on how to use configuration variables, see [Configuration Variables](/docs/explanations/configuration-variables).

```js
// --snip--
forking: {
    // --snip--
    rpcEndpoints: {
        optimism: "https://optimism.alchemyapi.io/v2/...",
        mainnet: configVariable("MAINNET_URL"),
    }
}
```

```solidity
string memory url = vm.rpcUrl("optimism");
assertEq(url, "https://optimism.alchemyapi.io/v2/...");
```

If a ENV var is missing, `rpcUrl()` will revert:

```solidity
vm.expectRevert("Failed to resolve env var `${RPC_MAINNET}` in `RPC_MAINNET`: environment variable not found");
string memory url = vm.rpcUrl("mainnet");
```

Retrieve all available alias -> URL pairs

```solidity
string[2][] memory allUrls = vm.rpcUrls();
assertEq(allUrls.length, 2);

string[2] memory val = allUrls[0];
assertEq(val[0], "optimism");

string[2] memory env = allUrls[1];
assertEq(env[0], "mainnet");
```

Make an RPC call to `eth_getBalance`

```solidity
// balance at block <https://etherscan.io/block/18332681>
bytes memory result = vm.rpc("eth_getBalance", "[\"0x8D97689C9818892B700e27F316cc3E41e17fBeb9\", \"0x117BC09\"]")
assertEq(hex"10b7c11bcb51e6", result);
```
