Add gh/download links & Update roadmap (#109)

* adds homepage (wip)

* fix footer links

* update nomenclature link on blog post

* small fixes and markdown format

* link fix

* make all docs links relative

* fix vtxo links

* fix errors with Safari

* improves arm detection

* fix bottom color

* update roadmap

* adds faucet instructions

* change ark-cli instructions to accomodate PR 117

* instructions fixes to accomodate onboarding; ui improvements
This commit is contained in:
João Bordalo
2024-03-05 13:06:31 +00:00
committed by GitHub
parent fb64bd35d8
commit a8f3039e69
9 changed files with 317 additions and 34 deletions

View File

@@ -24,7 +24,7 @@ Ark is a promising second-layer solution for Bitcoin that improves the scalabili
- **Secure**: Ark is a secure solution that is built on top of the Bitcoin blockchain. - **Secure**: Ark is a secure solution that is built on top of the Bitcoin blockchain.
:::tip :::tip
It's recommended to read the [nomenclature](/learn/nomenclature) first. It's recommended to read the [nomenclature](/docs/learn/nomenclature) first.
::: :::
## Ark liquidity requirements ## Ark liquidity requirements

View File

@@ -29,7 +29,7 @@ Should the digital bank cease to exist, **users can still retrieve their digital
### 🔨 How Does it Work? ### 🔨 How Does it Work?
Start by exploring the [Nomenclature](/docs/learn/nomenclature.md) to familiarize yourself with key concepts and terminology. Then, learn how to [Board the Ark](/docs/learn/boarding.md), [Send Payments](/docs/learn/payments.md), and eventually [Leave the Ark](/docs/learn/leaving.md) to withdraw your funds back to the Bitcoin blockchain in case of server unresponsiveness. Start by exploring the [Nomenclature](./learn/nomenclature.md) to familiarize yourself with key concepts and terminology. Then, learn how to [Board the Ark](./learn/boarding.md), [Send Payments](./learn/payments.md), and eventually [Leave the Ark](./learn/leaving.md) to withdraw your funds back to the Bitcoin blockchain in case of server unresponsiveness.
### 🏃‍♀️ Running Ark ### 🏃‍♀️ Running Ark
@@ -40,8 +40,8 @@ The Ark reference implementation is currently under development. Please check ba
You can join an existing Ark service provider or run your own. You can join an existing Ark service provider or run your own.
- [Join an Ark as User](/user/intro.md) - [Join an Ark as User](./user/intro.md)
- [Operate an Ark as Liquidity Provider](/provider/intro.md) - [Operate an Ark as Liquidity Provider](./provider/intro.md)
### 👩‍💻 Integrate Ark ### 👩‍💻 Integrate Ark
@@ -50,7 +50,7 @@ You can join an existing Ark service provider or run your own.
The Ark libraries and developer tools are currently under development. Please check back soon for updates. The Ark libraries and developer tools are currently under development. Please check back soon for updates.
::: :::
You can [integrate Ark](/docs/developers/get-started.md) into your wallet or application to enable your users to send and receive Bitcoin payments off-chain. You can [integrate Ark](./developers/get-started.md) into your wallet or application to enable your users to send and receive Bitcoin payments off-chain.
### ⌨️ Contributing ### ⌨️ Contributing

View File

@@ -29,7 +29,7 @@ flowchart LR
3. Alice adds an output with **2 spending paths**: 3. Alice adds an output with **2 spending paths**:
- This funds will belong to the ASP after 4 weeks: - This funds will belong to the ASP after 4 weeks:
- `(ASP after 4w)` - `(ASP after 4w)`
- A covenant output that forces coins to be spent by a [VTXO](./nomenclature#vtxo) with an output script with **2** spending paths: - A covenant output that forces coins to be spent by a [VTXO](./nomenclature#vtxo-1) with an output script with **2** spending paths:
- `(Alice + ASP)` - `(Alice + ASP)`
- `(Alice after 24h)` - `(Alice after 24h)`
4. Alice notifies ASP about the [Boarding transaction](./nomenclature#with-luggage) 4. Alice notifies ASP about the [Boarding transaction](./nomenclature#with-luggage)
@@ -39,7 +39,7 @@ flowchart LR
- Alice don't need to worry about being online to maintain access to her funds after boarding - Alice don't need to worry about being online to maintain access to her funds after boarding
- If ASP is unresponsive, Alice can claim her funds back in **1 year** - If ASP is unresponsive, Alice can claim her funds back in **1 year**
- ASP must be aware of the timeout on the [Boarding transaction](./nomenclature#with-luggage) to prevent double spending - ASP must be aware of the timeout on the [Boarding transaction](./nomenclature#without-luggage) to prevent double spending
#### Timeline of events #### Timeline of events

View File

@@ -11,7 +11,7 @@ Alice wants to leave the Ark and get her funds back on-chain. It requires an on-
#### Timeline of events #### Timeline of events
1. Alice tells ASP she wants to trade [VTXO](./nomenclature#vtxo) for UTXO 1. Alice tells ASP she wants to trade [VTXO](./nomenclature#vtxo-1) for UTXO
2. ASP (with Alice) prepares next [Pool transaction](./nomenclature#pool-transaction-aka-ark-transaction): 2. ASP (with Alice) prepares next [Pool transaction](./nomenclature#pool-transaction-aka-ark-transaction):
- an additional output is added, locked by `Alice` - an additional output is added, locked by `Alice`
3. Alice creates a [Forfeit transaction](./nomenclature#forfeit-transaction): 3. Alice creates a [Forfeit transaction](./nomenclature#forfeit-transaction):
@@ -20,7 +20,7 @@ Alice wants to leave the Ark and get her funds back on-chain. It requires an on-
- signs it and send it to the ASP - signs it and send it to the ASP
4. ASP broadcasts [Pool transaction](./nomenclature#pool-transaction-aka-ark-transaction) 4. ASP broadcasts [Pool transaction](./nomenclature#pool-transaction-aka-ark-transaction)
5. Alice has now a new UTXO 5. Alice has now a new UTXO
6. For at most 4 weeks, Alice will be able to double spend her [VTXO](./nomenclature#vtxo), but if she does it, the ASP will have time (24 hours) to grab the funds from the [VTXO](./nomenclature#vtxo) to itself using the [Forfeit transaction](./nomenclature#forfeit-transaction) 6. For at most 4 weeks, Alice will be able to double spend her [VTXO](./nomenclature#vtxo-1), but if she does it, the ASP will have time (24 hours) to grab the funds from the [VTXO](./nomenclature#vtxo-1) to itself using the [Forfeit transaction](./nomenclature#forfeit-transaction)
### Non-cooperative exit ### Non-cooperative exit
@@ -28,7 +28,7 @@ If ASP is unresponsive, Alice can unilaterally exit revealing the branch of the
#### Timeline of events #### Timeline of events
1. Assuming a [VTXO](./nomenclature#vtxo) tree with radix of 2 and 8 [VTXOs](./nomenclature#vtxo): 1. Assuming a [VTXO](./nomenclature#vtxo-1) tree with radix of 2 and 8 [VTXOs](./nomenclature#vtxo-1):
```mermaid ```mermaid
flowchart TB flowchart TB
@@ -49,7 +49,7 @@ flowchart TB
``` ```
2. Assuming VTXO 1 and 2 belong to Alice and Bob 2. Assuming VTXO 1 and 2 belong to Alice and Bob
3. Alice reveals the [VTXO](./nomenclature#vtxo) tree to spend the [Shared Output](./nomenclature#shared-output-aka-shared-utxo). 3. Alice reveals the [VTXO](./nomenclature#vtxo-1) tree to spend the [Shared Output](./nomenclature#shared-output-aka-shared-utxo).
4. Alice doesn't need to reveal the entire tree, just enough to validate it: 4. Alice doesn't need to reveal the entire tree, just enough to validate it:
```mermaid ```mermaid
@@ -62,5 +62,5 @@ flowchart TB
tx4 --> v2(VTXO 2) tx4 --> v2(VTXO 2)
``` ```
5. Alice will need to wait 24 hours to be able to spend her [VTXO](./nomenclature#vtxo). This gives enough time to the ASP to prevent any double spend attempts by Alice. 5. Alice will need to wait 24 hours to be able to spend her [VTXO](./nomenclature#vtxo-1). This gives enough time to the ASP to prevent any double spend attempts by Alice.
6. Bob can also spend his [VTXO](./nomenclature#vtxo) in 24 hours, or do nothing and maintain his [VTXO](./nomenclature#vtxo) on the Ark. 6. Bob can also spend his [VTXO](./nomenclature#vtxo-1) in 24 hours, or do nothing and maintain his [VTXO](./nomenclature#vtxo-1) on the Ark.

View File

@@ -73,7 +73,7 @@ Different ASPs can use different ways for users to board their Ark.
- Initially proposed by [Steven Roose](https://roose.io/presentations/understanding-ark.pdf) - Initially proposed by [Steven Roose](https://roose.io/presentations/understanding-ark.pdf)
- Alice funds an output that can be **accepted as a VTXO** in a future round - Alice funds an output that can be **accepted as a VTXO** in a future round
- A covenant forces the creation of an output with the same script as [**VTXO**](#VTXO). No need for interactivity after funding it, anyone can spend. - A covenant forces the creation of an output with the same script as [**VTXO**](#vtxo-1). No need for interactivity after funding it, anyone can spend.
- **ASP** can unlock after a timeout ie. _4 weeks_ - **ASP** can unlock after a timeout ie. _4 weeks_
- Alice is **required to be online** to maintain access to funds: after the timeout, ASP becomes the only owner funds - Alice is **required to be online** to maintain access to funds: after the timeout, ASP becomes the only owner funds

View File

@@ -2,38 +2,40 @@
The roadmap provides an overview of the planned projects and modules for the Ark network. It outlines the current development status and expected functionalities of each module. Please note that the roadmap is subject to change as the project evolves. The roadmap provides an overview of the planned projects and modules for the Ark network. It outlines the current development status and expected functionalities of each module. Please note that the roadmap is subject to change as the project evolves.
For the latest updates and progress reports, please check the [Roadmap](/roadmap/index.md) page regularly. For the latest updates and progress reports, please check the this page regularly.
## Projects ## Projects
### ☁️ `arkd` - Ark Service Provider Daemon ### ☁️ `arkd` - Ark Service Provider Daemon
- Status: Pre-Alpha - Status: Pre-Alpha
The `arkd` it's the Ark daemon, the initial implementation of an ASP (Ark Service Provider) as a standalone always-on server. The `arkd` is the Ark daemon, the initial implementation of an ASP (Ark Service Provider) as a standalone always-on server.
It uses [Ocean](https://github.com/vulpemventures/ocean) as Bitcoin and Liquid wallet backend. It uses [Ocean](https://github.com/vulpemventures/ocean) as Bitcoin and Liquid wallet backend.
It exposes a gRPC interface that Ark wallets can use to interact with the Provider. It exposes a gRPC interface that Ark wallets can use to interact with the Provider.
- [x] Setup Ocean Wallet for funding rounds - [x] Setup Ocean Wallet for funding rounds
- [ ] Start producing rounds from Ark wallets - [ ] Start producing rounds from Ark wallets
- [x] Register VTXOs to be spent & new VTXOs to be created - [x] Register VTXOs to be spent & new VTXOs to be created
- [ ] Build congestion control tree - [x] Build congestion control tree
- [x] Root node - [x] Root node
- [x] VTXOs Script - [x] VTXOs Script
- [ ] Tap Leaf Script Validation - [x] Tap Leaf Script Validation
- [ ] Unroll Clause Transaction Builder. - [x] Unroll Clause Transaction Builder.
- [ ] Verifiy forfeit transactions - [ ] Verifiy forfeit transactions
- [x] Sign & Broadcast Pool transactions - [x] Sign & Broadcast Pool transactions
- [ ] Sweep expired VTXOs - [x] Sweep expired VTXOs
- [ ] Accept VTXOs from Boarding transactions - [ ] Accept VTXOs from Boarding transactions
- [ ] Detect double spends to recover with forfeit transactions - [ ] Detect double spends to recover with forfeit transactions
### 🌐 Ark Explorer ### 🌐 Ark Explorer
Status: Not started yet Status: Not started yet
The Ark Explorer module will consist of a console and an Electrum-like server. It will allow users to retrieve VTXOs, pool transactions, and access transaction data. More details about this module will be provided as development progresses. The Ark Explorer module will consist of a console and an Electrum-like server. It will allow users to retrieve VTXOs, pool transactions, and access transaction data. More details about this module will be provided as development progresses.
### 👩‍💻 `ark` - Ark CLI ### 👩‍💻 `ark` - Ark CLI
- Status: Pre-Alpha - Status: Pre-Alpha
The `ark` module will be an Ark wallet implemented as a command line interface (CLI). It will also be in the alpha status, indicating that it is still being developed and may have some limitations. The `ark` module will be an Ark wallet implemented as a command line interface (CLI). It will also be in the alpha status, indicating that it is still being developed and may have some limitations.
@@ -52,26 +54,31 @@ The `ark` module will be an Ark wallet implemented as a command line interface (
- [ ] Unilateral exit - [ ] Unilateral exit
### 🚰 Ark Faucet ### 🚰 Ark Faucet
Status: Alpha Status: Alpha
The Ark Faucet allows users to request testnet VTXOs for testing purposes, without having to onboard to the Ark provider. The Ark Faucet allows users to request testnet VTXOs for testing purposes, without having to onboard to the Ark provider.
### 📱 Ark Mobile App ### 📱 Ark Mobile App
Status: Not started yet Status: Not started yet
The Ark App module will serve as a reference implementation for an Ark wallet as Mobile App. It will provide a user-friendly interface for managing Ark transactions and other wallet-related functionalities. The Ark App module will serve as a reference implementation for an Ark wallet as Mobile App. It will provide a user-friendly interface for managing Ark transactions and other wallet-related functionalities.
### 🖥️ Ark Desktop App ### 🖥️ Ark Desktop App
Status: Not started yet Status: Not started yet
The Ark Desktop module will be a reference implementation for an Ark wallet as a desktop application. It will provide a user-friendly interface for managing Ark transactions and other wallet-related functionalities. The Ark Desktop module will be a reference implementation for an Ark wallet as a desktop application. It will provide a user-friendly interface for managing Ark transactions and other wallet-related functionalities.
### 👨🏻‍💻 Ark SDK ### 👨🏻‍💻 Ark SDK
Status: Not started yet Status: Not started yet
Rust-based SDK with first-class support Java, Swift and JavaScript bindings for implementing Ark wallets and interacting with ASPs. It will provide a set of APIs for managing wallets, transactions, and other Ark-related functionalities. Rust-based SDK with first-class support Java, Swift and JavaScript bindings for implementing Ark wallets and interacting with ASPs. It will provide a set of APIs for managing wallets, transactions, and other Ark-related functionalities.
### 🗼 Ark Tower ### 🗼 Ark Tower
Status: Not started yet Status: Not started yet
Delegate automatic refereshes of VTXOs to trust-minimized Ark Tower nodes. Additional information about this module will be shared as development continues. Delegate automatic refereshes of VTXOs to trust-minimized Ark Tower nodes. Additional information about this module will be shared as development continues.

View File

@@ -26,15 +26,15 @@ const config = {
/** @type {import('@docusaurus/preset-classic').Options} */ /** @type {import('@docusaurus/preset-classic').Options} */
({ ({
docs: { docs: {
routeBasePath: '/', routeBasePath: '/docs',
sidebarPath: require.resolve('./sidebars.js'), sidebarPath: require.resolve('./sidebars.js'),
editUrl: 'https://github.com/ark-network/ark/edit/master/website/', editUrl: 'https://github.com/ark-network/ark/edit/master/website/',
exclude: [ exclude: [
'**/provider/gateway/**', '**/provider/gateway/**',
'**/provider/coordinator/**', '**/provider/coordinator/**',
'**/provider/treasury/**', '**/provider/treasury/**',
'**/user/ark-cli.md' '**/user/ark-cli.md',
] ],
}, },
blog: { blog: {
showReadingTime: true, showReadingTime: true,
@@ -82,19 +82,19 @@ const config = {
items: [ items: [
{ {
label: 'Nomenclature', label: 'Nomenclature',
to: '/learn/nomenclature', to: '/docs/learn/nomenclature',
}, },
{ {
label: 'Board an Ark', label: 'Board an Ark',
to: '/learn/boarding', to: '/docs/learn/boarding',
}, },
{ {
label: 'Send Payments', label: 'Send Payments',
to: '/learn/payments', to: '/docs/learn/payments',
}, },
{ {
label: 'Leave an Ark', label: 'Leave an Ark',
to: '/learn/leaving', to: '/docs/learn/leaving',
}, },
], ],
}, },
@@ -103,15 +103,15 @@ const config = {
items: [ items: [
{ {
label: 'Overview', label: 'Overview',
to: '/', to: '/docs',
}, },
{ {
label: 'Join an Ark', label: 'Join an Ark',
to: '/user/intro', to: '/docs/user/intro',
}, },
{ {
label: 'Create an Ark', label: 'Create an Ark',
to: '/provider/intro', to: '/docs/provider/intro',
}, },
], ],
}, },

View File

@@ -0,0 +1,128 @@
import React, { useEffect, useState } from 'react'
const isArm = async () => {
// available on Chrome, Edge and Opera
if (typeof navigator.userAgentData?.getHighEntropyValues === 'function') {
const { architecture } = await navigator.userAgentData.getHighEntropyValues(
['architecture']
)
return architecture === 'arm'
}
// for Firefox
const w = document.createElement('canvas').getContext('webgl')
const d = w.getExtension('WEBGL_debug_renderer_info')
const g = (d && w.getParameter(d.UNMASKED_RENDERER_WEBGL)) || ''
return Boolean(g.match(/Apple M[123]/)) // TODO: Linux
}
const Button = ({ children, onClick, colored }) => {
const backgroundColor = colored
? 'var(--ifm-color-primary-lightest)'
: 'var(--ifm-color-emphasis-200)'
return (
<button
onClick={onClick}
style={{
backgroundColor,
borderRadius: '8px',
borderWidth: '1px',
cursor: 'pointer',
fontSize: '1rem',
padding: '1rem',
width: '18rem',
}}>
{children}
</button>
)
}
const Section = ({ children }) => (
<div style={{ margin: '10vh 0', maxWidth: '600px' }}>{children}</div>
)
const SpaceBetween = ({ children }) => (
<div
style={{
display: 'flex',
justifyContent: 'space-between',
}}>
{children}
</div>
)
export default function Buttons() {
const [binaryUrl, setBinaryUrl] = useState('')
const [downloadText, setDownloadText] = useState('Download binary')
const fileURL = (filename) =>
`https://install-latest-cli.arkdev.info/latest-release/${filename}`
useEffect(async () => {
const nua = navigator.userAgent
const isMacOS = Boolean(nua.match(/OS X /))
const isLinux = Boolean(nua.match(/Linux/))
const isSafari = Boolean(nua.includes('Safari') && !nua.includes('Chrome'))
if (!isMacOS && !isLinux) return // no binaries available
if (isSafari) return // Safari hides the CPU architecture
const os = isMacOS ? 'darwin' : 'linux'
const arch = (await isArm()) ? 'arm64' : 'amd64'
const file = `ark-${os}-${arch}`
setBinaryUrl(fileURL(file))
setDownloadText(`Download ${file}`)
})
const viewOnGithub = () =>
window.open('https://github.com/ark-network/ark', '_blank')
const downloadAlpha = () => {
// if we know user OS and architecture, start download immediately
if (!binaryUrl) window.open(binaryUrl, '_blank')
document.querySelector('#available-binaries').scrollIntoView({
behavior: 'smooth',
})
}
return (
<Section>
<SpaceBetween>
<Button onClick={viewOnGithub}>
<SpaceBetween>
View on Github
<svg
className='github_svg__lucide github_svg__lucide-github'
xmlns='http://www.w3.org/2000/svg'
width='1em'
height='1em'
fill='none'
stroke='currentColor'
strokeLinecap='round'
strokeLinejoin='round'
strokeWidth='2'
viewBox='0 0 24 24'>
<path d='M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.4 5.4 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65S8.93 17.38 9 18v4'></path>
<path d='M9 18c-4.51 2-5-2-7-2'></path>
</svg>
</SpaceBetween>
</Button>
<Button onClick={downloadAlpha} colored={true}>
<SpaceBetween>
{downloadText}
<svg
className='download_svg__lucide download_svg__lucide-download'
xmlns='http://www.w3.org/2000/svg'
width='1em'
height='1em'
fill='none'
stroke='currentColor'
strokeLinecap='round'
strokeLinejoin='round'
strokeWidth='2'
viewBox='0 0 24 24'>
<path d='M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3'></path>
</svg>
</SpaceBetween>
</Button>
</SpaceBetween>
</Section>
)
}

148
website/src/pages/index.mdx Normal file
View File

@@ -0,0 +1,148 @@
import Buttons from './buttons.js'
# Welcome to Ark
A second-layer solution designed to scale Bitcoin transactions
<Buttons />
## Why Ark?
Bitcoin is the world's most secure and censorship-resistant blockchain. However, it's not the fastest or the cheapest. Ark is a second-layer solution designed to scale Bitcoin transactions. It uses a shared UTXO model for confidential and off-chain payments through an intermediary server that cannot access your funds.
## Try it
Start by downloading a compatible binary.
### Available binaries
- [ark-darwin-amd64](https://install-latest-cli.arkdev.info/latest-release/ark-darwin-amd64)
- [ark-darwin-arm64](https://install-latest-cli.arkdev.info/latest-release/ark-darwin-arm64)
- [ark-linux-amd64](https://install-latest-cli.arkdev.info/latest-release/ark-linux-amd64)
- [ark-linux-arm64](https://install-latest-cli.arkdev.info/latest-release/ark-linux-arm64)
Move it to somewhere on your PATH:
```bash
$ mv <file> /usr/local/bin/ark
$ chmod +x /usr/local/bin/ark
```
### Configure the CLI
The CLI requires an initial setup to initialize the wallet and connect to the ASP:
```bash
$ ark init --password <password> --ark-url https://asp.arkdev.info
```
You can also restore a wallet by specifying the hex encoded private key with the `--prvkey` flag.
### View balance
You can see both the onchain and offchain balance of the wallet with:
```bash
$ ark balance
```
To see your balance with your VTXOs expiration details use `--expiry-details`:
```bash
$ ark balance --expiry-details
```
### Receive funds
You can print your onchain and offchain receiving addresses with:
```bash
$ ark receive
```
#### Add funds to the ark wallet:
Fund the `onchain_address` from previous command with https://liquidtestnet.com/faucet.
### Onboard the ark
```
$ ark onboard --amount <amount>
```
This command will send funds from your onchain balance to your offchain balance.
After confirmation, your ark wallet will be funded and ready to spend offchain.
:::danger Use sats
Amount is always specified in _sats_ unit.
:::
### Make payments
You can make a payment by sending to either one or many receivers:
```bash
$ ark send --to <address> --amount <amount>
$ ark send --receivers '[{"to": "<address>", "amount": <amount>}, ...]'
```
:::tip
You can send funds to onchain or offchain addresses:
- funds to onchain addresses will come from your onchain balance
- funds to offchain addresses will come from your offchain balance
:::
### Collaborative redemption
You can redeem your funds onchain collaborating with the ASP:
```bash
$ ark redeem --address <onchain_address> --amount <amount>
```
This command will send funds from your offchain balance to your onchain balance.
:::info
Any change produced with this operation goes to your offchain address.
:::
### Unilateral redemption
If the ASP is unresponsive you can redeem all your offchain funds unilaterally:
```bash
$ ark redeem --address <onchain_address> --force
```
:::danger
The tag `--force` will make ark ignore `--amount` and redeem all funds.
:::
### Help
You can see all available commands with `help`:
```
$ ark help
```
### Create a second CLI
To create a second CLI, on a different terminal use a different datadir by exporting the env var `ARK_WALLET_DATADIR`:
```bash
$ export ARK_WALLET_DATADIR=path/to/custom
$ ark init --password <password> --ark-url https://asp.arkdev.info
```
:::info
By default the CLI uses the following datadir:
- POSIX (Linux/BSD): ~/.Ark-cli
- Mac OS: $HOME/Library/Application Support/Ark-cli
- Windows: %LOCALAPPDATA%\Ark-cli
- Plan 9: $home/Ark-cli
:::