Files
PolyWeather/docs/payments/PAYMENT_UPGRADE_V2_ZH.md
T
2026-03-20 23:50:40 +08:00

198 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# PolyWeather 支付合约升级方案(V2
最后更新:`2026-03-20`
## 1. 目标
本次 V2 方案对应三个明确目标:
1.`owner` 迁到多签地址
2. 升级到 `SafeERC20 + Pausable + ReentrancyGuard`
3. 把“链上 plan 绑定”和“EIP-712 授权支付”都纳入设计,而不是只在链下校验
合约草案:
- [PolyWeatherCheckoutV2.sol](/E:/web/PolyWeather/contracts/PolyWeatherCheckoutV2.sol)
构造参数编码脚本:
- [encode_checkout_v2_constructor.py](/E:/web/PolyWeather/scripts/encode_checkout_v2_constructor.py)
## 2. V2 新增能力
### 多签 owner
V2 constructor 不再默认 `msg.sender` 作为唯一 owner,而是显式传入:
- `initialOwner`
- `initialTreasury`
- `initialSigner`
这意味着:
- 部署后可直接把多签地址设为 `owner`
- 不需要先单签部署再补 transfer
### SafeERC20
V2 内置最小 `SafeERC20` 封装:
- `safeTransferFrom`
- `safeTransfer`
相比直接依赖 `IERC20.transferFrom -> bool`
- 对非标准 ERC20 的兼容性更稳
- 出错边界更明确
### Pausable
V2 增加:
- `pause()`
- `unpause()`
支付入口:
- `payPlan(...)`
- `payAuthorized(...)`
都受 `whenNotPaused` 保护。
一旦发现:
- treasury 配置错误
- token allowlist 配置错误
- 签名器异常
- 链上风控问题
可以直接暂停支付入口。
### ReentrancyGuard
V2 增加 `nonReentrant`,保护:
- `payPlan`
- `payAuthorized`
- `rescueToken`
虽然当前订单去重已经能挡住典型重复支付路径,但 `ReentrancyGuard` 仍然是更稳的防线。
### 链上套餐绑定
V2 新增:
- `setPlan(planId, token, amount, active)`
- `planConfig[planId][token]`
正式支付入口 `payPlan` 会:
1. 校验 token 已 allowed
2. 校验 `planId + token` 的 plan 已 active
3. 从链上读取 amount
4. 按链上配置收款
这意味着:
- `planId / amount / token` 绑定不再完全依赖链下
### EIP-712 授权支付
V2 同时保留第二条入口:
- `payAuthorized(...)`
它适合:
- 临时折扣
- 特殊活动价
- 不想每次都上链改 `setPlan`
校验字段包括:
- `orderId`
- `payer`
- `planId`
- `token`
- `amount`
- `nonce`
- `deadline`
签名人地址由:
- `signer`
统一控制。
## 3. 两条支付路径怎么选
### 路线 A:链上套餐绑定优先
优点:
- 最直观
- 合约级约束最强
- 更容易审计
缺点:
- 套餐改价需要 owner 交易
适合:
- 月付/季付/年付这类稳定商品
### 路线 BEIP-712 授权优先
优点:
- 活动价灵活
- 不必每次改链上 plan
缺点:
- 需要管理 signer 密钥
- 风险从 owner 单点,部分转移到 signer 运维
适合:
- 促销
- 临时折扣
- 白名单价格
### 当前建议
生产建议不是二选一,而是:
1. **稳定套餐**`payPlan`
2. **特殊场景**`payAuthorized`
这样:
- 主流程更稳
- 特殊价仍保留灵活性
## 4. 推荐迁移步骤
1. 先部署 V2 到测试环境
2. `owner` 直接用多签地址
3. 配置 `treasury`
4. 配置 `allowedToken`
5. 配置 `planId/token/amount`
6. 仅在需要活动价时再配置 `signer`
7. 用事件重放脚本和运行态接口验证
8. 再切生产前端/后端配置到新 `receiver_contract`
## 5. 构造参数编码
示例:
```bash
python scripts/encode_checkout_v2_constructor.py \
--owner 0xYourMultiSig \
--treasury 0xYourTreasury \
--signer 0xYourBackendSigner
```
## 6. 当前判断
V2 已经把这三件事做成了明确方案:
1. 多签 owner
2. SafeERC20 + Pausable + ReentrancyGuard
3. 链上 plan 绑定 + EIP-712 授权
它现在是**升级草案**,不是现网已部署合约。
如果要真正上线,下一步就是:
1. 做一次测试网或本地链验证
2. 更新 PolygonScan 验证文档
3. 修改后端 `receiver_contract` 配置