ord 0.12.0

◉ Ordinal wallet and block explorer
Documentation
set positional-arguments

watch +args='test':
  cargo watch --clear --exec '{{args}}'

ci: clippy forbid
  cargo fmt -- --check
  cargo test --all
  cargo test --all -- --ignored

forbid:
  ./bin/forbid

fmt:
  cargo fmt --all

clippy:
  cargo clippy --all --all-targets -- -D warnings

lclippy:
  cargo lclippy --all --all-targets -- -D warnings

deploy branch chain domain:
  ssh root@{{domain}} "mkdir -p deploy \
    && apt-get update --yes \
    && apt-get upgrade --yes \
    && apt-get install --yes git rsync"
  rsync -avz deploy/checkout root@{{domain}}:deploy/checkout
  ssh root@{{domain}} 'cd deploy && ./checkout {{branch}} {{chain}} {{domain}}'

deploy-all: deploy-testnet deploy-signet deploy-mainnet

deploy-mainnet branch="master": (deploy branch "main" "ordinals.net")

deploy-signet branch="master": (deploy branch "signet" "signet.ordinals.net")

deploy-testnet branch="master": (deploy branch "test" "testnet.ordinals.net")

deploy-ord-dev branch="master" chain="main" domain="ordinals-dev.com": (deploy branch chain domain)

save-ord-dev-state domain="ordinals-dev.com":
  $EDITOR ./deploy/save-ord-dev-state
  scp ./deploy/save-ord-dev-state root@{{domain}}:~
  ssh root@{{domain}} "./save-ord-dev-state"

log unit="ord" domain="ordinals.net":
  ssh root@{{domain}} 'journalctl -fu {{unit}}'

test-deploy:
  ssh-keygen -f ~/.ssh/known_hosts -R 192.168.56.4
  vagrant up
  ssh-keyscan 192.168.56.4 >> ~/.ssh/known_hosts
  rsync -avz \
    --delete \
    --exclude .git \
    --exclude target \
    --exclude .vagrant \
    --exclude index.redb \
    . root@192.168.56.4:ord
  ssh root@192.168.56.4 'cd ord && ./deploy/setup'

time-tests:
  cargo +nightly test -- -Z unstable-options --report-time

profile-tests:
  cargo +nightly test -- -Z unstable-options --report-time \
    | sed -n 's/^test \(.*\) ... ok <\(.*\)s>/\2 \1/p' | sort -n \
    | tee test-times.txt

fuzz:
  #!/usr/bin/env bash
  set -euxo pipefail
  cd fuzz
  while true; do
    cargo +nightly fuzz run transaction-builder -- -max_total_time=60
    cargo +nightly fuzz run runestone-decipher -- -max_total_time=60
    cargo +nightly fuzz run varint-decode -- -max_total_time=60
    cargo +nightly fuzz run varint-encode -- -max_total_time=60
  done

decode txid:
  bitcoin-cli getrawtransaction {{txid}} | xxd -r -p - | cargo run decode

open:
  open http://localhost

doc:
  cargo doc --all --open

prepare-release revision='master':
  #!/usr/bin/env bash
  set -euxo pipefail
  git checkout {{ revision }}
  git pull origin {{ revision }}
  echo >> CHANGELOG.md
  git log --pretty='format:- %s' >> CHANGELOG.md
  $EDITOR CHANGELOG.md
  $EDITOR Cargo.toml
  VERSION=`sed -En 's/version[[:space:]]*=[[:space:]]*"([^"]+)"/\1/p' Cargo.toml | head -1`
  cargo check
  git checkout -b release-$VERSION
  git add -u
  git commit -m "Release $VERSION"
  git tag -a $VERSION -m "Release $VERSION"
  gh pr create --web

publish-release revision='master':
  #!/usr/bin/env bash
  set -euxo pipefail
  rm -rf tmp/release
  git clone https://github.com/ordinals/ord.git tmp/release
  cd tmp/release
  git checkout {{ revision }}
  cargo publish
  cd ../..
  rm -rf tmp/release

publish-tag-and-crate revision='master':
  #!/usr/bin/env bash
  set -euxo pipefail
  rm -rf tmp/release
  git clone git@github.com:ordinals/ord.git tmp/release
  cd tmp/release
  git checkout {{revision}}
  VERSION=`sed -En 's/version[[:space:]]*=[[:space:]]*"([^"]+)"/\1/p' Cargo.toml | head -1`
  git tag -a $VERSION -m "Release $VERSION"
  git push git@github.com:ordinals/ord.git $VERSION
  cargo publish
  cd ../..
  rm -rf tmp/release

list-outdated-dependencies:
  cargo outdated -R
  cd test-bitcoincore-rpc && cargo outdated -R

update-modern-normalize:
  curl \
    https://raw.githubusercontent.com/sindresorhus/modern-normalize/main/modern-normalize.css \
    > static/modern-normalize.css

download-log unit='ord' host='ordinals.net':
  ssh root@{{host}} 'mkdir -p tmp && journalctl -u {{unit}} > tmp/{{unit}}.log'
  rsync --progress --compress root@{{host}}:tmp/{{unit}}.log tmp/{{unit}}.log

download-index unit='ord' host='ordinals.net':
  rsync --progress --compress root@{{host}}:/var/lib/{{unit}}/index.redb tmp/{{unit}}.index.redb

graph log:
  ./bin/graph $1

flamegraph dir=`git branch --show-current`:
  ./bin/flamegraph $1

benchmark index height-limit:
  ./bin/benchmark $1 $2

benchmark-revision rev:
  ssh root@ordinals.net "mkdir -p benchmark \
    && apt-get update --yes \
    && apt-get upgrade --yes \
    && apt-get install --yes git rsync"
  rsync -avz benchmark/checkout root@ordinals.net:benchmark/checkout
  ssh root@ordinals.net 'cd benchmark && ./checkout {{rev}}'

benchmark-branch branch:
  #/usr/bin/env bash
  # rm -f master.redb
  rm -f {{branch}}.redb
  # git checkout master
  # cargo build --release
  # time ./target/release/ord --index master.redb index update
  # ll master.redb
  git checkout {{branch}}
  cargo build --release
  time ./target/release/ord --index {{branch}}.redb index update
  ll {{branch}}.redb

build-snapshots:
  #!/usr/bin/env bash
  set -euxo pipefail
  rm -rf tmp/snapshots
  mkdir -p tmp/snapshots
  cargo build --release
  cp ./target/release/ord tmp/snapshots
  cd tmp/snapshots
  for start in {0..750000..50000}; do
    height_limit=$((start+50000))
    if [[ -f $start.redb ]]; then
      cp -c $start.redb index.redb
    fi
    a=`date +%s`
    time ./ord --data-dir . --height-limit $height_limit index
    b=`date +%s`
    mv index.redb $height_limit.redb
    printf "$height_limit\t$((b - a))\n" >> time.txt
  done

serve-docs: build-docs
  open http://127.0.0.1:8080
  python3 -m http.server --directory docs/build/html --bind 127.0.0.1 8080

build-docs:
  #!/usr/bin/env bash
  mdbook build docs -d build
  for lang in "de" "fr" "es" "pt" "ru" "zh" "ja" "ko" "fil" "ar" "hi"; do
    MDBOOK_BOOK__LANGUAGE=$lang \
      mdbook build docs -d build/$lang
    mv docs/build/$lang/html docs/build/html/$lang
  done

update-changelog:
  echo >> CHANGELOG.md
  git log --pretty='format:- %s' >> CHANGELOG.md

preview-examples:
  cargo run preview examples/*

convert-logo-to-favicon:
  convert -background none -resize 256x256 logo.svg static/favicon.png

update-mdbook-theme:
  curl https://raw.githubusercontent.com/rust-lang/mdBook/v0.4.35/src/theme/index.hbs > docs/theme/index.hbs