Взаимодействие токенов

Rome EVM связывает ERC-20 токены и SPL токены через модель единого состояния. На этой странице объясняется, как токены работают одновременно в EVM и Solana.

Модель единого состояния

В отличие от традиционных мостов, Rome не блокирует токены в одной сети и не выпускает их обёрнутые копии в другой. Вместо этого ERC-20 токены в Rome EVM являются прозрачными обёртками над базовыми SPL token accounts в Solana.

┌──────────────────────────────────┐
│ Rome EVM                         │
│                                  │
│   ERC-20 "rUSDC"                 │
│   ┌────────────────────────┐     │
│   │ balanceOf(user)        │─────┼──► читает напрямую из SPL ATA
│   │ transfer(to, amount)   │─────┼──► выполняет SPL transfer через precompile
│   │ totalSupply()          │─────┼──► читает объём выпуска SPL mint
│   └────────────────────────┘     │
│                                  │
└──────────────────────────────────┘

                 │ одни и те же базовые данные

┌──────────────────────────────────┐
│ Solana                           │
│                                  │
│   SPL Token Account (ATA)        │
│   Владелец: PDA пользователя     │
│   Mint: USDC (нативный Circle)   │
│   Количество: 1000000 (= 1 USDC) │
│                                  │
└──────────────────────────────────┘

Что это означает:

  • Нет задержки моста — баланс ERC-20 ЯВЛЯЕТСЯ балансом SPL

  • Нет фрагментации ликвидности — DeFi с обеих сторон видит одни и те же токены

  • Нет риска моста — нет отдельного эскроу, который можно эксплуатировать

ERC20SPL: контракт-обёртка

SPL_ERC20 — это стандартный контракт-обёртка, предоставляющий полный интерфейс ERC-20 поверх SPL token mint:

Как это работает на низком уровне:

  • balanceOf() → выводит ATA пользователя (Associated Token Account) → считывает баланс из Solana

  • transfer() → вызывает precompile SPL Token (0xff...05) → перемещает токены в Solana

  • approve() / allowance() → использует хранилище EVM (стандартный шаблон ERC-20), поскольку SPL нативно не поддерживает allowance в стиле EVM

  • totalSupply() → читает данные из аккаунта SPL mint

ERC20SPLFactory

Фабричный контракт развёртывает обёртки для любого SPL токена:

Адрес фабрики (devnet): 0xfd21da046c282e1d36cc45e46d9599cff5742f2b

Реестр токенов

Реестр токенов обеспечивает управляемую администратором регистрацию одобренных SPL токенов с кроссчейн-метаданными:

Реестр гарантирует, что каждый актив сопоставляется с одним каноническим SPL mint, предотвращая фрагментацию ликвидности из-за нескольких представлений USDC.

Поток депозита / вывода

Депозит SPL → EVM

  1. Пользователь переводит SPL токены в vault моста

  2. Мост создаёт ATA пользователя в Rome EVM (если он не существует)

  3. Обёртка ERC-20 становится активной — пользователь видит баланс в MetaMask

Вывод EVM → SPL

  1. Пользователь вызывает precompile Withdraw (0x42...16) в Rome EVM

  2. Precompile выполняет SPL transfer из PDA пользователя обратно в его Solana-кошелёк

  3. SPL токены появляются в Solana-кошельке пользователя

Вычисление PDA

Каждому EVM-адресу соответствует Solana PDA, владеющий его токен-аккаунтами:

Ключевые шаблоны

Чтение SPL-балансов из Solidity

Перевод токенов через SPL precompile

Газовый токен

У каждой сети Rome EVM есть собственный газовый токен — любой SPL токен, выбранный при регистрации сети:

  • RSOL — газовый токен по умолчанию (обёрнутый SOL)

  • Пользовательские токены — любой SPL токен, цена которого определяется через пул Meteora DAMM V1

Газовые токены — это ERC-20 представления SPL токенов. Transfer Hooks НЕ срабатывают при внутренних платежах газа в EVM.

Ограничения

  • Суммы SPL токенов имеют тип uint64 — максимальное значение 18,446,744,073,709,551,615

  • Количество decimals по умолчанию для новых SPL mint: 9

  • Символы обёрток ERC-20 должны быть глобально уникальны в пределах одной фабрики

  • Allowance используют хранилище EVM (а не делегатов Solana)

Что дальше

Последнее обновление

Это было полезно?