代币互操作
ERC-20 和 SPL 代币如何在 Rome 上对应同一个底层账户。
Rome 将 ERC-20 代币及其底层 SPL 代币表示为一个共享账户。本页说明代币如何在 EVM 和 Solana 之间运作。
共享状态模型
Rome 不会把代币锁定在一侧、再在另一侧铸造包装副本。Rome 上的 ERC-20 代币是一个 透明封装器 ,覆盖在 Solana 上的一个 SPL 代币账户之上——ERC-20 余额 为 就是 SPL 余额。
没有跨链延迟——ERC-20 余额就是 SPL 余额
没有流动性碎片化——两侧的 DeFi 看到的是同一批代币
没有桥接风险——不存在可被利用的独立托管账户
下面的导入路径使用
@rome-protocol/rome-solidity。该包不在 npm 上;请从公共rome-solidity仓库安装,使用npm install github:rome-protocol/rome-solidity,或forge install rome-protocol/rome-solidity通过重映射安装;封装器和工厂合约在 Foundry 下也需要 OpenZeppelin(见 部署 Solidity 合约)。预编译接口位于contracts/interface.sol.
封装器合约
SPL_ERC20 (以及其缓存轨道变体 SPL_ERC20_cached,工厂目前部署的就是它)在一个 SPL mint 之上提供完整的 ERC-20 接口:
balanceOf()— 从 Solana 读取用户的 ATA 余额transfer()— 在 Solana 上转移代币approve()/allowance()— 使用 EVM 存储(SPL 没有 EVM 风格的授权额度)totalSupply()— 读取 SPL mint 供应量
工厂
ERC20SPLFactory 为任意 SPL mint 部署一个封装器:
实时工厂地址,来自 live 注册表条目(v0.2.0):Hadrian 0x37c13e4ff21fb914eb24014dcbd0f8dbeaa31078,Martius 0x405ded76ebae104ebe8345a649c6cbbf37efff00。更早的工厂仍然在链上,但被标记为 deprecated 或 retired 中 registry;不要使用它们。注册表是唯一可信来源,因此请从中读取实时地址(见 读取 contracts 列表),而不是把地址复制到你的代码里。
规范 mint
没有链上的代币注册表合约。规范封装器和 gas/bridge 代币由链下 rome-protocol/registry维护;通过 add_spl_token_no_metadata 创建的无需许可封装器则通过链上的 TokenCreated 事件发现。这使得每个资产都映射到单一规范的 SPL mint,同时不会造成流动性碎片化。
从 Solidity 调用 SPL 操作
对于由用户 PDA 签名的 SPL 基元,请使用 HelperProgram 预编译(0xFF…09)——ATA 创建、SPL 转账以及 gas↔lamports 转换:
transfer_spl 有多个重载(包括用于流程的 delegate 变体);确切签名见 transferFrom 。在缓存轨道上,对应操作位于 interface.sol 以获取确切签名。一个合约应始终使用同一轨道。 ISplCached (0xFF…05分发——并且 IAssociatedSplCached (0xFF…06。一个合约应始终一致地使用同一轨道。
存入和提取
进入 EVM — SPL 侧会将代币记入用户 PDA 所拥有的 ATA;ERC-20 封装器会立即反映该余额。跨链入金通过用户在桥上的签名授权实现无信任结算。
转出到 Solana — 调用
取出预编译(0x42…16):withdraw_to_pda/withdraw_to_ata将代币从用户的 PDA 转回 Solana。wrap-gas-to-SPL 路径为withdraw_to_ata.
Gas 代币
每条链都有自己的 gas 代币——可以是任意 SPL 代币,通过 Meteora DAMM 池定价(v1 或 v2,可配置)。公链(Martius、Hadrian)使用 USDC。不存在统一的默认 gas 代币。
约束
SPL 代币数量为
uint64(最大 18,446,744,073,709,551,615)授权额度使用 EVM 存储,而不是 Solana delegate
每个工厂内 ERC-20 封装器的符号必须唯一
下一步
合约地址 — 预编译和各链地址
从 EVM 调用 Solana — 从 Solidity 调用 CPI 和 SPL 操作
最后更新于
这有帮助吗?