Browse Source

Add yieldgen report endpoint to API

Fixes #1122. An RPC client can request the list
of coinjoins as shown in the file datadir/logs/yigen-statement.csv.
Authentication is not required, nor a specific wallet, as this is
a global list of all coinjoins done so far. A 404 is returned if
the file has not yet been created (no maker operations).
master
Adam Gibson 4 years ago
parent
commit
89896e0d74
  1. 10
      docs/api/wallet-rpc.yaml
  2. 33
      jmclient/jmclient/wallet_rpc.py

10
docs/api/wallet-rpc.yaml

@ -123,6 +123,16 @@ paths:
$ref: "#/components/responses/ListWallets-200-OK"
'404':
$ref: '#/components/responses/404-NotFound'
/wallet/yieldgen/report:
get:
summary: get latest report on yield generating activity
operationId: yieldgenreport
description: get list of coinjoins taken part in as maker (across all wallets)
responses:
'200':
$ref: "#/components/responses/YieldGenReport-200-OK"
'404':
$ref: '#/components/responses/404-NotFound'
/wallet/{walletname}/address/new/{mixdepth}:
get:
security:

33
jmclient/jmclient/wallet_rpc.py

@ -88,6 +88,11 @@ class TransactionFailed(Exception):
class NotEnoughCoinsForMaker(Exception):
pass
# raised when we cannot read data from our
# yigen-statement csv file:
class YieldGeneratorDataUnreadable(Exception):
pass
def get_ssl_context(cert_directory):
"""Construct an SSL context factory from the user's privatekey/cert.
TODO:
@ -299,6 +304,11 @@ class JMWalletDaemon(Service):
request.setResponseCode(409)
return self.err(request, "Maker could not start, no coins.")
@app.handle_errors(YieldGeneratorDataUnreadable)
def yieldgenerator_report_unavailable(self, request, failure):
request.setResponseCode(404)
return self.err(request, "Yield generator report not available.")
def check_cookie(self, request):
#part after bearer is what we need
try:
@ -600,6 +610,29 @@ class JMWalletDaemon(Service):
self.services["maker"].stopService()
return make_jmwalletd_response(request, status=202)
def get_json_yigen_report(self):
try:
datadir = os.path.join(jm_single().config.datadir, "logs")
with open(os.path.join(datadir, "yigen-statement.csv"), "rb") as f:
yigen_data_raw = f.readlines()
return json.loads(yigen_data_raw)
except:
raise YieldGeneratorDataUnreadable()
@app.route('/wallet/yieldgen/report', methods=['GET'])
def yieldgen_report(self, request):
# Note that this is *not* a maker function, and
# not wallet specific (the report aggregates over time,
# even with different wallets), and does not require
# an authenticated session (it reads the filesystem, like
# /all)
# note: can raise, most particularly if file has not been
# created because maker never ran (or deleted):
yigen_data = self.get_json_yigen_report()
# this is the successful case; note the object can
# be an empty list:
return make_jmwalletd_response(request, yigen_data=yigen_data)
@app.route('/wallet/<string:walletname>/lock', methods=['GET'])
def lockwallet(self, request, walletname):
print_req(request)

Loading…
Cancel
Save