Skip to content

Instantly share code, notes, and snippets.

@larskuhtz
Last active March 23, 2021 09:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save larskuhtz/068e28540ba8309362f6bde141d71c65 to your computer and use it in GitHub Desktop.
Save larskuhtz/068e28540ba8309362f6bde141d71c65 to your computer and use it in GitHub Desktop.
Chainweb Tx History

Chainweb Transfers

Query Chainweb transfer events within a block range for a given chain.

Usage example:

CHAIN=1 MINHEIGHT=1420000 MAXHEIGHT=14201000 bash ./tranfers.sh

Pact events were introduced at block height 1138000.

# ############################################################################ #
# Base64
def base64dUrl: .
| gsub("(?<x>[-_])"; if .x == "-" then "+" else "/" end)
| "\(.)==="
| @base64d
;
def fromjson64: .
| base64dUrl
| fromjson
;
# ############################################################################ #
# Chainweb Debugging tools
# Parse Payload With Outputs
def pWo: .
| .minerData = (.minerData | fromjson64)
| .coinbase = (.coinbase | fromjson64)
| .transactions =
[ .transactions[]
|
{ tx: (.[0] | fromjson64 | .cmd = (.cmd | fromjson))
, result: (.[1] | fromjson64)
}
]
;
# Extra Transfer Events
# (Note that Pact events are avaiable only for block heights >= 1138000)
def transfers: .
| .transactions[]
| .tx.cmd.meta.creationTime as $creationTime
| .tx.cmd.meta.chainId as $chainId
| .tx.hash as $requestKey
| .result.events[]?
| select(.name == "TRANSFER")
|
{ sender: .params[0]
, receiver: .params[1]
, amount: .params[2]
, module: .module
, creationTime: $creationTime
, requestKey: $requestKey
, chainId: $chainId
}
;
#!/bin/bash
# ############################################################################ #
# Collect all transfers within a given block height range.
# NOTE that Pact events are avaiable only for block heights >= 1138000.
CHAIN=${CHAIN:-0}
URL="https://api.chainweb.com/chainweb/0.0/mainnet01"
# ############################################################################ #
# Get current latest block
CUR=$(curl -sL "$URL/cut" | jq '.hashes."'"$CHAIN"'"')
CUR_HEIGHT=$(echo "$CUR" | jq -r '.height')
CUR_HASH=$(echo "$CUR" | jq -r '.hash')
# ############################################################################ #
# Setup MINHEIGHT and MAXHEIGHT parameters
# Block Height Range
# Note that chainweb API calls have different maximum page size limits
[[ -n "$MAXHEIGHT" ]] || MAXHEIGHT=$(( CUR_HEIGHT ))
[[ -n "$MINHEIGHT" ]] || MINHEIGHT=$(( MAXHEIGHT - 100 ))
{
echo "CUR_HEIGHT: $CUR_HEIGHT"
echo "CUR_HASH: $CUR_HASH"
echo "MINHEIGHT: $MINHEIGHT"
echo "MAXHEIGHT: $MAXHEIGHT"
} 1>&2
[[ $MINHEIGHT -lt $MAXHEIGHT ]] || {
echo "MINHEIGHT $MINHEIGHT is not smaller than MAXHEIGHT $MAXHEIGHT" 1>&2
exit 1
}
[[ $MINHEIGHT -ge 1138000 ]] || {
echo "Pact events are supported only since block height 1138000 but MINHEIGHT is $MINHEIGHT" 1>&2
exit 1
}
# ############################################################################ #
# Run Queries
# Query Block Hashes
PAYLOAD_HASHES=$(curl -sL "$URL/chain/$CHAIN/header/branch?minheight=$MINHEIGHT&maxheight=$MAXHEIGHT" \
-H 'accept: application/json;blockheader-encoding=object' \
-H 'content-type: application/json' \
-XPOST -d '{"upper":["'"$CUR_HASH"'"], "lower":[]}' |
jq '[.items[].payloadHash]')
# Query Output Events
curl -sL "$URL/chain/$CHAIN/payload/outputs/batch" \
-H 'content-type: application/json' \
-XPOST -d "$PAYLOAD_HASHES" |
jq 'include "./tools"; .[] | pWo | transfers'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment