Arbitrum

Overview

Arbitrum is a Layer 2 scaling solution built on top of the Ethereum blockchain, designed to address its scalability and high transaction fees. It utilizes a technology called Optimistic Rollup, which allows for faster and cheaper transactions by processing most operations off-chain while periodically settling them on the Ethereum mainnet.

Explorer

https://arbiscan.io/

Wallets Types

BitGo enables holding arbeth in the following wallet types:

Multisig ColdMultisig HotMPC ColdMPC Hot
Custody
Self-Custody

Ticker Symbols

MainnetTestnet
ARBETHTARBETH

Faucet

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

Faucet: https://arbitrum-faucet.com/

Units

Each Arbeth is comprised of 1,000,000,000,000,000,000 (1018) wei, so not even a single Arbeth can be stored numerically without exceeding the range of Javascript numbers. Gas fees are denoted in gwei.

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

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

Tokens

To view all BitGo supported tokens on the Arbitrum Mainnet, see the Arbitrum - ERC20 Tokens.

Fees

Arbitrum supports EIP-1599 gas estimation. Arbitrum accounts for L2 and L1 components of fees. eth_estimateGas RPC endpoint will give you a value which already considers both L1 and L2 gas. You can't set a 21K upper limit to a transaction since it changes over time with L1 prices changing over time.

The base fee is the minimum price per unit of gas that a transaction must pay to be included in a block. Transactions must specify a maximum base fee higher than the block base fee to be included. The actual fee charged is the block base fee, even if the transaction specifies a higher maximum base fee.

The sequencer prioritizes transactions on a first-come first-served basis. Because priority fees do not make sense in this model, they are ignored. Arbitrum users always just pay the base fee regardless of the tip they choose.

Create Wallet

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

Create Address

export WALLET="585c51a5df8380e0e3082e46"
export ACCESS_TOKEN="<YOUR_ACCESS_TOKEN>"

curl -X POST \
-H "Authorization: Bearer $ACCESS_TOKEN" \
https://app.bitgo-test.com/api/v2/tarbeth/wallet/$WALLET/address
bitgo
  .coin('tarbeth')
  .wallets()
  .getWallet({ id: '585c51a5df8380e0e3082e46' })
  .then(function (wallet) {
    return wallet.createAddress();
  })
  .then(function (newAddress) {
    // print new address details
    console.dir(newAddress);
  });

Consolidate Balance

Arbeth 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

export COIN="tarbeth"
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"
const BitGoJS = require('../../../src/index.js');
const bitgo = new BitGoJS.BitGo({ env: 'test' });
const Promise = require('bluebird');
const accessToken = '<YOUR_ACCESS_TOKEN>';
const coin = 'tarbeth';

Promise.coroutine(function *() {
  bitgo.authenticateWithAccessToken({ accessToken });
  bitgo.coin(coin).feeEstimate({ numBlocks: 2 }, function callback(err, res) {
     console.dir(res);
  });
})();

Transact

BitGo's Arbitrum multisig contract currently only supports one sender and one recipient. That means that the sendMany call will only accept one recipient.

export BITGO_EXPRESS_HOST="<YOUR_LOCALHOST>"
export COIN="tarbeth"
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"'"
}'
export BITGO_EXPRESS_HOST="<YOUR_LOCALHOST>"
export COIN="tarbeth"
export WALLET_ID="<YOUR_WALLET_ID>"
export ACCESS_TOKEN="<YOUR_ACCESS_TOKEN>"
export ADDRESS_1="<DESTINATION_ADDRESS_1>"
export AMOUNT_1="<AMOUNT_1_IN_BASE_UNITS>"
export WALLET_PASSPHRASE="<YOUR_WALLET_PASSPHRASE>"

curl -X POST \
  http://$BITGO_EXPRESS_HOST/api/v2/$COIN/wallet/$WALLET_ID/sendmany \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -d '{
    "recipients": [
    {
      "address": "'"$ADDRESS_1"'",
      "amount": "'"$AMOUNT_1"'"
    }
  ],
    "walletPassphrase": "'"$WALLET_PASSPHRASE"'"
}'
const tx = await fundedWallet.send({
    address: `<DESTINATION_ADDRESS>`,
    amount: `<AMOUNT>`,
    walletPassphrase: process.env.PASSWORD as string,
  });
let params = {
  recipients: [
    {
      amount: "<AMOUNT_1>",
      address: "<DESTINATION_ADDRESS_1>",
    }
  ],
  walletPassphrase: "<YOUR_WALLET_PASSPHRASE>",
};
wallet.sendMany(params).then(function (transaction) {
  // Print transaction details
  console.dir(transaction);
});

Stake

Arbeth isn't a stakeable asset.

See Also