Last active
June 11, 2020 10:24
-
-
Save jprupp/dda42d824d846fda349b9ca564e9b3a1 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
set -e | |
NET='bch' | |
if [[ -n $1 ]] | |
then | |
NET="$1" | |
fi | |
COUNT=1 | |
if [[ $2 -gt 0 ]] | |
then | |
COUNT=$2 | |
fi | |
OFFSET=0 | |
if [[ $3 -gt 0 ]] | |
then | |
OFFSET=$3 | |
fi | |
DEPTH=20 | |
if [[ $4 -gt 0 ]] | |
then | |
DEPTH=$4 | |
fi | |
case "$NET" in | |
'btc' | 'bch' | 'btctest' | 'bchtest') | |
BASE="https://api.haskoin.com/$NET" | |
;; | |
'bchreg' | 'btcreg') | |
BASE='http://localhost:3000' | |
;; | |
*) | |
echo "Could not find network: $NET" >&2 | |
exit 1 | |
;; | |
esac | |
CURLOPTS="-sf" | |
best() | |
{ | |
curl $CURLOPTS "$BASE/block/best" | jq -r .hash | |
} | |
block-at-height() | |
{ | |
local HEIGHT="$1" | |
curl $CURLOPTS "$BASE/block/height/$HEIGHT" | jq -r '.[0].hash' | |
} | |
height() | |
{ | |
local HASH="$1" | |
curl $CURLOPTS "$BASE/block/$HASH" | jq -r .height | |
} | |
prev() | |
{ | |
local HASH="$1" | |
curl $CURLOPTS "$BASE/block/$HASH" | jq -r .previous | |
} | |
txs() | |
{ | |
local HASH="$1" | |
curl $CURLOPTS "$BASE/transactions/block/$HASH" | |
} | |
ins() | |
{ | |
jq -r '.[] | .inputs[]' | |
} | |
outs() | |
{ | |
jq -r '.[] | .outputs[]' | |
} | |
addrs() | |
{ | |
jq -r 'select(.address != null) | .address' | |
} | |
mempool() | |
{ | |
curl $CURLOPTS "$BASE/mempool?limit=0" | | |
jq -r '.[]' | | |
while read TXHASH | |
do | |
curl $CURLOPTS "$BASE/transaction/$TXHASH" | |
done | | |
jq -s | |
} | |
tx() | |
{ | |
local TX="$1" | |
curl $CURLOPTS "$BASE/transaction/$TX" | |
} | |
block-addrs() | |
{ | |
{ | |
local HASH="$1" | |
local TXS="$(txs "$HASH")" | |
echo "$TXS" | ins | addrs | |
echo "$TXS" | outs | addrs | |
} | sort | uniq | |
} | |
mem-addrs() | |
{ | |
{ | |
local TXS="$(mempool)" | |
echo "$TXS" | ins | addrs | |
echo "$TXS" | outs | addrs | |
} | sort | uniq | |
} | |
addr-balance() | |
{ | |
local ADDR="$1" | |
curl $CURLOPTS "$BASE/address/$ADDR/balance?pretty=false" | |
} | |
addr-txs() | |
{ | |
local ADDR="$1" | |
curl $CURLOPTS "$BASE/address/$ADDR/transactions?limit=10000" | |
} | |
addr-compare() | |
{ | |
local ADDR="$1" | |
local HEIGHT=$2 | |
local TXC=$(addr-balance "$ADDR" | jq -r .txs) | |
if [[ $TXC -le 10000 ]] | |
then | |
local TXS="$(addr-txs "$ADDR")" | |
local EARLIEST=$(jq '.[-1].block.height' <<< $TXS) | |
if [[ $EARLIEST != null && $HEIGHT -le $(( EARLIEST + DEPTH )) ]] | |
then | |
TXN=$(addr-txs "$ADDR" | jq length) | |
if [[ $TXC -ne $TXN ]] | |
then | |
echo "FAIL: $ADDR" | |
fi | |
fi | |
fi | |
} | |
print-progress() | |
{ | |
local ADDR_COUNT=$1 | |
local ADDR_INDEX=$2 | |
local PERCENT=$(( (100 * ADDR_INDEX) / ADDR_COUNT )) | |
echo -n "[$PERCENT%]" >&2 | |
echo -ne '\r' | |
} | |
addr-test() | |
{ | |
local HEIGHT=$1 | |
shift | |
local ADDRS=("$@") | |
for ADDR in "${ADDRS[@]}" | |
do | |
print-progress ${#ADDRS[@]} $(( ++N )) | |
addr-compare "$ADDR" $HEIGHT | |
done | |
} | |
BEST="$(best)" | |
HEIGHT=$(( $(height "$BEST") - OFFSET )) | |
BLOCK="$(block-at-height $HEIGHT)" | |
if [[ $OFFSET -eq 0 ]] | |
then | |
ADDRS=($(mem-addrs)) | |
echo "MEMPOOL" | |
addr-test $HEIGHT "${ADDRS[@]}" | |
fi | |
for (( i = 1; i <= COUNT; i++ )) | |
do | |
HEIGHT=$(height "$BLOCK") | |
echo "BLOCK: $BLOCK ($HEIGHT)" | |
ADDRS=($(block-addrs "$BLOCK")) | |
N=0 | |
addr-test $HEIGHT "${ADDRS[@]}" | |
BLOCK="$(prev "$BLOCK")" | |
done |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment