dao-treasury 0.0.47__cp312-cp312-win_amd64.whl → 0.0.64__cp312-cp312-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dao_treasury/.grafana/provisioning/dashboards/breakdowns/Expenses.json +526 -0
- dao_treasury/.grafana/provisioning/dashboards/breakdowns/Revenue.json +526 -0
- dao_treasury/.grafana/provisioning/dashboards/dashboards.yaml +25 -1
- dao_treasury/.grafana/provisioning/dashboards/streams/LlamaPay.json +8 -8
- dao_treasury/.grafana/provisioning/dashboards/summary/Monthly.json +10 -9
- dao_treasury/.grafana/provisioning/dashboards/transactions/Treasury Transactions.json +8 -35
- dao_treasury/.grafana/provisioning/dashboards/treasury/Cashflow (Including Unsorted).json +74 -33
- dao_treasury/.grafana/provisioning/dashboards/treasury/Cashflow.json +53 -23
- dao_treasury/.grafana/provisioning/dashboards/treasury/Current Treasury Assets.json +593 -0
- dao_treasury/.grafana/provisioning/dashboards/treasury/Historical Treasury Balances.json +2999 -0
- dao_treasury/.grafana/provisioning/dashboards/treasury/Operating Cashflow.json +38 -17
- dao_treasury/_docker.cp312-win_amd64.pyd +0 -0
- dao_treasury/_docker.py +24 -20
- dao_treasury/_nicknames.cp312-win_amd64.pyd +0 -0
- dao_treasury/_wallet.cp312-win_amd64.pyd +0 -0
- dao_treasury/constants.cp312-win_amd64.pyd +0 -0
- dao_treasury/constants.py +2 -2
- dao_treasury/db.py +23 -3
- dao_treasury/docker-compose.yaml +1 -1
- dao_treasury/main.py +6 -0
- dao_treasury/sorting/__init__.cp312-win_amd64.pyd +0 -0
- dao_treasury/sorting/_matchers.cp312-win_amd64.pyd +0 -0
- dao_treasury/sorting/_rules.cp312-win_amd64.pyd +0 -0
- dao_treasury/sorting/factory.cp312-win_amd64.pyd +0 -0
- dao_treasury/sorting/rule.cp312-win_amd64.pyd +0 -0
- dao_treasury/sorting/rule.py +8 -10
- dao_treasury/sorting/rules/__init__.cp312-win_amd64.pyd +0 -0
- dao_treasury/sorting/rules/ignore/__init__.cp312-win_amd64.pyd +0 -0
- dao_treasury/sorting/rules/ignore/llamapay.cp312-win_amd64.pyd +0 -0
- dao_treasury/streams/__init__.cp312-win_amd64.pyd +0 -0
- dao_treasury/streams/llamapay.cp312-win_amd64.pyd +0 -0
- dao_treasury/types.cp312-win_amd64.pyd +0 -0
- {dao_treasury-0.0.47.dist-info → dao_treasury-0.0.64.dist-info}/METADATA +4 -3
- dao_treasury-0.0.64.dist-info/RECORD +54 -0
- dao_treasury-0.0.64.dist-info/top_level.txt +2 -0
- dao_treasury__mypyc.cp312-win_amd64.pyd +0 -0
- bf2b4fe1f86ad2ea158b__mypyc.cp312-win_amd64.pyd +0 -0
- dao_treasury/.grafana/provisioning/dashboards/treasury/Treasury.json +0 -2018
- dao_treasury-0.0.47.dist-info/RECORD +0 -51
- dao_treasury-0.0.47.dist-info/top_level.txt +0 -2
- {dao_treasury-0.0.47.dist-info → dao_treasury-0.0.64.dist-info}/WHEEL +0 -0
|
@@ -18,12 +18,13 @@
|
|
|
18
18
|
"editable": true,
|
|
19
19
|
"fiscalYearStartMonth": 0,
|
|
20
20
|
"graphTooltip": 1,
|
|
21
|
+
"id": 6,
|
|
21
22
|
"links": [],
|
|
22
|
-
"liveNow": false,
|
|
23
23
|
"panels": [
|
|
24
24
|
{
|
|
25
25
|
"datasource": "SQLite",
|
|
26
26
|
"fieldConfig": {
|
|
27
|
+
"unit": "currencyUSD",
|
|
27
28
|
"defaults": {
|
|
28
29
|
"color": {
|
|
29
30
|
"mode": "thresholds"
|
|
@@ -34,7 +35,7 @@
|
|
|
34
35
|
"steps": [
|
|
35
36
|
{
|
|
36
37
|
"color": "green",
|
|
37
|
-
"value":
|
|
38
|
+
"value": 0
|
|
38
39
|
},
|
|
39
40
|
{
|
|
40
41
|
"color": "red",
|
|
@@ -57,6 +58,7 @@
|
|
|
57
58
|
"graphMode": "area",
|
|
58
59
|
"justifyMode": "auto",
|
|
59
60
|
"orientation": "auto",
|
|
61
|
+
"percentChangeColorMode": "standard",
|
|
60
62
|
"reduceOptions": {
|
|
61
63
|
"calcs": [
|
|
62
64
|
"lastNotNull"
|
|
@@ -64,9 +66,11 @@
|
|
|
64
66
|
"fields": "",
|
|
65
67
|
"values": false
|
|
66
68
|
},
|
|
67
|
-
"
|
|
69
|
+
"showPercentChange": false,
|
|
70
|
+
"textMode": "auto",
|
|
71
|
+
"wideLayout": true
|
|
68
72
|
},
|
|
69
|
-
"pluginVersion": "
|
|
73
|
+
"pluginVersion": "12.1.1",
|
|
70
74
|
"targets": [
|
|
71
75
|
{
|
|
72
76
|
"datasource": "SQLite",
|
|
@@ -86,6 +90,7 @@
|
|
|
86
90
|
{
|
|
87
91
|
"datasource": "SQLite",
|
|
88
92
|
"fieldConfig": {
|
|
93
|
+
"unit": "currencyUSD",
|
|
89
94
|
"defaults": {
|
|
90
95
|
"color": {
|
|
91
96
|
"mode": "thresholds"
|
|
@@ -96,7 +101,7 @@
|
|
|
96
101
|
"steps": [
|
|
97
102
|
{
|
|
98
103
|
"color": "green",
|
|
99
|
-
"value":
|
|
104
|
+
"value": 0
|
|
100
105
|
},
|
|
101
106
|
{
|
|
102
107
|
"color": "red",
|
|
@@ -119,6 +124,7 @@
|
|
|
119
124
|
"graphMode": "area",
|
|
120
125
|
"justifyMode": "auto",
|
|
121
126
|
"orientation": "auto",
|
|
127
|
+
"percentChangeColorMode": "standard",
|
|
122
128
|
"reduceOptions": {
|
|
123
129
|
"calcs": [
|
|
124
130
|
"lastNotNull"
|
|
@@ -126,9 +132,11 @@
|
|
|
126
132
|
"fields": "",
|
|
127
133
|
"values": false
|
|
128
134
|
},
|
|
129
|
-
"
|
|
135
|
+
"showPercentChange": false,
|
|
136
|
+
"textMode": "auto",
|
|
137
|
+
"wideLayout": true
|
|
130
138
|
},
|
|
131
|
-
"pluginVersion": "
|
|
139
|
+
"pluginVersion": "12.1.1",
|
|
132
140
|
"targets": [
|
|
133
141
|
{
|
|
134
142
|
"datasource": "SQLite",
|
|
@@ -148,6 +156,7 @@
|
|
|
148
156
|
{
|
|
149
157
|
"datasource": "SQLite",
|
|
150
158
|
"fieldConfig": {
|
|
159
|
+
"unit": "currencyUSD",
|
|
151
160
|
"defaults": {
|
|
152
161
|
"color": {
|
|
153
162
|
"mode": "thresholds"
|
|
@@ -158,7 +167,7 @@
|
|
|
158
167
|
"steps": [
|
|
159
168
|
{
|
|
160
169
|
"color": "green",
|
|
161
|
-
"value":
|
|
170
|
+
"value": 0
|
|
162
171
|
},
|
|
163
172
|
{
|
|
164
173
|
"color": "red",
|
|
@@ -181,6 +190,7 @@
|
|
|
181
190
|
"graphMode": "area",
|
|
182
191
|
"justifyMode": "auto",
|
|
183
192
|
"orientation": "auto",
|
|
193
|
+
"percentChangeColorMode": "standard",
|
|
184
194
|
"reduceOptions": {
|
|
185
195
|
"calcs": [
|
|
186
196
|
"lastNotNull"
|
|
@@ -188,9 +198,11 @@
|
|
|
188
198
|
"fields": "",
|
|
189
199
|
"values": false
|
|
190
200
|
},
|
|
191
|
-
"
|
|
201
|
+
"showPercentChange": false,
|
|
202
|
+
"textMode": "auto",
|
|
203
|
+
"wideLayout": true
|
|
192
204
|
},
|
|
193
|
-
"pluginVersion": "
|
|
205
|
+
"pluginVersion": "12.1.1",
|
|
194
206
|
"targets": [
|
|
195
207
|
{
|
|
196
208
|
"datasource": "SQLite",
|
|
@@ -211,6 +223,7 @@
|
|
|
211
223
|
"datasource": "SQLite",
|
|
212
224
|
"description": "",
|
|
213
225
|
"fieldConfig": {
|
|
226
|
+
"unit": "currencyUSD",
|
|
214
227
|
"defaults": {
|
|
215
228
|
"color": {
|
|
216
229
|
"mode": "thresholds"
|
|
@@ -221,7 +234,7 @@
|
|
|
221
234
|
"steps": [
|
|
222
235
|
{
|
|
223
236
|
"color": "green",
|
|
224
|
-
"value":
|
|
237
|
+
"value": 0
|
|
225
238
|
},
|
|
226
239
|
{
|
|
227
240
|
"color": "red",
|
|
@@ -244,6 +257,7 @@
|
|
|
244
257
|
"graphMode": "area",
|
|
245
258
|
"justifyMode": "auto",
|
|
246
259
|
"orientation": "auto",
|
|
260
|
+
"percentChangeColorMode": "standard",
|
|
247
261
|
"reduceOptions": {
|
|
248
262
|
"calcs": [
|
|
249
263
|
"lastNotNull"
|
|
@@ -251,9 +265,11 @@
|
|
|
251
265
|
"fields": "",
|
|
252
266
|
"values": false
|
|
253
267
|
},
|
|
254
|
-
"
|
|
268
|
+
"showPercentChange": false,
|
|
269
|
+
"textMode": "auto",
|
|
270
|
+
"wideLayout": true
|
|
255
271
|
},
|
|
256
|
-
"pluginVersion": "
|
|
272
|
+
"pluginVersion": "12.1.1",
|
|
257
273
|
"targets": [
|
|
258
274
|
{
|
|
259
275
|
"datasource": "SQLite",
|
|
@@ -274,6 +290,7 @@
|
|
|
274
290
|
"datasource": "SQLite",
|
|
275
291
|
"description": "",
|
|
276
292
|
"fieldConfig": {
|
|
293
|
+
"unit": "currencyUSD",
|
|
277
294
|
"defaults": {
|
|
278
295
|
"color": {
|
|
279
296
|
"mode": "palette-classic"
|
|
@@ -285,6 +302,7 @@
|
|
|
285
302
|
"axisLabel": "",
|
|
286
303
|
"axisPlacement": "auto",
|
|
287
304
|
"barAlignment": 0,
|
|
305
|
+
"barWidthFactor": 0.6,
|
|
288
306
|
"drawStyle": "bars",
|
|
289
307
|
"fillOpacity": 70,
|
|
290
308
|
"gradientMode": "none",
|
|
@@ -316,7 +334,7 @@
|
|
|
316
334
|
"steps": [
|
|
317
335
|
{
|
|
318
336
|
"color": "green",
|
|
319
|
-
"value":
|
|
337
|
+
"value": 0
|
|
320
338
|
},
|
|
321
339
|
{
|
|
322
340
|
"color": "red",
|
|
@@ -366,10 +384,12 @@
|
|
|
366
384
|
"showLegend": true
|
|
367
385
|
},
|
|
368
386
|
"tooltip": {
|
|
387
|
+
"hideZeros": false,
|
|
369
388
|
"mode": "single",
|
|
370
389
|
"sort": "none"
|
|
371
390
|
}
|
|
372
391
|
},
|
|
392
|
+
"pluginVersion": "12.1.1",
|
|
373
393
|
"targets": [
|
|
374
394
|
{
|
|
375
395
|
"datasource": "SQLite",
|
|
@@ -473,8 +493,9 @@
|
|
|
473
493
|
"type": "timeseries"
|
|
474
494
|
}
|
|
475
495
|
],
|
|
496
|
+
"preload": false,
|
|
476
497
|
"refresh": "",
|
|
477
|
-
"schemaVersion":
|
|
498
|
+
"schemaVersion": 41,
|
|
478
499
|
"tags": [],
|
|
479
500
|
"templating": {
|
|
480
501
|
"list": []
|
|
@@ -486,7 +507,7 @@
|
|
|
486
507
|
"timepicker": {},
|
|
487
508
|
"timezone": "",
|
|
488
509
|
"title": "Operating Cashflow Summary",
|
|
510
|
+
"description": "Provides a focused view of core operational cashflows, including only sorted transactions in Revenue, Cost of Revenue, and Expenses categories. Excludes unsorted transactions and non-operational activity, helping monitor specifically the DAO's operational financial flows.",
|
|
489
511
|
"uid": "fdf9969c-357a-4203-ae7b-12816e87bc7e",
|
|
490
|
-
"version":
|
|
491
|
-
"weekStart": ""
|
|
512
|
+
"version": 5
|
|
492
513
|
}
|
|
Binary file
|
dao_treasury/_docker.py
CHANGED
|
@@ -14,17 +14,17 @@ This is the main entry for all Docker-based orchestration.
|
|
|
14
14
|
"""
|
|
15
15
|
|
|
16
16
|
import logging
|
|
17
|
-
from importlib import resources
|
|
18
|
-
import subprocess
|
|
19
17
|
from functools import wraps
|
|
20
|
-
from
|
|
18
|
+
from importlib import resources
|
|
19
|
+
from typing import Any, Callable, Coroutine, Final, Literal, Tuple, TypeVar, List
|
|
21
20
|
|
|
22
21
|
import eth_portfolio_scripts.docker
|
|
22
|
+
from eth_portfolio_scripts.docker import docker_compose
|
|
23
23
|
from typing_extensions import ParamSpec
|
|
24
24
|
|
|
25
25
|
logger: Final = logging.getLogger(__name__)
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
COMPOSE_FILE: Final = str(
|
|
28
28
|
resources.files("dao_treasury").joinpath("docker-compose.yaml")
|
|
29
29
|
)
|
|
30
30
|
"""The path of dao-treasury's docker-compose.yaml file on your machine"""
|
|
@@ -55,7 +55,7 @@ def up(*services: str) -> None:
|
|
|
55
55
|
# eth-portfolio containers must be started first so dao-treasury can attach to the eth-portfolio docker network
|
|
56
56
|
eth_portfolio_scripts.docker.up("victoria-metrics")
|
|
57
57
|
build(*services)
|
|
58
|
-
|
|
58
|
+
_print_notice("starting", services)
|
|
59
59
|
_exec_command(["up", "-d", *services])
|
|
60
60
|
|
|
61
61
|
|
|
@@ -72,6 +72,7 @@ def down() -> None:
|
|
|
72
72
|
See Also:
|
|
73
73
|
:func:`up`
|
|
74
74
|
"""
|
|
75
|
+
print("stopping all dao-treasury containers")
|
|
75
76
|
_exec_command(["down"])
|
|
76
77
|
|
|
77
78
|
|
|
@@ -90,10 +91,24 @@ def build(*services: str) -> None:
|
|
|
90
91
|
:func:`up`
|
|
91
92
|
:func:`_exec_command`
|
|
92
93
|
"""
|
|
93
|
-
|
|
94
|
+
_print_notice("building", services)
|
|
94
95
|
_exec_command(["build", *services])
|
|
95
96
|
|
|
96
97
|
|
|
98
|
+
def _print_notice(
|
|
99
|
+
doing: Literal["building", "starting"], services: Tuple[str, ...]
|
|
100
|
+
) -> None:
|
|
101
|
+
if len(services) == 1:
|
|
102
|
+
container = services[0]
|
|
103
|
+
print(f"{doing} the {container} container")
|
|
104
|
+
elif len(services) == 2:
|
|
105
|
+
first, second = services
|
|
106
|
+
print(f"{doing} the {first} and {second} containers")
|
|
107
|
+
else:
|
|
108
|
+
*all_but_last, last = services
|
|
109
|
+
print(f"{doing} the {', '.join(all_but_last)}, and {last} containers")
|
|
110
|
+
|
|
111
|
+
|
|
97
112
|
_P = ParamSpec("_P")
|
|
98
113
|
_T = TypeVar("_T")
|
|
99
114
|
|
|
@@ -174,17 +189,6 @@ def _exec_command(command: List[str], *, compose_options: Tuple[str, ...] = ())
|
|
|
174
189
|
See Also:
|
|
175
190
|
:func:`check_system`
|
|
176
191
|
"""
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
["docker", "compose", *compose_options, "-f", compose_file, *command]
|
|
181
|
-
)
|
|
182
|
-
except (subprocess.CalledProcessError, FileNotFoundError) as e:
|
|
183
|
-
try:
|
|
184
|
-
subprocess.check_output(
|
|
185
|
-
["docker-compose", *compose_options, "-f", compose_file, *command]
|
|
186
|
-
)
|
|
187
|
-
except (subprocess.CalledProcessError, FileNotFoundError) as _e:
|
|
188
|
-
raise RuntimeError(
|
|
189
|
-
f"Error occurred while running {' '.join(command)}: {_e}"
|
|
190
|
-
) from _e
|
|
192
|
+
docker_compose._exec_command(
|
|
193
|
+
command, compose_file=COMPOSE_FILE, compose_options=compose_options
|
|
194
|
+
)
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
dao_treasury/constants.py
CHANGED
|
@@ -16,8 +16,8 @@ This is the single source of truth for system-wide constants.
|
|
|
16
16
|
|
|
17
17
|
from typing import Final
|
|
18
18
|
|
|
19
|
+
import eth_portfolio._utils
|
|
19
20
|
import y.constants
|
|
20
|
-
from eth_portfolio import _utils as eth_portfolio_utils
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
CHAINID: Final = y.constants.CHAINID
|
|
@@ -35,5 +35,5 @@ DISPERSE_APP: Final = (
|
|
|
35
35
|
# TODO: all crosslink to disperse.py once ready
|
|
36
36
|
|
|
37
37
|
|
|
38
|
-
SUPPRESS_ERROR_LOGS: Final =
|
|
38
|
+
SUPPRESS_ERROR_LOGS: Final = eth_portfolio._utils.SUPPRESS_ERROR_LOGS
|
|
39
39
|
"""Append tokens here when you don't expect them to price successfully and do not want to see the associated error logs."""
|
dao_treasury/db.py
CHANGED
|
@@ -18,6 +18,7 @@ and creating SQL views for reporting.
|
|
|
18
18
|
|
|
19
19
|
import typing
|
|
20
20
|
from asyncio import Semaphore
|
|
21
|
+
from collections import OrderedDict
|
|
21
22
|
from decimal import Decimal, InvalidOperation
|
|
22
23
|
from functools import lru_cache
|
|
23
24
|
from logging import getLogger
|
|
@@ -75,6 +76,9 @@ from dao_treasury.constants import CHAINID
|
|
|
75
76
|
from dao_treasury.types import TxGroupDbid, TxGroupName
|
|
76
77
|
|
|
77
78
|
|
|
79
|
+
EventItem = _EventItem[_EventItem[OrderedDict[str, Any]]]
|
|
80
|
+
|
|
81
|
+
|
|
78
82
|
SQLITE_DIR = Path(path.expanduser("~")) / ".dao-treasury"
|
|
79
83
|
"""Path to the directory in the user's home where the DAO treasury SQLite database is stored."""
|
|
80
84
|
|
|
@@ -250,6 +254,10 @@ class Address(DbEntity):
|
|
|
250
254
|
def contract(self) -> Contract:
|
|
251
255
|
return Contract(self.address)
|
|
252
256
|
|
|
257
|
+
@property
|
|
258
|
+
def contract_coro(self) -> Coroutine[Any, Any, Contract]:
|
|
259
|
+
return Contract.coroutine(self.address)
|
|
260
|
+
|
|
253
261
|
@staticmethod
|
|
254
262
|
@lru_cache(maxsize=None)
|
|
255
263
|
def get_dbid(address: HexAddress) -> int:
|
|
@@ -420,6 +428,10 @@ class Token(DbEntity):
|
|
|
420
428
|
def contract(self) -> Contract:
|
|
421
429
|
return Contract(self.address.address)
|
|
422
430
|
|
|
431
|
+
@property
|
|
432
|
+
def contract_coro(self) -> Coroutine[Any, Any, Contract]:
|
|
433
|
+
return Contract.coroutine(self.address.address)
|
|
434
|
+
|
|
423
435
|
@property
|
|
424
436
|
def scale(self) -> int:
|
|
425
437
|
"""Base for division according to `decimals`, e.g., `10**decimals`.
|
|
@@ -744,13 +756,21 @@ class TreasuryTx(DbEntity):
|
|
|
744
756
|
"""Decoded event logs for this transaction."""
|
|
745
757
|
return self._transaction.events
|
|
746
758
|
|
|
759
|
+
async def events_async(self) -> EventDict:
|
|
760
|
+
"""Asynchronously fetch decoded event logs for this transaction."""
|
|
761
|
+
tx = self._transaction
|
|
762
|
+
events = tx._events
|
|
763
|
+
if events is None:
|
|
764
|
+
events = await _EVENTS_THREADS.run(getattr, tx, "events")
|
|
765
|
+
return events
|
|
766
|
+
|
|
747
767
|
@overload
|
|
748
768
|
def get_events(
|
|
749
769
|
self, event_name: str, sync: Literal[False]
|
|
750
|
-
) -> Coroutine[Any, Any,
|
|
770
|
+
) -> Coroutine[Any, Any, EventItem]: ...
|
|
751
771
|
@overload
|
|
752
|
-
def get_events(self, event_name: str, sync: bool = True) ->
|
|
753
|
-
def get_events(self, event_name: str, sync: bool = True) ->
|
|
772
|
+
def get_events(self, event_name: str, sync: bool = True) -> EventItem: ...
|
|
773
|
+
def get_events(self, event_name: str, sync: bool = True) -> EventItem:
|
|
754
774
|
if not sync:
|
|
755
775
|
return _EVENTS_THREADS.run(self.get_events, event_name)
|
|
756
776
|
try:
|
dao_treasury/docker-compose.yaml
CHANGED
dao_treasury/main.py
CHANGED
|
@@ -97,6 +97,12 @@ parser.add_argument(
|
|
|
97
97
|
help="The time interval between datapoints. default: 1d",
|
|
98
98
|
default="1d",
|
|
99
99
|
)
|
|
100
|
+
parser.add_argument(
|
|
101
|
+
"--concurrency",
|
|
102
|
+
type=int,
|
|
103
|
+
help="The max number of historical blocks to export concurrently. default: 30",
|
|
104
|
+
default=30,
|
|
105
|
+
)
|
|
100
106
|
parser.add_argument(
|
|
101
107
|
"--daemon",
|
|
102
108
|
action="store_true",
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
dao_treasury/sorting/rule.py
CHANGED
|
@@ -130,8 +130,6 @@ class _SortRule:
|
|
|
130
130
|
func: Optional[SortFunction] = None
|
|
131
131
|
"""Custom matching function that takes a `TreasuryTx` and returns a bool or an awaitable that returns a bool."""
|
|
132
132
|
|
|
133
|
-
# __instances__: ClassVar[List[Self]] = []
|
|
134
|
-
|
|
135
133
|
def __post_init__(self) -> None:
|
|
136
134
|
"""Validate inputs, checksum addresses, and register the rule.
|
|
137
135
|
|
|
@@ -235,7 +233,7 @@ class _InboundSortRule(_SortRule):
|
|
|
235
233
|
return (
|
|
236
234
|
tx.to_address is not None
|
|
237
235
|
and TreasuryWallet.check_membership(tx.to_address.address, tx.block)
|
|
238
|
-
and await super().match(tx)
|
|
236
|
+
and await super(_InboundSortRule, self).match(tx)
|
|
239
237
|
)
|
|
240
238
|
|
|
241
239
|
|
|
@@ -250,7 +248,7 @@ class _OutboundSortRule(_SortRule):
|
|
|
250
248
|
async def match(self, tx: "TreasuryTx") -> bool:
|
|
251
249
|
return TreasuryWallet.check_membership(
|
|
252
250
|
tx.from_address.address, tx.block
|
|
253
|
-
) and await super().match(tx)
|
|
251
|
+
) and await super(_OutboundSortRule, self).match(tx)
|
|
254
252
|
|
|
255
253
|
|
|
256
254
|
@mypyc_attr(native_class=False)
|
|
@@ -267,7 +265,7 @@ class RevenueSortRule(_InboundSortRule):
|
|
|
267
265
|
def __post_init__(self) -> None:
|
|
268
266
|
"""Prepends `self.txgroup` with 'Revenue:'."""
|
|
269
267
|
object.__setattr__(self, "txgroup", f"Revenue:{self.txgroup}")
|
|
270
|
-
super().__post_init__()
|
|
268
|
+
super(RevenueSortRule, self).__post_init__()
|
|
271
269
|
|
|
272
270
|
|
|
273
271
|
@mypyc_attr(native_class=False)
|
|
@@ -280,7 +278,7 @@ class CostOfRevenueSortRule(_OutboundSortRule):
|
|
|
280
278
|
def __post_init__(self) -> None:
|
|
281
279
|
"""Prepends `self.txgroup` with 'Cost of Revenue:'."""
|
|
282
280
|
object.__setattr__(self, "txgroup", f"Cost of Revenue:{self.txgroup}")
|
|
283
|
-
super().__post_init__()
|
|
281
|
+
super(CostOfRevenueSortRule, self).__post_init__()
|
|
284
282
|
|
|
285
283
|
|
|
286
284
|
@mypyc_attr(native_class=False)
|
|
@@ -293,7 +291,7 @@ class ExpenseSortRule(_OutboundSortRule):
|
|
|
293
291
|
def __post_init__(self) -> None:
|
|
294
292
|
"""Prepends `self.txgroup` with 'Expenses:'."""
|
|
295
293
|
object.__setattr__(self, "txgroup", f"Expenses:{self.txgroup}")
|
|
296
|
-
super().__post_init__()
|
|
294
|
+
super(ExpenseSortRule, self).__post_init__()
|
|
297
295
|
|
|
298
296
|
|
|
299
297
|
@mypyc_attr(native_class=False)
|
|
@@ -306,7 +304,7 @@ class OtherIncomeSortRule(_InboundSortRule):
|
|
|
306
304
|
def __post_init__(self) -> None:
|
|
307
305
|
"""Prepends `self.txgroup` with 'Other Income:'."""
|
|
308
306
|
object.__setattr__(self, "txgroup", f"Other Income:{self.txgroup}")
|
|
309
|
-
super().__post_init__()
|
|
307
|
+
super(OtherIncomeSortRule, self).__post_init__()
|
|
310
308
|
|
|
311
309
|
|
|
312
310
|
@mypyc_attr(native_class=False)
|
|
@@ -319,7 +317,7 @@ class OtherExpenseSortRule(_OutboundSortRule):
|
|
|
319
317
|
def __post_init__(self) -> None:
|
|
320
318
|
"""Prepends `self.txgroup` with 'Other Expenses:'."""
|
|
321
319
|
object.__setattr__(self, "txgroup", f"Other Expenses:{self.txgroup}")
|
|
322
|
-
super().__post_init__()
|
|
320
|
+
super(OtherExpenseSortRule, self).__post_init__()
|
|
323
321
|
|
|
324
322
|
|
|
325
323
|
@mypyc_attr(native_class=False)
|
|
@@ -332,7 +330,7 @@ class IgnoreSortRule(_SortRule):
|
|
|
332
330
|
def __post_init__(self) -> None:
|
|
333
331
|
"""Prepends `self.txgroup` with 'Ignore:'."""
|
|
334
332
|
object.__setattr__(self, "txgroup", f"Ignore:{self.txgroup}")
|
|
335
|
-
super().__post_init__()
|
|
333
|
+
super(IgnoreSortRule, self).__post_init__()
|
|
336
334
|
|
|
337
335
|
|
|
338
336
|
TRule = TypeVar(
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dao_treasury
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.64
|
|
4
4
|
Summary: Produce comprehensive financial reports for your on-chain org
|
|
5
5
|
Classifier: Development Status :: 3 - Alpha
|
|
6
6
|
Classifier: Intended Audience :: Developers
|
|
@@ -14,7 +14,7 @@ Classifier: Operating System :: OS Independent
|
|
|
14
14
|
Classifier: Topic :: Software Development :: Libraries
|
|
15
15
|
Requires-Python: >=3.10,<3.13
|
|
16
16
|
Description-Content-Type: text/markdown
|
|
17
|
-
Requires-Dist: eth-portfolio-temp
|
|
17
|
+
Requires-Dist: eth-portfolio-temp==0.2.15
|
|
18
18
|
Dynamic: classifier
|
|
19
19
|
Dynamic: description
|
|
20
20
|
Dynamic: description-content-type
|
|
@@ -41,7 +41,7 @@ DAO Treasury is a comprehensive financial reporting and treasury management solu
|
|
|
41
41
|
- First, you will need to bring your own archive node. This can be one you run yourself, or one from one of the common providers (Tenderly, Alchemy, QuickNode, etc.). Your archive node must have tracing enabled (free-tier Alchemy nodes do not support this option).
|
|
42
42
|
- You must configure a [brownie network](https://eth-brownie.readthedocs.io/en/stable/network-management.html) to use your RPC.
|
|
43
43
|
- You will need an auth token for [Etherscan](https://etherscan.io/)'s API. Follow their [guide](https://docs.etherscan.io/etherscan-v2/getting-an-api-key) to get your key, and set env var `ETHERSCAN_TOKEN` with its value.
|
|
44
|
-
- You'll also need [Docker](https://www.docker.com/get-started/) installed on your system. If on MacOS, you will need to leave Docker Desktop open while
|
|
44
|
+
- You'll also need [Docker](https://www.docker.com/get-started/) installed on your system. If on MacOS, you will need to leave Docker Desktop open while DAO Treasury is running.
|
|
45
45
|
|
|
46
46
|
## Installation
|
|
47
47
|
|
|
@@ -66,6 +66,7 @@ poetry run dao-treasury run --wallet 0x123 --network mainnet --interval 12h
|
|
|
66
66
|
**CLI Options:**
|
|
67
67
|
- `--network`: The id of the brownie network the exporter will connect to (default: mainnet)
|
|
68
68
|
- `--interval`: The time interval between each data snapshot (default: 12h)
|
|
69
|
+
- `--concurrency`: The max number of historical blocks to export concurrently. (default: 30)
|
|
69
70
|
- `--daemon`: Run the export process in the background (default: False) (NOTE: currently unsupported)
|
|
70
71
|
- `--grafana-port`: Set the port for the Grafana dashboard where you can view data (default: 3004)
|
|
71
72
|
- `--renderer-port`: Set the port for the report rendering service (default: 8091)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
dao_treasury__mypyc.cp312-win_amd64.pyd,sha256=m_hSDR2b6FtVj0POuQJNGSob510zwa0kKFbNtDECMe0,480256
|
|
2
|
+
dao_treasury/ENVIRONMENT_VARIABLES.py,sha256=LS_D4ALB3BO-vYKyh1tzRHi10QBE6f654Zy8pmJ_xPY,656
|
|
3
|
+
dao_treasury/__init__.py,sha256=ai8iALE_Zv43O9cH1jkNJ39bzhr60kBDX6L7C4Nj9FA,1539
|
|
4
|
+
dao_treasury/_docker.cp312-win_amd64.pyd,sha256=Z5nnMuj_1GO-URK123LOzK_hUBzEZCtgpw0C2q3MZkE,10752
|
|
5
|
+
dao_treasury/_docker.py,sha256=Rki3eLKOmsNxN3nF-gmbM9UQV49SY7ToEHZboL_HYvA,6118
|
|
6
|
+
dao_treasury/_nicknames.cp312-win_amd64.pyd,sha256=YTnkDI0yc7DCVjihrIGN1tYJ61HRLtpmWYNPCA6-yb8,10752
|
|
7
|
+
dao_treasury/_nicknames.py,sha256=n8c-JZhORYymCMv6jsC96IthAzAhpslyEn-KCk_YiSM,1049
|
|
8
|
+
dao_treasury/_wallet.cp312-win_amd64.pyd,sha256=BZIi1Ktz8VaKJusnd9EiwzVncdcrjMdX6nJNUQxpnZg,10752
|
|
9
|
+
dao_treasury/_wallet.py,sha256=nHBAKFJstdKuYbvpskGVx2KU80YrZHGHsEh5V3TwIHs,10712
|
|
10
|
+
dao_treasury/constants.cp312-win_amd64.pyd,sha256=P713oVsvivx5u1ktLfU1xjRMhCql_awRIkWChobmFRc,10752
|
|
11
|
+
dao_treasury/constants.py,sha256=-T0oPw7lC5YeaiplHAtYL-2ss7knvKrJKQ1LCc8kX8g,1483
|
|
12
|
+
dao_treasury/db.py,sha256=3_-nm8vD92ECaHxjMYf0eaXfsBRC2ojGcm-AFz2ZLAQ,50625
|
|
13
|
+
dao_treasury/docker-compose.yaml,sha256=wNNE9xmkchcV-nJxzrmUkbUA0CW1qgdGQKJ7uw2P8nU,1350
|
|
14
|
+
dao_treasury/main.py,sha256=w7VBmBwNBYjOkz2LpT4_9FZ1CI8AVcr4vyfr1wZVk5Q,8458
|
|
15
|
+
dao_treasury/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
16
|
+
dao_treasury/treasury.py,sha256=wh4wESLbYSHjcfpa-sW5TIqa5pSC9Y_7Id8tzLzJLaw,7414
|
|
17
|
+
dao_treasury/types.cp312-win_amd64.pyd,sha256=r-peJUZxMkG3NPi7FAVGTzRDP0oOhiiXRaNBJqqObbY,10752
|
|
18
|
+
dao_treasury/types.py,sha256=KFz4WKPp4t_RBwIT6YGwOcgbzw8tdHIOcXTFsUA0pJA,3818
|
|
19
|
+
dao_treasury/.grafana/provisioning/dashboards/dashboards.yaml,sha256=NfmmICGLVfIrI8ulzUTUYc7wFetk2v-x6eaoYHnCvQc,1914
|
|
20
|
+
dao_treasury/.grafana/provisioning/dashboards/breakdowns/Expenses.json,sha256=gxfPI4eO3PDPe70Yx7_dN0Yx5isvgy-MKe-fizBClMw,16879
|
|
21
|
+
dao_treasury/.grafana/provisioning/dashboards/breakdowns/Revenue.json,sha256=eowBLlWgL3bsE1B17oYZKA-N9woBT4lHlRrhdqSY5KA,16483
|
|
22
|
+
dao_treasury/.grafana/provisioning/dashboards/streams/LlamaPay.json,sha256=zRSpnlDD3_fsynCDxfdV3HRjqWbeAqhad-YBe1rMQGo,7419
|
|
23
|
+
dao_treasury/.grafana/provisioning/dashboards/summary/Monthly.json,sha256=eqOVxhBV3YYsGhEs2xvnuDU1VX_DdxDFn-XuXKJ3Tpc,6860
|
|
24
|
+
dao_treasury/.grafana/provisioning/dashboards/transactions/Treasury Transactions.json,sha256=Ig_Z9gdAUnPb3OKZzkokoM9OmFsUiJRIcCTOMImJk-k,13133
|
|
25
|
+
dao_treasury/.grafana/provisioning/dashboards/treasury/Cashflow (Including Unsorted).json,sha256=s0SYuemqh9RgYm2H_gApmUJ73w-7P5czviUFmE0qOzE,28145
|
|
26
|
+
dao_treasury/.grafana/provisioning/dashboards/treasury/Cashflow.json,sha256=MzmeP5fdATIUCzeXV0ZBfzuwef2TRm050Sa6FAjUCpc,20009
|
|
27
|
+
dao_treasury/.grafana/provisioning/dashboards/treasury/Current Treasury Assets.json,sha256=TeVujxB5ibsPdbfwmbpW1ApjcdfKoSGkv_mS4wBDtZQ,14681
|
|
28
|
+
dao_treasury/.grafana/provisioning/dashboards/treasury/Historical Treasury Balances.json,sha256=7qVXn2PjeBIp2pFRbVfxA4PeWxhhVKQCr4qIPZoIj90,133963
|
|
29
|
+
dao_treasury/.grafana/provisioning/dashboards/treasury/Operating Cashflow.json,sha256=fYkiZ37Eg2vu9dPJavCZXPPtX6-rTDbJwE_Ougpo2Mk,15828
|
|
30
|
+
dao_treasury/.grafana/provisioning/datasources/datasources.yaml,sha256=gLmJsOkEXNzWRDibShfHFySWeuExW-dSB_U0OSfH868,344
|
|
31
|
+
dao_treasury/sorting/__init__.cp312-win_amd64.pyd,sha256=ak-k7uhErk6Xqg-mHGHWDbDAVFXGlcBXWvWDqLgBh1w,10752
|
|
32
|
+
dao_treasury/sorting/__init__.py,sha256=_uxM_FE1paM8oDAhDdHSyhDwnrlxCYX_lGn2DOqCaHU,10666
|
|
33
|
+
dao_treasury/sorting/_matchers.cp312-win_amd64.pyd,sha256=VAndvzBOSz3oxHn9SHaawZ3U39JtpLKU4wGzXCr6hQ0,10752
|
|
34
|
+
dao_treasury/sorting/_matchers.py,sha256=ACi6aXZCKW5OTiztsID7CXCGJounj5c6ivhOCg2436M,14392
|
|
35
|
+
dao_treasury/sorting/_rules.cp312-win_amd64.pyd,sha256=sgCiIxY7_wWn-03WbHdHhrefmi3B_3jgcM4q5eQHqwY,10752
|
|
36
|
+
dao_treasury/sorting/_rules.py,sha256=DxhdUgpS0q0LWeLl9W1Bjn5LZz9z4OLA03vQllPMH9k,9229
|
|
37
|
+
dao_treasury/sorting/factory.cp312-win_amd64.pyd,sha256=XrShOz6ZuldzvtGWuKeUUwOLqev64JX-OczmL6y4Se0,10752
|
|
38
|
+
dao_treasury/sorting/factory.py,sha256=zlJ18xlMTxv8ACV6_MimCVIDsw3K5AZcyvKaNYY7R14,10484
|
|
39
|
+
dao_treasury/sorting/rule.cp312-win_amd64.pyd,sha256=_FNxxynrY_5v4szFxHMqJ1c4A2RYN4ZhvDYTl2kjkfU,10752
|
|
40
|
+
dao_treasury/sorting/rule.py,sha256=wbL8s0-6dxcCKghUtEDSkLDBnyvggsJ3gt_RawQ6kB4,11972
|
|
41
|
+
dao_treasury/sorting/rules/__init__.cp312-win_amd64.pyd,sha256=dQ-KjAyGCkLe2ouwCP0VAmW7UdVRQZWVyqctFbLkfms,10752
|
|
42
|
+
dao_treasury/sorting/rules/__init__.py,sha256=hcLfejOEwD8RaM2RE-38Ej6_WkvL9BVGvIIGY848E6E,49
|
|
43
|
+
dao_treasury/sorting/rules/ignore/__init__.cp312-win_amd64.pyd,sha256=FlSg7q6Lv9r8sp4Y-ayKNw2Fd2Wg3oH7P74BElIAL5I,10752
|
|
44
|
+
dao_treasury/sorting/rules/ignore/__init__.py,sha256=16THKoGdj6qfkkytuCFVG_R1M6KSErMI4AVE1p0ukS4,58
|
|
45
|
+
dao_treasury/sorting/rules/ignore/llamapay.cp312-win_amd64.pyd,sha256=FLcw9b2bupon32wugGGOEbC5et-gfhVvXgZZu5I7A9c,10752
|
|
46
|
+
dao_treasury/sorting/rules/ignore/llamapay.py,sha256=aYyAJRlmv419IeaqkcV5o3ffx0UVfteU0lTl80j0BGo,783
|
|
47
|
+
dao_treasury/streams/__init__.cp312-win_amd64.pyd,sha256=WE7njp2ikR_fiIajjEi0eNcyO4122n9NlZLL52LTp_Y,10752
|
|
48
|
+
dao_treasury/streams/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
49
|
+
dao_treasury/streams/llamapay.cp312-win_amd64.pyd,sha256=9JRwhVxJLyT7GN8dzI0D_TMrs8v0exbk6pXFIqNHq4g,10752
|
|
50
|
+
dao_treasury/streams/llamapay.py,sha256=rO1Mh2ndTziR6pnRkKHnQ22a_Yx9PM_-BG7I4dspEZ8,13535
|
|
51
|
+
dao_treasury-0.0.64.dist-info/METADATA,sha256=mvz9huam9Gfqs52NpVQOhKLoWvn6xnEKyL5Rw2SKFTM,7231
|
|
52
|
+
dao_treasury-0.0.64.dist-info/WHEEL,sha256=8UP9x9puWI0P1V_d7K2oMTBqfeLNm21CTzZ_Ptr0NXU,101
|
|
53
|
+
dao_treasury-0.0.64.dist-info/top_level.txt,sha256=CV8aYytuSYplDhLVY4n0GphckdysXCd1lHmbqfsPxNk,33
|
|
54
|
+
dao_treasury-0.0.64.dist-info/RECORD,,
|
|
Binary file
|
|
Binary file
|