mcpField
S
scaffold

scaffold

github.com/therealharpaljadeja开发15231 次安装3 周前更新
代码仓库

关于 scaffold

用于从零构建 Monad 链上应用的开发技能,以清单组织架构规划、合约、前端及可选索引器等步骤。它还提供常见配置注意事项、部署验证流程和项目元数据要求。

主要功能

  1. 01规划应用架构与目录
  2. 02指导链上与链下拆分
  3. 03组织合约部署和验证
  4. 04提供前端与钱包集成指引
  5. 05说明可选事件索引器流程
  6. 06记录 Monad 项目元数据

适用场景

  1. 01启动新的 Monad dApp 项目
  2. 02安排合约、前端和索引器开发顺序
  3. 03部署合约并在多个浏览器验证
  4. 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/(此技能)

评论

支持 Markdown