How to deploy a Smart Contract to the Testnet
Tags: blockchain, solidity, web3, smartcontract
Published: 2021-09-17 11:54:02

In this article I will teach you how to deploy your contract to the Rinkeby Testnet.

To be faster we will use our project from another article: [How to create a smart contract to mint an nft](https://dev.to/emanuelferreira/how-to-create-a-smart-contract-to-mint-a-nft-2bbn)


## Creating an account and an Ethereum project in Infura
Infura provides instant access over HTTPS and WebSockets to the Ethereum network.

[Access Infura](https://infura.io/)

1. Create your account (Common Steps).
2. Click Ethereum, then create new project.
 
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ypw1fqksuym1wo0uiqef.png)

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hamo5d4p1629zn7dk7f0.png)

3. Give a name for your project .
4. Save your project id.

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7c1l8iql0b4darkf80zy.png)
 
 
## Initial settings
Returning to the project, let's make the initial settings for our project.
 
Let's go to the `hardhat.config.js` file and add an object called network along with another object called `rinkeby` containing url and accounts.


```js
require("@nomiclabs/hardhat-waffle");

/**
 * @type import('hardhat/config').HardhatUserConfig
 */

module.exports = {
  solidity: "0.8.3",
  networks: {
   rinkeby: {
     url: "", //Infura url with projectId
     accounts: [""] // add the account that will deploy the contract (private key)
    },
  }
};
```


Now in url we add the url with the project id provided by Infura and in accounts we add the private address of our wallet.

> Note: Be careful with your private key, it gives access to your wallet and will spend its crypto to deploy the contract.

```js
require("@nomiclabs/hardhat-waffle");

/**
 * @type import('hardhat/config').HardhatUserConfig
 */

module.exports = {
  solidity: "0.8.3",
  networks: {
   rinkeby: {
     url: "https://rinkeby.infura.io/v3/ba900937b83f4883b926713999277b1f", //Infura url with projectId
     accounts: ["123456789101112131415"] // add the account that will deploy the contract (private key)
    },
  }
};
```

## Creating the script to deploy
Now to deploy the smart contract to rinkeby testnet, we are going to make a script with the hardhat that will make it easier for us to upload it with a command.

In the root directory, create a folder called `scripts` and inside a file called `deploy.js`

```
/node_modules
/contracts
/test
/scripts
 | - deploy.js
hardhat.config.js
package.json
yarn.lock
```
Now we're going to modify the file by adding the script below, where I'll explain it line by line.

*deploy.js*
```js
const hre = require("hardhat"); //import the hardhat

async function main() {
  const [deployer] = await ethers.getSigners(); //get the account to deploy the contract

  console.log("Deploying contracts with the account:", deployer.address); 

  const FactoryNFT = await hre.ethers.getContractFactory("FactoryNFT"); // Getting the Contract
  const factoryNFT = await FactoryNFT.deploy(); //deploying the contract

  await factoryNFT.deployed(); // waiting for the contract to be deployed

  console.log("FactoryNFT deployed to:", factoryNFT.address); // Returning the contract address on the rinkeby
}

main()
  .then(() => process.exit(0))
  .catch((error) => {
    console.error(error);
    process.exit(1);
  }); // Calling the function to deploy the contract 

```

Now to deploy your contract just run this commands:
```bash
yarn compile 
```
```bash
yarn hardhat run scripts/deploy.js --network rinkeby
```

*result*
```
Deploying contracts with the account: 0xAFEeb469Ce6376979Ea037b4CE6b7172f9018007
FactoryNFT deployed to: 0xF9e6b75cE8da147D4f1d7d2cc597A7A42A645006
```

Contract deployed!!!

Now you can Follow me on: [Twitter](https://twitter.com/manelferreira_)
Project Repository: https://github.com/EmanuelCampos/mint-nft/tree/with-deploy-config