diff --git a/docs/api/wallet-rpc.yaml b/docs/api/wallet-rpc.yaml index afcea56..2419c24 100644 --- a/docs/api/wallet-rpc.yaml +++ b/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: diff --git a/jmclient/jmclient/wallet_rpc.py b/jmclient/jmclient/wallet_rpc.py index 1247e8d..b6179dc 100644 --- a/jmclient/jmclient/wallet_rpc.py +++ b/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//lock', methods=['GET']) def lockwallet(self, request, walletname): print_req(request)