Stacks.js

This repo is home to most of the stacks.js libraries, which provide everything you need to work with the Stacks blockchain from JavaScript/TypeScript.
Connecting Wallets
@stacks/connectConnect web application to Stacks wallet browser extensions (separate repo).
Stacks Primitives
@stacks/transactionsConstruct, decode transactions and work with Clarity smart contracts on the Stacks blockchain.@stacks/wallet-sdkLibrary for building wallets, managing accounts, and handling keys for the Stacks blockchain.@stacks/storageStore and fetch files with Gaia, the decentralized storage system.@stacks/encryptionEncryption functions used by stacks.js packages.@stacks/authConstruct and decode authentication requests for Stacks apps.@stacks/profileFunctions for manipulating user profiles.@stacks/networkNetwork and API library for working with Stacks blockchain nodes.@stacks/commonCommon utilities used by stacks.js packages.
Native Smart Contract Interaction
@stacks/bnsLibrary for interacting with the BNS contract.@stacks/stackingLibrary for PoX stacking.
Others
@stacks/cliCommand line interface to interact with auth, storage and Stacks transactions.@stacks/keychainDEPRECATED: replaced by@stacks/wallet-sdk
See README in each package directory for installation instructions and usage.
Importing & Polyfills
Most of the Stacks.js packages are released in multiple different forms. These typically include:
commonjsunder/distesmunder/dist/esmumd(with all dependencies bundled and polyfilled for the browser) under/dist/umd
The
@stacks/keychainand@stacks/wallet-sdkinclude an additionalesmbundle (with external dependecies bundled and polyfilled for the browser) under/dist/polyfill.
Build systems try to be smart and auto-detect the correct type. But you can specify which type to import as follows:
import { generateSecretKey } from '@stacks/wallet-sdk'; // auto-detect
import { generateSecretKey } from '@stacks/wallet-sdk/dist/polyfill'; // esm bundle (polyfilled)
// ...
const walletSdk = require('@stacks/wallet-sdk'); // auto-detect
const walletSdk = require('@stacks/wallet-sdk/dist'); // cjs bundle
const walletSdk = require('@stacks/wallet-sdk/dist/umd'); // umd bundle
// ...
For production builds it is recommended to configure the respective build system to optimize further.
For more fine-grained control, import using esm and configure your build system to polyfill any necessary dependencies.
You could also alias the packages to their /dist/<TYPE> alternative.
E.g., if you are already polyfilling in webpack, add a resolve.alias section like this.
We are currently working to get rid of many dependencies to remove the need for complex configuration.
For now, if you are seeing problems, try the /dist/umd import.
Otherwise, open a new issue with details on your build setup.
Migrating from blockstack.js
To migrate your app from blockstack.js to Stacks.js follow the steps in the migration guide.
Development: environment setup
To setup the development environment for this repository, follow these steps:
Prerequisites:
- Node v16.x.x is recommended (Node v17 may run into issues that can be worked around)
- Clone this package.
- Run
npm installto install dependencies - Run
npm run bootstrapto bootstrap project - Run
npm run buildto build packages - Run
npm run testto run tests - 🚀
Some tests may contain logging of errors and warnings. This should not be confused with failing tests. Make sure the last lines of
npm run testshowlerna success - @stacks/...for every package.
Development: adding dependencies
This repo uses Lerna hoisting for package dependencies.
In order to install a new dependency to a package, the lerna add command must be used, rather than npm install <package>.
For example, the following command installs lodash as a dependency to the @stacks/storage package:
# Run within the root directory
npx lerna add lodash --scope @stacks/storage
Add --dev to install as a development dependency:
npx lerna add lodash --scope @stacks/storage --dev
Documentation
Documentation for the stacks.js packages is located at stacks.js.org.
Contributing
Github issues marked help-wanted are great places to start. Please ask in a github issue or discord before embarking on larger issues that aren't labeled as help wanted or adding additional functionality so that we can make sure your contribution can be included!