Etherlink

Overview

Etherlink is an EVM-compatible, non-custodial Layer 2 blockchain powered by Tezos Smart Rollup technology. It offers sub-500ms confirmation times through a sequencer, nearly free transaction costs, and inherits security from the Tezos Layer 1 through a permissionless fraud-proof system. Etherlink supports all standard Ethereum tooling and enables asset transfers across EVM chains. Gas fees are paid in XTZ.

Explorer

https://explorer.etherlink.com/

Wallets Types

BitGo enables holding xtzevm in the following wallet types:

Multisig ColdMultisig HotMPC ColdMPC Hot
Custody
Self-Custody

Ticker Symbols

MainnetTestnet
XTZEVMTXTZEVM

Faucet

You can use a faucet to obtain free testnet txtzevm for development and testing purposes.

Faucet: https://shadownet.faucet.etherlink.com/

Units

Each Etherlink XTZ contains 1,000,000,000,000,000,000 (1018) wei, so not even a single XTZ can be stored numerically without exceeding the range of JavaScript numbers. Gas fees use gwei as the denomination.

  • 1 XTZ = 1018 wei
  • 1 wei = 10-18 XTZ
  • 1 gwei = 10-9 XTZ

For that reason, only string balance properties are available, which are balanceString, confirmedBalanceString, and spendableBalanceString.

Tokens

Etherlink supports the ERC20 token standard. ERC20 tokens on Etherlink are available as BitGo supported assets.

Fees

Etherlink supports EIP-1559 transaction pricing. Each transaction includes a base fee that fluctuates based on network demand and the protocol burns it algorithmically, plus an optional priority fee to incentivize block producers. Transaction costs on Etherlink are minimal, with an ERC-20 transaction costing $0.001 or less. As a Layer 2, Etherlink avoids the per-transaction gas fees of Layer 1 and incurs only minimal costs when publishing state to the Tezos Layer 1.

Create Wallet

bitgo
  .coin('txtzevm')
  .wallets()
  .generateWallet({
    label: 'My Test Wallet',
    passphrase: 'secretpassphrase1a5df8380e0e30',
    enterprise: '5612c2beeecf83610b621b90964448cd',
    walletVersion: 4,
  })
  .then(function (wallet) {
    // print the new wallet
    console.dir(wallet);
  });
export BITGO_EXPRESS_HOST="<YOUR_LOCALHOST>"
export COIN="txtzevm"
export ACCESS_TOKEN="<YOUR_ACCESS_TOKEN>"
export LABEL="<DESIRED_WALLET_NAME>"
export PASSPHRASE="<YOUR_BITGO_LOGIN_PASSPHRASE>"
export ENTERPRISE_ID="<YOUR_ENTERPRISE_ID>"

curl -X POST \
 http://$BITGO_EXPRESS_HOST/api/v2/$COIN/wallet/generate \
 -H 'Content-Type: application/json' \
 -H "Authorization: Bearer $ACCESS_TOKEN" \
  -d '{
    "label": "'"$LABEL"'",
    "passphrase": "'"$PASSPHRASE"'",
    "enterprise": "'"$ENTERPRISE_ID"'",
    "walletVersion": 4
}'

Create Address

bitgo
  .coin('txtzevm')
  .wallets()
  .getWallet({ id: '585c51a5df8380e0e3082e46' })
  .then(function (wallet) {
    return wallet.createAddress();
  })
  .then(function (newAddress) {
    // print new address details
    console.dir(newAddress);
  });
export WALLET="585c51a5df8380e0e3082e46"
export ACCESS_TOKEN="<YOUR_ACCESS_TOKEN>"

curl -X POST \
-H "Authorization: Bearer $ACCESS_TOKEN" \
https://app.bitgo-test.com/api/v2/txtzevm/wallet/$WALLET/address

Consolidate Balance

Etherlink supports Multisignature smart-contract wallets which utilize forwarder smart contracts to enable multiple receive addresses. The forwarder smart contract automatically consolidates native tokens received in your receive addresses to your base address. However, if you receive non-native tokens, such as ERC20 tokens, a different consolidation transaction will be initiated to the base address. Additionally, forwarders can only send assets to the base address of the wallet.

Estimate Fee

const BitGoJS = require('../../../src/index.js');
const bitgo = new BitGoJS.BitGo({ env: 'test' });
const accessToken = '<YOUR_ACCESS_TOKEN>';
const coin = 'txtzevm';

async function getFeeEstimate() {
  try {
    await bitgo.authenticateWithAccessToken({ accessToken });
    const res = await bitgo.coin(coin).feeEstimate({ numBlocks: 2 });
    console.dir(res);
  } catch (err) {
    console.error('Error fetching fee estimate:', err);
  }
}

getFeeEstimate();
export COIN="txtzevm"
export ACCESS_TOKEN="<YOUR_ACCESS_TOKEN>"

curl -X GET \
 https://app.bitgo-test.com/api/v2/$COIN/tx/fee \
 -H 'Content-Type: application/json' \
 -H "Authorization: Bearer $ACCESS_TOKEN"

Transact

const tx = await fundedWallet.send({
    address: '<DESTINATION_ADDRESS>',
    amount: '<AMOUNT>',
    walletPassphrase: process.env.PASSWORD,
  });
export BITGO_EXPRESS_HOST="<YOUR_LOCALHOST>"
export COIN="txtzevm"
export WALLET_ID="<YOUR_WALLET_ID>"
export ACCESS_TOKEN="<YOUR_ACCESS_TOKEN>"
export ADDRESS="<DESTINATION_ADDRESS>"
export AMOUNT="<AMOUNT_IN_BASE_UNITS>"
export WALLET_PASSPHRASE="<YOUR_WALLET_PASSPHRASE>"

curl -X POST \
 http://$BITGO_EXPRESS_HOST/api/v2/$COIN/wallet/$WALLET_ID/sendcoins \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -d '{
    "address": "'"$ADDRESS"'",
    "amount": "'"$AMOUNT"'",
    "walletPassphrase": "'"$WALLET_PASSPHRASE"'"
}'

Stake

Etherlink isn't a stakeable asset.