Token Ocean 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 Raretoshi.
The plan is to separate out any Raretoshi-specific features from the core platform functionality so that anyone can adapt the platform to host their own Liquid-based NFT site but that's currently a work in progress
- 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/QmRufapYwRWXh4Lkxv8ctUSJazCKpVPeUKvwsZHDso7ZiW
docker exec -it ipfs ipfs add /export/QmRufapYwRWXh4Lkxv8ctUSJazCKpVPeUKvwsZHDso7ZiW
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
docker exec -it ipfs ipfs add /export/user.png
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>