Primcast
EN

开发者指南

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 份额(资金池、金库、市场):

  1. 请每个代币的管理员调用 setVenue(yourContract, true)。
  2. 如果你的合约能领取分红并转交给存款人,请申请 setVenueDividends(yourContract, true),并在合约中调用 claimDividends()。
  3. 预期转给不合格用户的转账会回滚,并在界面中展示 canReceive 结果。
  4. 到期后,你的合约仍可以把份额发给合格持有人——据此设计提取流程。

运行 Keeper

调用 Offering.processAll(n)(或用 isDue 找出编号后调用 process(ids))以及 RWAToken.checkMaturity()。两者都无需许可,对没有到期事项的条目不会回滚。

本地开发

make local                    # anvil + 部署 + 冒烟测试(若同级目录有 DEX 也会部署)
make local-demo               # 写入演示数据:发行方、投资者、认购、设备与读数
make portal-dev               # 在 http://localhost:3002 启动本门户,带开发钱包

开发钱包按演示数据中的角色提供 anvil 账户(治理方、发行方、登记机构、投资者、电表运营方、预言机),私钥不会进入浏览器。