> For the complete documentation index, see [llms.txt](https://doc.cess.network/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://doc.cess.network/developer/smart-contract/deploy-sc-solidity.md).

# Deploy a Solidity Smart Contract

## Overall

In this tutorial, we will learn how to deploy a [**Solidity** Smart Contract](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html) on the CESS blockchain. Solidity smart contracts are widely deployed on EVM-compatible chains, notably Ethereum. CESS blockchain is also EVM-compatible and allows Solidity developers to deploy their contracts on CESS with no or minimal changes.

## Preparation

You will need the following to deploy a Solidity smart contract to CESS.

* **MetaMask**: Required to get an Ethereum address and to connect to the CESS chain
* **CESS Acount**: Refer to [this article](https://github.com/CESSProject/doc-v2/blob/main/community/cess-account.md) on how to create a CESS account and [this article](https://github.com/CESSProject/doc-v2/blob/main/developer/guides/testnet-faucet.md) on getting testnet tokens from our faucet.
* **Remix IDE**: Access to [Remix IDE](https://remix.ethereum.org/) to develop, compile, and deploy smart contracts to the chain
* **Access to CESS Node**: Make sure the node allows access from MetaMask.

The following steps will guide you to deploy a Solidity contract on the CESS testnet.

{% hint style="info" %}
This tutorial involves working with the EVM in CESS test-chain. You will understand better if you understand the reasoning and mechanism behind the [Subtrate and EVM address conversion](https://github.com/CESSProject/doc-v2/blob/main/developer/guides/substrate-evm.md).
{% endhint %}

## Add CESS Network to MetaMask

Open the MetaMask setting tab, click on the **Networks** tab, click on **Add a network** and then **Add a network manually**.

![Metamask: Adding a Network](/files/XKXFvRHyf8qESXWf8Quy)

On **Add a network manually** page, enter the following details:

* Network Name: **CESS Testnet**
* New RPC URL, one of the following:
  * <https://testnet-rpc.cess.network/ws/>
* Chain ID: **11330**
* Currency Symbol: **TCESS**

![Metamask: Adding CESS Testnet](/files/BbP0D3VmKirevPcXSUS3)

## Convert the Substrate Address to an EVM Address

Copy the account address from MetaMask.

![Metamask: My Account](/files/7Ajt0wx095amOCDJmC7p)

Open the page to [Substrate Address Converter](https://hoonsubin.github.io/evm-substrate-address-converter).

![Substrate Address Converter](/files/Nn7kUQFvEbL0iksGcDt5)

Input the following:

* Current Address Scheme: **H160**
* Change Address Prefix: \**11330*
* Intput address: *your metamask account*
* Copy the account address starting with "cX.."

Get the EVM address output.

## Fund the Account

Using [CESS Explorer](https://testnet.cess.network/) **Accounts -> Transfer** to transfer some balance to the Substrate address output above. For testnet goto [testnet faucet](https://cess.network/faucet.html) to get fund drip into this Substrate address.

![CESS Explorer: Transfer Amount](/files/gNqeOimZQ7Byz7x1wxJo)

## Validate the Fund

To validate the funds are in the Ethereum account, open MetaMask and check that account has the funds transferred

![Metamask: Check My Account](/files/otuk2XSkUMFCg4WgiyUC)

## Deploy a Contract Using Remix IDE

{% hint style="info" %}
You can use one of the [sample Solidity smart contract codes here](https://github.com/CESSProject/cess-examples/tree/main/hardhat).
{% endhint %}

Open [Remix IDE](https://remix.ethereum.org/) and go to **File explorer**.

In File explorer, open the smart contract you wish to compile and then deploy.

![Remix: Deploy a Contract](/files/WZiyziTME9RF4xkQQOBM)

Once the file is selected, go to tab **Solidity Compiler**, you should see the selected file, press the **Compile** button to compile the contract. Once compiled, you’ll see the "green tick" mark and compiled (\*.sol) file.

![Remix: Contract Compiled](/files/OkNKAcGYwJwtfPIAaWgv)

Go to **Deploy and run Transactions**, once the compilation is successful, you should see the compiled \*.sol file selected, ready to be deployed. In the **Environments** drop-down, select **Injected Provider - MetaMask** and click **deploy**.

![Remix: Deploy Contract to CESS](/files/SoIxrEXakDAPtYL5uA4l)

{% hint style="info" %}
When you click **Deploy**, you will need to confirm in MetaMask to allow Remix to access the account and submit the transaction.
{% endhint %}

Click **Confirm** to submit the transaction to deploy the smart contract.

![Metamask: Confirm Deploy Transaction](/files/yzzJ0vS7SNn6CBQWC7Zu)

After the transaction is deployed and processed on-chain, you’ll see the following message.

![Remix: Deployment Succeeded](/files/pJPEvnDeQ1hJE14DA8cw)

In the **Deployed Contracts** section in the Remix, you can call the function of the smart contract.

![Remix: Interact with the Contract](/files/ag1hiLXHIA2PPPK2cq4v)

## Transfer Tokens to the CESS Account

Convert the Substrate address to Ethereum account address using the link [Substrate Address Converter](https://hoonsubin.github.io/evm-substrate-address-converter).

![Substrate-EVM Address Converter](/files/xER3n4ZAqad3FrC9aOLy)

Copy the Ethereum equivalent address and use MetaMask to transfer fund.

| <p><img src="/files/pxCnYTbo2BeM8wz50pRJ" alt="deploy-sc-solidity-14"><br>Transfer Fund in Metamask 1</p> | <p><img src="/files/kr6Ou9hAUzxrnzHhJPbN" alt="deploy-sc-solidity-15"><br>Transfer Fund in Metamask 2</p> |
| --------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- |

Confirm the balance in the [CESS Explorer: Developer RPC calls](https://testnet.cess.network/#/rpc). Use the Ethereum address in previous step.

![CESS Explorer: Get Balance](/files/4RMsBJAGS7BFtr1ZKUVe)

## Withdraw Balances to the CESS Account

To withdraw the balance from the Ethereum account to CESS account, follow the route **Developer => Extrinsics => evm => withdraw**.

![CESS Explorer: Sending evm:withdraw Transaction](/files/zAbAFaYmQpmAc4MfjX8y)

Validate the balances in **Accounts** tab of CESS Explorer.

![CESS Explorer: Account Updated](/files/FNPcR6P1QGhN0ecwEhtb)
