Appearance
PaymentRouter 与链上配置
这页属于高级接入参考。链上收款的核心合约是 contracts/src/PaymentRouter.sol,它负责校验支付输入、把 stablecoin 转进 treasury,并发出可监听的事件。
合约职责
PaymentRouter 处理以下事情:
- 维护
treasury - 维护受支持的 token 白名单
- 防止同一
(merchant, orderId)被重复支付 - 提供
pay和payWithSig - 在成功支付后发出
PaymentReceived
关键事件
solidity
event PaymentReceived(
address indexed payer,
address indexed merchant,
address indexed token,
uint256 amount,
bytes32 orderId
);backend listener 正是基于这个事件更新支付状态。
防重与安全点
合约当前的几个关键约束:
- token 必须在
supportedTokens白名单里 merchant不能是零地址amount不能为 0orderId不能是空值- 同一个
merchant + orderId只能成功处理一次 - 转账实际到账金额必须等于预期金额
当前链和 token
当前仓库已经支持四套独立部署:
- Base Sepolia(测试环境,默认本地模板)
- Base Mainnet(独立主网环境)
- Arbitrum One(主网)
- BSC Mainnet(主网)
默认本地模板仍然是 Base Sepolia:
CHAIN_ID=84532
部署脚本里预置了每条链的稳定币地址,部署时会按目标链自动选择。
| 链 | 币种 |
|---|---|
Base Mainnet (8453) | USDC / USDT / EURC(6 decimals) |
Base Sepolia (84532) | USDC / USDT / EURC(6 decimals) |
Arbitrum One (42161) | USDC / USDT(6 decimals) |
BSC Mainnet (56) | USDC 0x8ac76a51cc950d9822d68b83fe1ad97b32Cd580d / USDT 0x55d398326f99059fF775485246999027B3197955(18 decimals) |
部署脚本
部署入口:
bash
npm run deploy:base-sepolia
npm run deploy:base
npm run deploy:arbitrum
npm run deploy:bsc部署脚本会:
- 校验当前链是否与目标部署 profile 匹配
- 部署
PaymentRouter - 传入
initialOwner与treasury - 按目标链把对应 stablecoin 加入白名单
- 输出部署区块、constructor args 和 verify 命令
与商家接入的关系
后端并不保管链上余额。它只依赖下面这些链上事实:
PAYMENT_ROUTER_ADDRESSPaymentReceived事件- token 地址与 decimals 配置
相关文档: