> For the complete documentation index, see [llms.txt](https://docs.plume.org/plume/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.plume.org/plume/developers/how-to-guides/how-to-deploy-smart-contracts/deploy-using-remix-ide.md).

# Deploy using Remix IDE

[Remix IDE](https://remix.ethereum.org/) is an online no-setup platform maintained by the Ethereum Foundation with a GUI for developing smart contracts. You can check the [Remix IDE docs](https://remix-ide.readthedocs.io/en/latest/run.html) to learn more about deployment.

## Before you Begin

* Check if you are using the right [network configuration](/plume/developers/network-information.md)
* Have enough test tokens in your wallet

{% hint style="info" %}
Learn more about claiming test tokens from [here](/plume/developers/how-to-guides/how-to-connect-to-network/claim-test-tokens.md).
{% endhint %}

## Deploying your Contract

Let's write a simple one-of-one NFT contract based on [OpenZeppelin's open-source ERC-721](https://docs.openzeppelin.com/contracts/4.x/erc721) implementation to tokenize our CBO's prized Rolex watch on Plume Testnet for instance.

{% stepper %}
{% step %}

### Create a file on Remix IDE

Go to [Remix IDE](https://remix.ethereum.org) and create a new file. We are using a sample file named `RolexYachtMaster40.sol`.

<figure><img src="/files/kNVFWqcaULLfgqBsR6lX" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Add your code to the file

To demonstrate we are using this sample smart contract code, you can add your own code.

{% code title="RolexYachtMaster40.sol" overflow="wrap" fullWidth="false" %}

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;

import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";

contract RolexYachtMaster40 is Ownable, ERC721 {
    error NFTAlreadyMinted();
    bool private _minted;

    constructor() Ownable(msg.sender) ERC721("Rolex Yacht-Master 40", "") {}

    function mint() public onlyOwner returns (uint256) {
        if (_minted) {
            revert NFTAlreadyMinted();
        }
        _safeMint(owner(), 0);
        _minted = true;
        return 0;
    }
}
```

{% endcode %}
{% endstep %}

{% step %}

### Compile the Contract

Go to the **Solidity Compiler** tab on the IDE, choose the compiler version if you wish to and click on the blue `Compile <file_name>` button.

<figure><img src="/files/4z9AWlVjKq34qUXMS1DG" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}
A green tick :white\_check\_mark: will appear on the Compiler tab if the compilation is successful.
{% endhint %}
{% endstep %}

{% step %}

### Deploying the contract using MetaMask

Make sure you are on Plume Testnet network in MetaMask.

<img src="/files/HiJ9m3dO4XkDA4looLuX" alt="" data-size="original">

Select **Injected Provider - MetaMask** in the Environment dropdown and select the account which has sufficient ETH to pay to gas fees. As for our sample contract, no need to change other fields and click on **Deploy** button

<figure><img src="/files/tqslDEBzSjFAjnoeWdI1" alt=""><figcaption></figcaption></figure>

There will be a pop-up on MetaMask to confirm the transaction (asking for gas fees), on confirming the contract will be deployed.
{% endstep %}

{% step %}

### Contract Deployed

Check the console for the transaction info and deployed contract on the left-side panel.

<figure><img src="/files/dD1ZGCU6SB4DTshE11Ah" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}
