JungleLab LNFT Digital Assets is a web-based platform for issuing and transacting with non-fungible tokens on the Bitcoin Liquid Network. Blockstream is sponsoring its development and hosting an exemplary curated instance of it for use by Bitcoin artists at JungleLab.
- User accounts and profiles for artists and collectors include custom avatars, contact info and biography
- Users can follow other artists and collectors and like/favorite individual artworks
- Artists can upload digital media files (jpg, png, gif, mp4) representing an artwork and add metadata like a title, description, and tags
- Selected metadata is published in the liquid asset registry so that tokens can be recognized by external wallets
- Media files are added to the IPFS network upon being uploaded and are given a unique content identifier (CID) derived from the SHA256 hash of the file
- The CID is embedded in the Liquid token issuance transaction contract, permanently and provably linking the file to the token
- Artworks are listed in a searchable/sortable/filterable marketplace gallery
- Artists can list an artwork for sale by setting an optional listing price, royalty rate, and/or auction period
- Bids and sales are conducted peer-to-peer using atomic swaps so the platform host does not need to escrow funds
- Listings, bids, transfers and new artwork activity are logged and presented in a site-wide feed
- A web-based liquid wallet is integrated into the user's profile page and allows them to fund their accounts with L-BTC or any kind of liquid asset
- Wallets can be backed up and imported using a 12-word BIP mnemonic seed phrase
- Built-in integration with the coinos.io API allows users to instantly convert BTC to L-BTC by depositing to an on-chain address or paying a lightning network invoice
- Royalties and auction holding periods are enforced through a 2-of-2 signing server that only signs off on transactions that meet certain conditions
- Svelte Kit reactive component framework
- Tailwind CSS UI utility classes
- LiquidJS for liquid wallet functionality
- Postgres/Hasura for storing relational app data
- Hasura backend plus for JWT-based user auth
- IPFS for media storage and hash-based content addressing
- Fastify NodeJS api/app server
- Esplora for Liquid blockchain data
- Liquid asset registry for token metadata
- coinos BTC/LNBTC <-> L-BTC conversion
- pnpm: https://pnpm.io/
- Docker: https://docs.docker.com/get-docker/
- Hasura CLI: https://hasura.io/docs/1.0/graphql/core/hasura-cli/install-hasura-cli.html#install-hasura-cli
pnpm install
cd hasura
cp .env.sample .env
docker run -it -v $PWD/app:/app --entrypoint pnpm asoltys/lnft-server install
docker-compose up -d
hasura migrate apply
hasura metadata apply
hasura seeds apply
hasura metadata reload
sudo cp ../static/user.png storage/QmcbyjMMT5fFtoiWRJiwV8xoiRWJpSRwC6qCFMqp7EXD4Z
docker exec -it ipfs ipfs add /export/QmcbyjMMT5fFtoiWRJiwV8xoiRWJpSRwC6qCFMqp7EXD4Z
docker restart lapp
cd ..
pnpm dev # site is available at http://localhost:3000/
We have a pre-commit git hook for running prettier on all files to keep the formatting consistent.
git config core.hooksPath "./git_hooks"
- This will set the git config path to use this directory for hooks.
chmod +x ./git_hooks/pre-commit
- This will give the hook the necessary permissions to run.
Setup local development with cloud tools - VS CodeSpaces https://vscode.dev
npm i -g pnpm
pnpm install
curl -L https://github.com/hasura/graphql-engine/raw/stable/cli/get.sh | bash
cd hasura
cp .env.sample .env
docker run -it -v $PWD/app:/app --entrypoint pnpm asoltys/lnft-server install
docker-compose up -d
hasura migrate apply
hasura metadata apply
hasura seeds apply
hasura metadata reload
sudo cp ../static/user.png storage/QmcbyjMMT5fFtoiWRJiwV8xoiRWJpSRwC6qCFMqp7EXD4Z
docker exec -it ipfs ipfs add /export/QmcbyjMMT5fFtoiWRJiwV8xoiRWJpSRwC6qCFMqp7EXD4Z
docker restart lapp
cd ..
pnpm dev # site is available at http://localhost:3000/
chmod +x mine.sh
./mine.sh # this script will run continually to mine regtest blocks, you may want to run it in a separate terminal window or tab
Get a deposit address from the wallet page or users table in the db and send an amount with this command
docker exec -it liquid elements-cli -datadir=/home/elements/.elements sendtoaddress <address> <amount>