Skip to content

0xFlicker/ordinals

Repository files navigation

0xflick ordinals

You're expecting documentations?

You want me to make this easy?

Well sorry.... I'm still figuring out a lot of this stuff myself.

Packages

Development

You will need a local bitcoin regtest, electrum compatible server, and mempool API.

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