You're expecting documentations?
You want me to make this easy?
Well sorry.... I'm still figuring out a lot of this stuff myself.
- apps/cli Command line tools for doing all sorts of useful things
- apps/graphql-backend A local dev focused backend
- apps/www This will eventually be a minting website
- ordinals/axolotl-valley A fully functioning example recursive ordinal with reveal and $4 inscriptions
- packages/assets Tools for generating assets on a canvas in Typescript
- packages/backend All the bits for talking to stateful and cloud things
- packages/graphql Graphql resolvers, to make building the API easier for me
- packages/models Common models for representing all the things
- packages/inscriptions Typescript inscription library
- packages/rbac A little heavy for what's need with permissions, but it's flexible
- packages/rbac-models Only split out for the frontend to pull in w/o any backend dependencies
You will need a local bitcoin regtest, electrum compatible server, and mempool API.
- Download and install bitcoin core: https://bitcoin.org/en/download
- Clone this repo: https://github.com/mempool/mempool
- Clone this repo: https://github.com/romanz/electrs
Generate an RPC user and password:
# Generate RPC credentials
export RPC_USER="bitcoinrpc"
export RPC_PASS=$(openssl rand -base64 32)
export RPC_SALT=$(openssl rand -hex 16)
export RPC_HMAC=$(echo -n "$RPC_PASS" | openssl dgst -sha256 -hmac "$RPC_SALT" | cut -d' ' -f2)
export RPC_AUTH="$RPC_USER:$RPC_SALT\$$RPC_HMAC"
echo "Generated RPC credentials:"
echo "Username: $RPC_USER"
echo "Password: $RPC_PASS"
echo "Auth string: $RPC_AUTH"
When starting mempool via docker, it will probably connect to the default docker bridge network.
export DOCKER_NETWORK_MASK=$(docker network inspect bridge | jq -r .[0].IPAM.Config[0].Subnet)
export DOCKER_NETWORK_GATEWAY=$(docker network inspect bridge | jq -r .[0].IPAM.Config[0].Gateway)
echo "DOCKER_NETWORK_MASK: $DOCKER_NETWORK_MASK"
echo "DOCKER_NETWORK_GATEWAY: $DOCKER_NETWORK_GATEWAY"
Create a starter .bitcoin.conf:
mkdir -p ~/.bitcoin
cat << EOF > ~/.bitcoin/bitcoin.conf
[regtest]
txindex=1
prune=0
server=1
rpcallowip=127.0.0.0/8
rpcbind=127.0.0.1
rpcallowip=$DOCKER_NETWORK_MASK
rpcbind=$DOCKER_NETWORK_GATEWAY
rpcauth=$RPC_AUTH
EOF
Start bitcoind:
bitcoind -regtest
Build and run electrs:
mkdir -p ~/.electrs
cat << EOF > ~/.electrs/config.toml
auth="bitcoinrpc:$RPC_PASS"
network = "regtest"
electrum_rpc_addr = "$DOCKER_NETWORK_GATEWAY:60001"
log_filters = "DEBUG"
EOF
cargo run --release --bin electrs
Now build and launch mempool:
cd mempool/docker
# edit the regtest.yml to use the correct RPC credentials
cat << EOF > regtest.yml
version: "3.7"
services:
web:
environment:
FRONTEND_HTTP_PORT: "8080"
BACKEND_MAINNET_HTTP_HOST: "api"
image: mempool/frontend:latest
user: "1000:1000"
restart: on-failure
stop_grace_period: 1m
command: "./wait-for db:3306 --timeout=720 -- nginx -g 'daemon off;'"
ports:
- 4080:8080
api:
environment:
MEMPOOL_NETWORK: "regtest"
MEMPOOL_BACKEND: "electrum"
ELECTRUM_HOST: "$DOCKER_NETWORK_GATEWAY"
ELECTRUM_PORT: "60001"
ELECTRUM_TLS_ENABLED: "false"
CORE_RPC_HOST: "$DOCKER_NETWORK_GATEWAY"
CORE_RPC_PORT: "18443"
CORE_RPC_USERNAME: "bitcoinrpc"
CORE_RPC_PASSWORD: "$RPC_PASS"
DATABASE_ENABLED: "true"
DATABASE_HOST: "db"
DATABASE_DATABASE: "mempool"
DATABASE_USERNAME: "mempool"
DATABASE_PASSWORD: "mempool"
STATISTICS_ENABLED: "true"
image: mempool/backend:latest
user: "1000:1000"
restart: on-failure
stop_grace_period: 1m
command: "./wait-for-it.sh db:3306 --timeout=720 --strict -- ./start.sh"
volumes:
- ./data:/backend/cache
db:
environment:
MYSQL_DATABASE: "mempool"
MYSQL_USER: "mempool"
MYSQL_PASSWORD: "mempool"
MYSQL_ROOT_PASSWORD: "admin"
image: mariadb:10.5.21
user: "1000:1000"
restart: on-failure
stop_grace_period: 1m
volumes:
- ./mysql/data:/var/lib/mysql
EOF
docker compose -f regtest.yml up -d
Congratulations! You've got a local regtest bitcoin network running with mempool and electrs.
If you have not already, generate a bitcoin wallet:
bitcoin-cli -regtest createwallet "mywallet"
Generate some coins:
bitcoin-cli -regtest --rpcwallet=mywallet generatetoaddress 101 $(bitcoin-cli -regtest --rpcwallet=mywallet getnewaddress)
Mint an inscription:
Usage: index mint [options] <file>
Mint an ordinal
Options:
-n, --network <network> Bitcoin network (default: "regtest")
-a, --address <address> Address to mint to
-p, --padding <amount> Padding amount (default: 546)
--parent-inscription <parent-inscription> Parent inscription
--parent-key <parent-key> Parent security key used to generate p2tr
--parent-txid <parent-txid> Parent txid
--parent-index <parent-index> Parent index
--parent-destination-address <destination-parent-address> Destination parent address (default: "auto")
--parent-amount <parent-amount> Parent amount
-m, --mime-type <mime-type> Mime type of file
-f, --fee-rate <fee-rate> Fee rate in satoshis per vbyte
-w, --rpcwallet <wallet> Bitcoin Wallet name (default: "default")
-u, --rpcuser <rpcuser> Bitcoin RPC username
-p, --rpcpassword <rpcpassword> Bitcoin RPC password
--no-send Don't automatically pay
-d, --metadata-file <metadata-file> Metadata file
--compress Compress the file
-h, --help display help for command
cd apps/cli
yarn cli mint --rpcuser $RPC_USER --rpcpassword $RPC_PASS --rpcwallet mywallet --network regtest --padding 543 --fee-rate 1 --address $(bitcoin-cli -regtest --rpcwallet=mywallet -named getnewaddress -addresstype bech32m) ./ordinals/axolotl-valley/content/1.png
privKey: 8771198ba3264d518054897bb0dd35e3f3ceaa21ebc707aa8a9e1469b29d21f0
Reveal tx id: 4ca6a1a916904c48ed904e14e943ad62c9bb0b3c29d1c0073fc6ba8abd81e703
yarn cli receive --network regtest
privKey: d5eac4c869a74abdea6f71ad1ed1a6723d5638734d76747de4359a77ac7f5ae7
address: bcrt1p2vf2d4hq53p83rc5kwgexftxtxug36pj6vvvhgapvupe5gkan8kqemxjkg
bitcoin-cli -regtest --rpcwallet=mywallet -named sendtoaddress address="bcrt1prp4leq2ec6p6ex2ddfesqs54s3jjxsmh7vt2f3nlkuza7umd7zkqqc0dhj"
privKey: be24d8f82871a94420f4744ce5d85692bcd37f8f9a01b3ed2e8fd2100c27e737
address: bcrt1pfy4khs4h9vllxkjrjvrdp07js09t3r9ldmwhpj59cdf768zvp0csqhc9nz
privKey: 1d14b7263163f8227a0548a7837d3ed23540a1b043a0307fa89b9164cf9f717d
address: bcrt1pekgsd92rsd9kum8up4encglqtkdpfzrz39pck0dh5wnajvswdw4qm58089
yarn cli mint --rpcuser $RPC_USER --rpcpassword $RPC_PASS --rpcwallet mywallet --network regtest --padding 546 --fee-rate 1 --address bcrt1pfy4khs4h9vllxkjrjvrdp07js09t3r9ldmwhpj59cdf768zvp0csqhc9nz --parent-inscription 4ca6a1a916904c48ed904e14e943ad62c9bb0b3c29d1c0073fc6ba8abd81e703i0 --parent-key d5eac4c869a74abdea6f71ad1ed1a6723d5638734d76747de4359a77ac7f5ae7 --parent-txid 4ca6a1a916904c48ed904e14e943ad62c9bb0b3c29d1c0073fc6ba8abd81e703 --parent-index 0 --parent-amount 546 --parent-destination-address bcrt1pekgsd92rsd9kum8up4encglqtkdpfzrz39pck0dh5wnajvswdw4qm58089 package.json