# 6. Deploy Contract

1. truffle configuration
2. Deploy setup
3. Deploy

## 1) truffle configuration <a href="#id-1-truffle-configuration" id="id-1-truffle-configuration"></a>

`truffle-config.js` file describes how to deploy your contract code. You can configure below items in truffle-config.js

**1) Who will deploy the contract (Which Klaytn account will deploy the contract)?**\
**2) Which network will you deploy to?**\
**3) How many gas are you willing to pay to deploy the contract?**

There are 2 different methods to deploy your contract, first one uses `private key`, the other one uses `unlocked account`.

### DEPLOY METHOD 1: By private key <a href="#deploy-method-1-by-private-key" id="deploy-method-1-by-private-key"></a>

*WARNING: You shouldn't expose your private key. Otherwise, your account would be hacked.*

If you want to deploy your contract using the private key, `provider` option is needed.

1\) Pass your private key as the 1st argument of `new HDWalletProvider()`.\
2\) Pass your Klaytn node's URL as the 2nd argument of `new HDWalletProvider()`.

example)

```javascript
{
 ...,
 provider: new HDWalletProvider(
   'YOUR PRIVATE KEY',
   'https://public-en-baobab.klaytn.net', // If you're running full node you can set your node's rpc url.
  ),
 ...
}
```

```javascript
const HDWalletProvider = require("truffle-hdwallet-provider-klaytn");

const NETWORK_ID = '1001'
const GASLIMIT = '8500000'

/**
 * We extracted `URL`, `PRIVATE_KEY` as const variable to set value easily.
 * Set your private key and klaytn node's URL in here.
 */
const URL = `https://public-en-baobab.klaytn.net`
const PRIVATE_KEY = '0x48f5a77dbf13b436ae0325ae91efd084430d2da1123a8c273d7df5009248f90c'

module.exports = {
  networks: {
    /**
     * DEPLOY METHOD 1: By private key.
     * You shouldn't expose your private key. Otherwise, your account would be hacked!!
     */
    baobab: {
      provider: () => new HDWalletProvider(PRIVATE_KEY, URL),
      network_id: NETWORK_ID,
      gas: GASLIMIT,
      gasPrice: null,
    },
  },
}
```

See `networks` property in the above code. It has `baobab` key which has 4 properties, `provider`, `network_id`, `gas`, `gasPrice`.

`provider: new HDWalletProvider(PRIVATE_KEY, URL)` line informs the contract deployer account and the target network node URL.

`network_id: NETWORK_ID` line specifies the network id in Klaytn. Use `1001` for the Baobab network (testnet).

`gas: GASLIMIT` line informs how much gas limit will you endure to deploy your contract.

`gasPrice: null` line informs truffle how much price will you pay per gas unit. Currently in Klaytn, the price is fixed to `25000000000`. If you set it to `null`, truffle will set the value with the fixed gas price automatically.

### DEPLOY METHOD 2: By unlocked account (difficult) <a href="#deploy-method-2-by-unlocked-account-difficult" id="deploy-method-2-by-unlocked-account-difficult"></a>

To deploy a contract by unlocked account, you should have your Klaytn full node.\
Access your Klaytn node console by typing `$ klay attach http://localhost:8551` If you don't have a Klaytn account in the node, generate it by typing `personal.newAccount()` on the console.\
If you already have one, unlock your account through `personal.unlockAccount()`.

After ensuring account is unlocked,\
you should set the properties, `host`, `port`, `network_id`, and `from`. 1) Which network to deploy (`host`, `port`, `network_id`)\
2\) Who will deploy (`from`) 3) How much gas will you endure to deploy your contract (`gas`)

Put your unlocked account address on `from`. If you're running your own Klaytn full node, set the node's host to `host` and node's port to `port`.

example)

```javascript
{
  host: 'localhost',
  port: 8551,
  from: '0xd0122fc8df283027b6285cc889f5aa624eac1d23',
  network_id: NETWORK_ID,
  gas: GASLIMIT,
  gasPrice: null,
}
```

## 2) Deploy setup (Which contract do you want to deploy?) <a href="#id-2-deploy-setup-which-contract-do-you-want-to-deploy" id="id-2-deploy-setup-which-contract-do-you-want-to-deploy"></a>

`migrations/2_deploy_contracts.js`:

```javascript
const Count = artifacts.require('./Count.sol')
const fs = require('fs')

module.exports = function (deployer) {
  deployer.deploy(Count)
    .then(() => {
    // Record recently deployed contract address to 'deployedAddress' file.
    if (Count._json) {
      // Save abi file to deployedABI.
      fs.writeFile(
        'deployedABI',
        JSON.stringify(Count._json.abi, 2),
        (err) => {
          if (err) throw err
          console.log(`The abi of ${Count._json.contractName} is recorded on deployedABI file`)
        })
    }

    fs.writeFile(
      'deployedAddress',
      Count.address,
      (err) => {
        if (err) throw err
        console.log(`The deployed contract address * ${Count.address} * is recorded on deployedAddress file`)
    })
  })
}
```

You can specify which contract code will you deploy in your `contracts/` directory.\
First, you should import your contract file (`Count.sol`) in this file through `const Count = artifacts.require('./Count.sol')`\
And use `deployer` to deploy your contract, through `deployer.deploy(Count)`.\
If you want to run some logic after deploying your contract, use `.then()`.\
We want to store the contract ABI and the deployed address in files. `fs` node.js module is used to do it. (`fs.writeFile(filename, content, callback)`)\
Through this post-process, we save our contract address and ABI as `deployedABI` and `deployedAddress` in the directory.\
For further information about `artifacts.`, visit truffle document site, <https://trufflesuite.com/docs/truffle/getting-started/running-migrations#artifacts-require->

## 3) Deploy <a href="#id-3-deploy" id="id-3-deploy"></a>

You need KLAY to deploy a contract. You can receive testnet KLAY on faucet.

* On Klaytn wallet <https://baobab.wallet.klaytn.foundation/faucet>, there is a faucet providing 150 KLAY per 86400 blocks in Klaytn Baobab testnet. After creating your Klaytn account, run faucet to receive 150 KLAY.

![deploy](https://2361259531-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fo8dCjygb765jszAbMUcT%2Fuploads%2Fgit-blob-d525c4c2cd84f04d78e62415f4f703a4c1fc3a8b%2Ftutorial-3deploy.gif?alt=media\&token=93974f49-ebff-4300-a0d9-af386663daaa)

Type `$ truffle deploy --network baobab`.\
It will deploy your contract according to the configurations defined in `truffle-config.js` and `migrations/2_deploy_contracts.js`.

cf) `--reset` option\
After deploying your contract, if you type `$ truffle deploy --network baobab` again, nothing will happen.\
Because truffle deploys a contract only when there are changes in the contract, otherwise truffle will not do anything.\
If you want to re-deploy your contract anyway, there is an option `--reset`.\
If you provide this option, truffle will deploy your contract even the content of contract hasn't changed.\
ex) `$ truffle deploy --reset --network baobab`

To recap, `truffle-config.js` configures the `target network`, `deployer account`, and the `gas limit`. `migrations/2_deploy_contracts.js` configures the `contract` to deploy.\
`target network`: We deploy our contract to the node `https://public-en-baobab.klaytn.net`.\
`deployer account`: '0xd0122fc8df283027b6285cc889f5aa624eac1d23' will deploy this contract.\
`gas limit`: We can endure up to '20000000' gas for deploying our contract.\
`contract`: We will deploy the Count contract.

From the terminal output, you can see if the deployment has been succeeded and find the deployed address.
