dao-treasury 0.0.28__cp312-cp312-win_amd64.whl → 0.0.30__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.
Binary file
dao_treasury/_docker.py CHANGED
@@ -1,33 +1,38 @@
1
1
  """This module contains utilities for managing dao-treasury's docker containers"""
2
2
 
3
3
  import logging
4
- import os
4
+ from importlib import resources
5
5
  import subprocess
6
6
  from functools import wraps
7
- from typing import Any, Callable, Coroutine, Final, Iterable, Tuple, TypeVar
7
+ from typing import Any, Callable, Coroutine, Final, Iterable, Tuple, TypeVar, List
8
8
 
9
9
  import eth_portfolio_scripts.docker
10
10
  from typing_extensions import ParamSpec
11
11
 
12
12
  logger: Final = logging.getLogger(__name__)
13
13
 
14
- compose_file: Final = os.path.join(
15
- os.path.dirname(os.path.abspath(__file__)), "docker-compose.yaml"
14
+ compose_file: Final = str(
15
+ resources.files("dao_treasury").joinpath("docker-compose.yaml")
16
16
  )
17
17
  """The path of dao-treasury's docker-compose.yaml file on your machine"""
18
18
 
19
19
 
20
- def up() -> None:
21
- """Build and start Grafana containers defined in the compose file.
20
+ def up(*services: str) -> None:
21
+ """Build and start the specified containers defined in the compose file.
22
+
23
+ Args:
24
+ services: service names to bring up.
22
25
 
23
26
  This function first builds the Docker services by invoking
24
- :func:`build` and then starts them in detached mode using
27
+ :func:`build` and then starts the specified services in detached mode using
25
28
  Docker Compose. If Docker Compose is not available, it falls back
26
29
  to the legacy ``docker-compose`` command.
27
30
 
28
31
  Examples:
32
+ >>> up('grafana')
33
+ starting the grafana container
29
34
  >>> up()
30
- starting the grafana containers
35
+ starting all containers (grafana and renderer)
31
36
 
32
37
  See Also:
33
38
  :func:`build`
@@ -35,10 +40,10 @@ def up() -> None:
35
40
  :func:`_exec_command`
36
41
  """
37
42
  # eth-portfolio containers must be started first so dao-treasury can attach to the eth-portfolio docker network
38
- eth_portfolio_scripts.docker.up()
39
- build()
40
- print("starting the grafana containers")
41
- _exec_command(["up", "-d"])
43
+ eth_portfolio_scripts.docker.up("victoria-metrics")
44
+ build(*services)
45
+ print(f"starting the {', '.join(services) if services else 'grafana'} container(s)")
46
+ _exec_command(["up", "-d", *services])
42
47
 
43
48
 
44
49
  def down() -> None:
@@ -57,7 +62,7 @@ def down() -> None:
57
62
  _exec_command(["down"])
58
63
 
59
64
 
60
- def build() -> None:
65
+ def build(*services: str) -> None:
61
66
  """Build Docker images for Grafana containers.
62
67
 
63
68
  This function builds all services defined in the Docker Compose
@@ -73,7 +78,7 @@ def build() -> None:
73
78
  :func:`_exec_command`
74
79
  """
75
80
  print("building the grafana containers")
76
- _exec_command(["build"])
81
+ _exec_command(["build", *services])
77
82
 
78
83
 
79
84
  _P = ParamSpec("_P")
@@ -118,20 +123,20 @@ def ensure_containers(
118
123
  # signal.signal(signal.SIGINT, down)
119
124
 
120
125
  # start Grafana containers
121
- up()
126
+ up("grafana")
122
127
 
123
128
  try:
124
129
  # attempt to run `fn`
125
- await fn(*args, **kwargs)
130
+ return await fn(*args, **kwargs)
126
131
  finally:
127
132
  # stop and remove containers
128
133
  # down()
129
- return
134
+ pass
130
135
 
131
136
  return compose_wrap
132
137
 
133
138
 
134
- def _exec_command(command: Iterable[str], *, compose_options: Tuple[str] = ()) -> None:
139
+ def _exec_command(command: List[str], *, compose_options: Tuple[str, ...] = ()) -> None:
135
140
  """Execute a Docker Compose command with system checks and fallback.
136
141
 
137
142
  This internal function ensures that Docker and Docker Compose
Binary file
Binary file
Binary file
dao_treasury/db.py CHANGED
@@ -826,6 +826,8 @@ class TreasuryTx(DbEntity):
826
826
  gas_price=gas_price,
827
827
  txgroup=txgroup_dbid,
828
828
  )
829
+ # we must commit here or else dbid below will be `None`.
830
+ commit()
829
831
  dbid = entity.treasury_tx_id
830
832
  except InterfaceError as e:
831
833
  raise ValueError(
@@ -15,6 +15,7 @@ services:
15
15
  - GF_SECURITY_ADMIN_USER=${GF_SECURITY_ADMIN_USER:-admin}
16
16
  - GF_SECURITY_ADMIN_PASSWORD=${GF_SECURITY_ADMIN_PASSWORD:-admin}
17
17
  - GF_AUTH_ANONYMOUS_ENABLED=true
18
+ - GF_AUTH_ANONYMOUS_ORG_ROLE=Viewer
18
19
  - GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/etc/grafana/provisioning/dashboards/summary/Monthly.json
19
20
  - GF_SERVER_ROOT_URL
20
21
  - GF_RENDERING_SERVER_URL=http://renderer:8091/render
dao_treasury/main.py CHANGED
@@ -28,6 +28,7 @@ from pathlib import Path
28
28
 
29
29
  import brownie
30
30
  import yaml
31
+ from a_sync import create_task
31
32
  from dao_treasury._wallet import load_wallets_from_yaml
32
33
  from eth_portfolio_scripts.balances import export_balances
33
34
  from eth_typing import BlockNumber
@@ -107,6 +108,11 @@ parser.add_argument(
107
108
  help="Port for the DAO Treasury dashboard web interface. Default: 3000",
108
109
  default=3000,
109
110
  )
111
+ parser.add_argument(
112
+ "--start-renderer",
113
+ action="store_true",
114
+ help="If set, the Grafana renderer container will be started for dashboard image export. By default, only the grafana container is started.",
115
+ )
110
116
  parser.add_argument(
111
117
  "--renderer-port",
112
118
  type=int,
@@ -154,6 +160,7 @@ async def export(args) -> None:
154
160
  daemon: Ignored flag.
155
161
  grafana_port: Port for Grafana (sets DAO_TREASURY_GRAFANA_PORT).
156
162
  renderer_port: Port for renderer (sets DAO_TREASURY_RENDERER_PORT).
163
+ start_renderer: If True, start renderer; otherwise, only start grafana.
157
164
 
158
165
  Example:
159
166
  In code::
@@ -165,6 +172,8 @@ async def export(args) -> None:
165
172
  :func:`dao_treasury._docker.down`,
166
173
  :class:`dao_treasury.Treasury.populate_db`
167
174
  """
175
+ import eth_portfolio_scripts.docker
176
+
168
177
  from dao_treasury import _docker, constants, db, Treasury
169
178
 
170
179
  wallets = getattr(args, "wallet", None)
@@ -195,24 +204,40 @@ async def export(args) -> None:
195
204
  db.Address.set_nickname(address, nickname)
196
205
 
197
206
  treasury = Treasury(wallets, args.sort_rules, asynchronous=True)
198
- _docker.up()
207
+
208
+ # Start only the requested containers
209
+ if args.start_renderer is True:
210
+ _docker.up()
211
+ else:
212
+ _docker.up("grafana")
199
213
 
200
214
  # eth-portfolio needs this present
201
215
  # TODO: we need to update eth-portfolio to honor wallet join and exit times
202
- args.wallet = [
203
- wallet.address
204
- for wallet in wallets
205
- if wallet.networks is None or CHAINID in wallet.networks
206
- ]
216
+ if not getattr(args, "wallet", None):
217
+ args.wallet = [
218
+ wallet.address
219
+ for wallet in wallets
220
+ if wallet.networks is None or CHAINID in wallet.networks
221
+ ]
207
222
 
208
223
  # TODO: make this user configurable? would require some dynamic grafana dashboard files
209
224
  args.label = "Treasury"
210
225
 
211
- try:
212
- await asyncio.gather(
226
+ export_task = create_task(
227
+ asyncio.gather(
213
228
  export_balances(args),
214
229
  treasury.populate_db(BlockNumber(0), brownie.chain.height),
215
230
  )
231
+ )
232
+
233
+ await asyncio.sleep(1)
234
+
235
+ # we don't need these containers since dao-treasury uses its own.
236
+ eth_portfolio_scripts.docker.stop("grafana")
237
+ eth_portfolio_scripts.docker.stop("renderer")
238
+
239
+ try:
240
+ await export_task
216
241
  finally:
217
242
  _docker.down()
218
243
 
@@ -9,7 +9,7 @@ from eth_portfolio.structs import LedgerEntry
9
9
  from evmspec.data import TransactionHash
10
10
  from y.exceptions import ContractNotVerified
11
11
 
12
- from dao_treasury import db
12
+ from dao_treasury import constants, db
13
13
  from dao_treasury._wallet import TreasuryWallet
14
14
  from dao_treasury.sorting._matchers import (
15
15
  _Matcher,
@@ -115,33 +115,44 @@ def sort_basic(entry: LedgerEntry) -> TxGroupDbid:
115
115
  return txgroup_dbid # type: ignore [no-any-return]
116
116
 
117
117
 
118
- def sort_basic_entity(entry: db.TreasuryTx) -> TxGroupDbid:
118
+ def sort_basic_entity(tx: db.TreasuryTx) -> TxGroupDbid:
119
119
  # TODO: write docstring
120
+ from_address = tx.from_address.address
121
+ to_address = tx.to_address
122
+ block = tx.block
123
+
120
124
  txgroup_dbid: Optional[TxGroupDbid] = None
121
- block = entry.block
122
- if (
123
- entry.from_address
124
- and TreasuryWallet.check_membership(entry.from_address.address, block)
125
- and TreasuryWallet.check_membership(entry.to_address.address, block)
125
+ if TreasuryWallet.check_membership(from_address, block):
126
+ if TreasuryWallet.check_membership(tx.to_address.address, block):
127
+ txgroup_dbid = INTERNAL_TRANSFER_TXGROUP_DBID
128
+ elif not (
129
+ TreasuryWallet.check_membership(tx.to_address.address, tx.block)
130
+ or from_address in constants.DISPERSE_APP
126
131
  ):
127
- txgroup_dbid = INTERNAL_TRANSFER_TXGROUP_DBID
132
+ txgroup_dbid = OUT_OF_RANGE_TXGROUP_DBID
128
133
 
129
134
  if txgroup_dbid is None:
130
- txgroup_dbid = HashMatcher.match(entry.hash)
135
+ txgroup_dbid = HashMatcher.match(tx.hash)
131
136
 
132
137
  if txgroup_dbid is None:
133
- txgroup_dbid = FromAddressMatcher.match(entry.from_address.address)
138
+ txgroup_dbid = FromAddressMatcher.match(from_address)
134
139
 
135
- if txgroup_dbid is None and entry.to_address:
136
- txgroup_dbid = ToAddressMatcher.match(entry.to_address.address)
140
+ if txgroup_dbid is None and to_address:
141
+ txgroup_dbid = ToAddressMatcher.match(to_address.address)
137
142
 
138
143
  if txgroup_dbid is None:
139
- if TreasuryWallet.check_membership(entry.from_address.address, entry.block):
144
+ if TreasuryWallet.check_membership(from_address, block):
140
145
  txgroup_dbid = MUST_SORT_OUTBOUND_TXGROUP_DBID
141
146
 
142
- elif TreasuryWallet.check_membership(entry.to_address.address, entry.block):
147
+ elif TreasuryWallet.check_membership(to_address.address, block):
143
148
  txgroup_dbid = MUST_SORT_INBOUND_TXGROUP_DBID
144
149
 
150
+ elif from_address in constants.DISPERSE_APP:
151
+ txgroup_dbid = MUST_SORT_OUTBOUND_TXGROUP_DBID
152
+
153
+ elif from_address in constants.DISPERSE_APP:
154
+ txgroup_dbid = MUST_SORT_OUTBOUND_TXGROUP_DBID
155
+
145
156
  else:
146
157
  raise NotImplementedError("this isnt supposed to happen")
147
158
 
@@ -149,7 +160,7 @@ def sort_basic_entity(entry: db.TreasuryTx) -> TxGroupDbid:
149
160
  MUST_SORT_INBOUND_TXGROUP_DBID,
150
161
  MUST_SORT_OUTBOUND_TXGROUP_DBID,
151
162
  ):
152
- logger.info("Sorted %s to %s", entry, TxGroup.get_fullname(txgroup_dbid))
163
+ logger.info("Sorted %s to %s", tx, TxGroup.get_fullname(txgroup_dbid))
153
164
 
154
165
  return txgroup_dbid # type: ignore [no-any-return]
155
166
 
@@ -31,6 +31,7 @@ See Also:
31
31
 
32
32
  from collections import defaultdict
33
33
  from dataclasses import dataclass
34
+ from logging import getLogger
34
35
  from typing import (
35
36
  TYPE_CHECKING,
36
37
  DefaultDict,
@@ -53,6 +54,9 @@ if TYPE_CHECKING:
53
54
  from dao_treasury.db import TreasuryTx
54
55
 
55
56
 
57
+ logger: Final = getLogger(__name__)
58
+ _log_debug: Final = logger.debug
59
+
56
60
  SORT_RULES: DefaultDict[Type[SortRule], List[SortRule]] = defaultdict(list)
57
61
  """Mapping from sort rule classes to lists of instantiated rules, in creation order per class.
58
62
 
@@ -214,6 +218,7 @@ class _SortRule:
214
218
  getattr(tx, matcher) == getattr(self, matcher) for matcher in matchers
215
219
  )
216
220
 
221
+ _log_debug("checking %s for %s", tx, self.func)
217
222
  match = self.func(tx) # type: ignore [misc]
218
223
  return match if isinstance(match, bool) else await match
219
224
 
dao_treasury/treasury.py CHANGED
@@ -149,3 +149,6 @@ class Treasury(a_sync.ASyncGenericBase): # type: ignore [misc]
149
149
 
150
150
  if futs:
151
151
  await tqdm_asyncio.gather(*futs, desc="Insert Txs to Postgres")
152
+ logger.info(f"{len(futs)} transfers exported")
153
+
154
+ logger.info("db connection closed")
Binary file
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dao_treasury
3
- Version: 0.0.28
3
+ Version: 0.0.30
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.14.dev0
17
+ Requires-Dist: eth-portfolio-temp<0.1,>=0.0.23.dev0
18
18
  Dynamic: classifier
19
19
  Dynamic: description
20
20
  Dynamic: description-content-type
@@ -38,8 +38,9 @@ DAO Treasury is a comprehensive financial reporting and treasury management solu
38
38
 
39
39
  ## Prerequisites
40
40
 
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.)
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
+ - 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.
43
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
45
 
45
46
  ## Installation
@@ -67,13 +68,43 @@ poetry run dao-treasury run --wallet 0x123 --network mainnet --interval 12h
67
68
  - `--interval`: The time interval between each data snapshot (default: 12h)
68
69
  - `--daemon`: Run the export process in the background (default: False) (NOTE: currently unsupported)
69
70
  - `--grafana-port`: Set the port for the Grafana dashboard where you can view data (default: 3004)
70
- - `--renderer-port`: Set the port for the report rendering service (default: 8080)
71
+ - `--renderer-port`: Set the port for the report rendering service (default: 8091)
71
72
  - `--victoria-port`: Set the port for the Victoria metrics reporting endpoint (default: 8430)
73
+ - `--start-renderer`: If set, both the Grafana and renderer containers will be started for dashboard image export. By default, only the grafana container is started.
72
74
 
73
75
  After running the command, the export script will run continuously until you close your terminal.
74
76
  To view the dashboards, just open your browser and navigate to [http://localhost:3004](http://localhost:3004)!
75
77
 
76
- Enjoy!
78
+ ## Docker
79
+
80
+ When you run DAO Treasury, [eth-portfolio](https://github.com/BobTheBuidler/eth-portfolio) will build and start 4 [required Docker containers](https://bobthebuidler.github.io/eth-portfolio/exporter.html#docker-containers) on your system. Additionally, DAO Treasury will build and start 2 more required containers:
81
+
82
+ - **grafana**
83
+ - Provides a web-based dashboard for visualizing your treasury data.
84
+ - Pre-configured with dashboards and plugins for real-time monitoring.
85
+ - Uses persistent storage to retain dashboard settings and data.
86
+ - Accessible locally (default port `3004`, configurable via `--grafana-port`).
87
+ - Supports anonymous access for convenience.
88
+ - Integrates with the renderer container for dashboard image export.
89
+ - Loads dashboards and data sources automatically via provisioning files.
90
+
91
+ - **renderer**
92
+ - Runs the official Grafana image renderer service.
93
+ - Enables Grafana to export dashboards as images for reporting or sharing.
94
+ - Operates on port `8091` by default (configurable via `--renderer-port`).
95
+ - Tightly integrated with the Grafana container for seamless image rendering.
96
+ - **Note:** The renderer container is only started if you pass the `--start-renderer` CLI flag.
97
+
98
+ **How it works:**
99
+ 1. DAO Treasury collects and exports treasury data.
100
+ 2. Grafana displays this data in pre-built dashboards for analysis and reporting.
101
+ 3. The renderer container allows dashboards to be exported as images directly from Grafana (if enabled).
102
+
103
+ **Additional Information:**
104
+ - All containers are orchestrated via Docker Compose and started automatically as needed.
105
+ - Grafana provisioning ensures dashboards and data sources are set up out-of-the-box.
106
+ - All dashboard data and settings are persisted for durability.
107
+ - Dashboard images can be generated for reporting via the renderer (if enabled).
77
108
 
78
109
  ## Screenshots
79
110
 
@@ -84,3 +115,5 @@ Enjoy!
84
115
  ## Contributing
85
116
 
86
117
  We welcome contributions to DAO Treasury! For detailed guidelines on how to contribute, please see the [Contributing Guidelines](https://github.com/BobTheBuidler/dao-treasury/blob/master/CONTRIBUTING.md).
118
+
119
+ Enjoy!
@@ -0,0 +1,38 @@
1
+ 3619d39567c7fe330ece__mypyc.cp312-win_amd64.pyd,sha256=xTzFzuenxlz2DVEkHWWaLU_7SoDbQGfM1ujMMgTbOVc,289280
2
+ dao_treasury/ENVIRONMENT_VARIABLES.py,sha256=ci7djcsXc9uRi6_vBQv-avGQrrIacyftXmcwKuitWWU,203
3
+ dao_treasury/__init__.py,sha256=U8BsakN_w15wVE_7MjVbHD9LBal48LfJ6a1Icf5oHdY,1052
4
+ dao_treasury/_docker.cp312-win_amd64.pyd,sha256=P6jblfAIMwXFTNb4msIbrVVnlOtLVBoAm2sXt-Iv_5c,10752
5
+ dao_treasury/_docker.py,sha256=wY26wCrQ8p-L0KfMJftyzI_YAszHjnBWLw94eh0LxxY,5607
6
+ dao_treasury/_nicknames.cp312-win_amd64.pyd,sha256=QQFs4UTIg63Ih0wxkQRUgDbDB7QcpRN3XwLHbMvzawU,10752
7
+ dao_treasury/_nicknames.py,sha256=NpbQ4NtmZF_A_vqTGSal2KzKzkH5t7_wbI8EtMBqEr4,497
8
+ dao_treasury/_wallet.cp312-win_amd64.pyd,sha256=ulj3LWfsZv932ysSAl4WehC96bEyMJLfEY9TMxn5_Wc,10752
9
+ dao_treasury/_wallet.py,sha256=q-H3YrRLWHIjOplVEcY2zqYnv6J--nxXtcx_-a1jcQw,10584
10
+ dao_treasury/constants.cp312-win_amd64.pyd,sha256=gSBXER_n0SPM7fw1rku-WLmx-W4pjrbNAtTP81a1GWg,10752
11
+ dao_treasury/constants.py,sha256=VNzlrwC8HB8LdKNmoIfncUACKHfXZxp2GtBBrH_lZKE,522
12
+ dao_treasury/db.py,sha256=HMFp3X8rRn3TE0FbqnqgzbMm-WFF6GaGq6UmYYViHgY,41205
13
+ dao_treasury/docker-compose.yaml,sha256=trksBUUwNGJGcrsgX0k0xVEsl-SjWzYE_4tpO1DjuJg,1421
14
+ dao_treasury/main.py,sha256=yVQGwDgO4XKcxV6tQQPxEcLcZPSEEK1yJS8Djfq3Esc,8294
15
+ dao_treasury/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
+ dao_treasury/treasury.py,sha256=ZkkxaH49CXOgszOayu_IZ5wmqznOp7t1S3lz_M77Ct8,5954
17
+ dao_treasury/types.cp312-win_amd64.pyd,sha256=t06h1R8O7sXyzIT4sm4HOknQD57HUQat2QZ5J4q174o,10752
18
+ dao_treasury/types.py,sha256=KFz4WKPp4t_RBwIT6YGwOcgbzw8tdHIOcXTFsUA0pJA,3818
19
+ dao_treasury/.grafana/provisioning/dashboards/dashboards.yaml,sha256=43Lof370qTV5TPnVRpWxXIzjRpPX_u9khgee41lAyYQ,570
20
+ dao_treasury/.grafana/provisioning/dashboards/summary/Monthly.json,sha256=pEHnKgiFgL_oscujk2SVEmkwe-PZiuGjlKf7bcLm2uc,8022
21
+ dao_treasury/.grafana/provisioning/dashboards/transactions/Treasury Transactions.json,sha256=kXaEYWwbwVbkYmj2iWYpHzHVeeBidFpGQoLm5rxUUGU,16361
22
+ dao_treasury/.grafana/provisioning/dashboards/treasury/Cashflow.json,sha256=xrUS1csp0hsfHcxhxFekxwzZ3ul-03aDwNw1EurBG9U,43323
23
+ dao_treasury/.grafana/provisioning/dashboards/treasury/Treasury.json,sha256=6y7Fp-2g1iRanRBtWKKN13sXjaKxBvqld7416ZJu4YI,72196
24
+ dao_treasury/.grafana/provisioning/datasources/datasources.yaml,sha256=gLmJsOkEXNzWRDibShfHFySWeuExW-dSB_U0OSfH868,344
25
+ dao_treasury/sorting/__init__.cp312-win_amd64.pyd,sha256=QXCxbU2QAtdwlIYPHoAf3sBPgyEFb19h0zEW9QUHem8,10752
26
+ dao_treasury/sorting/__init__.py,sha256=8scT00tm4LtZrKTnpv6MGdJWqC9L0ksDt_V7lrK7c98,5935
27
+ dao_treasury/sorting/_matchers.cp312-win_amd64.pyd,sha256=W6acQ_Mqrpwz0kL81YwjyzweLIiKZJSH34ViDvgy7j8,10752
28
+ dao_treasury/sorting/_matchers.py,sha256=ACi6aXZCKW5OTiztsID7CXCGJounj5c6ivhOCg2436M,14392
29
+ dao_treasury/sorting/_rules.cp312-win_amd64.pyd,sha256=hUWEpbrBibYLrrGOZskyhg3ggbb95islM360SxHncF4,10752
30
+ dao_treasury/sorting/_rules.py,sha256=DxhdUgpS0q0LWeLl9W1Bjn5LZz9z4OLA03vQllPMH9k,9229
31
+ dao_treasury/sorting/factory.cp312-win_amd64.pyd,sha256=DiPf0ifXFapHEyhvs1BIT6_gs4bbFP9qMiGaacITChI,10752
32
+ dao_treasury/sorting/factory.py,sha256=zlJ18xlMTxv8ACV6_MimCVIDsw3K5AZcyvKaNYY7R14,10484
33
+ dao_treasury/sorting/rule.cp312-win_amd64.pyd,sha256=ibcMmC278xoCpqyOtHzLjgEzk4k7WDnsoEM9mLh7xUc,10752
34
+ dao_treasury/sorting/rule.py,sha256=TsSlaU4UlYr4QWJBdUY7EOAfC_SK6_VA3wEFOFNUUrU,11837
35
+ dao_treasury-0.0.30.dist-info/METADATA,sha256=vGTp6PwV3CsZbe3zO5cg0m5UJMEb1ED_hsnUDJ33jGc,7149
36
+ dao_treasury-0.0.30.dist-info/WHEEL,sha256=8UP9x9puWI0P1V_d7K2oMTBqfeLNm21CTzZ_Ptr0NXU,101
37
+ dao_treasury-0.0.30.dist-info/top_level.txt,sha256=NRjzFf9H2cBekP0cVk8IWoVYf0fTSSKfqvVPvaMhoNs,41
38
+ dao_treasury-0.0.30.dist-info/RECORD,,
@@ -0,0 +1,2 @@
1
+ 3619d39567c7fe330ece__mypyc
2
+ dao_treasury
@@ -1,37 +0,0 @@
1
- 8d7637a0eb7617042369__mypyc.cp312-win_amd64.pyd,sha256=v2ZodnQkx_Xas9zScONz5fB-dDFfvvMi6XUX8LYx-tA,262144
2
- dao_treasury/ENVIRONMENT_VARIABLES.py,sha256=ci7djcsXc9uRi6_vBQv-avGQrrIacyftXmcwKuitWWU,203
3
- dao_treasury/__init__.py,sha256=U8BsakN_w15wVE_7MjVbHD9LBal48LfJ6a1Icf5oHdY,1052
4
- dao_treasury/_docker.py,sha256=q0xhHc9YEaPfk3RrJLXeMaFRl-emedIwzH7Xhz3Mapw,5289
5
- dao_treasury/_nicknames.cp312-win_amd64.pyd,sha256=Iv080VQA1tggW48LPbsTJQbqBSHw-GuAVBnpRZNZv90,10752
6
- dao_treasury/_nicknames.py,sha256=NpbQ4NtmZF_A_vqTGSal2KzKzkH5t7_wbI8EtMBqEr4,497
7
- dao_treasury/_wallet.cp312-win_amd64.pyd,sha256=y6yU0gN5lFXJoOOZg71qA8MpARtCdNa3bgGXauSzYWY,10752
8
- dao_treasury/_wallet.py,sha256=q-H3YrRLWHIjOplVEcY2zqYnv6J--nxXtcx_-a1jcQw,10584
9
- dao_treasury/constants.cp312-win_amd64.pyd,sha256=DWY0VurvtPld8MCouIu9Anett6_t6qrFp2mawWq-q3Q,10752
10
- dao_treasury/constants.py,sha256=VNzlrwC8HB8LdKNmoIfncUACKHfXZxp2GtBBrH_lZKE,522
11
- dao_treasury/db.py,sha256=3O1J6bOFifBUIzSEIYxXOLJPad0aBxwn6kVxAPdVd_Y,41105
12
- dao_treasury/docker-compose.yaml,sha256=z1avJCfQY5aKrhw6Bq72dnjzRLAm4ttbzvjWeh69bM4,1378
13
- dao_treasury/main.py,sha256=VGZ9ExFWHvXkRxo1kqjN-AMeisjUIWXcRulQyhC2kNs,7454
14
- dao_treasury/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- dao_treasury/treasury.py,sha256=N5skZSxvb9-7CajhHrynKJMnUuy5pYEpRr75SDjGVoE,5843
16
- dao_treasury/types.cp312-win_amd64.pyd,sha256=_oWfXauRxsLb5yAfVgZXqLlZUSHz6nuRG88lK3ipd-s,10752
17
- dao_treasury/types.py,sha256=KFz4WKPp4t_RBwIT6YGwOcgbzw8tdHIOcXTFsUA0pJA,3818
18
- dao_treasury/.grafana/provisioning/dashboards/dashboards.yaml,sha256=43Lof370qTV5TPnVRpWxXIzjRpPX_u9khgee41lAyYQ,570
19
- dao_treasury/.grafana/provisioning/dashboards/summary/Monthly.json,sha256=pEHnKgiFgL_oscujk2SVEmkwe-PZiuGjlKf7bcLm2uc,8022
20
- dao_treasury/.grafana/provisioning/dashboards/transactions/Treasury Transactions.json,sha256=kXaEYWwbwVbkYmj2iWYpHzHVeeBidFpGQoLm5rxUUGU,16361
21
- dao_treasury/.grafana/provisioning/dashboards/treasury/Cashflow.json,sha256=xrUS1csp0hsfHcxhxFekxwzZ3ul-03aDwNw1EurBG9U,43323
22
- dao_treasury/.grafana/provisioning/dashboards/treasury/Treasury.json,sha256=6y7Fp-2g1iRanRBtWKKN13sXjaKxBvqld7416ZJu4YI,72196
23
- dao_treasury/.grafana/provisioning/datasources/datasources.yaml,sha256=gLmJsOkEXNzWRDibShfHFySWeuExW-dSB_U0OSfH868,344
24
- dao_treasury/sorting/__init__.cp312-win_amd64.pyd,sha256=x5a0rp0t3LqhV418C5wD1IxfsycYjqrQP5Nz6X4be9Q,10752
25
- dao_treasury/sorting/__init__.py,sha256=rBpCNDcuEWbYxt0RpmiinBeJla_MwZ2vZOuSVkmh1P8,5548
26
- dao_treasury/sorting/_matchers.cp312-win_amd64.pyd,sha256=cKe-WyvofgMQhnp4okvnVa0bWPKyiStFSDk2oToyTrE,10752
27
- dao_treasury/sorting/_matchers.py,sha256=ACi6aXZCKW5OTiztsID7CXCGJounj5c6ivhOCg2436M,14392
28
- dao_treasury/sorting/_rules.cp312-win_amd64.pyd,sha256=qxpea8Q3Zz74fSLAo6faGY6pcLPsqsrKw9PNWe8WLU8,10752
29
- dao_treasury/sorting/_rules.py,sha256=DxhdUgpS0q0LWeLl9W1Bjn5LZz9z4OLA03vQllPMH9k,9229
30
- dao_treasury/sorting/factory.cp312-win_amd64.pyd,sha256=bm7naswcfjGjgcIrPxD7FB5PQYSKiY4zb2AFxGbDaoo,10752
31
- dao_treasury/sorting/factory.py,sha256=zlJ18xlMTxv8ACV6_MimCVIDsw3K5AZcyvKaNYY7R14,10484
32
- dao_treasury/sorting/rule.cp312-win_amd64.pyd,sha256=E7GQl17_a6VZj_vjPVvrN6QpLbM64LFXYiygqaOsMhI,10752
33
- dao_treasury/sorting/rule.py,sha256=It0DNHavo6eqCNn5l2Mhqt7UUzvf03zhl2KIMkHz65M,11676
34
- dao_treasury-0.0.28.dist-info/METADATA,sha256=o8n-eka8sJ9kWC7ijZHKKFjIFX_I0G8EYV9l7fC1NXw,4791
35
- dao_treasury-0.0.28.dist-info/WHEEL,sha256=8UP9x9puWI0P1V_d7K2oMTBqfeLNm21CTzZ_Ptr0NXU,101
36
- dao_treasury-0.0.28.dist-info/top_level.txt,sha256=gLBdPS4UkA4KGtYmzVb1Jqq5N0FmaTK76zmC9-mACEE,41
37
- dao_treasury-0.0.28.dist-info/RECORD,,
@@ -1,2 +0,0 @@
1
- 8d7637a0eb7617042369__mypyc
2
- dao_treasury