> ## Documentation Index
> Fetch the complete documentation index at: https://docs.monad.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# 使用 Foundry 在 Monad 上部署智能合约

本指南使用官方 [Foundry](/zh/tooling-and-infra/toolkits/foundry) v1.8 或更高版本在 Monad 测试网上编译并部署合约。

## 1. 安装 Foundry

安装官方 Foundry 安装器:

```sh theme={null}
curl -L https://foundry.paradigm.xyz | bash
```

按照安装器提示将 `foundryup` 添加到您的 shell,然后安装最新的稳定版:

```sh theme={null}
foundryup
```

确认 `forge --version` 报告 v1.8.0 或更高版本。有关更多安装和迁移指南,请参阅 [Foundry 工具包页面](/zh/tooling-and-infra/toolkits/foundry#installation)。

## 2. 创建新的 foundry 项目

<Tip>
  您可以使用 `foundry-monad` 模板来创建一个新项目。

  *[Foundry-Monad](https://github.com/monad-developers/foundry-monad) 是一个带有 Monad 配置的 Foundry 模板。*
</Tip>

以下命令使用 `foundry-monad` 创建一个新的 foundry 项目:

```sh theme={null}
forge init --template monad-developers/foundry-monad [project_name]
```

或者,您可以使用以下命令创建一个 foundry 项目:

```sh theme={null}
forge init [project_name]
```

## 3. 修改 Foundry 配置

更新 `foundry.toml` 以选择 Monad 执行环境并配置 Monad 测试网:

```toml lines title="foundry.toml" theme={null}
[profile.default]
src = "src"
out = "out"
libs = ["lib"]
network = "monad"
# Monad Testnet Configuration
eth-rpc-url = "https://testnet-rpc.monad.xyz"
chain_id = 10143
```

`network = "monad"` 设置等同于持久化传入 `--network monad`。它让 Forge 在本地编译、测试、脚本和交易模拟中使用 Monad 的执行规则。当与 Monad 测试网交互时,Foundry 会自动选择处于活跃状态的 hardfork。

## 4. 编写智能合约

您可以在 `src` 文件夹下编写智能合约。项目中已经有一个 `Counter` 合约,位于 `src/Counter.sol`。

```solidity lines title="src/Counter.sol" theme={null}
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

contract Counter {
    uint256 public number;

    function setNumber(uint256 newNumber) public {
        number = newNumber;
    }

    function increment() public {
        number++;
    }
}
```

## 5. 编译智能合约

```sh theme={null}
forge compile
```

编译过程的输出可以在新创建的 `out` 目录中找到,其中包括合约 ABI 和字节码。

## 6. 部署智能合约

<Note>
  对于部署合约,我们建议使用 keystore 而不是私钥。
</Note>

### 获取测试网资金

部署智能合约需要测试网资金。请通过[水龙头](https://testnet.monad.xyz)领取测试网资金。

### 部署智能合约

<Tabs>
  <Tab title="使用 Keystore(推荐)">
    使用 keystore 比使用私钥安全得多,因为 keystore 会加密私钥,之后可以在任何需要私钥的命令中引用。

    使用以下命令导入新生成的私钥来创建新的 keystore。

    ```sh theme={null}
    cast wallet import monad-deployer --private-key $(cast wallet new | grep 'Private key:' | awk '{print $3}')
    ```

    以下是上述命令的分步说明:

    * 生成一个新的私钥
    * 将该私钥导入名为 `monad-deployer` 的 keystore 文件
    * 将新创建的钱包地址打印到控制台

    创建 keystore 后,您可以使用以下命令读取其地址:

    ```sh theme={null}
    cast wallet address --account monad-deployer
    ```

    在提示时提供一个密码来加密 keystore 文件,并请不要忘记它。

    运行以下命令来部署您的智能合约

    ```sh theme={null}
    forge create src/Counter.sol:Counter --account monad-deployer --broadcast
    ```
  </Tab>

  <Tab title="使用私钥(不推荐)">
    使用以下命令,通过直接在终端粘贴私钥来部署智能合约。

    <Warning>
      不推荐使用私钥。您不应将私钥复制粘贴到终端中。请改用 keystore。
    </Warning>

    ```sh theme={null}
    forge create --private-key <your_private_key> src/Counter.sol:Counter --broadcast
    ```
  </Tab>
</Tabs>

智能合约部署成功后,输出应类似如下内容:

```sh theme={null}
[⠊] Compiling...
Deployer: 0xB1aB62fdFC104512F594fCa0EF6ddd93FcEAF67b
Deployed to: 0x67329e4dc233512f06c16cF362EC3D44Cdc800e0
Transaction hash: 0xa0a40c299170c9077d321a93ec20c71e91b8aff54dd9fa33f08d6b61f8953ee0
```

### 后续步骤

查看[如何在 MonadVision 上验证已部署的智能合约](/zh/guides/verify-smart-contract/foundry)。
