# Core

Source: https://developers.bitgo.com/docs/core

## Overview

Core (coredao) is the native asset of the Core blockchain. It utilizes:

- Account model

- ECDSA signature algorithm

Core is an EVM-compatible Layer-1 blockchain that enhances Bitcoin’s utility while preserving decentralization and security. Its Satoshi Plus consensus combines DPoW, DPoS, and Non-Custodial BTC Staking, integrating Bitcoin miners into smart contract security. This allows miners and BTC holders to earn CORE token rewards while extending Bitcoin’s capabilities. Core bridges Bitcoin’s security with scalable smart contracts, unlocking new DeFi opportunities.

## Explorer

<a href="https://scan.test2.btcs.network/" target="_blank" rel="noreferrer">https://scan.test2.btcs.network/</a>

## Wallets Types

BitGo enables holding Core in the following wallet types:

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

## Ticker Symbols

| Mainnet | Testnet |
| ------- | ------- |
| coredao | tcoredao |

## Faucet

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

**Faucet:** https://scan.test2.btcs.network/faucet

## Units

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

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

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

## Tokens

The CORE token plays a crucial role in the network, serving as both a utility token and a governance token. Holders can use CORE for transaction fees, staking, and participating in governance decisions.

## Fees

Core supports **EIP-1559** gas estimation and accounts for both L2 and L1 components of fees. The `eth_estimateGas` RPC endpoint provides a value that already includes both L1 and L2 gas costs.

Unlike fixed gas limits, you cannot set a strict 21K upper limit for transactions, as gas requirements fluctuate over time with L1 price variations.

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 **priority fee** is an additional price per unit of gas paid on top of the base fee. In Core, Core prioritizes transactions with a higher priority fee and processes them faster. If transaction speed is important to your app, setting a higher priority fee can help ensure quicker inclusion.

## Create Wallet

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

## Create Address

```shell cURL
export WALLET="<YOUR-WALLET-ID>"
export ACCESS_TOKEN="<YOUR_ACCESS_TOKEN>"

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

```
```js JavaScript
bitgo
  .coin('tcoredao')
  .wallets()
  .getWallet({ id: '<YOUR-WALLET-ID>' })
  .then(function (wallet) {
    return wallet.createAddress();
  })
  .then(function (newAddress) {
    // print new address details
    console.dir(newAddress);
  });
```

## Consolidate Balance

Consolidation Fee Source: Corechain Gas Tank

Core uses forwarders, therefore does not support manual consolidation

## Estimate Fee

```shell cURL
export COIN="tcoredao"
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"

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

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();

```

## Transact

Withdrawal Fee Source: Wallet Base Address

```shell cURL
export BITGO_EXPRESS_HOST="<YOUR_LOCALHOST>"
export COIN="tcoredao"
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"'"
}'
```
```shell cURL (send to many)
export BITGO_EXPRESS_HOST="<YOUR_LOCALHOST>"
export COIN="tcoredao"
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"'"
}'
```
```js JavaScript
const tx = await fundedWallet.send({
    address: `<DESTINATION_ADDRESS>`,
    amount: `<AMOUNT>`,
    walletPassphrase: process.env.PASSWORD as string,
  });
```
```js JavaScript (send to many)
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

**Non-Custodial Bitcoin Staking:** Core's Bitcoin staking uses CLTV timelocks, a Bitcoin-native feature that locks funds until a specified time or block height. Instead of giving up custody, stakers simply place their bitcoins in CLTV timelocks, with the transaction returning the funds after the lock period ends. The transaction must include a script with two details: the validator's address and the address for receiving CORE rewards. Read more at <a href="https://stake.test2.btcs.network/" target="_blank" rel="noreferrer">Core DAO</a>.

To learn more about staking assets with BitGo, see [Staking Overview](/docs/stake-overview).

```shell cURL
export COIN="[testnet ID all lowercase]"
export WALLET_ID="<YOUR_WALLET_ID>"
export ACCESS_TOKEN="<YOUR_ACCESS_TOKEN>"
export CLIENT_ID="<CLIENT_ID>"
export AMOUNT="<AMOUNT_IN_BASE_UNITS>"
export GAS_PRICE="<GAS_PRICE>"
export TYPE="STAKE"

curl -X POST \
  http://api/staking/v1/$COIN/wallets/$WALLET_ID/requests \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -d '{
    "clientId": "'$CLIENT_ID'",
    "amount": "'$AMOUNT'",
    "gasPrice": "'$GAS_PRICE'",
    "type": "STAKE"
}'
```
```js JavaScript
const stakingWallet = wallet.toStakingWallet();
const stakingRequest = await stakingWallet.stake({
  amount: '<AMOUNT>',
  cliendId: '<CLIENT_ID>'
});
```

## See Also

- [Staking Overview](/docs/stake-overview)
