Normal operation

Alice wants to move her CryptoKitty from ETH to ETC

  1. She locks it on ETH by sending it to the Lock (by calling CryptoKitty.approve(...) and then Lock.lock(...))
  2. Meanwhile, Relayers are submitting the ETH epoch block headers to SideChain contract on ETC.
  3. After 10 epoch block headers, Alice can unlock/mint the CryptoKitty on ETC.
  4. Alice provides the block header index, the Merkle path, and the transaction to enable minting on ETC.
  5. CryptoKitty is getting minted for Alice on ETC.

If Alice sells the Kitty to Bob, who wants to bring Kitty back to the ETH, he can do the same operation in reverse.


Upon unlocking ETC CryptoKitty Alice has to pay a fee. This fee gets distributed across the last 10 Relayers.

Adversary Case

  1. When Relayer submits and block header they stake a large fee, which will be unlocked in 10 blocks.
  2. If Relayer submits a fake block header they can be challenged by other Relayers who do so by staking a larger amount.
  3. After 10 blocks the largest stake defines the correct block header and the adversary gets slashed, because anyone on the network can challenge.

A detailed explanation of all adversarial scenarios and fee economy:

Challenges we ran into

  • Development is extremely slow: from set up to libraries not working with each other. Forked few libraries just to fix minor bugs and update dependencies. Code from 6 months ago doesn't run anymore.
  • Analysis of incentives and pricing of the computation without being able to test it. E.g. estimate gas fees just based on number of operation / hashes.

What's next for Teleport

  • Proper analysis of incentives and adversary attacks
  • Teleporting any ERC20 and ERC721 tokens back and forth
  • Support other smart-contract enabled blockchains

Built With

Share this project: