Overview

This document describes possible approaches of bridging wstETH from Ethereum to Neutron

Approach #1: using Axelar’s “Send Tokens” feature and AxelarJS SDK

This feature is used under the hood of Axelar’s Satellite app. Axelar generates a deposit address on Ethereum, where you can send your tokens to with a simple transfer transaction. After transfer is complete, ibc denom (with some relaying fee deducted) will appear on target wallet on Neutron. After that, it is necessary to wrap bridged tokens into canonical ones using Lido Satellite contract.

It is unclear if reverse path is the same or not, since Axelar’s documentation about Cosmos is pretty scarce, and I couldn’t “reverse-engineer” it quickly because apparently IBC relayer between Axelar and Neutron testnets is down.

Advantages

Disadvantages

Approach #2: using Axelar’s “Send Tokens” feature directly

It is practically not very different from approach #1, instead of sending funds to some kind of deposit address, user has to go through these three steps manually:

  1. set desired allowance on wstETH contract
  2. call sendToken("neutron", "neutron1…", "wsteth-wei", amount) on Axelar’s Gateway contract, e.g. 0xe432150cce91c13a887f7D836923d5597adD8E31 on Goerli.
  3. after funds have arrived to Neutron (with some of Axelar’s fee already deducted), wrap them using Lido Satellite.

In order to transfer funds back, user will have to:

  1. unwrap funds using Lido Satellite contract
  2. issue IBC transfer to Axelar Gateway axelar1dv4u5k73pzqrxlzujxg3qp8kvc3pje7jtdvu72npnt5zhq05ejcsn5qme5s on Axelar network, all funds and fees are sent together with this IBC transfer. In order for Axelar to understand where these funds are to be routed further, a special memo should be crafted: GeneralMessage { "ethereum", <wstETH receiver on Ethereum>, <payload constructed of recipient address> }. Please note that this is not the way a memo will look in real life, it has to be properly encoded.