Batchers manage batches

This commit is contained in:
kexkey
2020-07-03 13:42:32 -04:00
parent 3efdd200d4
commit 38819f169d
7 changed files with 336 additions and 336 deletions

View File

@@ -68,20 +68,20 @@ CREATE TABLE recipient (
webhook_url TEXT, webhook_url TEXT,
calledback INTEGER DEFAULT FALSE, calledback INTEGER DEFAULT FALSE,
calledback_ts INTEGER, calledback_ts INTEGER,
batch_id INTEGER REFERENCES batch, batcher_id INTEGER REFERENCES batcher,
label TEXT, label TEXT
); );
CREATE INDEX idx_recipient_address ON recipient (address); CREATE INDEX idx_recipient_address ON recipient (address);
CREATE INDEX idx_recipient_label ON recipient (label); CREATE INDEX idx_recipient_label ON recipient (label);
CREATE TABLE batch ( CREATE TABLE batcher (
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
label TEXT UNIQUE, label TEXT UNIQUE,
conf_target INTEGER, conf_target INTEGER,
feerate REAL, feerate REAL,
inserted_ts INTEGER DEFAULT CURRENT_TIMESTAMP inserted_ts INTEGER DEFAULT CURRENT_TIMESTAMP
); );
INSERT INTO batch (id, label, conf_target, feerate) VALUES (1, "default", 6, NULL); INSERT INTO batcher (id, label, conf_target, feerate) VALUES (1, "default", 6, NULL);
CREATE TABLE watching_by_txid ( CREATE TABLE watching_by_txid (
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,

View File

@@ -1,9 +1,9 @@
#!/bin/sh #!/bin/sh
echo "Checking for extended batching support in DB..." echo "Checking for extended batching support in DB..."
count=$(sqlite3 $DB_FILE "select count(*) from pragma_table_info('recipient') where name='batch_id'") count=$(sqlite3 $DB_FILE "select count(*) from pragma_table_info('recipient') where name='batcher_id'")
if [ "${count}" -eq "0" ]; then if [ "${count}" -eq "0" ]; then
# batch_id not there, we have to migrate # batcher_id not there, we have to migrate
echo "Migrating database for extended batching support..." echo "Migrating database for extended batching support..."
echo "Backing up current DB..." echo "Backing up current DB..."
cp $DB_FILE $DB_FILE-sqlmigrate20200610_0.4.0-0.5.0 cp $DB_FILE $DB_FILE-sqlmigrate20200610_0.4.0-0.5.0

View File

@@ -1,16 +1,16 @@
CREATE TABLE batch ( CREATE TABLE batcher (
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
label TEXT UNIQUE, label TEXT UNIQUE,
conf_target INTEGER, conf_target INTEGER,
feerate REAL, feerate REAL,
inserted_ts INTEGER DEFAULT CURRENT_TIMESTAMP inserted_ts INTEGER DEFAULT CURRENT_TIMESTAMP
); );
INSERT INTO batch (id, label, conf_target, feerate) VALUES (1, "default", 6, NULL); INSERT INTO batcher (id, label, conf_target, feerate) VALUES (1, "default", 6, NULL);
ALTER TABLE recipient ADD COLUMN webhook_url TEXT; ALTER TABLE recipient ADD COLUMN webhook_url TEXT;
ALTER TABLE recipient ADD COLUMN batch_id INTEGER REFERENCES batch; ALTER TABLE recipient ADD COLUMN batcher_id INTEGER REFERENCES batcher;
ALTER TABLE recipient ADD COLUMN label INTEGER REFERENCES batch; ALTER TABLE recipient ADD COLUMN label INTEGER REFERENCES batcher;
ALTER TABLE recipient ADD COLUMN calledback INTEGER DEFAULT FALSE; ALTER TABLE recipient ADD COLUMN calledback INTEGER DEFAULT FALSE;
ALTER TABLE recipient ADD COLUMN calledback_ts INTEGER; ALTER TABLE recipient ADD COLUMN calledback_ts INTEGER;
CREATE INDEX idx_recipient_label ON recipient (label); CREATE INDEX idx_recipient_label ON recipient (label);

View File

@@ -3,98 +3,98 @@
. ./trace.sh . ./trace.sh
. ./sendtobitcoinnode.sh . ./sendtobitcoinnode.sh
createbatch() { createbatcher() {
trace "Entering createbatch()..." trace "Entering createbatcher()..."
# POST http://192.168.111.152:8080/createbatch # POST http://192.168.111.152:8080/createbatcher
# #
# args: # args:
# - batchLabel, optional, id can be used to reference the batch # - batcherLabel, optional, id can be used to reference the batcher
# - confTarget, optional, overriden by batchspend's confTarget, default Bitcoin Core conf_target will be used if not supplied # - confTarget, optional, overriden by batchspend's confTarget, default Bitcoin Core conf_target will be used if not supplied
# NOTYET - feeRate, sat/vB, optional, overrides confTarget if supplied, overriden by batchspend's feeRate, default Bitcoin Core fee policy will be used if not supplied # NOTYET - feeRate, sat/vB, optional, overrides confTarget if supplied, overriden by batchspend's feeRate, default Bitcoin Core fee policy will be used if not supplied
# #
# response: # response:
# - id, the batch id # - batcherId, the batcher id
# #
# BODY {"batchLabel":"lowfees","confTarget":32} # BODY {"batcherLabel":"lowfees","confTarget":32}
# NOTYET BODY {"batchLabel":"highfees","feeRate":231.8} # NOTYET BODY {"batcherLabel":"highfees","feeRate":231.8}
local request=${1} local request=${1}
local response local response
local label=$(echo "${request}" | jq ".batchLabel") local label=$(echo "${request}" | jq ".batcherLabel")
trace "[createbatch] label=${label}" trace "[createbatcher] label=${label}"
local conf_target=$(echo "${request}" | jq ".confTarget") local conf_target=$(echo "${request}" | jq ".confTarget")
trace "[createbatch] conf_target=${conf_target}" trace "[createbatcher] conf_target=${conf_target}"
local feerate=$(echo "${request}" | jq ".feeRate") local feerate=$(echo "${request}" | jq ".feeRate")
trace "[createbatch] feerate=${feerate}" trace "[createbatcher] feerate=${feerate}"
# if [ "${feerate}" != "null" ]; then # if [ "${feerate}" != "null" ]; then
# # If not null, let's nullify conf_target since feerate overrides it # # If not null, let's nullify conf_target since feerate overrides it
# conf_target="null" # conf_target="null"
# trace "[createbatch] Overriding conf_target=${conf_target}" # trace "[createbatcher] Overriding conf_target=${conf_target}"
# fi # fi
local batch_id local batcher_id
batch_id=$(sql "INSERT OR IGNORE INTO batch (label, conf_target, feerate) VALUES (${label}, ${conf_target}, ${feerate}); SELECT LAST_INSERT_ROWID();") batcher_id=$(sql "INSERT OR IGNORE INTO batcher (label, conf_target, feerate) VALUES (${label}, ${conf_target}, ${feerate}); SELECT LAST_INSERT_ROWID();")
if ("${batch_id}" -eq "0"); then if ("${batcher_id}" -eq "0"); then
trace "[createbatch] Could not insert" trace "[createbatcher] Could not insert"
response='{"result":null,"error":{"code":-32700,"message":"Could not create batch, label probably already exists","data":'${request}'}}' response='{"result":null,"error":{"code":-32700,"message":"Could not create batcher, label probably already exists","data":'${request}'}}'
else else
trace "[createbatch] Inserted" trace "[createbatcher] Inserted"
response='{"result":{"batchId":'${batch_id}'},"error":null}' response='{"result":{"batcherId":'${batcher_id}'},"error":null}'
fi fi
echo "${response}" echo "${response}"
} }
updatebatch() { updatebatcher() {
trace "Entering updatebatch()..." trace "Entering updatebatcher()..."
# POST http://192.168.111.152:8080/updatebatch # POST http://192.168.111.152:8080/updatebatcher
# #
# args: # args:
# - batchId, optional, batch id to update, will update default batch if not supplied # - batcherId, optional, batcher id to update, will update default batcher if not supplied
# - batchLabel, optional, id can be used to reference the batch, will update default batch if not supplied, if id is present then change the label with supplied text # - batcherLabel, optional, id can be used to reference the batcher, will update default batcher if not supplied, if id is present then change the label with supplied text
# - confTarget, optional, new confirmation target for the batch # - confTarget, optional, new confirmation target for the batcher
# NOTYET - feeRate, sat/vB, optional, new feerate for the batch # NOTYET - feeRate, sat/vB, optional, new feerate for the batcher
# #
# response: # response:
# - batchId, the batch id # - batcherId, the batcher id
# - batchLabel, the batch label # - batcherLabel, the batcher label
# - confTarget, the batch default confirmation target # - confTarget, the batcher default confirmation target
# NOTYET - feeRate, the batch default feerate # NOTYET - feeRate, the batcher default feerate
# #
# BODY {"batchId":5,"confTarget":12} # BODY {"batcherId":5,"confTarget":12}
# NOTYET BODY {"batchLabel":"highfees","feeRate":400} # NOTYET BODY {"batcherLabel":"highfees","feeRate":400}
# NOTYET BODY {"batchId":3,"batchLabel":"ultrahighfees","feeRate":800} # NOTYET BODY {"batcherId":3,"batcherLabel":"ultrahighfees","feeRate":800}
# BODY {"batchLabel":"fast","confTarget":2} # BODY {"batcherLabel":"fast","confTarget":2}
local request=${1} local request=${1}
local response local response
local whereclause local whereclause
local returncode local returncode
local id=$(echo "${request}" | jq ".batchId") local id=$(echo "${request}" | jq ".batcherId")
trace "[updatebatch] id=${id}" trace "[updatebatcher] id=${id}"
local label=$(echo "${request}" | jq ".batchLabel") local label=$(echo "${request}" | jq ".batcherLabel")
trace "[updatebatch] label=${label}" trace "[updatebatcher] label=${label}"
local conf_target=$(echo "${request}" | jq ".confTarget") local conf_target=$(echo "${request}" | jq ".confTarget")
trace "[updatebatch] conf_target=${conf_target}" trace "[updatebatcher] conf_target=${conf_target}"
local feerate=$(echo "${request}" | jq ".feeRate") local feerate=$(echo "${request}" | jq ".feeRate")
trace "[updatebatch] feerate=${feerate}" trace "[updatebatcher] feerate=${feerate}"
if [ "${id}" = "null" ] && [ "${label}" = "null" ]; then if [ "${id}" = "null" ] && [ "${label}" = "null" ]; then
# If id and label are null, use default batch # If id and label are null, use default batcher
trace "[updatebatch] Using default batch 1" trace "[updatebatcher] Using default batcher 1"
id=1 id=1
fi fi
# if [ "${feerate}" != "null" ]; then # if [ "${feerate}" != "null" ]; then
# # If not null, let's nullify conf_target since feerate overrides it # # If not null, let's nullify conf_target since feerate overrides it
# conf_target="null" # conf_target="null"
# trace "[updatebatch] Overriding conf_target=${conf_target}" # trace "[updatebatcher] Overriding conf_target=${conf_target}"
# fi # fi
if [ "${id}" = "null" ]; then if [ "${id}" = "null" ]; then
@@ -103,13 +103,13 @@ updatebatch() {
whereclause="id = ${id}" whereclause="id = ${id}"
fi fi
sql "UPDATE batch set label=${label}, conf_target=${conf_target}, feerate=${feerate} WHERE ${whereclause}" sql "UPDATE batcher set label=${label}, conf_target=${conf_target}, feerate=${feerate} WHERE ${whereclause}"
returncode=$? returncode=$?
trace_rc ${returncode} trace_rc ${returncode}
if [ "${returncode}" -ne 0 ]; then if [ "${returncode}" -ne 0 ]; then
response='{"result":null,"error":{"code":-32700,"message":"Could not update batch","data":'${request}'}}' response='{"result":null,"error":{"code":-32700,"message":"Could not update batcher","data":'${request}'}}'
else else
response='{"result":{"batchId":'${id}'},"error":null}' response='{"result":{"batcherId":'${id}'},"error":null}'
fi fi
echo "${response}" echo "${response}"
@@ -123,20 +123,20 @@ addtobatch() {
# args: # args:
# - address, required, desination address # - address, required, desination address
# - amount, required, amount to send to the destination address # - amount, required, amount to send to the destination address
# - batchId, optional, the id of the batch to which the output will be added, default batch if not supplied, overrides batchLabel # - batcherId, optional, the id of the batcher to which the output will be added, default batcher if not supplied, overrides batcherLabel
# - batchLabel, optional, the label of the batch to which the output will be added, default batch if not supplied # - batcherLabel, optional, the label of the batcher to which the output will be added, default batcher if not supplied
# - webhookUrl, optional, the webhook to call when the batch is broadcast # - webhookUrl, optional, the webhook to call when the batch is broadcast
# #
# response: # response:
# - id, the id of the added output # - outputId, the id of the added output
# - nbOutputs, the number of outputs currently in the batch # - nbOutputs, the number of outputs currently in the batch
# - oldest, the timestamp of the oldest output in the batch # - oldest, the timestamp of the oldest output in the batch
# - pendingTotal, the current sum of the batch's output amounts # - pendingTotal, the current sum of the batch's output amounts
# #
# BODY {"address":"2N8DcqzfkYi8CkYzvNNS5amoq3SbAcQNXKp","amount":0.00233} # BODY {"address":"2N8DcqzfkYi8CkYzvNNS5amoq3SbAcQNXKp","amount":0.00233}
# BODY {"address":"2N8DcqzfkYi8CkYzvNNS5amoq3SbAcQNXKp","amount":0.00233,"batchId":34,"webhookUrl":"https://myCypherApp:3000/batchExecuted"} # BODY {"address":"2N8DcqzfkYi8CkYzvNNS5amoq3SbAcQNXKp","amount":0.00233,"batcherId":34,"webhookUrl":"https://myCypherApp:3000/batchExecuted"}
# BODY {"address":"2N8DcqzfkYi8CkYzvNNS5amoq3SbAcQNXKp","amount":0.00233,"batchLabel":"lowfees","webhookUrl":"https://myCypherApp:3000/batchExecuted"} # BODY {"address":"2N8DcqzfkYi8CkYzvNNS5amoq3SbAcQNXKp","amount":0.00233,"batcherLabel":"lowfees","webhookUrl":"https://myCypherApp:3000/batchExecuted"}
# BODY {"address":"2N8DcqzfkYi8CkYzvNNS5amoq3SbAcQNXKp","amount":0.00233,"batchId":34,"webhookUrl":"https://myCypherApp:3000/batchExecuted"} # BODY {"address":"2N8DcqzfkYi8CkYzvNNS5amoq3SbAcQNXKp","amount":0.00233,"batcherId":34,"webhookUrl":"https://myCypherApp:3000/batchExecuted"}
local request=${1} local request=${1}
local response local response
@@ -150,38 +150,38 @@ addtobatch() {
trace "[addtobatch] amount=${amount}" trace "[addtobatch] amount=${amount}"
local label=$(echo "${request}" | jq ".outputLabel") local label=$(echo "${request}" | jq ".outputLabel")
trace "[addtobatch] label=${label}" trace "[addtobatch] label=${label}"
local batch_id=$(echo "${request}" | jq ".batchId") local batcher_id=$(echo "${request}" | jq ".batcherId")
trace "[addtobatch] batch_id=${batch_id}" trace "[addtobatch] batcher_id=${batcher_id}"
local batch_label=$(echo "${request}" | jq ".batchLabel") local batcher_label=$(echo "${request}" | jq ".batcherLabel")
trace "[addtobatch] batch_label=${batch_label}" trace "[addtobatch] batcher_label=${batcher_label}"
local webhook_url=$(echo "${request}" | jq ".webhookUrl") local webhook_url=$(echo "${request}" | jq ".webhookUrl")
trace "[addtobatch] webhook_url=${webhook_url}" trace "[addtobatch] webhook_url=${webhook_url}"
if [ "${batch_id}" = "null" ] && [ "${batch_label}" = "null" ]; then if [ "${batcher_id}" = "null" ] && [ "${batcher_label}" = "null" ]; then
# If batch_id and batch_label are null, use default batch # If batcher_id and batcher_label are null, use default batcher
trace "[addtobatch] Using default batch 1" trace "[addtobatch] Using default batcher 1"
batch_id=1 batcher_id=1
fi fi
if [ "${batch_id}" = "null" ]; then if [ "${batcher_id}" = "null" ]; then
# Using batch_label # Using batcher_label
batch_id=$(sql "SELECT id FROM batch WHERE label=${batch_label}") batcher_id=$(sql "SELECT id FROM batcher WHERE label=${batcher_label}")
returncode=$? returncode=$?
trace_rc ${returncode} trace_rc ${returncode}
fi fi
if [ -z "${batch_id}" ]; then if [ -z "${batcher_id}" ]; then
# batchLabel not found # batcherLabel not found
response='{"result":null,"error":{"code":-32700,"message":"batch not found","data":'${request}'}}' response='{"result":null,"error":{"code":-32700,"message":"batcher not found","data":'${request}'}}'
else else
inserted_id=$(sql "INSERT INTO recipient (address, amount, webhook_url, batch_id, label) VALUES (${address}, ${amount}, ${webhook_url}, ${batch_id}, ${label}); SELECT LAST_INSERT_ROWID();") inserted_id=$(sql "INSERT INTO recipient (address, amount, webhook_url, batcher_id, label) VALUES (${address}, ${amount}, ${webhook_url}, ${batcher_id}, ${label}); SELECT LAST_INSERT_ROWID();")
returncode=$? returncode=$?
trace_rc ${returncode} trace_rc ${returncode}
if [ "${returncode}" -ne 0 ]; then if [ "${returncode}" -ne 0 ]; then
response='{"result":null,"error":{"code":-32700,"message":"Could not add to batch","data":'${request}'}}' response='{"result":null,"error":{"code":-32700,"message":"Could not add to batch","data":'${request}'}}'
else else
row=$(sql "SELECT COUNT(id), MIN(inserted_ts), SUM(amount) FROM recipient WHERE tx_id IS NULL AND batch_id=${batch_id}") row=$(sql "SELECT COUNT(id), MIN(inserted_ts), SUM(amount) FROM recipient WHERE tx_id IS NULL AND batcher_id=${batcher_id}")
returncode=$? returncode=$?
trace_rc ${returncode} trace_rc ${returncode}
@@ -192,7 +192,7 @@ addtobatch() {
local total=$(echo "${row}" | cut -d '|' -f3) local total=$(echo "${row}" | cut -d '|' -f3)
trace "[addtobatch] total=${total}" trace "[addtobatch] total=${total}"
response='{"result":{"batchId":'${batch_id}',"outputId":'${inserted_id}',"nbOutputs":'${count}',"oldest":"'${oldest}'","pendingTotal":'${total}'},"error":null}' response='{"result":{"batcherId":'${batcher_id}',"outputId":'${inserted_id}',"nbOutputs":'${count}',"oldest":"'${oldest}'","pendingTotal":'${total}'},"error":null}'
fi fi
fi fi
@@ -219,7 +219,7 @@ removefrombatch() {
local response local response
local returncode=0 local returncode=0
local row local row
local batch_id local batcher_id
local id=$(echo "${request}" | jq ".outputId") local id=$(echo "${request}" | jq ".outputId")
trace "[removefrombatch] id=${id}" trace "[removefrombatch] id=${id}"
@@ -229,11 +229,11 @@ removefrombatch() {
trace "[removefrombatch] id missing" trace "[removefrombatch] id missing"
response='{"result":null,"error":{"code":-32700,"message":"outputId is required","data":'${request}'}}' response='{"result":null,"error":{"code":-32700,"message":"outputId is required","data":'${request}'}}'
else else
batch_id=$(sql "SELECT batch_id FROM recipient WHERE id=${id}") batcher_id=$(sql "SELECT batcher_id FROM recipient WHERE id=${id}")
returncode=$? returncode=$?
trace_rc ${returncode} trace_rc ${returncode}
if [ -n "${batch_id}" ]; then if [ -n "${batcher_id}" ]; then
sql "DELETE FROM recipient WHERE id=${id}" sql "DELETE FROM recipient WHERE id=${id}"
returncode=$? returncode=$?
trace_rc ${returncode} trace_rc ${returncode}
@@ -241,7 +241,7 @@ removefrombatch() {
if [ "${returncode}" -ne 0 ]; then if [ "${returncode}" -ne 0 ]; then
response='{"result":null,"error":{"code":-32700,"message":"Output was not removed","data":'${request}'}}' response='{"result":null,"error":{"code":-32700,"message":"Output was not removed","data":'${request}'}}'
else else
row=$(sql "SELECT COUNT(id), COALESCE(MIN(inserted_ts), 0), COALESCE(SUM(amount), 0.00000000) FROM recipient WHERE tx_id IS NULL AND batch_id=${batch_id}") row=$(sql "SELECT COUNT(id), COALESCE(MIN(inserted_ts), 0), COALESCE(SUM(amount), 0.00000000) FROM recipient WHERE tx_id IS NULL AND batcher_id=${batcher_id}")
returncode=$? returncode=$?
trace_rc ${returncode} trace_rc ${returncode}
@@ -252,7 +252,7 @@ removefrombatch() {
local total=$(echo "${row}" | cut -d '|' -f3) local total=$(echo "${row}" | cut -d '|' -f3)
trace "[removefrombatch] total=${total}" trace "[removefrombatch] total=${total}"
response='{"result":{"batchId":'${batch_id}',"nbOutputs":'${count}',"oldest":"'${oldest}'","pendingTotal":'${total}'},"error":null}' response='{"result":{"batcherId":'${batcher_id}',"nbOutputs":'${count}',"oldest":"'${oldest}'","pendingTotal":'${total}'},"error":null}'
fi fi
else else
response='{"result":null,"error":{"code":-32700,"message":"Output not found or already spent","data":'${request}'}}' response='{"result":null,"error":{"code":-32700,"message":"Output not found or already spent","data":'${request}'}}'
@@ -268,10 +268,10 @@ batchspend() {
# POST http://192.168.111.152:8080/batchspend # POST http://192.168.111.152:8080/batchspend
# #
# args: # args:
# - batchId, optional, id of the batch to spend, overrides batchLabel, default batch will be spent if not supplied # - batcherId, optional, id of the batcher to execute, overrides batcherLabel, default batcher will be spent if not supplied
# - batchLabel, optional, label of the batch to spend, default batch will be spent if not supplied # - batcherLabel, optional, label of the batcher to execute, default batcher will be executed if not supplied
# - confTarget, optional, overrides default value of createbatch, default to value of createbatch, default Bitcoin Core conf_target will be used if not supplied # - confTarget, optional, overrides default value of createbatcher, default to value of createbatcher, default Bitcoin Core conf_target will be used if not supplied
# NOTYET - feeRate, optional, overrides confTarget if supplied, overrides default value of createbatch, default to value of createbatch, default Bitcoin Core value will be used if not supplied # NOTYET - feeRate, optional, overrides confTarget if supplied, overrides default value of createbatcher, default to value of createbatcher, default Bitcoin Core value will be used if not supplied
# #
# response: # response:
# - txid, the txid of the batch # - txid, the txid of the batch
@@ -284,9 +284,9 @@ batchspend() {
# - outputs # - outputs
# #
# BODY {} # BODY {}
# BODY {"batchId":"34","confTarget":12} # BODY {"batcherId":"34","confTarget":12}
# NOTYET BODY {"batchLabel":"highfees","feeRate":233.7} # NOTYET BODY {"batcherLabel":"highfees","feeRate":233.7}
# BODY {"batchId":"411","confTarget":6} # BODY {"batcherId":"411","confTarget":6}
local request=${1} local request=${1}
local response local response
@@ -294,47 +294,47 @@ batchspend() {
local row local row
local whereclause local whereclause
local batch_id=$(echo "${request}" | jq ".batchId") local batcher_id=$(echo "${request}" | jq ".batcherId")
trace "[batchspend] batch_id=${batch_id}" trace "[batchspend] batcher_id=${batcher_id}"
local batch_label=$(echo "${request}" | jq ".batchLabel") local batcher_label=$(echo "${request}" | jq ".batcherLabel")
trace "[batchspend] batch_label=${batch_label}" trace "[batchspend] batcher_label=${batcher_label}"
local conf_target=$(echo "${request}" | jq ".confTarget") local conf_target=$(echo "${request}" | jq ".confTarget")
trace "[batchspend] conf_target=${conf_target}" trace "[batchspend] conf_target=${conf_target}"
local feerate=$(echo "${request}" | jq ".feeRate") local feerate=$(echo "${request}" | jq ".feeRate")
trace "[batchspend] feerate=${feerate}" trace "[batchspend] feerate=${feerate}"
if [ "${batch_id}" = "null" ] && [ "${batch_label}" = "null" ]; then if [ "${batcher_id}" = "null" ] && [ "${batcher_label}" = "null" ]; then
# If batch_id and batch_label are null, use default batch # If batcher_id and batcher_label are null, use default batcher
trace "[batchspend] Using default batch 1" trace "[batchspend] Using default batcher 1"
batch_id=1 batcher_id=1
fi fi
if [ "${batch_id}" = "null" ]; then if [ "${batcher_id}" = "null" ]; then
# Using batch_label # Using batcher_label
whereclause="label=${batch_label}" whereclause="label=${batcher_label}"
else else
whereclause="id=${batch_id}" whereclause="id=${batcher_id}"
fi fi
local batch=$(sql "SELECT id, conf_target, feerate FROM batch WHERE ${whereclause}") local batcher=$(sql "SELECT id, conf_target, feerate FROM batcher WHERE ${whereclause}")
returncode=$? returncode=$?
trace_rc ${returncode} trace_rc ${returncode}
if [ -z "${batch}" ]; then if [ -z "${batcher}" ]; then
# batchLabel not found # batcherLabel not found
response='{"result":null,"error":{"code":-32700,"message":"batch not found","data":'${request}'}}' response='{"result":null,"error":{"code":-32700,"message":"batcher not found","data":'${request}'}}'
else else
# All good, let's try to batch spend! # All good, let's try to batch spend!
# NOTYET # NOTYET
# We'll use supplied feerate # We'll use supplied feerate
# If not supplied, we'll use supplied conf_target # If not supplied, we'll use supplied conf_target
# If not supplied, we'll use batch default feerate # If not supplied, we'll use batcher default feerate
# If not set, we'll use batch default conf_target # If not set, we'll use batcher default conf_target
# If not set, default Bitcoin Core fee policy will be used # If not set, default Bitcoin Core fee policy will be used
# We'll use the supplied conf_target # We'll use the supplied conf_target
# If not supplied, we'll use the batch default conf_target # If not supplied, we'll use the batcher default conf_target
# If not set, default Bitcoin Core fee policy will be used # If not set, default Bitcoin Core fee policy will be used
# if [ "${feerate}" != "null" ]; then # if [ "${feerate}" != "null" ]; then
@@ -343,22 +343,22 @@ batchspend() {
# trace "[batchspend] Overriding conf_target=${conf_target}" # trace "[batchspend] Overriding conf_target=${conf_target}"
# else # else
# if [ "${conf_target}" = "null" ]; then # if [ "${conf_target}" = "null" ]; then
# feerate=$(echo "${batch}" | cut -d '|' -f3) # feerate=$(echo "${batcher}" | cut -d '|' -f3)
# if [ -z "${feerate}" ]; then # if [ -z "${feerate}" ]; then
# # If null, let's use batch conf_target # # If null, let's use batcher conf_target
# conf_target=$(echo "${batch}" | cut -d '|' -f2) # conf_target=$(echo "${batcher}" | cut -d '|' -f2)
# fi # fi
# fi # fi
# fi # fi
if [ "${conf_target}" = "null" ]; then if [ "${conf_target}" = "null" ]; then
conf_target=$(echo "${batch}" | cut -d '|' -f2) conf_target=$(echo "${batcher}" | cut -d '|' -f2)
trace "[batchspend] Using batch default conf_target=${conf_target}" trace "[batchspend] Using batcher default conf_target=${conf_target}"
fi fi
batch_id=$(echo "${batch}" | cut -d '|' -f1) batcher_id=$(echo "${batcher}" | cut -d '|' -f1)
local batching=$(sql "SELECT address, amount, id, webhook_url FROM recipient WHERE tx_id IS NULL AND batch_id=${batch_id}") local batching=$(sql "SELECT address, amount, id, webhook_url FROM recipient WHERE tx_id IS NULL AND batcher_id=${batcher_id}")
trace "[batchspend] batching=${batching}" trace "[batchspend] batching=${batching}"
local data local data
@@ -427,7 +427,7 @@ batchspend() {
echo "${tx_raw_details}" > batchspend-rawtx-${txid}.blob echo "${tx_raw_details}" > batchspend-rawtx-${txid}.blob
# Get the info on the batch before setting it to done # Get the info on the batch before setting it to done
row=$(sql "SELECT COUNT(id), COALESCE(MIN(inserted_ts), 0), COALESCE(SUM(amount), 0.00000000) FROM recipient WHERE tx_id IS NULL AND batch_id=${batch_id}") row=$(sql "SELECT COUNT(id), COALESCE(MIN(inserted_ts), 0), COALESCE(SUM(amount), 0.00000000) FROM recipient WHERE tx_id IS NULL AND batcher_id=${batcher_id}")
# Let's insert the txid in our little DB -- then we'll already have it when receiving confirmation # Let's insert the txid in our little DB -- then we'll already have it when receiving confirmation
id_inserted=$(sql "INSERT OR IGNORE INTO tx (txid, hash, confirmations, timereceived, fee, size, vsize, is_replaceable, raw_tx) VALUES (\"${txid}\", ${tx_hash}, 0, ${tx_ts_firstseen}, ${fees}, ${tx_size}, ${tx_vsize}, ${tx_replaceable}, readfile('batchspend-rawtx-${txid}.blob')); SELECT LAST_INSERT_ROWID();") id_inserted=$(sql "INSERT OR IGNORE INTO tx (txid, hash, confirmations, timereceived, fee, size, vsize, is_replaceable, raw_tx) VALUES (\"${txid}\", ${tx_hash}, 0, ${tx_ts_firstseen}, ${fees}, ${tx_size}, ${tx_vsize}, ${tx_replaceable}, readfile('batchspend-rawtx-${txid}.blob')); SELECT LAST_INSERT_ROWID();")
@@ -450,14 +450,14 @@ batchspend() {
local total=$(echo "${row}" | cut -d '|' -f3) local total=$(echo "${row}" | cut -d '|' -f3)
trace "[batchspend] total=${total}" trace "[batchspend] total=${total}"
response='{"result":{"batchId":'${batch_id}',"nbOutputs":'${count}',"oldest":"'${oldest}'","total":'${total} response='{"result":{"batcherId":'${batcher_id}',"nbOutputs":'${count}',"oldest":"'${oldest}'","total":'${total}
response="${response},\"txid\":\"${txid}\",\"hash\":${tx_hash},\"details\":{\"firstseen\":${tx_ts_firstseen},\"size\":${tx_size},\"vsize\":${tx_vsize},\"replaceable\":${tx_replaceable},\"fee\":${fees}},\"outputs\":{${recipientsjson}}}" response="${response},\"txid\":\"${txid}\",\"hash\":${tx_hash},\"details\":{\"firstseen\":${tx_ts_firstseen},\"size\":${tx_size},\"vsize\":${tx_vsize},\"replaceable\":${tx_replaceable},\"fee\":${fees}},\"outputs\":{${recipientsjson}}}"
response="${response},\"error\":null}" response="${response},\"error\":null}"
# Delete the temp file containing the raw tx (see above) # Delete the temp file containing the raw tx (see above)
rm batchspend-rawtx-${txid}.blob rm batchspend-rawtx-${txid}.blob
batch_webhooks "[${webhooks_data}]" '"batchId":'${batch_id}',"txid":"'${txid}'","hash":'${tx_hash}',"details":{"firstseen":'${tx_ts_firstseen}',"size":'${tx_size}',"vsize":'${tx_vsize}',"replaceable":'${tx_replaceable}',"fee":'${fees}'}' batch_webhooks "[${webhooks_data}]" '"batcherId":'${batcher_id}',"txid":"'${txid}'","hash":'${tx_hash}',"details":{"firstseen":'${tx_ts_firstseen}',"size":'${tx_size}',"vsize":'${tx_vsize}',"replaceable":'${tx_replaceable}',"fee":'${fees}'}'
else else
local message=$(echo "${data}" | jq -e ".error.message") local message=$(echo "${data}" | jq -e ".error.message")
@@ -477,7 +477,7 @@ batch_check_webhooks() {
local amount local amount
local recipient_id local recipient_id
local webhook_url local webhook_url
local batch_id local batcher_id
local txid local txid
local tx_hash local tx_hash
local tx_ts_firstseen local tx_ts_firstseen
@@ -486,7 +486,7 @@ batch_check_webhooks() {
local tx_replaceable local tx_replaceable
local fees local fees
local batching=$(sql "SELECT address, amount, r.id, webhook_url, b.id, t.txid, t.hash, t.timereceived, t.fee, t.size, t.vsize, t.is_replaceable FROM recipient r, batch b, tx t WHERE r.batch_id=b.id AND r.tx_id=t.id AND NOT calledback AND tx_id IS NOT NULL AND webhook_url IS NOT NULL") local batching=$(sql "SELECT address, amount, r.id, webhook_url, b.id, t.txid, t.hash, t.timereceived, t.fee, t.size, t.vsize, t.is_replaceable FROM recipient r, batcher b, tx t WHERE r.batcher_id=b.id AND r.tx_id=t.id AND NOT calledback AND tx_id IS NOT NULL AND webhook_url IS NOT NULL")
trace "[batch_check_webhooks] batching=${batching}" trace "[batch_check_webhooks] batching=${batching}"
local IFS=$'\n' local IFS=$'\n'
@@ -501,8 +501,8 @@ batch_check_webhooks() {
trace "[batch_check_webhooks] recipient_id=${recipient_id}" trace "[batch_check_webhooks] recipient_id=${recipient_id}"
webhook_url=$(echo "${row}" | cut -d '|' -f4) webhook_url=$(echo "${row}" | cut -d '|' -f4)
trace "[batch_check_webhooks] webhook_url=${webhook_url}" trace "[batch_check_webhooks] webhook_url=${webhook_url}"
batch_id=$(echo "${row}" | cut -d '|' -f5) batcher_id=$(echo "${row}" | cut -d '|' -f5)
trace "[batch_check_webhooks] batch_id=${batch_id}" trace "[batch_check_webhooks] batcher_id=${batcher_id}"
txid=$(echo "${row}" | cut -d '|' -f6) txid=$(echo "${row}" | cut -d '|' -f6)
trace "[batch_check_webhooks] txid=${txid}" trace "[batch_check_webhooks] txid=${txid}"
tx_hash=$(echo "${row}" | cut -d '|' -f7) tx_hash=$(echo "${row}" | cut -d '|' -f7)
@@ -520,7 +520,7 @@ batch_check_webhooks() {
webhooks_data="{\"outputId\":${recipient_id},\"address\":\"${address}\",\"amount\":${amount},\"webhookUrl\":\"${webhook_url}\"}" webhooks_data="{\"outputId\":${recipient_id},\"address\":\"${address}\",\"amount\":${amount},\"webhookUrl\":\"${webhook_url}\"}"
batch_webhooks "[${webhooks_data}]" '"batchId":'${batch_id}',"txid":"'${txid}'","hash":"'${tx_hash}'","details":{"firstseen":'${tx_ts_firstseen}',"size":'${tx_size}',"vsize":'${tx_vsize}',"replaceable":'${tx_replaceable}',"fee":'${fees}'}' batch_webhooks "[${webhooks_data}]" '"batcherId":'${batcher_id}',"txid":"'${txid}'","hash":"'${tx_hash}'","details":{"firstseen":'${tx_ts_firstseen}',"size":'${tx_size}',"vsize":'${tx_vsize}',"replaceable":'${tx_replaceable}',"fee":'${fees}'}'
done done
} }
@@ -533,7 +533,7 @@ batch_webhooks() {
trace "[batch_webhooks] webhooks_data=${webhooks_data}" trace "[batch_webhooks] webhooks_data=${webhooks_data}"
# tx: # tx:
# {"batchId":1,"txid":"abc123","hash":"abc123","details":{"firstseen":123123,"size":200,"vsize":141,"replaceable":true,"fee":0.00001}}' # {"batcherId":1,"txid":"abc123","hash":"abc123","details":{"firstseen":123123,"size":200,"vsize":141,"replaceable":true,"fee":0.00001}}'
local tx=${2} local tx=${2}
trace "[batch_webhooks] tx=${tx}" trace "[batch_webhooks] tx=${tx}"
@@ -589,30 +589,30 @@ batch_webhooks() {
trace_rc $? trace_rc $?
} }
listbatches() { listbatchers() {
trace "Entering listbatches()..." trace "Entering listbatchers()..."
# curl (GET) http://192.168.111.152:8080/listbatches # curl (GET) http://192.168.111.152:8080/listbatchers
# #
# {"result":[ # {"result":[
# {"batchId":1,"batchLabel":"default","confTarget":6,"nbOutputs":12,"oldest":123123,"pendingTotal":0.86990143}, # {"batcherId":1,"batcherLabel":"default","confTarget":6,"nbOutputs":12,"oldest":123123,"pendingTotal":0.86990143},
# {"batchId":2,"batchLabel":"lowfee","confTarget":32,"nbOutputs":44,"oldest":123123,"pendingTotal":0.49827387}, # {"batcherId":2,"batcherLabel":"lowfee","confTarget":32,"nbOutputs":44,"oldest":123123,"pendingTotal":0.49827387},
# {"batchId":3,"batchLabel":"highfee","confTarget":2,"nbOutputs":7,"oldest":123123,"pendingTotal":4.16843782} # {"batcherId":3,"batcherLabel":"highfee","confTarget":2,"nbOutputs":7,"oldest":123123,"pendingTotal":4.16843782}
# ], # ],
# "error":null} # "error":null}
local batches=$(sql "SELECT b.id, '{\"batchId\":' || b.id || ',\"batchLabel\":\"' || b.label || '\",\"confTarget\":' || conf_target || ',\"nbOutputs\":' || COUNT(r.id) || ',\"oldest\":\"' ||COALESCE(MIN(r.inserted_ts), 0) || '\",\"pendingTotal\":' ||COALESCE(SUM(amount), 0.00000000) || '}' FROM batch b LEFT JOIN recipient r ON r.batch_id=b.id AND r.tx_id IS NULL GROUP BY b.id") local batchers=$(sql "SELECT b.id, '{\"batcherId\":' || b.id || ',\"batcherLabel\":\"' || b.label || '\",\"confTarget\":' || conf_target || ',\"nbOutputs\":' || COUNT(r.id) || ',\"oldest\":\"' ||COALESCE(MIN(r.inserted_ts), 0) || '\",\"pendingTotal\":' ||COALESCE(SUM(amount), 0.00000000) || '}' FROM batcher b LEFT JOIN recipient r ON r.batcher_id=b.id AND r.tx_id IS NULL GROUP BY b.id")
trace "[listbatches] batches=${batches}" trace "[listbatchers] batchers=${batchers}"
local returncode local returncode
local response local response
local batch local batcher
local jsonstring local jsonstring
local IFS=$'\n' local IFS=$'\n'
for batch in ${batches} for batcher in ${batchers}
do do
jsonstring=$(echo ${batch} | cut -d '|' -f2) jsonstring=$(echo ${batcher} | cut -d '|' -f2)
if [ -z "${response}" ]; then if [ -z "${response}" ]; then
response='{"result":['${jsonstring} response='{"result":['${jsonstring}
else else
@@ -621,58 +621,58 @@ listbatches() {
done done
response=${response}'],"error":null}' response=${response}'],"error":null}'
trace "[listbatches] responding=${response}" trace "[listbatchers] responding=${response}"
echo "${response}" echo "${response}"
} }
getbatch() { getbatcher() {
trace "Entering getbatch()..." trace "Entering getbatcher()..."
# POST (GET) http://192.168.111.152:8080/getbatch # POST (GET) http://192.168.111.152:8080/getbatcher
# #
# args: # args:
# - batchId, optional, id of the batch to spend, overrides batchLabel, default batch will be spent if not supplied # - batcherId, optional, id of the batcher, overrides batcerhLabel, default batcher will be used if not supplied
# - batchLabel, optional, label of the batch to spend, default batch will be spent if not supplied # - batcherLabel, optional, label of the batcher, default batcher will be used if not supplied
# #
# response: # response:
# {"result":{"batchId":1,"batchLabel":"default","confTarget":6,"nbOutputs":12,"oldest":123123,"pendingTotal":0.86990143},"error":null} # {"result":{"batcherId":1,"batcherLabel":"default","confTarget":6,"nbOutputs":12,"oldest":123123,"pendingTotal":0.86990143},"error":null}
# #
# BODY {} # BODY {}
# BODY {"batchId":34} # BODY {"batcherId":34}
local request=${1} local request=${1}
local response local response
local returncode=0 local returncode=0
local batch local batcher
local whereclause local whereclause
local batch_id=$(echo "${request}" | jq ".batchId") local batcher_id=$(echo "${request}" | jq ".batcherId")
trace "[getbatch] batch_id=${batch_id}" trace "[getbatcher] batcher_id=${batcher_id}"
local batch_label=$(echo "${request}" | jq ".batchLabel") local batcher_label=$(echo "${request}" | jq ".batcherLabel")
trace "[getbatch] batch_label=${batch_label}" trace "[getbatcher] batcher_label=${batcher_label}"
if [ "${batch_id}" = "null" ] && [ "${batch_label}" = "null" ]; then if [ "${batcher_id}" = "null" ] && [ "${batcher_label}" = "null" ]; then
# If batch_id and batch_label are null, use default batch # If batcher_id and batcher_label are null, use default batcher
trace "[getbatch] Using default batch 1" trace "[getbatcher] Using default batcher 1"
batch_id=1 batcher_id=1
fi fi
if [ "${batch_id}" = "null" ]; then if [ "${batcher_id}" = "null" ]; then
# Using batch_label # Using batcher_label
whereclause="b.label=${batch_label}" whereclause="b.label=${batcher_label}"
else else
# Using batch_id # Using batcher_id
whereclause="b.id=${batch_id}" whereclause="b.id=${batcher_id}"
fi fi
batch=$(sql "SELECT b.id, '{\"batchId\":' || b.id || ',\"batchLabel\":\"' || b.label || '\",\"confTarget\":' || conf_target || ',\"nbOutputs\":' || COUNT(r.id) || ',\"oldest\":\"' ||COALESCE(MIN(r.inserted_ts), 0) || '\",\"pendingTotal\":' ||COALESCE(SUM(amount), 0.00000000) || '}' FROM batch b LEFT JOIN recipient r ON r.batch_id=b.id AND r.tx_id IS NULL WHERE ${whereclause} GROUP BY b.id") batcher=$(sql "SELECT b.id, '{\"batcherId\":' || b.id || ',\"batcherLabel\":\"' || b.label || '\",\"confTarget\":' || conf_target || ',\"nbOutputs\":' || COUNT(r.id) || ',\"oldest\":\"' ||COALESCE(MIN(r.inserted_ts), 0) || '\",\"pendingTotal\":' ||COALESCE(SUM(amount), 0.00000000) || '}' FROM batcher b LEFT JOIN recipient r ON r.batcher_id=b.id AND r.tx_id IS NULL WHERE ${whereclause} GROUP BY b.id")
trace "[getbatch] batch=${batch}" trace "[getbatcher] batcher=${batcher}"
if [ -n "${batch}" ]; then if [ -n "${batcher}" ]; then
batch=$(echo "${batch}" | cut -d '|' -f2) batcher=$(echo "${batcher}" | cut -d '|' -f2)
response='{"result":'${batch}',"error":null}' response='{"result":'${batcher}',"error":null}'
else else
response='{"result":null,"error":{"code":-32700,"message":"batch not found","data":'${request}'}}' response='{"result":null,"error":{"code":-32700,"message":"batcher not found","data":'${request}'}}'
fi fi
echo "${response}" echo "${response}"
@@ -684,15 +684,15 @@ getbatchdetails() {
# POST (GET) http://192.168.111.152:8080/getbatchdetails # POST (GET) http://192.168.111.152:8080/getbatchdetails
# #
# args: # args:
# - batchId, optional, id of the batch to spend, overrides batchLabel, default batch will be spent if not supplied # - batcherId, optional, id of the batcher, overrides batcherLabel, default batcher will be used if not supplied
# - batchLabel, optional, label of the batch to spend, default batch will be spent if not supplied # - batcherLabel, optional, label of the batcher, default batcher will be used if not supplied
# - txid, optional, if you want the details of an executed batch, supply the batch txid, will return current pending batch # - txid, optional, if you want the details of an executed batch, supply the batch txid, will return current pending batch
# if not supplied # if not supplied
# #
# response: # response:
# {"result":{ # {"result":{
# "batchId":34, # "batcherId":34,
# "batchLabel":"Special batch for a special client", # "batcherLabel":"Special batcher for a special client",
# "confTarget":6, # "confTarget":6,
# "nbOutputs":83, # "nbOutputs":83,
# "oldest":123123, # "oldest":123123,
@@ -715,7 +715,7 @@ getbatchdetails() {
# },"error":null} # },"error":null}
# #
# BODY {} # BODY {}
# BODY {"batchId":34} # BODY {"batcherId":34}
local request=${1} local request=${1}
local response local response
@@ -725,25 +725,25 @@ getbatchdetails() {
local outputsjson local outputsjson
local whereclause local whereclause
local batch_id=$(echo "${request}" | jq ".batchId") local batcher_id=$(echo "${request}" | jq ".batcherId")
trace "[getbatchdetails] batch_id=${batch_id}" trace "[getbatchdetails] batcher_id=${batcher_id}"
local batch_label=$(echo "${request}" | jq ".batchLabel") local batcher_label=$(echo "${request}" | jq ".batcherLabel")
trace "[getbatchdetails] batch_label=${batch_label}" trace "[getbatchdetails] batcher_label=${batcher_label}"
local txid=$(echo "${request}" | jq ".txid") local txid=$(echo "${request}" | jq ".txid")
trace "[getbatchdetails] txid=${txid}" trace "[getbatchdetails] txid=${txid}"
if [ "${batch_id}" = "null" ] && [ "${batch_label}" = "null" ]; then if [ "${batcher_id}" = "null" ] && [ "${batcher_label}" = "null" ]; then
# If batch_id and batch_label are null, use default batch # If batcher_id and batcher_label are null, use default batcher
trace "[getbatchdetails] Using default batch 1" trace "[getbatchdetails] Using default batcher 1"
batch_id=1 batcher_id=1
fi fi
if [ "${batch_id}" = "null" ]; then if [ "${batcher_id}" = "null" ]; then
# Using batch_label # Using batcher_label
whereclause="b.label=${batch_label}" whereclause="b.label=${batcher_label}"
else else
# Using batch_id # Using batcher_id
whereclause="b.id=${batch_id}" whereclause="b.id=${batcher_id}"
fi fi
if [ "${txid}" != "null" ]; then if [ "${txid}" != "null" ]; then
@@ -756,7 +756,7 @@ getbatchdetails() {
fi fi
# First get the batch summary # First get the batch summary
batch=$(sql "SELECT b.id, COALESCE(t.id, 0), '{\"batchId\":' || b.id || ',\"batchLabel\":\"' || b.label || '\",\"confTarget\":' || conf_target || ',\"nbOutputs\":' || COUNT(r.id) || ',\"oldest\":\"' ||COALESCE(MIN(r.inserted_ts), 0) || '\",\"total\":' ||COALESCE(SUM(amount), 0.00000000) FROM batch b LEFT JOIN recipient r ON r.batch_id=b.id ${outerclause} LEFT JOIN tx t ON t.id=r.tx_id WHERE ${whereclause} GROUP BY b.id") batch=$(sql "SELECT b.id, COALESCE(t.id, 0), '{\"batcherId\":' || b.id || ',\"batcherLabel\":\"' || b.label || '\",\"confTarget\":' || conf_target || ',\"nbOutputs\":' || COUNT(r.id) || ',\"oldest\":\"' ||COALESCE(MIN(r.inserted_ts), 0) || '\",\"total\":' ||COALESCE(SUM(amount), 0.00000000) FROM batcher b LEFT JOIN recipient r ON r.batcher_id=b.id ${outerclause} LEFT JOIN tx t ON t.id=r.tx_id WHERE ${whereclause} GROUP BY b.id")
trace "[getbatchdetails] batch=${batch}" trace "[getbatchdetails] batch=${batch}"
if [ -n "${batch}" ]; then if [ -n "${batch}" ]; then
@@ -775,8 +775,8 @@ getbatchdetails() {
tx=$(sql "SELECT '\"txid\":\"' || txid || '\",\"hash\":\"' || hash || '\",\"details\":{\"firstseen\":' || timereceived || ',\"size\":' || size || ',\"vsize\":' || vsize || ',\"replaceable\":' || is_replaceable || ',\"fee\":' || fee || '}' FROM tx WHERE id=${tx_id}") tx=$(sql "SELECT '\"txid\":\"' || txid || '\",\"hash\":\"' || hash || '\",\"details\":{\"firstseen\":' || timereceived || ',\"size\":' || size || ',\"vsize\":' || vsize || ',\"replaceable\":' || is_replaceable || ',\"fee\":' || fee || '}' FROM tx WHERE id=${tx_id}")
batch_id=$(echo "${batch}" | cut -d '|' -f1) batcher_id=$(echo "${batch}" | cut -d '|' -f1)
outputs=$(sql "SELECT '{\"outputId\":' || id || ',\"outputLabel\":\"' || COALESCE(label, '') || '\",\"address\":\"' || address || '\",\"amount\":' || amount || ',\"addedTimestamp\":\"' || inserted_ts || '\"}' FROM recipient r WHERE batch_id=${batch_id} ${outerclause}") outputs=$(sql "SELECT '{\"outputId\":' || id || ',\"outputLabel\":\"' || COALESCE(label, '') || '\",\"address\":\"' || address || '\",\"amount\":' || amount || ',\"addedTimestamp\":\"' || inserted_ts || '\"}' FROM recipient r WHERE batcher_id=${batcher_id} ${outerclause}")
local output local output
local IFS=$'\n' local IFS=$'\n'
@@ -806,18 +806,18 @@ getbatchdetails() {
} }
# curl localhost:8888/listbatches | jq # curl localhost:8888/listbatchers | jq
# curl -d '{}' localhost:8888/getbatch | jq # curl -d '{}' localhost:8888/getbatcher | jq
# curl -d '{}' localhost:8888/getbatchdetails | jq # curl -d '{}' localhost:8888/getbatchdetails | jq
# curl -d '{"outputLabel":"test002","address":"1abd","amount":0.0002}' localhost:8888/addtobatch | jq # curl -d '{"outputLabel":"test002","address":"1abd","amount":0.0002}' localhost:8888/addtobatch | jq
# curl -d '{}' localhost:8888/batchspend | jq # curl -d '{}' localhost:8888/batchspend | jq
# curl -d '{"outputId":1}' localhost:8888/removefrombatch | jq # curl -d '{"outputId":1}' localhost:8888/removefrombatch | jq
# curl -d '{"batchLabel":"lowfees","confTarget":32}' localhost:8888/createbatch | jq # curl -d '{"batcherLabel":"lowfees","confTarget":32}' localhost:8888/createbatcher | jq
# curl localhost:8888/listbatches | jq # curl localhost:8888/listbatchers | jq
# curl -d '{"batchLabel":"lowfees"}' localhost:8888/getbatch | jq # curl -d '{"batcherLabel":"lowfees"}' localhost:8888/getbatcher | jq
# curl -d '{"batchLabel":"lowfees"}' localhost:8888/getbatchdetails | jq # curl -d '{"batcherLabel":"lowfees"}' localhost:8888/getbatchdetails | jq
# curl -d '{"batchLabel":"lowfees","outputLabel":"test002","address":"1abd","amount":0.0002}' localhost:8888/addtobatch | jq # curl -d '{"batcherLabel":"lowfees","outputLabel":"test002","address":"1abd","amount":0.0002}' localhost:8888/addtobatch | jq
# curl -d '{"batchLabel":"lowfees"}' localhost:8888/batchspend | jq # curl -d '{"batcherLabel":"lowfees"}' localhost:8888/batchspend | jq
# curl -d '{"batchLabel":"lowfees","outputId":9}' localhost:8888/removefrombatch | jq # curl -d '{"batcherLabel":"lowfees","outputId":9}' localhost:8888/removefrombatch | jq

View File

@@ -301,45 +301,45 @@ main() {
response_to_client "${response}" ${?} response_to_client "${response}" ${?}
break break
;; ;;
createbatch) createbatcher)
# POST http://192.168.111.152:8080/createbatch # POST http://192.168.111.152:8080/createbatcher
# #
# args: # args:
# - batchLabel, optional, id can be used to reference the batch # - batcherLabel, optional, id can be used to reference the batcher
# - confTarget, optional, overriden by batchspend's confTarget, default Bitcoin Core conf_target will be used if not supplied # - confTarget, optional, overriden by batchspend's confTarget, default Bitcoin Core conf_target will be used if not supplied
# NOTYET - feeRate, sat/vB, optional, overrides confTarget if supplied, overriden by batchspend's feeRate, default Bitcoin Core fee policy will be used if not supplied # NOTYET - feeRate, sat/vB, optional, overrides confTarget if supplied, overriden by batchspend's feeRate, default Bitcoin Core fee policy will be used if not supplied
# #
# response: # response:
# - batchId, the batch id # - batcherId, the batcher id
# #
# BODY {"batchLabel":"lowfees","confTarget":32} # BODY {"batcherLabel":"lowfees","confTarget":32}
# NOTYET BODY {"batchLabel":"highfees","feeRate":231.8} # NOTYET BODY {"batcherLabel":"highfees","feeRate":231.8}
response=$(createbatch "${line}") response=$(createbatcher "${line}")
response_to_client "${response}" ${?} response_to_client "${response}" ${?}
break break
;; ;;
updatebatch) updatebatcher)
# POST http://192.168.111.152:8080/updatebatch # POST http://192.168.111.152:8080/updatebatcher
# #
# args: # args:
# - batchId, optional, batch id to update, will update default batch if not supplied # - batcherId, optional, batcher id to update, will update default batcher if not supplied
# - batchLabel, optional, id can be used to reference the batch, will update default batch if not supplied, if id is present then change the label with supplied text # - batcherLabel, optional, id can be used to reference the batcher, will update default batcher if not supplied, if id is present then change the label with supplied text
# - confTarget, optional, new confirmation target for the batch # - confTarget, optional, new confirmation target for the batcher
# NOTYET - feeRate, sat/vB, optional, new feerate for the batch # NOTYET - feeRate, sat/vB, optional, new feerate for the batcher
# #
# response: # response:
# - batchId, the batch id # - batcherId, the batcher id
# - batchLabel, the batch label # - batcherLabel, the batcher label
# - confTarget, the batch default confirmation target # - confTarget, the batcher default confirmation target
# NOTYET - feeRate, the batch default feerate # NOTYET - feeRate, the batcher default feerate
# #
# BODY {"batchId":5,"confTarget":12} # BODY {"batcherId":5,"confTarget":12}
# NOTYET BODY {"batchLabel":"highfees","feeRate":400} # NOTYET BODY {"batcherLabel":"highfees","feeRate":400}
# NOTYET BODY {"batchId":3,"label":"ultrahighfees","feeRate":800} # NOTYET BODY {"batcherId":3,"label":"ultrahighfees","feeRate":800}
# BODY {"batchLabel":"fast","confTarget":2} # BODY {"batcherLabel":"fast","confTarget":2}
response=$(updatebatch "${line}") response=$(updatebatcher "${line}")
response_to_client "${response}" ${?} response_to_client "${response}" ${?}
break break
;; ;;
@@ -350,8 +350,8 @@ main() {
# - address, required, desination address # - address, required, desination address
# - amount, required, amount to send to the destination address # - amount, required, amount to send to the destination address
# - outputLabel, optional, if you want to reference this output # - outputLabel, optional, if you want to reference this output
# - batchId, optional, the id of the batch to which the output will be added, default batch if not supplied, overrides batchLabel # - batcherId, optional, the id of the batcher to which the output will be added, default batcher if not supplied, overrides batcherLabel
# - batchLabel, optional, the label of the batch to which the output will be added, default batch if not supplied # - batcherLabel, optional, the label of the batcher to which the output will be added, default batcher if not supplied
# - webhookUrl, optional, the webhook to call when the batch is broadcast # - webhookUrl, optional, the webhook to call when the batch is broadcast
# #
# response: # response:
@@ -361,9 +361,9 @@ main() {
# - pendingTotal, the current sum of the batch's output amounts # - pendingTotal, the current sum of the batch's output amounts
# #
# BODY {"address":"2N8DcqzfkYi8CkYzvNNS5amoq3SbAcQNXKp","amount":0.00233} # BODY {"address":"2N8DcqzfkYi8CkYzvNNS5amoq3SbAcQNXKp","amount":0.00233}
# BODY {"address":"2N8DcqzfkYi8CkYzvNNS5amoq3SbAcQNXKp","amount":0.00233,"batchId":34,"webhookUrl":"https://myCypherApp:3000/batchExecuted"} # BODY {"address":"2N8DcqzfkYi8CkYzvNNS5amoq3SbAcQNXKp","amount":0.00233,"batcherId":34,"webhookUrl":"https://myCypherApp:3000/batchExecuted"}
# BODY {"address":"2N8DcqzfkYi8CkYzvNNS5amoq3SbAcQNXKp","amount":0.00233,"batchLabel":"lowfees","webhookUrl":"https://myCypherApp:3000/batchExecuted"} # BODY {"address":"2N8DcqzfkYi8CkYzvNNS5amoq3SbAcQNXKp","amount":0.00233,"batcherLabel":"lowfees","webhookUrl":"https://myCypherApp:3000/batchExecuted"}
# BODY {"address":"2N8DcqzfkYi8CkYzvNNS5amoq3SbAcQNXKp","amount":0.00233,"batchId":34,"webhookUrl":"https://myCypherApp:3000/batchExecuted"} # BODY {"address":"2N8DcqzfkYi8CkYzvNNS5amoq3SbAcQNXKp","amount":0.00233,"batcherId":34,"webhookUrl":"https://myCypherApp:3000/batchExecuted"}
response=$(addtobatch "${line}") response=$(addtobatch "${line}")
response_to_client "${response}" ${?} response_to_client "${response}" ${?}
@@ -391,10 +391,10 @@ main() {
# POST http://192.168.111.152:8080/batchspend # POST http://192.168.111.152:8080/batchspend
# #
# args: # args:
# - batchId, optional, id of the batch to spend, overrides batchLabel, default batch will be spent if not supplied # - batcherId, optional, id of the batcher to execute, overrides batcherLabel, default batcher will be spent if not supplied
# - batchLabel, optional, label of the batch to spend, default batch will be spent if not supplied # - batcherLabel, optional, label of the batcher to execute, default batcher will be executed if not supplied
# - confTarget, optional, overrides default value of createbatch, default to value of createbatch, default Bitcoin Core conf_target will be used if not supplied # - confTarget, optional, overrides default value of createbatcher, default to value of createbatcher, default Bitcoin Core conf_target will be used if not supplied
# NOTYET - feeRate, optional, overrides confTarget if supplied, overrides default value of createbatch, default to value of createbatch, default Bitcoin Core value will be used if not supplied # NOTYET - feeRate, optional, overrides confTarget if supplied, overrides default value of createbatcher, default to value of createbatcher, default Bitcoin Core value will be used if not supplied
# #
# response: # response:
# - txid, the transaction txid # - txid, the transaction txid
@@ -406,8 +406,8 @@ main() {
# - outputs # - outputs
# #
# {"result":{ # {"result":{
# "batchId":34, # "batcherId":34,
# "batchLabel":"Special batch for a special client", # "batcherLabel":"Special batcher for a special client",
# "confTarget":6, # "confTarget":6,
# "nbOutputs":83, # "nbOutputs":83,
# "oldest":123123, # "oldest":123123,
@@ -431,28 +431,28 @@ main() {
# },"error":null} # },"error":null}
# #
# BODY {} # BODY {}
# BODY {"batchId":34,"confTarget":12} # BODY {"batcherId":34,"confTarget":12}
# NOTYET BODY {"batchLabel":"highfees","feeRate":233.7} # NOTYET BODY {"batcherLabel":"highfees","feeRate":233.7}
# BODY {"batchId":411,"confTarget":6} # BODY {"batcherId":411,"confTarget":6}
response=$(batchspend "${line}") response=$(batchspend "${line}")
response_to_client "${response}" ${?} response_to_client "${response}" ${?}
break break
;; ;;
getbatch) getbatcher)
# POST (GET) http://192.168.111.152:8080/getbatch # POST (GET) http://192.168.111.152:8080/getbatcher
# #
# args: # args:
# - batchId, optional, id of the batch to spend, overrides batchLabel, default batch will be spent if not supplied # - batcherId, optional, id of the batcher, overrides batcherLabel, default batcher will be used if not supplied
# - batchLabel, optional, label of the batch to spend, default batch will be spent if not supplied # - batcherLabel, optional, label of the batcher, default batcher will be used if not supplied
# #
# response: # response:
# {"result":{"batchId":1,"batchLabel":"default","confTarget":6,"nbOutputs":12,"oldest":123123,"pendingTotal":0.86990143},"error":null} # {"result":{"batcherId":1,"batcherLabel":"default","confTarget":6,"nbOutputs":12,"oldest":123123,"pendingTotal":0.86990143},"error":null}
# #
# BODY {} # BODY {}
# BODY {"batchId":34} # BODY {"batcherId":34}
response=$(getbatch "${line}") response=$(getbatcher "${line}")
response_to_client "${response}" ${?} response_to_client "${response}" ${?}
break break
;; ;;
@@ -460,15 +460,15 @@ main() {
# POST (GET) http://192.168.111.152:8080/getbatchdetails # POST (GET) http://192.168.111.152:8080/getbatchdetails
# #
# args: # args:
# - batchId, optional, id of the batch to spend, overrides batchLabel, default batch will be spent if not supplied # - batcherId, optional, id of the batcher, overrides batcherLabel, default batcher will be spent if not supplied
# - batchLabel, optional, label of the batch to spend, default batch will be spent if not supplied # - batcherLabel, optional, label of the batcher, default batcher will be used if not supplied
# - txid, optional, if you want the details of an executed batch, supply the batch txid, will return current pending batch # - txid, optional, if you want the details of an executed batch, supply the batch txid, will return current pending batch
# if not supplied # if not supplied
# #
# response: # response:
# {"result":{ # {"result":{
# "batchId":34, # "batcherId":34,
# "batchLabel":"Special batch for a special client", # "batcherLabel":"Special batcher for a special client",
# "confTarget":6, # "confTarget":6,
# "nbOutputs":83, # "nbOutputs":83,
# "oldest":123123, # "oldest":123123,
@@ -492,24 +492,24 @@ main() {
# },"error":null} # },"error":null}
# #
# BODY {} # BODY {}
# BODY {"batchId":34} # BODY {"batcherId":34}
response=$(getbatchdetails "${line}") response=$(getbatchdetails "${line}")
response_to_client "${response}" ${?} response_to_client "${response}" ${?}
break break
;; ;;
listbatches) listbatchers)
# curl (GET) http://192.168.111.152:8080/listbatches # curl (GET) http://192.168.111.152:8080/listbatchers
# #
# response: # response:
# {"result":[ # {"result":[
# {"batchId":1,"batchLabel":"default","confTarget":6,"nbOutputs":12,"oldest":123123,"pendingTotal":0.86990143}, # {"batcherId":1,"batcherLabel":"default","confTarget":6,"nbOutputs":12,"oldest":123123,"pendingTotal":0.86990143},
# {"batchId":2,"batchLabel":"lowfee","confTarget":32,"nbOutputs":44,"oldest":123123,"pendingTotal":0.49827387}, # {"batcherId":2,"batcherLabel":"lowfee","confTarget":32,"nbOutputs":44,"oldest":123123,"pendingTotal":0.49827387},
# {"batchId":3,"batchLabel":"highfee","confTarget":2,"nbOutputs":7,"oldest":123123,"pendingTotal":4.16843782} # {"batcherId":3,"batcherLabel":"highfee","confTarget":2,"nbOutputs":7,"oldest":123123,"pendingTotal":4.16843782}
# ], # ],
# "error":null} # "error":null}
response=$(listbatches) response=$(listbatchers)
response_to_client "${response}" ${?} response_to_client "${response}" ${?}
break break
;; ;;

View File

@@ -1,20 +1,20 @@
#!/bin/sh #!/bin/sh
# curl localhost:8888/listbatches | jq # curl localhost:8888/listbatchers | jq
# curl -d '{}' localhost:8888/getbatch | jq # curl -d '{}' localhost:8888/getbatcher | jq
# curl -d '{}' localhost:8888/getbatchdetails | jq # curl -d '{}' localhost:8888/getbatchdetails | jq
# curl -d '{"outputLabel":"test002","address":"1abd","amount":0.0002}' localhost:8888/addtobatch | jq # curl -d '{"outputLabel":"test002","address":"1abd","amount":0.0002}' localhost:8888/addtobatch | jq
# curl -d '{}' localhost:8888/batchspend | jq # curl -d '{}' localhost:8888/batchspend | jq
# curl -d '{"outputId":1}' localhost:8888/removefrombatch | jq # curl -d '{"outputId":1}' localhost:8888/removefrombatch | jq
# curl -d '{"batchLabel":"lowfees","confTarget":32}' localhost:8888/createbatch | jq # curl -d '{"batcherLabel":"lowfees","confTarget":32}' localhost:8888/createbatcher | jq
# curl localhost:8888/listbatches | jq # curl localhost:8888/listbatchers | jq
# curl -d '{"batchLabel":"lowfees"}' localhost:8888/getbatch | jq # curl -d '{"batcherLabel":"lowfees"}' localhost:8888/getbatcher | jq
# curl -d '{"batchLabel":"lowfees"}' localhost:8888/getbatchdetails | jq # curl -d '{"batcherLabel":"lowfees"}' localhost:8888/getbatchdetails | jq
# curl -d '{"batchLabel":"lowfees","outputLabel":"test002","address":"1abd","amount":0.0002}' localhost:8888/addtobatch | jq # curl -d '{"batcherLabel":"lowfees","outputLabel":"test002","address":"1abd","amount":0.0002}' localhost:8888/addtobatch | jq
# curl -d '{"batchLabel":"lowfees"}' localhost:8888/batchspend | jq # curl -d '{"batcherLabel":"lowfees"}' localhost:8888/batchspend | jq
# curl -d '{"batchLabel":"lowfees","outputId":9}' localhost:8888/removefrombatch | jq # curl -d '{"batcherLabel":"lowfees","outputId":9}' localhost:8888/removefrombatch | jq
testbatching() { testbatching() {
local response local response
@@ -32,42 +32,42 @@ testbatching() {
local url2="$(hostname):1112/callback" local url2="$(hostname):1112/callback"
echo "url2=${url2}" echo "url2=${url2}"
# List batches (should show at least empty default batch) # List batchers (should show at least empty default batcher)
echo "Testing listbatches..." echo "Testing listbatchers..."
response=$(curl -s proxy:8888/listbatches) response=$(curl -s proxy:8888/listbatchers)
echo "response=${response}" echo "response=${response}"
id=$(echo "${response}" | jq ".result[0].batchId") id=$(echo "${response}" | jq ".result[0].batcherId")
echo "batchId=${id}" echo "batcherId=${id}"
if [ "${id}" -ne "1" ]; then if [ "${id}" -ne "1" ]; then
exit 10 exit 10
fi fi
echo "Tested listbatches." echo "Tested listbatchers."
# getbatch the default batch # getbatcher the default batcher
echo "Testing getbatch..." echo "Testing getbatcher..."
response=$(curl -sd '{}' localhost:8888/getbatch) response=$(curl -sd '{}' localhost:8888/getbatcher)
echo "response=${response}" echo "response=${response}"
data=$(echo "${response}" | jq -r ".result.batchLabel") data=$(echo "${response}" | jq -r ".result.batcherLabel")
echo "batchLabel=${data}" echo "batcherLabel=${data}"
if [ "${data}" != "default" ]; then if [ "${data}" != "default" ]; then
exit 20 exit 20
fi fi
response=$(curl -sd '{"batchId":1}' localhost:8888/getbatch) response=$(curl -sd '{"batcherId":1}' localhost:8888/getbatcher)
echo "response=${response}" echo "response=${response}"
data=$(echo "${response}" | jq -r ".result.batchLabel") data=$(echo "${response}" | jq -r ".result.batcherLabel")
echo "batchLabel=${data}" echo "batcherLabel=${data}"
if [ "${data}" != "default" ]; then if [ "${data}" != "default" ]; then
exit 25 exit 25
fi fi
echo "Tested getbatch." echo "Tested getbatcher."
# getbatchdetails the default batch # getbatchdetails the default batcher
echo "Testing getbatchdetails..." echo "Testing getbatchdetails..."
response=$(curl -sd '{}' localhost:8888/getbatchdetails) response=$(curl -sd '{}' localhost:8888/getbatchdetails)
echo "response=${response}" echo "response=${response}"
data=$(echo "${response}" | jq -r ".result.batchLabel") data=$(echo "${response}" | jq -r ".result.batcherLabel")
echo "batchLabel=${data}" echo "batcherLabel=${data}"
if [ "${data}" != "default" ]; then if [ "${data}" != "default" ]; then
exit 30 exit 30
fi fi
@@ -76,10 +76,10 @@ testbatching() {
exit 32 exit 32
fi fi
response=$(curl -sd '{"batchId":1}' localhost:8888/getbatchdetails) response=$(curl -sd '{"batcherId":1}' localhost:8888/getbatchdetails)
echo "response=${response}" echo "response=${response}"
data=$(echo "${response}" | jq -r ".result.batchLabel") data=$(echo "${response}" | jq -r ".result.batcherLabel")
echo "batchLabel=${data}" echo "batcherLabel=${data}"
if [ "${data}" != "default" ]; then if [ "${data}" != "default" ]; then
exit 35 exit 35
fi fi
@@ -89,12 +89,12 @@ testbatching() {
fi fi
echo "Tested getbatchdetails." echo "Tested getbatchdetails."
# addtobatch to default batch # addtobatch to default batcher
echo "Testing addtobatch..." echo "Testing addtobatch..."
response=$(curl -sd '{"outputLabel":"test001","address":"test001","amount":0.001}' localhost:8888/addtobatch) response=$(curl -sd '{"outputLabel":"test001","address":"test001","amount":0.001}' localhost:8888/addtobatch)
echo "response=${response}" echo "response=${response}"
id=$(echo "${response}" | jq ".result.batchId") id=$(echo "${response}" | jq ".result.batcherId")
echo "batchId=${id}" echo "batcherId=${id}"
if [ "${id}" -ne "1" ]; then if [ "${id}" -ne "1" ]; then
exit 40 exit 40
fi fi
@@ -104,10 +104,10 @@ testbatching() {
fi fi
echo "outputId=${id}" echo "outputId=${id}"
response=$(curl -sd '{"batchId":1,"outputLabel":"test002","address":"test002","amount":0.002}' localhost:8888/addtobatch) response=$(curl -sd '{"batcherId":1,"outputLabel":"test002","address":"test002","amount":0.002}' localhost:8888/addtobatch)
echo "response=${response}" echo "response=${response}"
id2=$(echo "${response}" | jq ".result.batchId") id2=$(echo "${response}" | jq ".result.batcherId")
echo "batchId=${id2}" echo "batcherId=${id2}"
if [ "${id2}" -ne "1" ]; then if [ "${id2}" -ne "1" ]; then
exit 40 exit 40
fi fi
@@ -118,7 +118,7 @@ testbatching() {
echo "outputId=${id2}" echo "outputId=${id2}"
echo "Tested addtobatch." echo "Tested addtobatch."
# batchspend default batch # batchspend default batcher
echo "Testing batchspend..." echo "Testing batchspend..."
response=$(curl -sd '{}' localhost:8888/batchspend) response=$(curl -sd '{}' localhost:8888/batchspend)
echo "response=${response}" echo "response=${response}"
@@ -128,7 +128,7 @@ testbatching() {
fi fi
echo "Tested batchspend." echo "Tested batchspend."
# getbatchdetails the default batch # getbatchdetails the default batcher
echo "Testing getbatchdetails..." echo "Testing getbatchdetails..."
response=$(curl -sd '{}' localhost:8888/getbatchdetails) response=$(curl -sd '{}' localhost:8888/getbatchdetails)
echo "response=${response}" echo "response=${response}"
@@ -136,28 +136,28 @@ testbatching() {
echo "nbOutputs=${data}" echo "nbOutputs=${data}"
echo "Tested getbatchdetails." echo "Tested getbatchdetails."
# removefrombatch from default batch # removefrombatch from default batcher
echo "Testing removefrombatch..." echo "Testing removefrombatch..."
response=$(curl -sd '{"outputId":'${id}'}' localhost:8888/removefrombatch) response=$(curl -sd '{"outputId":'${id}'}' localhost:8888/removefrombatch)
echo "response=${response}" echo "response=${response}"
id=$(echo "${response}" | jq ".result.batchId") id=$(echo "${response}" | jq ".result.batcherId")
echo "batchId=${id}" echo "batcherId=${id}"
if [ "${id}" -ne "1" ]; then if [ "${id}" -ne "1" ]; then
exit 50 exit 50
fi fi
response=$(curl -sd '{"outputId":'${id2}'}' localhost:8888/removefrombatch) response=$(curl -sd '{"outputId":'${id2}'}' localhost:8888/removefrombatch)
echo "response=${response}" echo "response=${response}"
id=$(echo "${response}" | jq ".result.batchId") id=$(echo "${response}" | jq ".result.batcherId")
echo "batchId=${id}" echo "batcherId=${id}"
if [ "${id}" -ne "1" ]; then if [ "${id}" -ne "1" ]; then
exit 54 exit 54
fi fi
echo "Tested removefrombatch." echo "Tested removefrombatch."
# getbatchdetails the default batch # getbatchdetails the default batcher
echo "Testing getbatchdetails..." echo "Testing getbatchdetails..."
response=$(curl -sd '{"batchId":1}' localhost:8888/getbatchdetails) response=$(curl -sd '{"batcherId":1}' localhost:8888/getbatchdetails)
echo "response=${response}" echo "response=${response}"
data2=$(echo "${response}" | jq ".result.nbOutputs") data2=$(echo "${response}" | jq ".result.nbOutputs")
echo "nbOutputs=${data2}" echo "nbOutputs=${data2}"
@@ -179,51 +179,51 @@ testbatching() {
# Create a batch # Create a batcher
echo "Testing createbatch..." echo "Testing createbatcher..."
response=$(curl -s -H 'Content-Type: application/json' -d '{"batchLabel":"testbatch","confTarget":32}' proxy:8888/createbatch) response=$(curl -s -H 'Content-Type: application/json' -d '{"batcherLabel":"testbatcher","confTarget":32}' proxy:8888/createbatcher)
echo "response=${response}" echo "response=${response}"
id=$(echo "${response}" | jq -e ".result.batchId") id=$(echo "${response}" | jq -e ".result.batcherId")
if [ "$?" -ne "0" ]; then if [ "$?" -ne "0" ]; then
exit 60 exit 60
fi fi
# List batches (should show at least default and testbatch batches) # List batchers (should show at least default and testbatcher batchers)
echo "Testing listbatches..." echo "Testing listbatches..."
response=$(curl -s proxy:8888/listbatches) response=$(curl -s proxy:8888/listbatchers)
echo "response=${response}" echo "response=${response}"
id=$(echo "${response}" | jq '.result[] | select(.batchLabel == "testbatch") | .batchId') id=$(echo "${response}" | jq '.result[] | select(.batcherLabel == "testbatcher") | .batcherId')
echo "batchId=${id}" echo "batcherId=${id}"
if [ -z "${id}" ]; then if [ -z "${id}" ]; then
exit 70 exit 70
fi fi
echo "Tested listbatches." echo "Tested listbatchers."
# getbatch the testbatch batch # getbatcher the testbatcher batcher
echo "Testing getbatch..." echo "Testing getbatcher..."
response=$(curl -sd '{"batchId":'${id}'}' localhost:8888/getbatch) response=$(curl -sd '{"batcherId":'${id}'}' localhost:8888/getbatcher)
echo "response=${response}" echo "response=${response}"
data=$(echo "${response}" | jq -r ".result.batchLabel") data=$(echo "${response}" | jq -r ".result.batcherLabel")
echo "batchLabel=${data}" echo "batcherLabel=${data}"
if [ "${data}" != "testbatch" ]; then if [ "${data}" != "testbatcher" ]; then
exit 80 exit 80
fi fi
response=$(curl -sd '{"batchLabel":"testbatch"}' localhost:8888/getbatch) response=$(curl -sd '{"batcherLabel":"testbatcher"}' localhost:8888/getbatcher)
echo "response=${response}" echo "response=${response}"
data=$(echo "${response}" | jq -r ".result.batchId") data=$(echo "${response}" | jq -r ".result.batcherId")
echo "batchId=${data}" echo "batcherId=${data}"
if [ "${data}" != "${id}" ]; then if [ "${data}" != "${id}" ]; then
exit 90 exit 90
fi fi
echo "Tested getbatch." echo "Tested getbatcher."
# getbatchdetails the testbatch batch # getbatchdetails the testbatcher batcher
echo "Testing getbatchdetails..." echo "Testing getbatchdetails..."
response=$(curl -sd '{"batchLabel":"testbatch"}' localhost:8888/getbatchdetails) response=$(curl -sd '{"batcherLabel":"testbatcher"}' localhost:8888/getbatchdetails)
echo "response=${response}" echo "response=${response}"
data=$(echo "${response}" | jq -r ".result.batchId") data=$(echo "${response}" | jq -r ".result.batcherId")
echo "batchId=${data}" echo "batcherId=${data}"
if [ "${data}" != "${id}" ]; then if [ "${data}" != "${id}" ]; then
exit 100 exit 100
fi fi
@@ -232,11 +232,11 @@ testbatching() {
exit 32 exit 32
fi fi
response=$(curl -sd '{"batchId":'${id}'}' localhost:8888/getbatchdetails) response=$(curl -sd '{"batcherId":'${id}'}' localhost:8888/getbatchdetails)
echo "response=${response}" echo "response=${response}"
data=$(echo "${response}" | jq -r ".result.batchLabel") data=$(echo "${response}" | jq -r ".result.batcherLabel")
echo "batchLabel=${data}" echo "batcherLabel=${data}"
if [ "${data}" != "testbatch" ]; then if [ "${data}" != "testbatcher" ]; then
exit 35 exit 35
fi fi
echo "${response}" | jq -e ".result.outputs" echo "${response}" | jq -e ".result.outputs"
@@ -245,14 +245,14 @@ testbatching() {
fi fi
echo "Tested getbatchdetails." echo "Tested getbatchdetails."
# addtobatch to testbatch batch # addtobatch to testbatcher batcher
echo "Testing addtobatch..." echo "Testing addtobatch..."
address1=$(curl -s localhost:8888/getnewaddress | jq -r ".address") address1=$(curl -s localhost:8888/getnewaddress | jq -r ".address")
echo "address1=${address1}" echo "address1=${address1}"
response=$(curl -sd '{"batchId":'${id}',"outputLabel":"test001","address":"'${address1}'","amount":0.001,"webhookUrl":"'${url1}'/'${address1}'"}' localhost:8888/addtobatch) response=$(curl -sd '{"batcherId":'${id}',"outputLabel":"test001","address":"'${address1}'","amount":0.001,"webhookUrl":"'${url1}'/'${address1}'"}' localhost:8888/addtobatch)
echo "response=${response}" echo "response=${response}"
data=$(echo "${response}" | jq ".result.batchId") data=$(echo "${response}" | jq ".result.batcherId")
echo "batchId=${data}" echo "batcherId=${data}"
if [ "${data}" -ne "${id}" ]; then if [ "${data}" -ne "${id}" ]; then
exit 40 exit 40
fi fi
@@ -264,10 +264,10 @@ testbatching() {
address2=$(curl -s localhost:8888/getnewaddress | jq -r ".address") address2=$(curl -s localhost:8888/getnewaddress | jq -r ".address")
echo "address2=${address2}" echo "address2=${address2}"
response=$(curl -sd '{"batchLabel":"testbatch","outputLabel":"test002","address":"'${address2}'","amount":0.002,"webhookUrl":"'${url2}'/'${address2}'"}' localhost:8888/addtobatch) response=$(curl -sd '{"batcherLabel":"testbatcher","outputLabel":"test002","address":"'${address2}'","amount":0.002,"webhookUrl":"'${url2}'/'${address2}'"}' localhost:8888/addtobatch)
echo "response=${response}" echo "response=${response}"
data=$(echo "${response}" | jq ".result.batchId") data=$(echo "${response}" | jq ".result.batcherId")
echo "batchId=${data}" echo "batcherId=${data}"
if [ "${data}" -ne "${id}" ]; then if [ "${data}" -ne "${id}" ]; then
exit 40 exit 40
fi fi
@@ -278,9 +278,9 @@ testbatching() {
echo "outputId=${id2}" echo "outputId=${id2}"
echo "Tested addtobatch." echo "Tested addtobatch."
# batchspend testbatch batch # batchspend testbatcher batcher
echo "Testing batchspend..." echo "Testing batchspend..."
response=$(curl -sd '{"batchLabel":"testbatch"}' localhost:8888/batchspend) response=$(curl -sd '{"batcherLabel":"testbatcher"}' localhost:8888/batchspend)
echo "response=${response}" echo "response=${response}"
data2=$(echo "${response}" | jq -e ".result.txid") data2=$(echo "${response}" | jq -e ".result.txid")
if [ "$?" -ne 0 ]; then if [ "$?" -ne 0 ]; then
@@ -293,10 +293,10 @@ testbatching() {
fi fi
echo "Tested batchspend." echo "Tested batchspend."
# getbatchdetails the testbatch batch # getbatchdetails the testbatcher batcher
echo "Testing getbatchdetails..." echo "Testing getbatchdetails..."
echo "txid=${data2}" echo "txid=${data2}"
response=$(curl -sd '{"batchLabel":"testbatch","txid":'${data2}'}' localhost:8888/getbatchdetails) response=$(curl -sd '{"batcherLabel":"testbatcher","txid":'${data2}'}' localhost:8888/getbatchdetails)
echo "response=${response}" echo "response=${response}"
data=$(echo "${response}" | jq ".result.nbOutputs") data=$(echo "${response}" | jq ".result.nbOutputs")
echo "nbOutputs=${data}" echo "nbOutputs=${data}"
@@ -305,11 +305,11 @@ testbatching() {
fi fi
echo "Tested getbatchdetails." echo "Tested getbatchdetails."
# List batches # List batchers
# Add to batch # Add to batch
# List batches # List batchers
# Remove from batch # Remove from batch
# List batches # List batchers
} }
wait_for_callbacks() { wait_for_callbacks() {

View File

@@ -43,7 +43,7 @@ spend() {
local tx_amount=$(echo "${tx_details}" | jq '.result.amount | fabs' | awk '{ printf "%.8f", $0 }') local tx_amount=$(echo "${tx_details}" | jq '.result.amount | fabs' | awk '{ printf "%.8f", $0 }')
local tx_size=$(echo "${tx_raw_details}" | jq '.result.size') local tx_size=$(echo "${tx_raw_details}" | jq '.result.size')
local tx_vsize=$(echo "${tx_raw_details}" | jq '.result.vsize') local tx_vsize=$(echo "${tx_raw_details}" | jq '.result.vsize')
local tx_replaceable=$(echo "${tx_details}" | jq '.result."bip125-replaceable"') local tx_replaceable=$(echo "${tx_details}" | jq -r '.result."bip125-replaceable"')
tx_replaceable=$([ ${tx_replaceable} = "yes" ] && echo "true" || echo "false") tx_replaceable=$([ ${tx_replaceable} = "yes" ] && echo "true" || echo "false")
local fees=$(echo "${tx_details}" | jq '.result.fee | fabs' | awk '{ printf "%.8f", $0 }') local fees=$(echo "${tx_details}" | jq '.result.fee | fabs' | awk '{ printf "%.8f", $0 }')
# Sometimes raw tx are too long to be passed as paramater, so let's write # Sometimes raw tx are too long to be passed as paramater, so let's write