# zkSync Era

Source: https://developers.bitgo.com/docs/zksync-era

## Overview

zkSync Era is a ZK Rollup–based Ethereum Layer 2 that provides EVM compatibility with significantly reduced transaction fees. The sequencer executes transactions off-chain, with validity proofs submitted to Ethereum L1 to achieve finality. zkSync Era supports standard Ethereum addresses (0x-prefixed, EIP-55 checksummed), ECDSA signing, and ERC-20 tokens.

## Network Information

| Configuration    | Mainnet                              | Testnet (zkSync Era Sepolia)              |
| ---------------- | ------------------------------------ | ----------------------------------------- |
| Block Explorer   | https://explorer.zksync.io           | https://sepolia.explorer.zksync.io        |
| Chain ID         | 324                                  | 300                                       |
| Currency Symbol  | ETH                                  | ETH                                       |
| Layer 1          | Ethereum Mainnet                     | Sepolia Testnet                           |
| Network Name     | zkSync Era Mainnet                   | zkSync Era Sepolia Testnet                |
| RPC URL          | https://mainnet.era.zksync.io        | https://sepolia.era.zksync.dev            |

## Explorer
<a href="https://explorer.zksync.io/" target="_blank" rel="noreferrer">https://explorer.zksync.io/</a>


## Wallets Types

BitGo enables holding zksyncera in the following wallet types:

|                  | Multisig Cold | Multisig Hot | MPC Cold | MPC Hot |
| ---------------- | ------------- | ------------ | -------- | ------- |
| **Custody**      | ❌            | ❌           | ✅       | ❌      |
| **Self-Custody** | ❌            | ❌           | ✅       | ✅      |

## Ticker Symbols

| Mainnet    | Testnet     |
| ---------- | ----------- |
| ZKSYNCERA  | TZKSYNCERA  |

## Faucet

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

**Faucet:** https://portal.zksync.io/faucet

## Units

Each zkSync Era consists of `1,000,000,000,000,000,000` (<code>10<sup>18</sup></code>) wei, so not even a single zkSync Era can be stored numerically without exceeding the range of JavaScript numbers. Gas fees use gwei.

- 1 zksyncera = <code>10<sup>18</sup></code> wei
- 1 wei = <code>10<sup>-18</sup></code> zksyncera
- 1 gwei = <code>10<sup>-9</sup></code> zksyncera

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

## Fees

zkSync Era uses a unique fee model based on the EIP-1559 transaction format for compatibility, but its internal fee mechanism uses `eth_gasPrice` rather than standard EIP-1559 fee history. The effective gas price from `eth_gasPrice` already includes L2 execution costs and L1 calldata publication overhead. You pay fees exclusively in ETH. There is no traditional `baseFeePerGas`; instead, the gas price bundles all fee components — L2 execution, L1 calldata, and prover overhead — into a single value.

## Create Wallet

```javascript
bitgo
  .coin('tzksyncera')
  .wallets()
  .generateWallet({
    label: 'My Test Wallet',
    passphrase: 'secretpassphrase1a5df8380e0e30',
    enterprise: '5612c2beeecf83610b621b90964448cd',
    walletVersion: 3,
  })
  .then(function (wallet) {
    // print the new wallet
    console.dir(wallet);
  });
```
```shell
export BITGO_EXPRESS_HOST="<YOUR_LOCALHOST>"
export COIN="tzksyncera"
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": 3
}'
```

## Create Address

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

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

## Consolidate Balance

zkSync Era 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, the forwarder initiates a different consolidation transaction to the base address. Additionally, forwarders can only send assets to the base address of the wallet.

## Estimate Fee

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

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();
```
```shell
export COIN="tzksyncera"
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

```javascript
const tx = await fundedWallet.send({
    address: '<DESTINATION_ADDRESS>',
    amount: '<AMOUNT>',
    walletPassphrase: process.env.PASSWORD,
  });
```
```shell
export BITGO_EXPRESS_HOST="<YOUR_LOCALHOST>"
export COIN="tzksyncera"
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

zkSync Era isn't a stakeable asset.
