The best way to get started? Launch your first token on Spark.

You can go from nothing to a working token in just six steps. No complicated setup. No need to understand every detail up front. Spark handles the hard parts — so you can focus on getting something live, fast. Below are instructions using either the SDK or CLI.

1. Install the SDK / CLI

SDK

npm i @buildonspark/issuer-sdk

CLI

git clone https://github.com/buildonspark/spark.git
cd spark/sdks/js
yarn install && yarn build
cd examples/spark-cli
yarn cli

2. Create a Wallet

SDK

const { wallet, mnemonic } = await IssuerSparkWallet.initialize({
  options: {
    network: "MAINNET",
  },
});

CLI

> initwallet

You get back a wallet object and a mnemonic. This wallet will become the sole issuer for your token. One wallet = one token. Treat it like a root of trust.

3. Fund Your Wallet on L1

SDK

// Get your L1 address for funding
const l1Address = wallet.getTokenL1Address();
console.log("Fund this address:", l1Address);

CLI

>gettokenl1address

Why fund? The token announcement transaction requires Bitcoin to pay for network fees. Without funds, the transaction won’t be included in a Bitcoin block. This is a one-time cost to establish your token’s identity on Bitcoin L1.

4. Announce Your Token (on L1)

SDK

await wallet.announceTokenL1({
  tokenName: "MyToken",
  tokenTicker: "MTK",
  maxSupply: 1_000_000n,
  decimals: 6,
  isFreezeable: true
});

CLI

> announcetoken MyToken MTK 6 1000000 true

This creates a Bitcoin transaction with an embedded OP_RETURN (a special field in a Bitcoin transaction used to store extra data) that defines your token’s metadata. It’s immutable, lives on L1, and is what the Spark network uses to recognize your token.

In the announcement response, you’ll find the TokenPubkey which will be used in transferToken requests.

5. Mint Your Supply (on Spark)

SDK

await wallet.mintTokens(500_000n);

CLI

> minttokens 500000

This mints tokens on Spark — ready to send. All tokens must originate from the original issuer wallet, and minting is capped by the maxSupply defined during the announcement.

6. Send It

SDK

await wallet.transferTokens({
  tokenPublicKey,
  tokenAmount: 100_000n,
  receiverSparkAddress
});

CLI

> transfertokens 03cc4ad4e0a9b734dda02f8c7e67e4698641370069e9b08ffe2403f5ff32ddb3f0 100000 sprt1pgss8nz26ns2nde5mkszlrr7vljxnpjpxuqxn6ds3llzgql4luedmvlsnlnvmz

That’s it. Your token is live and transferable. Instantly settled, no L1 confirmation required.