Token-Interop

Rome EVM verbindet ERC-20-Token und SPL-Token über ein Single-State-Modell. Diese Seite erklärt, wie Tokens über EVM und Solana hinweg funktionieren.

Das Single-State-Modell

Im Gegensatz zu traditionellen Bridges sperrt Rome keine Tokens auf einer Chain und mintet keine gewrappten Kopien auf einer anderen. Stattdessen sind ERC-20-Token auf Rome EVM transparente Wrapper über den zugrunde liegenden SPL-Token-Konten auf Solana.

┌──────────────────────────────────┐
│ Rome EVM                         │
│                                  │
│   ERC-20 "rUSDC"                 │
│   ┌────────────────────────┐     │
│   │ balanceOf(user)        │─────┼──► liest direkt aus dem SPL-ATA
│   │ transfer(to, amount)   │─────┼──► führt SPL-Transfer über Precompile aus
│   │ totalSupply()          │─────┼──► liest das SPL-Mint-Angebot
│   └────────────────────────┘     │
│                                  │
└──────────────────────────────────┘

                 │ dieselben zugrunde liegenden Daten

┌──────────────────────────────────┐
│ Solana                           │
│                                  │
│   SPL-Token-Konto (ATA)          │
│   Inhaber: PDA des Benutzers     │
│   Mint: USDC (Circle native)     │
│   Betrag: 1000000 (= 1 USDC)    │
│                                  │
└──────────────────────────────────┘

Das bedeutet:

  • Keine Bridging-Verzögerung — ERC-20-Guthaben IST das SPL-Guthaben

  • Keine Fragmentierung der Liquidität — DeFi auf beiden Seiten sieht dieselben Tokens

  • Kein Bridge-Risiko — es gibt kein separates Escrow, das ausgenutzt werden könnte

ERC20SPL: Der Wrapper-Vertrag

SPL_ERC20 ist der Standard-Wrapper-Vertrag, der eine vollständige ERC-20-Schnittstelle über einen SPL-Token-Mint bereitstellt:

So funktioniert es unter der Haube:

  • balanceOf() → leitet das ATA des Benutzers ab (Associated Token Account) → liest das Guthaben von Solana

  • transfer() → ruft das SPL-Token-Precompile auf (0xff...05) → verschiebt Tokens auf Solana

  • approve() / allowance() → verwendet EVM-Speicher (standardmäßiges ERC-20-Muster), da SPL von Haus aus keine EVM-ähnlichen Allowances unterstützt

  • totalSupply() → liest aus dem SPL-Mint-Konto

ERC20SPLFactory

Der Factory-Vertrag stellt Wrapper für beliebige SPL-Tokens bereit:

Factory-Adresse (devnet): 0xfd21da046c282e1d36cc45e46d9599cff5742f2b

Token-Registry

Das TokenRegistry bietet eine vom Admin gesteuerte Registrierung genehmigter SPL-Tokens mit Cross-Chain-Metadaten:

Das Registry stellt sicher, dass jedes Asset auf einen einzigen kanonischen SPL-Mint abgebildet wird — so wird verhindert, dass mehrere USDC-Darstellungen die Liquidität fragmentieren.

Einzahlungs-/Auszahlungsablauf

Einzahlen SPL → EVM

  1. Benutzer überträgt SPL-Tokens in den Bridge-Vault

  2. Die Bridge erstellt das ATA des Benutzers auf Rome EVM (falls es nicht existiert)

  3. Der ERC-20-Wrapper wird aktiv — der Benutzer sieht das Guthaben in MetaMask

Auszahlen EVM → SPL

  1. Benutzer ruft das Withdraw-Precompile auf (0x42...16) auf Rome EVM

  2. Das Precompile führt einen SPL-Transfer vom PDA des Benutzers zurück zu dessen Solana-Wallet aus

  3. SPL-Tokens erscheinen im Solana-Wallet des Benutzers

PDA-Ableitung

Jede EVM-Adresse wird auf einen Solana-PDA abgebildet, der ihre Token-Konten besitzt:

Wichtige Muster

SPL-Guthaben aus Solidity lesen

Tokens über das SPL-Precompile übertragen

Gas-Token

Jede Rome-EVM-Chain hat ihren eigenen Gas-Token — beliebiger SPL-Token, der bei der Chain-Registrierung ausgewählt wird:

  • RSOL — standardmäßiger Gas-Token (gewrappte SOL)

  • Benutzerdefinierte Tokens — jeder SPL-Token, bepreist über den Meteora DAMM V1 Pool

Gas-Tokens sind ERC-20-Darstellungen von SPL-Tokens. Transfer Hooks werden bei EVM-internen Gaszahlungen NICHT ausgelöst.

Einschränkungen

  • SPL-Token-Beträge sind uint64 — Maximalwert 18,446,744,073,709,551,615

  • Standard-Decimals für neue SPL-Mints: 9

  • ERC-20-Wrapper-Symbole müssen pro Factory global eindeutig sein

  • Allowances verwenden EVM-Speicher (nicht Solana-Delegates)

Was kommt als Nächstes

Zuletzt aktualisiert

War das hilfreich?