开发者指南
Primcast 与 EVM 等价(Arbitrum Nitro),现有工具都能直接使用:Foundry、Hardhat、viem、ethers、wagmi。
节点与地址
RPC、WebSocket、浏览器和 Chain ID,以及实时合约地址,见网络。Primcast 代码库中的部署文件 contracts/deployments/<chainId>.json 以机器可读的形式提供同样的数据。
ABI
在 contracts/ 中执行 forge build,或使用生成的 portal/lib/abi.ts,其中导出了 identityRegistryAbi、rwaTokenAbi、offeringAbi、assetHubAbi、rwaTokenFactoryAbi 和 systemRegistryAbi。
操作前先检查资格
const ok = await client.readContract({
address: token, abi: rwaTokenAbi, functionName: "canReceive", args: [wallet, amount],
});
canReceive 以不回滚的方式执行完整的接收方校验,包括冻结、制裁、KYC、合格投资者、辖区和持有上限。可用 IdentityRegistry.complianceOf(wallet) 解释为什么没有通过。
发送交易
- 授权: 结算币是普通 ERC-20。
subscribe前授权Offering合约;distributeDividend或fundRedemptionPool前授权代币合约;AssetHub 缴纳保证金也需要授权。 - Gas: 交易除执行费外还需支付 L1 数据费,请让节点估算 Gas。使用 Foundry 时务必加
--skip-simulation --slow广播,否则节点会以intrinsic gas too low拒绝交易。 - 错误: 合约以类型化错误回滚:
Unauthorized、NotFound、AlreadyExists、LimitExceeded、InvalidArgument(string)、InvalidStatus、Sanctioned(address)、AccountFrozen(address)、KYCRequired(address)、AccreditedRequired(address)、JurisdictionDenied(address)、InsufficientBalance、Paused、ZeroAmount。
索引
每次状态变化都会发出事件,不存在需要推导的隐藏状态。核心事件列在各系统页面末尾(身份、RWA 代币、认购、AssetHub)。编号从 1 开始;辖区、资产类别、单位、设备类型等短字符串为左对齐的 bytes32。
集成协议
如果你的合约会持有 RWA 份额(资金池、金库、市场):
- 请每个代币的管理员调用
setVenue(yourContract, true)。 - 如果你的合约能领取分红并转交给存款人,请申请
setVenueDividends(yourContract, true),并在合约中调用claimDividends()。 - 预期转给不合格用户的转账会回滚,并在界面中展示
canReceive结果。 - 到期后,你的合约仍可以把份额发给合格持有人——据此设计提取流程。
运行 Keeper
调用 Offering.processAll(n)(或用 isDue 找出编号后调用 process(ids))以及 RWAToken.checkMaturity()。两者都无需许可,对没有到期事项的条目不会回滚。
本地开发
make local # anvil + 部署 + 冒烟测试(若同级目录有 DEX 也会部署)
make local-demo # 写入演示数据:发行方、投资者、认购、设备与读数
make portal-dev # 在 http://localhost:3002 启动本门户,带开发钱包
开发钱包按演示数据中的角色提供 anvil 账户(治理方、发行方、登记机构、投资者、电表运营方、预言机),私钥不会进入浏览器。