Cross-Chain Rebase Token

October 10, 2026 (2w ago)

Stack: Solidity ^0.8.24, Foundry, OpenZeppelin, Chainlink CCIP, GitHub Actions, semantic-release · Repo: Axeloooo/Cross-Chain-Rebase-Token

Problem

A rebase token keeps per-user state: an interest rate and a last-updated timestamp. A plain burn-and-mint bridge would not carry that rate across. This project builds the token, a vault to mint it, and a CCIP token pool that sends the user's rate with the transfer so the destination chain mints with the same rate.

The rule in the contract comments is that the global rate can only decrease, and each depositor locks in the global rate at deposit time, so earlier depositors keep higher rates. It targets Sepolia and Arbitrum Sepolia.

Architecture diagram

  Sepolia
  -------
  User --ETH deposit--> Vault --mint at global rate--> RebaseToken
  User <--ETH-- Vault <--redeem: burn tokens---------- RebaseToken
 
  User --approve token + LINK, ccipSend--> CCIP Router
  CCIP Router --lockOrBurn--> RebaseTokenPool
      1. reads the sender's rate from RebaseToken
      2. burns the tokens
      3. returns destPoolData = abi.encode(rate)
                |
                |  CCIP message (OnRamp / OffRamp omitted)
                v
  Arbitrum Sepolia
  ----------------
  CCIP Router --releaseOrMint--> RebaseTokenPool
      1. decodes the rate from destPoolData
      2. mints to the receiver with that rate  --> RebaseToken
         (same user rate as on Sepolia)

Vault accepts ETH, mints RebaseToken at the current global rate and burns on redeem before sending ETH back. RebaseToken stores principal in ERC-20 storage and overrides balanceOf to return principal plus linear interest; interest is minted lazily when the account mints, burns or transfers. Foundry scripts deploy, grant roles, register the pool, configure each chain pair and send a bridge transaction. The vault is deployed on Sepolia only; Arbitrum Sepolia has the token and pool.

Key decisions

Challenges

Results

Links