# 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)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://doc.cess.network/developer/smart-contract/deploy-sc-solidity.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
