forked from Qortal/qortal
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
2.8 KiB
97 lines
2.8 KiB
#!/usr/bin/env bash |
|
|
|
port=12391 |
|
if [ $# -gt 0 -a "$1" = "-t" ]; then |
|
port=62391 |
|
fi |
|
|
|
printf "Searching for auto-update transactions to approve...\n"; |
|
|
|
tx=$( curl --silent --url "http://localhost:${port}/arbitrary/search?txGroupId=1&service=AUTO_UPDATE&confirmationStatus=CONFIRMED&limit=1&reverse=true" ); |
|
if fgrep --silent '"approvalStatus":"PENDING"' <<< "${tx}"; then |
|
true |
|
else |
|
echo "Can't find any pending transactions" |
|
exit |
|
fi |
|
|
|
sig=$( perl -n -e 'print $1 if m/"signature":"(\w+)"/' <<< "${tx}" ) |
|
if [ -z "${sig}" ]; then |
|
printf "Can't find transaction signature in JSON:\n%s\n" "${tx}" |
|
exit |
|
fi |
|
|
|
printf "Found transaction %s\n" $sig; |
|
|
|
printf "\nPaste your dev account private key:\n"; |
|
IFS= |
|
read -s privkey |
|
printf "\n" |
|
|
|
# Convert to public key |
|
pubkey=$( curl --silent --url "http://localhost:${port}/utils/publickey" --data @- <<< "${privkey}" ); |
|
if egrep -v --silent '^\w{44,46}$' <<< "${pubkey}"; then |
|
printf "Invalid response from API - was your private key correct?\n%s\n" "${pubkey}" |
|
exit |
|
fi |
|
printf "Your public key: %s\n" ${pubkey} |
|
|
|
# Convert to address |
|
address=$( curl --silent --url "http://localhost:${port}/addresses/convert/${pubkey}" ); |
|
printf "Your address: %s\n" ${address} |
|
|
|
# Grab last reference |
|
lastref=$( curl --silent --url "http://localhost:${port}/addresses/lastreference/{$address}" ); |
|
printf "Your last reference: %s\n" ${lastref} |
|
|
|
# Build GROUP_APPROVAL transaction |
|
timestamp=$( date +%s )000 |
|
tx_json=$( cat <<TX_END |
|
{ |
|
"timestamp": ${timestamp}, |
|
"reference": "${lastref}", |
|
"fee": 0.001, |
|
"txGroupId": 0, |
|
"adminPublicKey": "${pubkey}", |
|
"pendingSignature": "${sig}", |
|
"approval": true |
|
} |
|
TX_END |
|
) |
|
|
|
raw_tx=$( curl --silent --header "Content-Type: application/json" --url "http://localhost:${port}/groups/approval" --data @- <<< "${tx_json}" ) |
|
if egrep -v --silent '^\w{100,}' <<< "${raw_tx}"; then |
|
printf "Building GROUP_APPROVAL transaction failed:\n%s\n" "${raw_tx}" |
|
exit |
|
fi |
|
printf "\nRaw approval tx:\n%s\n" ${raw_tx} |
|
|
|
# sign |
|
sign_json=$( cat <<SIGN_END |
|
{ |
|
"privateKey": "${privkey}", |
|
"transactionBytes": "${raw_tx}" |
|
} |
|
SIGN_END |
|
) |
|
signed_tx=$( curl --silent --header "Content-Type: application/json" --url "http://localhost:${port}/transactions/sign" --data @- <<< "${sign_json}" ) |
|
printf "\nSigned tx:\n%s\n" ${signed_tx} |
|
if egrep -v --silent '^\w{100,}' <<< "${signed_tx}"; then |
|
printf "Signing GROUP_APPROVAL transaction failed:\n%s\n" "${signed_tx}" |
|
exit |
|
fi |
|
|
|
# ready to publish? |
|
plural="s" |
|
printf "\n" |
|
for ((seconds = 5; seconds > 0; seconds--)); do |
|
if [ "${seconds}" = "1" ]; then |
|
plural="" |
|
fi |
|
printf "\rBroadcasting in %d second%s...(CTRL-C) to abort " $seconds $plural |
|
sleep 1 |
|
done |
|
|
|
printf "\rBroadcasting signed GROUP_APPROVAL transaction... \n" |
|
result=$( curl --silent --url "http://localhost:${port}/transactions/process" --data @- <<< "${signed_tx}" ) |
|
printf "API response:\n%s\n" "${result}"
|
|
|