> ## Documentation Index
> Fetch the complete documentation index at: https://docs.relay.link/llms.txt
> Use this file to discover all available pages before exploring further.

# Contract Addresses

>  

export const Contracts = ({env, id}) => {
  const key = `chains-${env}`;
  if (typeof window === "undefined") {
    return null;
  }
  if (!window[key]) {
    window[key] = {
      fetching: false,
      data: null
    };
  }
  if (!window[key].fetching) {
    const appendContracts = data => {
      const rootElement = document.getElementById(id);
      if (!rootElement) {
        return;
      }
      const rows = data.sort((a, b) => a.displayName.localeCompare(b.displayName)).map(chain => {
        return `<tr key=${chain.id}>
        <td style="text-transform: capitalize;">${chain.displayName}</td>
        <td>${chain.id}</td>
        <td>
          ${chain.contracts.relayReceiver > 0 ? chain.contracts.relayReceiver : "N/A"}
        </td>
        <td>
          ${chain.contracts.erc20Router > 0 ? chain.contracts.erc20Router : "N/A"}
        </td>
        <td>
          ${chain.contracts.approvalProxy > 0 ? chain.contracts.approvalProxy : "N/A"}
        </td>
      </tr>`;
      });
      rootElement.innerHTML = rows.join("");
      const loaderContainer = document.getElementById(`loader-container-${id}`);
      if (loaderContainer) {
        loaderContainer.style.display = "none";
      }
    };
    const fetchChains = async () => {
      try {
        window[key].fetching = true;
        window[key].data = null;
        const response = await fetch(env === "testnets" ? "https://api.testnets.relay.link/chains" : "https://api.relay.link/chains");
        const data = await response.json();
        window[key].fetching = false;
        window[key].data = data.chains;
        appendContracts(data.chains);
      } catch (e) {
        window[key].fetching = false;
        window[key].data = false;
      }
    };
    const loaderContainer = document.getElementById(`loader-container-${id}`);
    if (loaderContainer) {
      loaderContainer.style.display = "flex";
    }
    if (window[key].data) {
      setTimeout(() => {
        appendContracts(window[key].data);
      }, 1000);
    } else {
      fetchChains();
    }
  }
  return <table style={{
    width: "100%",
    borderSpacing: "48px"
  }} className="relay-table">
  <thead style={{
    borderBottom: "1px solid rgb(227 226 230)",
    paddingBottom: 5,
    width: "100%",
    fontSize: 16
  }}>
    <tr style={{
    textAlign: "left"
  }}>
      <th>Chain Name</th>
      <th>Chain ID</th>
      <th>RelayReceiver</th>
      <th>ERC20Router</th>
      <th>ApprovalProxy</th>
    </tr>
  </thead>
  <tbody id={id} style={{
    width: "100%"
  }}>
  </tbody>
  <div className={`loader-container-${id}`} style={{
    display: "none",
    justifyContent: "center",
    alignItems: "center",
    height: "200px",
    width: "100%"
  }}>
    <div className="loader"></div>
  </div>
</table>;
};

Relay's solver and contract addresses can be found below along with each chain

<Info>
  Please note that not all deployed contracts have the same address across all
  chains. Please check carefully to ensure you are using the correct contract
  address for the chain you are using.
</Info>

### Solver Addresses

| Chain Type | Solver Address                               |
| ---------- | -------------------------------------------- |
| Bitcoin    | bc1qq2mvrp4g3ugd424dw4xv53rgsf8szkrv853jrc   |
| EVM        | 0xf70da97812cb96acdf810712aa562db8dfa3dbef   |
| SVM        | F7p3dFrjRTbtRp8FRF6qHLomXbKRBzpvBLjtQcfcgmNe |
| Tron       | TYVWGh8XkmU49Hi9PkGAZXiiJPB3J5zJZy           |

### Contract Versions

| Version            | Summary                     | London                                     | Cancun                                     | Zero-ZkEvm                                 |
| ------------------ | --------------------------- | ------------------------------------------ | ------------------------------------------ | ------------------------------------------ |
| v2 Router          |                             | 0x113a327221d2c4660684449bfc39bc14ad1aaf38 | 0xf5042e6ffac5a625d4e7848e0b01373d8eb9e222 | 0x8fdceeda2951a9747feaf25311435448bce47b2a |
| v2 ApprovalProxy   |                             | 0xcd740b0e005cb8647f9baf4febedc8753ceef861 | 0xbbbfd134e9b44bfb5123898ba36b01de7ab93d98 | 0xaec31c3780521c34ca59dc2eb5fb9ee2e285cebe |
| v2.1 Router        | Revert reasons improvements | 0xb758f3bfa7b9d39ef5457d7c7ffb3702f2ad3982 | 0x3ec130b627944cad9b2750300ecb0a695da522b6 | 0xb758f3bfa7b9d39ef5457d7c7ffb3702f2ad3982 |
| v2.1 ApprovalProxy |                             | 0x953c95146eb8ce763f35caf2f1d46ddf6a33bea2 | 0x58cc3e0aa6cd7bf795832a225179ec2d848ce3e7 | 0x953c95146eb8ce763f35caf2f1d46ddf6a33bea2 |
| v3 Router          | Indexing improvements       | 0x9ef6d3c2f60d7b9008d74cab1fc0f899c957c819 | 0xb92fe925dc43a0ecde6c8b1a2709c170ec4fff4f | 0xe16870b028704e38dbc254a84d3f72c8ba345ca9 |
| v3 ApprovalProxy   |                             | 0x8754bc615047de01228a7527b712806a71a8dc9a | 0xccc88a9d1b4ed6b0eaba998850414b24f1c315be | 0xf6e54bbf91e564fcf0df3ed9f2dd82913e9232c3 |

### Mainnet Contracts

<Contracts id="mainnetContracts" env="mainnets" />

### Testnet Contracts

<Contracts id="testnetContracts" env="testnets" />
