---
# System prepended metadata

title: Foundry NFT實作教學/介紹 (1)你的第一個Foundry專案

---

# Foundry NFT實作教學/介紹 (1)你的第一個Foundry專案

# 前言

**本系列文章的目的在於了解Foundry的功能，並熟悉其操作，並以發布一個ERC721 NFT為目標**

Foundry 類似於 Hardhat，都是用來開發智能合約的工具，有包含部署、測試、編譯等等的功能，只不過 Hardhat 在部署跟測試上都是採用 ethers，使用 javascript 做撰寫，且使用 npm 做相關的套件管理，而在 Foundry **裡頭全都是使用 solidity 撰寫**，再搭配 CLI 工具

Hardhat 現在也是主要智能合約開發用的工具，不過現在也仍有不少的問題，最為顯著的就是智能合約的開發者必須掌握兩種語言，雖然核心還是在於 solidity，但是對於 javascript 也必須擁有一定的掌握度，才能去撰寫部署跟測試腳本

且在使用 ethers 的時候，會遇到一些坑，例如需要注意 BigNumber 的轉換，以及要去尋找相對應的 ethers function，例如部署的合約需要先`getContractFactory("Your Contract")`然後再執行`deploy()`，如果上述動作改用 solidity 寫的話就是`contract = new Contract()`，對於智能合約工程師而言就不用再多一層的轉換

我個人目前主觀認為用Foundry最大的好處在於可以讓專門開發智能合約的工程師，可以在使用上更順暢，大腦不用反覆轉換兩種語言，但Foundry較為被大眾喜愛的點在於，快速的執行速度，以及豐富完善的測試方式

但Foundry在腳本上功能還是沒有ethers完善跟方便，所以現在有一些專案採取Hardhat跟Foundry的混用，但是這邊需要注意的地方是，test是不能去混用的，若用solidity寫的test就是用`forge test`，那使用js就是用`npx hardhat test`

**注意！這邊都用Mac去做舉例，若你用其他作業系統，在某些操作指令跟安裝步驟會不太一樣**

# 提醒

- 此系列需要對solidity/hardhat有基本認識
- 需要了解git add/commit
- 對env有基本認識
- 本系列講解會比較詳細，若是有一定開發經驗的人可以自行選擇帶過某些部分


# Foundry install

1. Download foundryup
``` 
curl -L https://foundry.paradigm.xyz | bash 
```

2. Install foundry
```
foundryup
```
foundry其實是由四個套件組成，分別是**forge, cast, anvil, chisel**.

3. Check version 我們這邊檢查forge的版本，用來確定是否確實安裝成功
```
forge --version
```
如果這邊有安裝成功的話就會顯示你的版本現在為多少

Output: 
```
forge 0.2.0 (edf15ab 2023-02-22T00:11:26.185311Z)
```


如果你是其他作業系統，可以參考[foundry book](https://book.getfoundry.sh/getting-started/installation)


# Start

1. 創建一個空的資料夾，叫做hello_foundry
```
mkdir hello_foundry && cd hello_foundry
```

2. Init
```
forge init
```

這時候你會發現多了一些資料夾，我們晚點一個個介紹
![](https://i.imgur.com/lgWfYCW.png)

在src跟test裡面，都已經有一個預設的sol檔，接下來我們就來跑跑看

3. Compile
```
forge build
```

Output:
```
[⠰] Compiling...
[⠒] Compiling 21 files with 0.8.18
[⠃] Solc 0.8.18 finished in 2.23s
Compiler run successful
```

4. Test
```
forge test
```

Output:
```
[⠔] Compiling...
No files changed, compilation skipped

Running 2 tests for test/Counter.t.sol:CounterTest
[PASS] testIncrement() (gas: 28334)
[PASS] testSetNumber(uint256) (runs: 256, μ: 27787, ~: 28409)
Test result: ok. 2 passed; 0 failed; finished in 13.41ms
```

`forge build`跟`forge test`是我們最常用的兩個指令，第一個是編譯，確認合約有沒有問題(相當於`npx hardhat compile`)

第二個就是跑測試，相當於`npx hardhat test`

# 專案結構介紹

我們可以看到hello_foundry裡面多了很多資料夾跟檔案，接下來我們一個個解釋

- **.github**  CI/CD 控制github action (待補充)
- **lib** 套件儲存，在hardhat我們是採用npm並把套件都裝在node_modules，但在foundry 我們採用的是git submodule，簡單來說就是我們可以把在git上的專案都載下來當做套件去做使用
- **script** 腳本，作用跟hardhat的scripts一樣，可以在上面寫部署合約用的腳本
- **src**  裡面存放合約
- **test** 存放測試檔案
- **.gitmodules** 功能類似於package.json，可以查看現在裝了哪些套件
- **foundry.toml** 用於設定專案上面的某些功能，類似於hardhat.config.js，可以用來設定compile version等等，更多可以設定的選項可以參考[foundry config](https://github.com/foundry-rs/foundry/tree/master/config)

整體而言我們可以看到foundry跟hardhat在資料夾的結構上並沒有相差多少

# 結尾

下一回我們就會該怎麼開發合約跟部署 [Foundry NFT實作教學/介紹 (2)開發並部署合約](https://hackmd.io/@RainFox/B1UlEhQzn)

若在製作上有問題，可以參考原始碼: [hello-foundry](https://github.com/LI-YONG-QI/hello-foundry)