# INK

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

## Overview

INK is a Layer 2 blockchain built on Optimism's Superchain by Kraken, designed for decentralized finance applications. It enables developers to deploy EVM-compatible smart contracts with access to cross-chain interoperability through the Superchain ecosystem. The network supports standard EVM development tools including Foundry and Hardhat, and uses ETH as its native gas token.

## Explorer

<a href="https://explorer.inkonchain.com/" target="_blank" rel="noreferrer">
  https://explorer.inkonchain.com/
</a>

## Wallets Types

BitGo enables holding inketh in the following wallet types:

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

## Ticker Symbols

| Mainnet | Testnet  |
| ------- | -------- |
| INKETH  | TINKETH  |

## Faucet

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

**Faucet:** https://docs.inkonchain.com/tools/faucets

## Units

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

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

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

## Tokens

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

## Fees

INK supports EIP-1559 gas estimation. As an OP Stack L2, INK accounts for both L2 execution costs and L1 data posting fees. The `eth_estimateGas` RPC endpoint returns a value that already considers both components. You cannot set a fixed 21K gas limit since the L1 data fee component changes over time with L1 prices.

The base fee is the minimum price per unit of gas required for a transaction to be included in a block. Transactions must specify a maximum base fee higher than the block base fee to be included. The priority fee is paid on top of the base fee and is used to incentivize faster sequencer processing.

## Create Wallet

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

```javascript
bitgo
  .coin("tinketh")
  .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/tinketh/wallet/$WALLET/address
```

## Consolidate Balance

INK 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 wallet 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 = process.env.ACCESS_TOKEN;
const coin = "tinketh";

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="tinketh"
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="tinketh"
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

INK isn't a stakeable asset.
