dao-treasury 0.0.37__cp310-cp310-macosx_11_0_arm64.whl → 0.0.69__cp310-cp310-macosx_11_0_arm64.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 (46) hide show
  1. dao_treasury/.grafana/provisioning/dashboards/breakdowns/Expenses.json +551 -0
  2. dao_treasury/.grafana/provisioning/dashboards/breakdowns/Revenue.json +551 -0
  3. dao_treasury/.grafana/provisioning/dashboards/dashboards.yaml +7 -57
  4. dao_treasury/.grafana/provisioning/dashboards/streams/LlamaPay.json +11 -16
  5. dao_treasury/.grafana/provisioning/dashboards/summary/Monthly.json +15 -15
  6. dao_treasury/.grafana/provisioning/dashboards/transactions/Treasury Transactions.json +38 -61
  7. dao_treasury/.grafana/provisioning/dashboards/treasury/Cashflow (Including Unsorted).json +122 -149
  8. dao_treasury/.grafana/provisioning/dashboards/treasury/Cashflow.json +87 -100
  9. dao_treasury/.grafana/provisioning/dashboards/treasury/Current Treasury Assets.json +1009 -0
  10. dao_treasury/.grafana/provisioning/dashboards/treasury/Historical Treasury Balances.json +2989 -0
  11. dao_treasury/.grafana/provisioning/dashboards/treasury/Operating Cashflow.json +64 -78
  12. dao_treasury/ENVIRONMENT_VARIABLES.py +12 -0
  13. dao_treasury/__init__.py +14 -0
  14. dao_treasury/_docker.cpython-310-darwin.so +0 -0
  15. dao_treasury/_docker.py +38 -21
  16. dao_treasury/_nicknames.cpython-310-darwin.so +0 -0
  17. dao_treasury/_nicknames.py +15 -0
  18. dao_treasury/_wallet.cpython-310-darwin.so +0 -0
  19. dao_treasury/constants.cpython-310-darwin.so +0 -0
  20. dao_treasury/constants.py +24 -0
  21. dao_treasury/db.py +74 -4
  22. dao_treasury/docker-compose.yaml +1 -1
  23. dao_treasury/main.py +6 -0
  24. dao_treasury/sorting/__init__.cpython-310-darwin.so +0 -0
  25. dao_treasury/sorting/_matchers.cpython-310-darwin.so +0 -0
  26. dao_treasury/sorting/_rules.cpython-310-darwin.so +0 -0
  27. dao_treasury/sorting/factory.cpython-310-darwin.so +0 -0
  28. dao_treasury/sorting/rule.cpython-310-darwin.so +0 -0
  29. dao_treasury/sorting/rule.py +8 -10
  30. dao_treasury/sorting/rules/__init__.cpython-310-darwin.so +0 -0
  31. dao_treasury/sorting/rules/ignore/__init__.cpython-310-darwin.so +0 -0
  32. dao_treasury/sorting/rules/ignore/llamapay.cpython-310-darwin.so +0 -0
  33. dao_treasury/streams/__init__.cpython-310-darwin.so +0 -0
  34. dao_treasury/streams/llamapay.cpython-310-darwin.so +0 -0
  35. dao_treasury/streams/llamapay.py +14 -2
  36. dao_treasury/treasury.py +33 -14
  37. dao_treasury/types.cpython-310-darwin.so +0 -0
  38. {dao_treasury-0.0.37.dist-info → dao_treasury-0.0.69.dist-info}/METADATA +4 -3
  39. dao_treasury-0.0.69.dist-info/RECORD +54 -0
  40. dao_treasury-0.0.69.dist-info/top_level.txt +2 -0
  41. dao_treasury__mypyc.cpython-310-darwin.so +0 -0
  42. bf2b4fe1f86ad2ea158b__mypyc.cpython-310-darwin.so +0 -0
  43. dao_treasury/.grafana/provisioning/dashboards/treasury/Treasury.json +0 -2018
  44. dao_treasury-0.0.37.dist-info/RECORD +0 -51
  45. dao_treasury-0.0.37.dist-info/top_level.txt +0 -2
  46. {dao_treasury-0.0.37.dist-info → dao_treasury-0.0.69.dist-info}/WHEEL +0 -0
dao_treasury/db.py CHANGED
@@ -3,6 +3,7 @@
3
3
  Database models and utilities for DAO treasury reporting.
4
4
 
5
5
  This module defines Pony ORM entities for:
6
+
6
7
  - Blockchain networks (:class:`Chain`)
7
8
  - On-chain addresses (:class:`Address`)
8
9
  - ERC-20 tokens and native coin placeholder (:class:`Token`)
@@ -17,27 +18,41 @@ and creating SQL views for reporting.
17
18
 
18
19
  import typing
19
20
  from asyncio import Semaphore
21
+ from collections import OrderedDict
20
22
  from decimal import Decimal, InvalidOperation
21
23
  from functools import lru_cache
22
24
  from logging import getLogger
23
25
  from os import path
24
26
  from pathlib import Path
25
- from typing import TYPE_CHECKING, Dict, Final, Tuple, Union, final
27
+ from typing import (
28
+ TYPE_CHECKING,
29
+ Any,
30
+ Coroutine,
31
+ Dict,
32
+ Final,
33
+ Literal,
34
+ Tuple,
35
+ Union,
36
+ final,
37
+ overload,
38
+ )
26
39
  from datetime import date, datetime, time, timezone
27
40
 
41
+ import eth_portfolio
28
42
  from a_sync import AsyncThreadPoolExecutor
29
43
  from brownie import chain
30
44
  from brownie.convert.datatypes import HexString
31
45
  from brownie.exceptions import EventLookupError
32
46
  from brownie.network.event import EventDict, _EventItem
33
47
  from brownie.network.transaction import TransactionReceipt
34
- from eth_typing import ChecksumAddress, HexAddress, HexStr
35
48
  from eth_portfolio.structs import (
36
49
  InternalTransfer,
37
50
  LedgerEntry,
38
51
  TokenTransfer,
39
52
  Transaction,
40
53
  )
54
+ from eth_retry import auto_retry
55
+ from eth_typing import ChecksumAddress, HexAddress, HexStr
41
56
  from pony.orm import (
42
57
  Database,
43
58
  InterfaceError,
@@ -53,6 +68,7 @@ from pony.orm import (
53
68
  select,
54
69
  )
55
70
  from y import EEE_ADDRESS, Contract, Network, convert, get_block_timestamp_async
71
+ from y._db.decorators import retry_locked
56
72
  from y.contracts import _get_code
57
73
  from y.exceptions import ContractNotVerified
58
74
 
@@ -60,6 +76,9 @@ from dao_treasury.constants import CHAINID
60
76
  from dao_treasury.types import TxGroupDbid, TxGroupName
61
77
 
62
78
 
79
+ EventItem = _EventItem[_EventItem[OrderedDict[str, Any]]]
80
+
81
+
63
82
  SQLITE_DIR = Path(path.expanduser("~")) / ".dao-treasury"
64
83
  """Path to the directory in the user's home where the DAO treasury SQLite database is stored."""
65
84
 
@@ -68,6 +87,7 @@ SQLITE_DIR.mkdir(parents=True, exist_ok=True)
68
87
 
69
88
  _INSERT_THREAD = AsyncThreadPoolExecutor(1)
70
89
  _SORT_THREAD = AsyncThreadPoolExecutor(1)
90
+ _EVENTS_THREADS = AsyncThreadPoolExecutor(16)
71
91
  _SORT_SEMAPHORE = Semaphore(50)
72
92
 
73
93
  _UTC = timezone.utc
@@ -234,6 +254,10 @@ class Address(DbEntity):
234
254
  def contract(self) -> Contract:
235
255
  return Contract(self.address)
236
256
 
257
+ @property
258
+ def contract_coro(self) -> Coroutine[Any, Any, Contract]:
259
+ return Contract.coroutine(self.address)
260
+
237
261
  @staticmethod
238
262
  @lru_cache(maxsize=None)
239
263
  def get_dbid(address: HexAddress) -> int:
@@ -294,7 +318,6 @@ class Address(DbEntity):
294
318
  )
295
319
 
296
320
  commit()
297
-
298
321
  return entity # type: ignore [no-any-return]
299
322
 
300
323
  @staticmethod
@@ -405,6 +428,10 @@ class Token(DbEntity):
405
428
  def contract(self) -> Contract:
406
429
  return Contract(self.address.address)
407
430
 
431
+ @property
432
+ def contract_coro(self) -> Coroutine[Any, Any, Contract]:
433
+ return Contract.coroutine(self.address.address)
434
+
408
435
  @property
409
436
  def scale(self) -> int:
410
437
  """Base for division according to `decimals`, e.g., `10**decimals`.
@@ -719,6 +746,10 @@ class TreasuryTx(DbEntity):
719
746
  """Human-readable label for the sender address."""
720
747
  return self.from_address.nickname or self.from_address.address # type: ignore [union-attr]
721
748
 
749
+ @property
750
+ def token_address(self) -> ChecksumAddress:
751
+ return self.token.address.address
752
+
722
753
  @property
723
754
  def symbol(self) -> str:
724
755
  """Ticker symbol for the transferred token."""
@@ -729,7 +760,23 @@ class TreasuryTx(DbEntity):
729
760
  """Decoded event logs for this transaction."""
730
761
  return self._transaction.events
731
762
 
732
- def get_events(self, event_name: str) -> _EventItem:
763
+ async def events_async(self) -> EventDict:
764
+ """Asynchronously fetch decoded event logs for this transaction."""
765
+ tx = self._transaction
766
+ events = tx._events
767
+ if events is None:
768
+ events = await _EVENTS_THREADS.run(getattr, tx, "events")
769
+ return events
770
+
771
+ @overload
772
+ def get_events(
773
+ self, event_name: str, sync: Literal[False]
774
+ ) -> Coroutine[Any, Any, EventItem]: ...
775
+ @overload
776
+ def get_events(self, event_name: str, sync: bool = True) -> EventItem: ...
777
+ def get_events(self, event_name: str, sync: bool = True) -> EventItem:
778
+ if not sync:
779
+ return _EVENTS_THREADS.run(self.get_events, event_name)
733
780
  try:
734
781
  return self.events[event_name]
735
782
  except EventLookupError:
@@ -746,6 +793,7 @@ class TreasuryTx(DbEntity):
746
793
  return get_transaction(self.hash)
747
794
 
748
795
  @staticmethod
796
+ @auto_retry
749
797
  async def insert(entry: LedgerEntry) -> None:
750
798
  """Asynchronously insert and sort a ledger entry.
751
799
 
@@ -923,6 +971,7 @@ class TreasuryTx(DbEntity):
923
971
  return dbid # type: ignore [no-any-return]
924
972
 
925
973
  @staticmethod
974
+ @retry_locked
926
975
  def __set_txgroup(treasury_tx_dbid: int, txgroup_dbid: TxGroupDbid) -> None:
927
976
  with db_session:
928
977
  TreasuryTx[treasury_tx_dbid].txgroup = txgroup_dbid
@@ -1382,3 +1431,24 @@ def _validate_integrity_error(
1382
1431
  )
1383
1432
  else None
1384
1433
  )
1434
+
1435
+
1436
+ def _drop_shitcoin_txs() -> None:
1437
+ """
1438
+ Purge any shitcoin txs from the db.
1439
+
1440
+ These should not be frequent, and only occur if a user populated the db before a shitcoin was added to the SHITCOINS mapping.
1441
+ """
1442
+ shitcoins = eth_portfolio.SHITCOINS[CHAINID]
1443
+ with db_session:
1444
+ shitcoin_txs = select(
1445
+ tx for tx in TreasuryTx if tx.token.address.address in shitcoins
1446
+ )
1447
+ if count := shitcoin_txs.count():
1448
+ logger.info(f"Purging {count} shitcoin txs from the database...")
1449
+ for tx in shitcoin_txs:
1450
+ tx.delete()
1451
+ logger.info("Shitcoin tx purge complete.")
1452
+
1453
+
1454
+ _drop_shitcoin_txs()
@@ -5,7 +5,7 @@ networks:
5
5
 
6
6
  services:
7
7
  grafana:
8
- image: grafana/grafana:10.2.0
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(
@@ -22,7 +22,7 @@ from eth_typing import BlockNumber, ChecksumAddress, HexAddress, HexStr
22
22
  from tqdm.asyncio import tqdm_asyncio
23
23
 
24
24
  import y
25
- from y.time import UnixTimestamp
25
+ from y.time import NoBlockFound, UnixTimestamp
26
26
  from y.utils.events import decode_logs, get_logs_asap
27
27
 
28
28
  from dao_treasury import constants
@@ -338,7 +338,19 @@ class LlamaPayProcessor:
338
338
  check_at = date_obj + timedelta(days=1) - timedelta(seconds=1)
339
339
  if check_at > now(tz=_UTC):
340
340
  await sleep((check_at - now(tz=_UTC)).total_seconds())
341
- block = await get_block_at_timestamp(check_at, sync=False)
341
+
342
+ while True:
343
+ try:
344
+ block = await get_block_at_timestamp(check_at, sync=False)
345
+ except NoBlockFound:
346
+ sleep_time = (check_at - now(tz=_UTC)).total_seconds()
347
+ logger.debug(
348
+ "no block found for %s, sleeping %ss", check_at, sleep_time
349
+ )
350
+ await sleep(sleep_time)
351
+ else:
352
+ break
353
+
342
354
  price_fut = create_task(get_price(stream_token, block, sync=False))
343
355
  start_timestamp = await _get_start_timestamp(stream_id, block)
344
356
  if start_timestamp == 0:
dao_treasury/treasury.py CHANGED
@@ -1,3 +1,20 @@
1
+ """Treasury orchestration and analytics interface.
2
+
3
+ This module defines the Treasury class, which aggregates DAO wallets, sets up
4
+ sorting rules, and manages transaction ingestion and streaming analytics.
5
+ It coordinates the end-to-end flow from wallet configuration to database
6
+ population and dashboard analytics.
7
+
8
+ Key Responsibilities:
9
+ - Aggregate and manage DAO-controlled wallets.
10
+ - Ingest and process on-chain transactions.
11
+ - Apply sorting/categorization rules.
12
+ - Integrate with streaming protocols (e.g., LlamaPay).
13
+ - Populate the database for analytics and dashboards.
14
+
15
+ This is the main entry point for orchestrating DAO treasury analytics.
16
+ """
17
+
1
18
  from asyncio import create_task, gather
2
19
  from logging import getLogger
3
20
  from pathlib import Path
@@ -59,20 +76,22 @@ class Treasury(a_sync.ASyncGenericBase): # type: ignore [misc]
59
76
  TypeError: If any item in `wallets` is not a str or TreasuryWallet.
60
77
 
61
78
  Examples:
62
- Create a synchronous Treasury:
63
- >>> treasury = Treasury(
64
- ... wallets=["0xAbc123...", TreasuryWallet("0xDef456...", start_block=1000)],
65
- ... sort_rules=Path("/path/to/rules"),
66
- ... start_block=500,
67
- ... label="DAO Treasury",
68
- ... asynchronous=False
69
- ... )
70
-
71
- Create an asynchronous Treasury:
72
- >>> treasury_async = Treasury(
73
- ... wallets=["0xAbc123..."],
74
- ... asynchronous=True
75
- ... )
79
+ .. code-block:: python
80
+
81
+ # Create a synchronous Treasury
82
+ treasury = Treasury(
83
+ wallets=["0xAbc123...", TreasuryWallet("0xDef456...", start_block=1000)],
84
+ sort_rules=Path("/path/to/rules"),
85
+ start_block=500,
86
+ label="DAO Treasury",
87
+ asynchronous=False
88
+ )
89
+
90
+ # Create an asynchronous Treasury
91
+ treasury_async = Treasury(
92
+ wallets=["0xAbc123..."],
93
+ asynchronous=True
94
+ )
76
95
  """
77
96
  global TREASURY
78
97
  if TREASURY is not None:
Binary file
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dao_treasury
3
- Version: 0.0.37
3
+ Version: 0.0.69
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.1,>=0.0.34.dev0
17
+ Requires-Dist: eth-portfolio-temp==0.2.17
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.cpython-310-darwin.so,sha256=kIki1ZCZKlg6t_KnnGyrCVcToWX9QslYfe7FM040ldo,1247656
2
+ dao_treasury-0.0.69.dist-info/RECORD,,
3
+ dao_treasury-0.0.69.dist-info/WHEEL,sha256=11kMdE9gzbsaQG30fRcsAYxBLEVRsqJo098Y5iL60Xo,136
4
+ dao_treasury-0.0.69.dist-info/top_level.txt,sha256=CV8aYytuSYplDhLVY4n0GphckdysXCd1lHmbqfsPxNk,33
5
+ dao_treasury-0.0.69.dist-info/METADATA,sha256=nvHMuGdpOK5wplMI1rk4FRymCtKZJP7VPpLe_YTX2j4,7111
6
+ dao_treasury/_wallet.py,sha256=epV8LVuwHlOzc9UkA66js7HfEiZBOSAGJMtWbDTzmjU,10462
7
+ dao_treasury/_wallet.cpython-310-darwin.so,sha256=LmL9YXzht18fa-hyF-ntOFXjE2EUVsBVy7fFx2ieCAE,50640
8
+ dao_treasury/db.py,sha256=WEM89soGJ-qI0KVk2XdmcUDtOGe-IUiw5cKQu7EKsvQ,49280
9
+ dao_treasury/docker-compose.yaml,sha256=SsfbKO8XiKxu0ckhFVRF8YA3dMWOnGhwvpJg_8YDXB0,1309
10
+ dao_treasury/types.cpython-310-darwin.so,sha256=nG4OufWTWLt8HFGDOVYCd3wVL08yIIX-vCYUVgZx-eM,50616
11
+ dao_treasury/ENVIRONMENT_VARIABLES.py,sha256=LEczR1MSWTY00sLHnFs3j_Jm8WZNJCxjwEzrvjbwl2E,636
12
+ dao_treasury/_nicknames.cpython-310-darwin.so,sha256=q4ngQ9QkG_X-D8jNqzmqrKw7Gr-lvXKsoY6XIk2x4wE,50656
13
+ dao_treasury/constants.py,sha256=BGWVeN4KqpxWDGLG-DjPmdXmyVEb2C9KpMig9RaGJws,1444
14
+ dao_treasury/__init__.py,sha256=W4syl9-cNhHOdD25ye9U7aBJTLE_R-uP49FXC_6CUOE,1477
15
+ dao_treasury/_nicknames.py,sha256=bvz0b8C31tFQ0pGtpSJW86OwjUF_qMBal4VXVT5UyLo,1017
16
+ dao_treasury/types.py,sha256=dJDx0hYfDDL3slcUzRnCgrzFFsgCzoqg8uaTtLaT4kk,3685
17
+ dao_treasury/_docker.py,sha256=9_XTuBClqNK6qQjSsVk_fdBWPgfSj8EuDIcE9-whBB4,5924
18
+ dao_treasury/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
+ dao_treasury/constants.cpython-310-darwin.so,sha256=lKl5HQDTQWYSlexhN2PMTEBSJW07KT7Bkt4mN5L1Rd4,50656
20
+ dao_treasury/_docker.cpython-310-darwin.so,sha256=Gu8EQuL4kdBYhWgoBhcHks7bVOgosTIrJvqZi1e_4gs,50640
21
+ dao_treasury/treasury.py,sha256=taTvwTH_Zdu2M61TrUCENcIUjxdQO3vryrZ2iVb6suM,7223
22
+ dao_treasury/main.py,sha256=uMY5XP_GpxO6Qd9VA1YMLzMOd-O4VnxbGJ2Pdqh0Zo0,8205
23
+ dao_treasury/.grafana/provisioning/datasources/datasources.yaml,sha256=mjQs8or651NgD_bZnKBm8vSghzjw_g3enL01YPt0dik,327
24
+ dao_treasury/.grafana/provisioning/dashboards/dashboards.yaml,sha256=7WQaeajNf9hNnPJA9SZgvPot9m7TbzyN21BIbB8MaHM,191
25
+ dao_treasury/.grafana/provisioning/dashboards/breakdowns/Revenue.json,sha256=sPwG6ERjiJVPyivYS2iPCtFDdxUAWpyz4e3NGcT0tcE,18620
26
+ dao_treasury/.grafana/provisioning/dashboards/breakdowns/Expenses.json,sha256=fMBSldgUmZm3dDHb6D7ShQ7R2eCH4CWbhZCRhz21cOw,19413
27
+ dao_treasury/.grafana/provisioning/dashboards/streams/LlamaPay.json,sha256=Ct8FRa0c_FQEBTKaGpC0y2cBhYM_YYU_v0uOUBJAqQU,7504
28
+ dao_treasury/.grafana/provisioning/dashboards/transactions/Treasury Transactions.json,sha256=4R4L3jHegSTewWGRDayGscDZqVv5Laf6K77jK0TYeyY,14700
29
+ dao_treasury/.grafana/provisioning/dashboards/treasury/Cashflow (Including Unsorted).json,sha256=rUzNnSnR33YyJDLwzPL8iPn34CYaYVsL2V4vEZwvQf0,27346
30
+ dao_treasury/.grafana/provisioning/dashboards/treasury/Historical Treasury Balances.json,sha256=jTSvRNQu9QAjL7v2lJWbkDa_p8vnFecTQsbqIPJ2d3o,104559
31
+ dao_treasury/.grafana/provisioning/dashboards/treasury/Current Treasury Assets.json,sha256=mysaX1aoB9pB5OTrp2vlrGLRfAxsDCUOMsnL9rbxOc0,25951
32
+ dao_treasury/.grafana/provisioning/dashboards/treasury/Operating Cashflow.json,sha256=7xRABZ9m1iFXDVeLX-4x6ByyGnE7GQQrSGUPk2pRvww,15471
33
+ dao_treasury/.grafana/provisioning/dashboards/treasury/Cashflow.json,sha256=f7hl5DyxhrebpXqGsq2FJhrNIvpInD9VwoH0N6jqIFY,19637
34
+ dao_treasury/.grafana/provisioning/dashboards/summary/Monthly.json,sha256=Xa0GyAOK_3fDn5u89_6yzzd-SKo_LEotH8t4GnXsUTg,7050
35
+ dao_treasury/streams/llamapay.py,sha256=yn37gwVfqGFF9fOhHuj9_t7KlHGyrdekF2TUmVDyg64,13147
36
+ dao_treasury/streams/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
+ dao_treasury/streams/__init__.cpython-310-darwin.so,sha256=TS96wG_HxmBbAatizVpQv74eonu9Wd2D8LHRmarTsTo,50640
38
+ dao_treasury/streams/llamapay.cpython-310-darwin.so,sha256=-WV4uPT-9ESfsO-CMKcD2A6YVa-jvnmil7LdZbXj_sk,50656
39
+ dao_treasury/sorting/factory.cpython-310-darwin.so,sha256=euD8mVddY44_tz2Ee_ehdHMrtRVZ6KmPeAWX7AhjZ8w,50656
40
+ dao_treasury/sorting/_rules.py,sha256=vWkqJVA8yCHKRv9sw872Jq6G0zpM-v_J1jCz-Mgleec,8994
41
+ dao_treasury/sorting/rule.cpython-310-darwin.so,sha256=fxnzLnbNgwohwWeoxtukt03mo0fgFFDgByiYCjbWE-s,50632
42
+ dao_treasury/sorting/_matchers.cpython-310-darwin.so,sha256=vXqL7ox32cWEfznn4DtXdxh1BoT1rrRn_C2Kc6jpIcU,50656
43
+ dao_treasury/sorting/__init__.py,sha256=vKj3NPB7EWbX7_fSUWKXk-NsyPasOkFhJvJVGclBOAE,10371
44
+ dao_treasury/sorting/factory.py,sha256=pFD6luc0bKxOTT1hlAp3ZwJw6R0wN8pjIZrqMZwhsko,10185
45
+ dao_treasury/sorting/__init__.cpython-310-darwin.so,sha256=dQa-t7PlnnpRVETqBOHmm4myoXyOhVT8e22_g_6RsiM,50640
46
+ dao_treasury/sorting/rule.py,sha256=WtGGN5mOd6S2Bhk7v5lsBWSSzVGKON7V10ImrUN79Y4,11628
47
+ dao_treasury/sorting/_rules.cpython-310-darwin.so,sha256=g_wUPrgkpTTE4QsYxSThmkS7tl-xvPWdWTJd8LpxWBQ,50640
48
+ dao_treasury/sorting/_matchers.py,sha256=u0GfPYiODr_NtzbfyLxEKDuXmWRiaeuZulDj9FPDOH8,14005
49
+ dao_treasury/sorting/rules/__init__.py,sha256=ofzIsW0P74kuKr6DlScZIF8p7hBh6guRpe1uOq6oLLA,48
50
+ dao_treasury/sorting/rules/__init__.cpython-310-darwin.so,sha256=J0KX8HrNMXTVsjASAow6bRdD2V-n_HN3w7RfPBuW0jM,50640
51
+ dao_treasury/sorting/rules/ignore/llamapay.py,sha256=NgiVt9MRtI-f4mw9U5_gqttdPqDa3vt_z5XWJP_UYWs,763
52
+ dao_treasury/sorting/rules/ignore/__init__.py,sha256=dJ4oKSLe7fal1Ct7XtMCfVJAtvZXcyIomf8HF3gWUhQ,57
53
+ dao_treasury/sorting/rules/ignore/__init__.cpython-310-darwin.so,sha256=B4nKJoPR5F4RQfutJXO0m_efGQSRAKQQ9Hyz6VJOM84,50656
54
+ dao_treasury/sorting/rules/ignore/llamapay.cpython-310-darwin.so,sha256=yd2vl313QQ8yhN453zbf2LbSgsC7lS8ha0G6gkf8-2Q,50672
@@ -0,0 +1,2 @@
1
+ dao_treasury
2
+ dao_treasury__mypyc