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.
Files changed (41) hide show
  1. dao_treasury/.grafana/provisioning/dashboards/breakdowns/Expenses.json +526 -0
  2. dao_treasury/.grafana/provisioning/dashboards/breakdowns/Revenue.json +526 -0
  3. dao_treasury/.grafana/provisioning/dashboards/dashboards.yaml +25 -1
  4. dao_treasury/.grafana/provisioning/dashboards/streams/LlamaPay.json +8 -8
  5. dao_treasury/.grafana/provisioning/dashboards/summary/Monthly.json +10 -9
  6. dao_treasury/.grafana/provisioning/dashboards/transactions/Treasury Transactions.json +8 -35
  7. dao_treasury/.grafana/provisioning/dashboards/treasury/Cashflow (Including Unsorted).json +74 -33
  8. dao_treasury/.grafana/provisioning/dashboards/treasury/Cashflow.json +53 -23
  9. dao_treasury/.grafana/provisioning/dashboards/treasury/Current Treasury Assets.json +593 -0
  10. dao_treasury/.grafana/provisioning/dashboards/treasury/Historical Treasury Balances.json +2999 -0
  11. dao_treasury/.grafana/provisioning/dashboards/treasury/Operating Cashflow.json +38 -17
  12. dao_treasury/_docker.cp312-win_amd64.pyd +0 -0
  13. dao_treasury/_docker.py +24 -20
  14. dao_treasury/_nicknames.cp312-win_amd64.pyd +0 -0
  15. dao_treasury/_wallet.cp312-win_amd64.pyd +0 -0
  16. dao_treasury/constants.cp312-win_amd64.pyd +0 -0
  17. dao_treasury/constants.py +2 -2
  18. dao_treasury/db.py +23 -3
  19. dao_treasury/docker-compose.yaml +1 -1
  20. dao_treasury/main.py +6 -0
  21. dao_treasury/sorting/__init__.cp312-win_amd64.pyd +0 -0
  22. dao_treasury/sorting/_matchers.cp312-win_amd64.pyd +0 -0
  23. dao_treasury/sorting/_rules.cp312-win_amd64.pyd +0 -0
  24. dao_treasury/sorting/factory.cp312-win_amd64.pyd +0 -0
  25. dao_treasury/sorting/rule.cp312-win_amd64.pyd +0 -0
  26. dao_treasury/sorting/rule.py +8 -10
  27. dao_treasury/sorting/rules/__init__.cp312-win_amd64.pyd +0 -0
  28. dao_treasury/sorting/rules/ignore/__init__.cp312-win_amd64.pyd +0 -0
  29. dao_treasury/sorting/rules/ignore/llamapay.cp312-win_amd64.pyd +0 -0
  30. dao_treasury/streams/__init__.cp312-win_amd64.pyd +0 -0
  31. dao_treasury/streams/llamapay.cp312-win_amd64.pyd +0 -0
  32. dao_treasury/types.cp312-win_amd64.pyd +0 -0
  33. {dao_treasury-0.0.47.dist-info → dao_treasury-0.0.64.dist-info}/METADATA +4 -3
  34. dao_treasury-0.0.64.dist-info/RECORD +54 -0
  35. dao_treasury-0.0.64.dist-info/top_level.txt +2 -0
  36. dao_treasury__mypyc.cp312-win_amd64.pyd +0 -0
  37. bf2b4fe1f86ad2ea158b__mypyc.cp312-win_amd64.pyd +0 -0
  38. dao_treasury/.grafana/provisioning/dashboards/treasury/Treasury.json +0 -2018
  39. dao_treasury-0.0.47.dist-info/RECORD +0 -51
  40. dao_treasury-0.0.47.dist-info/top_level.txt +0 -2
  41. {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": null
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
- "textMode": "auto"
69
+ "showPercentChange": false,
70
+ "textMode": "auto",
71
+ "wideLayout": true
68
72
  },
69
- "pluginVersion": "10.2.0",
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": null
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
- "textMode": "auto"
135
+ "showPercentChange": false,
136
+ "textMode": "auto",
137
+ "wideLayout": true
130
138
  },
131
- "pluginVersion": "10.2.0",
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": null
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
- "textMode": "auto"
201
+ "showPercentChange": false,
202
+ "textMode": "auto",
203
+ "wideLayout": true
192
204
  },
193
- "pluginVersion": "10.2.0",
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": null
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
- "textMode": "auto"
268
+ "showPercentChange": false,
269
+ "textMode": "auto",
270
+ "wideLayout": true
255
271
  },
256
- "pluginVersion": "10.2.0",
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": null
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": 38,
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": 1,
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 typing import Any, Callable, Coroutine, Final, Iterable, Tuple, TypeVar, List
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
- compose_file: Final = str(
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
- print(f"starting the {', '.join(services) if services else 'grafana'} container(s)")
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
- print("building the grafana containers")
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
- eth_portfolio_scripts.docker.check_system()
178
- try:
179
- subprocess.check_output(
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 = eth_portfolio_utils.SUPPRESS_ERROR_LOGS
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, _EventItem]: ...
770
+ ) -> Coroutine[Any, Any, EventItem]: ...
751
771
  @overload
752
- def get_events(self, event_name: str, sync: bool = True) -> _EventItem: ...
753
- def get_events(self, event_name: str, sync: bool = True) -> _EventItem:
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:
@@ -5,7 +5,7 @@ networks:
5
5
 
6
6
  services:
7
7
  grafana:
8
- image: grafana/grafana:12.1.1
8
+ image: grafana/grafana:12.2.1
9
9
  ports:
10
10
  - 127.0.0.1:${DAO_TREASURY_GRAFANA_PORT:-3004}:3000
11
11
  environment:
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",
@@ -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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dao_treasury
3
- Version: 0.0.47
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<0.3,>=0.2.1.dev0
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 Yearn Treasury is running.
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,,
@@ -0,0 +1,2 @@
1
+ dao_treasury
2
+ dao_treasury__mypyc
Binary file