> For the complete documentation index, see [llms.txt](https://docs.clusters.xyz/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.clusters.xyz/integration-guides/registering-a-name/ethereum-networks.md).

# Ethereum Networks

We currently support the following networks for name registration

<table><thead><tr><th width="138">ID</th><th>Name</th></tr></thead><tbody><tr><td>1</td><td>Mainnet</td></tr><tr><td>10</td><td>Optimism</td></tr><tr><td>56</td><td>BNB Smart Chain</td></tr><tr><td>137</td><td>Polygon</td></tr><tr><td>8453</td><td>Base</td></tr><tr><td>42161</td><td>Arbitrum One</td></tr><tr><td>43114</td><td>Avalanche</td></tr><tr><td>11155111</td><td>Sepolia</td></tr><tr><td>17000</td><td>Holesky (testnet)</td></tr></tbody></table>

1. **Let the user decide what name they want**

<figure><img src="/files/0RvG1cLL8QtO3CQGhE23" alt=""><figcaption></figcaption></figure>

You'll want to provide some sort of input box that allows a user to see if the name they want is available.

2. **Check if the name is valid**

There are some restrictions for registering a name. In short, the name must fit in 32 bytes, must not have a space, or a /.

```javascript
import { isNameValid } from "@clustersxyz/sdk"

const validName = "clusters";
console.log(isNameValid(validName)); // true

const invalidName = "c/c/c/c";
console.log(isNameValid(invalidName)); // false
```

3. **Once you know the name is valid, make sure the name is not taken**

```javascript
import { isNameValid } from "@clustersxyz/sdk"

const name = "clusters";
const nameAvailability = await clusters.getNameAvailability([name]);
console.log(nameAvailability[0].isAvailable) // false
```

4. **Get the raw transaction data for the on-chain transaction**

This call will get you the on-chain transaction data to register the names you want at the minimum registration fee of 0.01 ETH. If you are on a chain, such as Polygon, that has a different gas token than ETH, you'll receive back the converted value in MATIC.

{% hint style="info" %}
If you want to impose a specific registration amount, you can do so in the names array. Check out the documentation on [getting the transaction data](/getting-started/javascript/registration.md#getregistrationtransaction-names-sender-network) to learn more.
{% endhint %}

```javascript
const names = [{ name: 'mynewname' }];
const signerAddress = '0x..123';
const chainId = '1';
const data = await clusters.getRegistrationTransactionEvm(names, signerAddress, chainId);
```

5. **You can now display the registration fee, bridge fee (if any), and what gas token the user will be paying with**

```typescript
import { formatUnits } from 'viem';

const registrationFee = formatUnits(BigInt(data.registrationFee), data.gasToken.decimals);
const bridgeFee = formatUnits(BigInt(data.bridgeFee), data.gasToken.decimals);

// Total Registration fee: 0.01 ETH
console.log(`Total Registration fee: ${registrationFee} ${data.gasToken.symbol}`);

// Bridge fee: 0 ETH
console.log(`Bridge fee: ${bridgeFee} ${data.gasToken.symbol}`);
```

6. **Submit the transaction**

```javascript
// https://viem.sh/docs/actions/wallet/sendTransaction

const hash = await walletClient.sendTransaction({
  data: data.tranasctionData.data, 
  account: signerAddress,
  to: data.tranasctionData.to,
  value: BigInt(data.transactionData.value)
})
```

7. **Track the status of the transaction**

Once the transaction is submitted, you can check when the registration has been processed. This is especially useful when bridging. An alternative method is pinging the `getNameAvailability()` function to see when the name becomes taken.

```javascript
const getStatus = await clusters.getTransactionStatus(hash);
console.log(getStatus.status) // finalized
```
