For the complete documentation index, see llms.txt. This page is also available as Markdown.

代币互操作

ERC-20 和 SPL 代币如何在 Rome 上对应同一个底层账户。

Rome 将 ERC-20 代币及其底层 SPL 代币表示为一个共享账户。本页说明代币如何在 EVM 和 Solana 之间运作。

共享状态模型

Rome 不会把代币锁定在一侧、再在另一侧铸造包装副本。Rome 上的 ERC-20 代币是一个 透明封装器 ,覆盖在 Solana 上的一个 SPL 代币账户之上——ERC-20 余额 为 就是 SPL 余额。

An ERC-20 wrapper over the same SPL token account on Solana
  • 没有跨链延迟——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 封装器的符号必须唯一

下一步

最后更新于

这有帮助吗?