Skip to content

PaymentRouter 与链上配置

这页属于高级接入参考。链上收款的核心合约是 contracts/src/PaymentRouter.sol,它负责校验支付输入、把 stablecoin 转进 treasury,并发出可监听的事件。

合约职责

PaymentRouter 处理以下事情:

  • 维护 treasury
  • 维护受支持的 token 白名单
  • 防止同一 (merchant, orderId) 被重复支付
  • 提供 paypayWithSig
  • 在成功支付后发出 PaymentReceived

关键事件

solidity
event PaymentReceived(
    address indexed payer,
    address indexed merchant,
    address indexed token,
    uint256 amount,
    bytes32 orderId
);

backend listener 正是基于这个事件更新支付状态。

防重与安全点

合约当前的几个关键约束:

  • token 必须在 supportedTokens 白名单里
  • merchant 不能是零地址
  • amount 不能为 0
  • orderId 不能是空值
  • 同一个 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

部署脚本会:

  1. 校验当前链是否与目标部署 profile 匹配
  2. 部署 PaymentRouter
  3. 传入 initialOwnertreasury
  4. 按目标链把对应 stablecoin 加入白名单
  5. 输出部署区块、constructor args 和 verify 命令

与商家接入的关系

后端并不保管链上余额。它只依赖下面这些链上事实:

  • PAYMENT_ROUTER_ADDRESS
  • PaymentReceived 事件
  • token 地址与 decimals 配置

相关文档: