# 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](/files/bX3d0vuJK6e8L80mdlZ6)

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.


---

# 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://archive-docs.klaytn.foundation/content/dapp/tutorials/count-dapp/6.-deploy-contract.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.
