关于 scaffold
用于从零构建 Monad 链上应用的开发技能,以清单组织架构规划、合约、前端及可选索引器等步骤。它还提供常见配置注意事项、部署验证流程和项目元数据要求。
主要功能
- 01规划应用架构与目录
- 02指导链上与链下拆分
- 03组织合约部署和验证
- 04提供前端与钱包集成指引
- 05说明可选事件索引器流程
- 06记录 Monad 项目元数据
适用场景
- 01启动新的 Monad dApp 项目
- 02安排合约、前端和索引器开发顺序
- 03部署合约并在多个浏览器验证
- 04为前端配置钱包连接与认证
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ therealharpaljadeja/ monskills --skill scaffold安装后在 Claude Code 中输入/scaffold确认已加载。
附带文件SKILL.zh.md
详细介绍
清单
[ ] - 规划架构和文件夹结构
[ ] - 决定应用的哪些组件将上链
[ ] - 搭建项目骨架
[ ] - 初始化 git 仓库(git init && git add -A && git commit -m "initial commit")
[ ] - 不要从头构建已有的合约,尽可能使用 Openzeppelin 合约
[ ] - 构建智能合约
[ ] - 部署智能合约——获取 wallet/ 技能,然后通过 Alchemy Agent Wallet 会话部署(通过规范的 CreateX 工厂使用 CREATE2)。必须在构建前端之前完成此步骤,因为前端需要已部署合约的地址。
[ ] - 部署后验证智能合约——使用验证 API,一次调用即可在所有浏览器上验证。
[ ] - (如果应用需要可查询的历史链上数据)初始化索引器——获取 indexer/ 技能。合约部署并验证后,在 indexer/ 文件夹中初始化索引器。
[ ] - 使用已部署合约的地址构建前端。若用户没有偏好,则使用 Wagmi、Next.js 和 Shadcn
[ ] - 提前处理已知问题(见下文)——在运行 create-next-app 后立即将 tsconfig.json 的目标版本提高至 ES2020,等等。
[ ] - 创建 monskills 元数据文件(见下文「Monskills 元数据」部分)——在最终提交之前完成,以便将其纳入 git 历史记录。
[ ] - 将所有更改提交到 git(git add -A && git commit)
已知问题——提前处理
如果忽略这些问题,你会在构建过程中途遇到这些众所周知的小麻烦。请在搭建项目骨架时修复,而不要等到类型检查器报错后才处理。
Next.js 默认 tsconfig 目标版本对 viem/wagmi 来说太低
create-next-app 会生成 "target": "ES2017"。viem、wagmi 和大多数链上代码都会大量使用 BigInt 字面量(0n、1n)——用于金额、gas、事件参数、区块编号等——因此,一个全新的 Next.js 项目在你调用 useReadContract 或 getLogs 时就会因类型检查失败,并提示 TS2737: BigInt literals are not available when targeting lower than ES2020。
运行 npx create-next-app 后立即提高目标版本:
cd web
jq '.compilerOptions.target = "ES2020"' tsconfig.json > tsconfig.tmp && mv tsconfig.tmp tsconfig.json
(如果没有 jq,请打开 tsconfig.json,将 "target": "ES2017" 改为 "target": "ES2020"。)
搭建项目骨架
开始编写代码之前,请使用计划模式规划应用架构。
| 文件夹 | 组件 |
|---|---|
| web/ | Web 应用前端;如果使用 Next.js 或类似应用,也可包含后端路由(如果用户没有偏好,请使用 Next.js 和 shadcn 组件) |
| contracts/ | 智能合约(可以是 Foundry 项目;如果用户没有偏好,请使用 Foundry) |
| indexer/ | (可选)用于查询链上历史事件的 HyperIndex 索引器。合约部署并验证后,通过 indexer/ 技能创建。 |
决定哪些内容应该上链
以下内容应上链:
- 无需信任的所有权——谁拥有这个代币/NFT/头寸?
- 无需信任的交换——兑换、交易、借贷
- 可组合性——其他合约需要调用它
- 抗审查性——即使团队消失也必须能够正常运行
- 永久承诺——投票、证明、凭证
以下内容应保留在链下:
- 用户资料、偏好、设置
- 搜索、筛选、排序
- 图片、视频、元数据(存储在 IPFS 上,并在链上引用)
- 频繁变化的业务逻辑
- 不涉及价值转移或信任的任何内容
需要自行判断的情况:
- 声誉评分 → 链下计算,链上承诺(哈希或凭证)
- 价格数据 → 链下预言机将数据写入链上(Chainlink)
- 游戏状态 → 视风险而定。真钱扑克?上链。排行榜?链下。
不要尝试从头构建智能合约
根据智能合约的使用场景,很可能已经有可供基于其构建的 Openzeppelin 智能合约,无需从头构建。
例如:不要从头重建 ERC20、ERC721 等广为人知的代币类型,而应基于 Openzeppelin 合约构建,因为这些合约经过了大量审计。
所有 Openzeppelin 智能合约都可以在此处找到:https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts,并且可以使用以下命令安装(应已安装 Foundry)。
# --no-git avoids adding the dep as a git submodule — required when the contracts/
# folder is not (yet) its own git repo, which is the default in monskills scaffolds
# because the outer project directory owns the git history.
forge install --no-git OpenZeppelin/openzeppelin-contracts
在前端使用 Wagmi
使用 wagmi v3 库从前端调用智能合约。
如需连接钱包和进行身份验证,请使用 Para——嵌入式 MPC 钱包(电子邮件/通行密钥/社交登录)加上外部钱包连接。wallet-integration 技能会介绍 @getpara/cli 工作流(在已搭建的前端中执行 para init + ParaProvider + para doctor,以及 Monad 专用的 wagmi 配置)。不要运行 para create——脚手架搭建由此技能负责。
在任何适用的地方使用 useSendTransactionSync
Monad 支持 eth_sendRawTransactionSync RPC 方法,而 useSendTransactionSync 使用该 RPC 方法发送交易并在同一次函数调用中获取回执,因此 UI 的响应速度会快得多。
验证(所有区块浏览器)
始终使用验证 API。 一次调用即可在全部 3 个区块浏览器(MonadVision、Socialscan、Monadscan)上进行验证。不要首先选择使用 forge verify-contract。
第 1 步:获取验证数据
部署后,获取以下两项数据:
# 1. Standard JSON input (all source files)
forge verify-contract <ADDR> <CONTRACT> \
--chain 10143 \
--show-standard-json-input > /tmp/standard-input.json
# 2. Foundry metadata (from compilation output)
cat out/<Contract>.sol/<Contract>.json | jq '.metadata' > /tmp/metadata.json
第 2 步:调用验证 API
STANDARD_INPUT=$(cat /tmp/standard-input.json)
FOUNDRY_METADATA=$(cat /tmp/metadata.json)
cat > /tmp/verify.json << EOF
{
"chainId": 10143,
"contractAddress": "0xYOUR_CONTRACT_ADDRESS",
"contractName": "src/MyContract.sol:MyContract",
"compilerVersion": "v0.8.28+commit.7893614a",
"standardJsonInput": $STANDARD_INPUT,
"foundryMetadata": $FOUNDRY_METADATA
}
EOF
curl -X POST https://agents.devnads.com/v1/verify \
-H "Content-Type: application/json" \
-d @/tmp/verify.json
使用构造函数参数
添加 constructorArgs(ABI 编码,不带 0x 前缀)。
示例:
# Get constructor args
ARGS=$(cast abi-encode "constructor(string,string,uint256)" "MyToken" "MTK" 1000000000000000000000000)
# Remove 0x prefix
ARGS_NO_PREFIX=${ARGS#0x}
# Add to request
"constructorArgs": "$ARGS_NO_PREFIX"
参数
| 参数 | 必填 | 描述 |
|---|---|---|
chainId | 是 | 10143(测试网)或 143(主网) |
contractAddress | 是 | 已部署合约的地址 |
contractName | 是 | 格式:path/File.sol:ContractName |
compilerVersion | 是 | 例如:v0.8.28+commit.7893614a |
standardJsonInput | 是 | 来自 forge verify-contract --show-standard-json-input |
foundryMetadata | 是 | 来自 out/<Contract>.sol/<Contract>.json > .metadata |
constructorArgs | 否 | ABI 编码的参数,不带 0x 前缀 |
手动验证(仅作备用)
仅在 API 失败时使用。
测试网:
forge verify-contract <ADDR> <CONTRACT> --chain 10143 \
--verifier sourcify \
--verifier-url "https://sourcify-api-monad.blockvision.org/"
主网:
forge verify-contract <ADDR> <CONTRACT> --chain 143 \
--verifier sourcify \
--verifier-url "https://sourcify-api-monad.blockvision.org/"
Monskills 元数据
在最终提交前,在项目根目录中创建一个可见的 .monskills 文件。此文件用于记录项目是使用 monskills 构建的,以及脚手架面向哪个 Monad 网络。
对于 Monad 主网:
built-with=monskills
chain=monad
对于 Monad 测试网:
built-with=monskills
chain=monad-testnet
如果目标网络不明确,请在创建 .monskills 前询问用户。不要添加隐藏元数据、修改 git 提交消息,也不要使用框架的 generator 字段记录 monskills 来源。
按任务获取内容
| 我正在…… | 获取这些技能 |
|---|---|
| 选择要构建于其上的区块链 | why-monad/ |
| 编写智能合约 | addresses/ |
通过 Alchemy Agent Wallet 会话(@alchemy/cli)管理 Agent 钱包、部署智能合约(通过 CreateX 使用 CREATE2)或执行链上操作 | wallet/ |
| 为前端添加钱包和身份验证(嵌入式 MPC 钱包、社交/电子邮件/通行密钥登录,以及外部钱包连接——Para) | wallet-integration/ |
| 添加历史记录/活动动态,或任何需要索引链上智能合约事件的功能 | indexer/ |
| 从头构建应用(从创意到上线) | scaffold/(此技能) |