dao-treasury 0.0.32__cp311-cp311-win32.whl → 0.0.33__cp311-cp311-win32.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 (28) hide show
  1. bf2b4fe1f86ad2ea158b__mypyc.cp311-win32.pyd +0 -0
  2. dao_treasury/.grafana/provisioning/dashboards/dashboards.yaml +31 -5
  3. dao_treasury/.grafana/provisioning/dashboards/summary/Monthly.json +5 -10
  4. dao_treasury/.grafana/provisioning/dashboards/transactions/Treasury Transactions.json +13 -13
  5. dao_treasury/.grafana/provisioning/dashboards/treasury/Cashflow (Including Unsorted).json +834 -0
  6. dao_treasury/.grafana/provisioning/dashboards/treasury/Cashflow.json +25 -428
  7. dao_treasury/.grafana/provisioning/dashboards/treasury/Operating Cashflow.json +491 -0
  8. dao_treasury/_docker.cp311-win32.pyd +0 -0
  9. dao_treasury/_nicknames.cp311-win32.pyd +0 -0
  10. dao_treasury/_wallet.cp311-win32.pyd +0 -0
  11. dao_treasury/constants.cp311-win32.pyd +0 -0
  12. dao_treasury/db.py +58 -31
  13. dao_treasury/sorting/__init__.cp311-win32.pyd +0 -0
  14. dao_treasury/sorting/__init__.py +109 -6
  15. dao_treasury/sorting/_matchers.cp311-win32.pyd +0 -0
  16. dao_treasury/sorting/_rules.cp311-win32.pyd +0 -0
  17. dao_treasury/sorting/factory.cp311-win32.pyd +0 -0
  18. dao_treasury/sorting/rule.cp311-win32.pyd +0 -0
  19. dao_treasury/sorting/rules/__init__.cp311-win32.pyd +0 -0
  20. dao_treasury/sorting/rules/ignore/__init__.cp311-win32.pyd +0 -0
  21. dao_treasury/sorting/rules/ignore/llamapay.cp311-win32.pyd +0 -0
  22. dao_treasury/streams/__init__.cp311-win32.pyd +0 -0
  23. dao_treasury/streams/llamapay.cp311-win32.pyd +0 -0
  24. dao_treasury/types.cp311-win32.pyd +0 -0
  25. {dao_treasury-0.0.32.dist-info → dao_treasury-0.0.33.dist-info}/METADATA +2 -2
  26. {dao_treasury-0.0.32.dist-info → dao_treasury-0.0.33.dist-info}/RECORD +28 -26
  27. {dao_treasury-0.0.32.dist-info → dao_treasury-0.0.33.dist-info}/WHEEL +0 -0
  28. {dao_treasury-0.0.32.dist-info → dao_treasury-0.0.33.dist-info}/top_level.txt +0 -0
dao_treasury/db.py CHANGED
@@ -119,13 +119,13 @@ class Chain(DbEntity):
119
119
  chainid = Required(int, unique=True)
120
120
  """Numeric chain ID matching the connected RPC via :data:`~y.constants.CHAINID`."""
121
121
 
122
- addresses = Set("Address", reverse="chain")
122
+ addresses = Set("Address", reverse="chain", lazy=True)
123
123
  """Relationship to address records on this chain."""
124
124
 
125
- tokens = Set("Token", reverse="chain")
125
+ tokens = Set("Token", reverse="chain", lazy=True)
126
126
  """Relationship to token records on this chain."""
127
127
 
128
- treasury_txs = Set("TreasuryTx")
128
+ treasury_txs = Set("TreasuryTx", lazy=True)
129
129
  """Relationship to treasury transactions on this chain."""
130
130
 
131
131
  @staticmethod
@@ -184,7 +184,7 @@ class Address(DbEntity):
184
184
  address_id = PrimaryKey(int, auto=True)
185
185
  """Auto-incremented primary key for the addresses table."""
186
186
 
187
- chain = Required(Chain, reverse="addresses")
187
+ chain = Required(Chain, reverse="addresses", lazy=True)
188
188
  """Reference to the chain on which this address resides."""
189
189
 
190
190
  address = Required(str, index=True)
@@ -193,7 +193,7 @@ class Address(DbEntity):
193
193
  nickname = Optional(str)
194
194
  """Optional human-readable label (e.g., contract name or token name)."""
195
195
 
196
- is_contract = Required(bool, index=True)
196
+ is_contract = Required(bool, index=True, lazy=True)
197
197
  """Flag indicating whether the address is a smart contract."""
198
198
 
199
199
  composite_key(address, chain)
@@ -204,22 +204,22 @@ class Address(DbEntity):
204
204
  treasury_tx_from: Set["TreasuryTx"]
205
205
  treasury_tx_to: Set["TreasuryTx"]
206
206
 
207
- token = Optional("Token", index=True)
207
+ token = Optional("Token", index=True, lazy=True)
208
208
  """Optional back-reference to a Token if this address is one."""
209
- # partners_tx = Set('PartnerHarvestEvent', reverse='wrapper')
209
+ # partners_tx = Set('PartnerHarvestEvent', reverse='wrapper', lazy=True)
210
210
 
211
- treasury_tx_from = Set("TreasuryTx", reverse="from_address")
211
+ treasury_tx_from = Set("TreasuryTx", reverse="from_address", lazy=True)
212
212
  """Inverse relation for transactions sent from this address."""
213
213
 
214
- treasury_tx_to = Set("TreasuryTx", reverse="to_address")
214
+ treasury_tx_to = Set("TreasuryTx", reverse="to_address", lazy=True)
215
215
  """Inverse relation for transactions sent to this address."""
216
216
 
217
- streams_from = Set("Stream", reverse="from_address")
218
- streams_to = Set("Stream", reverse="to_address")
219
- streams = Set("Stream", reverse="contract")
220
- # vesting_escrows = Set("VestingEscrow", reverse="address")
221
- # vests_received = Set("VestingEscrow", reverse="recipient")
222
- # vests_funded = Set("VestingEscrow", reverse="funder")
217
+ streams_from = Set("Stream", reverse="from_address", lazy=True)
218
+ streams_to = Set("Stream", reverse="to_address", lazy=True)
219
+ streams = Set("Stream", reverse="contract", lazy=True)
220
+ # vesting_escrows = Set("VestingEscrow", reverse="address", lazy=True)
221
+ # vests_received = Set("VestingEscrow", reverse="recipient", lazy=True)
222
+ # vests_funded = Set("VestingEscrow", reverse="funder", lazy=True)
223
223
 
224
224
  def __eq__(self, other: Union["Address", ChecksumAddress, "Token"]) -> bool: # type: ignore [override]
225
225
  if isinstance(other, str):
@@ -367,30 +367,30 @@ class Token(DbEntity):
367
367
  token_id = PrimaryKey(int, auto=True)
368
368
  """Auto-incremented primary key for the tokens table."""
369
369
 
370
- chain = Required(Chain, index=True)
370
+ chain = Required(Chain, index=True, lazy=True)
371
371
  """Foreign key linking to :class:`~dao_treasury.db.Chain`."""
372
372
 
373
- symbol = Required(str, index=True)
373
+ symbol = Required(str, index=True, lazy=True)
374
374
  """Short ticker symbol for the token."""
375
375
 
376
- name = Required(str)
376
+ name = Required(str, lazy=True)
377
377
  """Full human-readable name of the token."""
378
378
 
379
- decimals = Required(int)
379
+ decimals = Required(int, lazy=True)
380
380
  """Number of decimals used for value scaling."""
381
381
 
382
382
  if TYPE_CHECKING:
383
383
  treasury_tx: Set["TreasuryTx"]
384
384
 
385
- treasury_tx = Set("TreasuryTx", reverse="token")
385
+ treasury_tx = Set("TreasuryTx", reverse="token", lazy=True)
386
386
  """Inverse relation for treasury transactions involving this token."""
387
- # partner_harvest_event = Set('PartnerHarvestEvent', reverse="vault")
387
+ # partner_harvest_event = Set('PartnerHarvestEvent', reverse="vault", lazy=True)
388
388
 
389
389
  address = Required(Address, column="address_id")
390
390
  """Foreign key to the address record for this token contract."""
391
391
 
392
- streams = Set("Stream", reverse="token")
393
- # vesting_escrows = Set("VestingEscrow", reverse="token")
392
+ streams = Set("Stream", reverse="token", lazy=True)
393
+ # vesting_escrows = Set("VestingEscrow", reverse="token", lazy=True)
394
394
 
395
395
  def __eq__(self, other: Union["Token", Address, ChecksumAddress]) -> bool: # type: ignore [override]
396
396
  if isinstance(other, str):
@@ -533,7 +533,7 @@ class TxGroup(DbEntity):
533
533
  name = Required(str)
534
534
  """Name of the grouping category, e.g., 'Revenue', 'Expenses'."""
535
535
 
536
- treasury_tx = Set("TreasuryTx", reverse="txgroup")
536
+ treasury_tx = Set("TreasuryTx", reverse="txgroup", lazy=True)
537
537
  """Inverse relation for treasury transactions assigned to this group."""
538
538
 
539
539
  parent_txgroup = Optional("TxGroup", reverse="child_txgroups")
@@ -541,13 +541,13 @@ class TxGroup(DbEntity):
541
541
 
542
542
  composite_key(name, parent_txgroup)
543
543
 
544
- child_txgroups = Set("TxGroup", reverse="parent_txgroup")
544
+ child_txgroups = Set("TxGroup", reverse="parent_txgroup", lazy=True)
545
545
  """Set of nested child groups."""
546
546
 
547
- streams = Set("Stream", reverse="txgroup")
547
+ streams = Set("Stream", reverse="txgroup", lazy=True)
548
548
 
549
549
  # TODO: implement this
550
- # vesting_escrows = Set("VestingEscrow", reverse="txgroup")
550
+ # vesting_escrows = Set("VestingEscrow", reverse="txgroup", lazy=True)
551
551
 
552
552
  @property
553
553
  def fullname(self) -> str:
@@ -623,7 +623,7 @@ class TxGroup(DbEntity):
623
623
  return txgroup # type: ignore [no-any-return]
624
624
 
625
625
 
626
- @lru_cache(100)
626
+ @lru_cache(500)
627
627
  def get_transaction(txhash: str) -> TransactionReceipt:
628
628
  """Fetch and cache a transaction receipt from the connected chain.
629
629
 
@@ -905,6 +905,7 @@ class TreasuryTx(DbEntity):
905
905
  def __set_txgroup(treasury_tx_dbid: int, txgroup_dbid: TxGroupDbid) -> None:
906
906
  with db_session:
907
907
  TreasuryTx[treasury_tx_dbid].txgroup = txgroup_dbid
908
+ commit()
908
909
 
909
910
 
910
911
  _stream_metadata_cache: Final[Dict[HexStr, Tuple[ChecksumAddress, date]]] = {}
@@ -925,9 +926,9 @@ class Stream(DbEntity):
925
926
  status = Required(str, default="Active")
926
927
  txgroup = Optional("TxGroup", reverse="streams")
927
928
 
928
- streamed_funds = Set("StreamedFunds")
929
+ streamed_funds = Set("StreamedFunds", lazy=True)
929
930
 
930
- scale = int(1e20)
931
+ scale = 10**20
931
932
 
932
933
  @property
933
934
  def is_alive(self) -> bool:
@@ -1089,7 +1090,7 @@ def create_stream_ledger_view() -> None:
1089
1090
  symbol as token,
1090
1091
  d.address AS "from",
1091
1092
  d.nickname as from_nickname,
1092
- e.address as "to",
1093
+ e.address AS "to",
1093
1094
  e.nickname as to_nickname,
1094
1095
  amount,
1095
1096
  price,
@@ -1108,6 +1109,31 @@ def create_stream_ledger_view() -> None:
1108
1109
  )
1109
1110
 
1110
1111
 
1112
+ def create_txgroup_hierarchy_view() -> None:
1113
+ """Create or replace the SQL view `txgroup_hierarchy` for recursive txgroup hierarchy.
1114
+
1115
+ This view exposes txgroup_id, top_category, and parent_txgroup for all txgroups,
1116
+ matching the recursive CTE logic used in dashboards.
1117
+ """
1118
+ db.execute("DROP VIEW IF EXISTS txgroup_hierarchy;")
1119
+ db.execute(
1120
+ """
1121
+ CREATE VIEW txgroup_hierarchy AS
1122
+ WITH RECURSIVE group_hierarchy (txgroup_id, top_category, parent_txgroup) AS (
1123
+ SELECT txgroup_id, name AS top_category, parent_txgroup
1124
+ FROM txgroups
1125
+ WHERE parent_txgroup IS NULL
1126
+ UNION ALL
1127
+ SELECT child.txgroup_id, parent.top_category, child.parent_txgroup
1128
+ FROM txgroups AS child
1129
+ JOIN group_hierarchy AS parent
1130
+ ON child.parent_txgroup = parent.txgroup_id
1131
+ )
1132
+ SELECT * FROM group_hierarchy;
1133
+ """
1134
+ )
1135
+
1136
+
1111
1137
  def create_vesting_ledger_view() -> None:
1112
1138
  """Create or replace the SQL view `vesting_ledger` for vesting escrow reporting.
1113
1139
 
@@ -1250,6 +1276,7 @@ def create_monthly_pnl_view() -> None:
1250
1276
 
1251
1277
  with db_session:
1252
1278
  create_stream_ledger_view()
1279
+ create_txgroup_hierarchy_view()
1253
1280
  # create_vesting_ledger_view()
1254
1281
  create_general_ledger_view()
1255
1282
  create_unsorted_txs_view()
@@ -1,5 +1,28 @@
1
1
  """
2
- This module contains logic for sorting transactions into various categories.
2
+ This module provides the core logic for sorting DAO Treasury transactions into transaction groups (categories).
3
+
4
+ Sorting enables comprehensive financial reporting and categorization tailored for on-chain organizations.
5
+ Transactions are matched against either statically defined rules or more advanced dynamic rules based on user-defined matching functions.
6
+
7
+ Sorting works by attempting matches in this order:
8
+ 1. Check if the transaction is an internal transfer (within treasury wallets).
9
+ 2. Check if the transaction is "Out of Range" (neither sender nor receiver was a treasury wallet at the time of the tx).
10
+ 3. Match by transaction hash using registered HashMatchers.
11
+ 4. Match by sender address using registered FromAddressMatchers.
12
+ 5. Match by recipient address using registered ToAddressMatchers.
13
+ 6. Assign "Must Sort Inbound" or "Must Sort Outbound" groups if part of treasury.
14
+ 7. Raise an error if no match is found (unexpected case).
15
+
16
+ See the complete [sort rules documentation](https://bobthebuidler.github.io/dao-treasury/sort_rules.html) for detailed explanations
17
+ and examples on defining and registering sort rules.
18
+
19
+ See Also:
20
+ :func:`dao_treasury.sorting.sort_basic`
21
+ :func:`dao_treasury.sorting.sort_basic_entity`
22
+ :func:`dao_treasury.sorting.sort_advanced`
23
+ :class:`dao_treasury.sorting.HashMatcher`
24
+ :class:`dao_treasury.sorting.FromAddressMatcher`
25
+ :class:`dao_treasury.sorting.ToAddressMatcher`
3
26
  """
4
27
 
5
28
  from logging import getLogger
@@ -72,16 +95,54 @@ INTERNAL_TRANSFER_TXGROUP_DBID: Final = TxGroup.get_dbid(
72
95
  name="Internal Transfer",
73
96
  parent=TxGroup.get_dbid("Ignore"),
74
97
  )
75
- # TODO: write a docstring
98
+ """Database ID for the 'Internal Transfer' transaction group.
99
+
100
+ This group represents transactions that occur internally between treasury-owned wallets.
101
+ Such internal movements of funds within the DAO's treasury do not require separate handling or reporting.
102
+
103
+ See Also:
104
+ :class:`dao_treasury.db.TxGroup`
105
+ """
76
106
 
77
107
  OUT_OF_RANGE_TXGROUP_DBID = TxGroup.get_dbid(
78
108
  name="Out of Range", parent=TxGroup.get_dbid("Ignore")
79
109
  )
80
- # TODO: write a docstring
110
+ """Database ID for the 'Out of Range' transaction group.
111
+
112
+ This category is assigned to transactions where neither the sender nor the recipient
113
+ wallet are members of the treasury at the time of the transaction.
114
+
115
+ See Also:
116
+ :class:`dao_treasury.db.TxGroup`
117
+ """
81
118
 
82
119
 
83
120
  def sort_basic(entry: LedgerEntry) -> TxGroupDbid:
84
- # TODO: write docstring
121
+ """Determine the transaction group ID for a basic ledger entry using static matching.
122
+
123
+ The function attempts to categorize the transaction by testing:
124
+ - If both 'from' and 'to' addresses are treasury wallets (internal transfer).
125
+ - If neither ‘to’ address is a treasury wallet at the time of the transaction (out of range).
126
+ - If the transaction hash matches a known HashMatcher.
127
+ - If the 'from' address matches a FromAddressMatcher.
128
+ - If the 'to' address matches a ToAddressMatcher.
129
+ - Assignment to 'Must Sort Outbound' or 'Must Sort Inbound' groups if applicable.
130
+ - Raises `NotImplementedError` if none of the above conditions are met (should not happen).
131
+
132
+ Args:
133
+ entry: A ledger entry representing a blockchain transaction.
134
+
135
+ Examples:
136
+ >>> from eth_portfolio.structs import Transaction
137
+ >>> entry = Transaction(from_address="0xabc...", to_address="0xdef...", block_number=1234567)
138
+ >>> group_id = sort_basic(entry)
139
+ >>> print(group_id)
140
+
141
+ See Also:
142
+ :func:`sort_basic_entity`
143
+ :func:`sort_advanced`
144
+ :class:`dao_treasury.sorting.HashMatcher`
145
+ """
85
146
  from_address = entry.from_address
86
147
  to_address = entry.to_address
87
148
  block = entry.block_number
@@ -117,7 +178,25 @@ def sort_basic(entry: LedgerEntry) -> TxGroupDbid:
117
178
 
118
179
 
119
180
  def sort_basic_entity(tx: db.TreasuryTx) -> TxGroupDbid:
120
- # TODO: write docstring
181
+ """Determine the transaction group ID for a TreasuryTx database entity using static matching.
182
+
183
+ Similar to :func:`sort_basic` but operates on a TreasuryTx entity from the database.
184
+ It considers additional constants such as `DISPERSE_APP` when determining whether
185
+ a transaction is out of range.
186
+
187
+ Args:
188
+ tx: A TreasuryTx database entity representing a treasury transaction.
189
+
190
+ Examples:
191
+ >>> from dao_treasury.db import TreasuryTx
192
+ >>> tx = TreasuryTx[123]
193
+ >>> group_id = sort_basic_entity(tx)
194
+ >>> print(group_id)
195
+
196
+ See Also:
197
+ :func:`sort_basic`
198
+ :func:`sort_advanced`
199
+ """
121
200
  from_address = tx.from_address.address
122
201
  to_address = tx.to_address
123
202
  block = tx.block
@@ -167,7 +246,31 @@ def sort_basic_entity(tx: db.TreasuryTx) -> TxGroupDbid:
167
246
 
168
247
 
169
248
  async def sort_advanced(entry: db.TreasuryTx) -> TxGroupDbid:
170
- # TODO: write docstring
249
+ """Determine the transaction group ID for a TreasuryTx entity using advanced dynamic rules.
250
+
251
+ Starts with the result of static matching via :func:`sort_basic_entity`, then
252
+ applies advanced asynchronous matching rules registered under :data:`SORT_RULES`.
253
+ Applies rules sequentially until a match is found or all rules are exhausted.
254
+
255
+ If a rule's match attempt raises a `ContractNotVerified` exception, the rule is skipped.
256
+
257
+ Updates the TreasuryTx entity's transaction group in the database when a match
258
+ other than 'Must Sort Inbound/Outbound' is found.
259
+
260
+ Args:
261
+ entry: A TreasuryTx database entity representing a treasury transaction.
262
+
263
+ Examples:
264
+ >>> from dao_treasury.db import TreasuryTx
265
+ >>> import asyncio
266
+ >>> tx = TreasuryTx[123]
267
+ >>> group_id = asyncio.run(sort_advanced(tx))
268
+ >>> print(group_id)
269
+
270
+ See Also:
271
+ :func:`sort_basic_entity`
272
+ :data:`SORT_RULES`
273
+ """
171
274
  txgroup_dbid = sort_basic_entity(entry)
172
275
 
173
276
  if txgroup_dbid in (
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.32
3
+ Version: 0.0.33
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.29.dev0
17
+ Requires-Dist: eth-portfolio-temp<0.1,>=0.0.30.dev0
18
18
  Dynamic: classifier
19
19
  Dynamic: description
20
20
  Dynamic: description-content-type
@@ -1,49 +1,51 @@
1
- bf2b4fe1f86ad2ea158b__mypyc.cp311-win32.pyd,sha256=0epd8E6FMUcavmUk_AcjYb8AI4lkJ_n_Y_SM1B-Wb4k,407552
1
+ bf2b4fe1f86ad2ea158b__mypyc.cp311-win32.pyd,sha256=tBslkr98nU_EP3LiFbwRldr18VfZ8dmGe2GL7DuEbuQ,408064
2
2
  dao_treasury/ENVIRONMENT_VARIABLES.py,sha256=ci7djcsXc9uRi6_vBQv-avGQrrIacyftXmcwKuitWWU,203
3
3
  dao_treasury/__init__.py,sha256=U8BsakN_w15wVE_7MjVbHD9LBal48LfJ6a1Icf5oHdY,1052
4
- dao_treasury/_docker.cp311-win32.pyd,sha256=TT6iqolseeorx1BuniZP-gvZz-UhGoLqfq4B-jHhAUU,9216
4
+ dao_treasury/_docker.cp311-win32.pyd,sha256=CvIqlFbAbmtbin9j2hYD_OAylY4vFLeHD3jVq4776lk,9216
5
5
  dao_treasury/_docker.py,sha256=wY26wCrQ8p-L0KfMJftyzI_YAszHjnBWLw94eh0LxxY,5607
6
- dao_treasury/_nicknames.cp311-win32.pyd,sha256=cEE-1i9UI8wEqnw2YeDDwmpkwQJzQqDRrzsjkt8Walk,9216
6
+ dao_treasury/_nicknames.cp311-win32.pyd,sha256=3oTFK_LTCdHDXkT84aDPB4ExtQEc_esYdfJ6HVA9UEk,9216
7
7
  dao_treasury/_nicknames.py,sha256=NpbQ4NtmZF_A_vqTGSal2KzKzkH5t7_wbI8EtMBqEr4,497
8
- dao_treasury/_wallet.cp311-win32.pyd,sha256=X0xOVTFnBVoT1VNw-PXIjIg98VJB_bFw8e1zdf3ky_U,9216
8
+ dao_treasury/_wallet.cp311-win32.pyd,sha256=kV0joY76IFXIKOwMQ0NIYcs-WeaKBP7zy2CtqLjlC5s,9216
9
9
  dao_treasury/_wallet.py,sha256=q-H3YrRLWHIjOplVEcY2zqYnv6J--nxXtcx_-a1jcQw,10584
10
- dao_treasury/constants.cp311-win32.pyd,sha256=EWWN5s_wtMSQpMc1jBUeUW8gbsR2c51gr4Hl4OA7524,9216
10
+ dao_treasury/constants.cp311-win32.pyd,sha256=DNU6xNy_t8_BVnwv6rtttblkifIo8I19bEGG4PI6tKk,9216
11
11
  dao_treasury/constants.py,sha256=VNzlrwC8HB8LdKNmoIfncUACKHfXZxp2GtBBrH_lZKE,522
12
- dao_treasury/db.py,sha256=naWIASCJCGROMijxdkS-A0g8_HEFrCqCP0FsAjaDRm8,46167
12
+ dao_treasury/db.py,sha256=FMoPgWtXjg_DjwpkUumpCOgPFqgRBfwmAaSyp_fl9mU,47499
13
13
  dao_treasury/docker-compose.yaml,sha256=trksBUUwNGJGcrsgX0k0xVEsl-SjWzYE_4tpO1DjuJg,1421
14
14
  dao_treasury/main.py,sha256=yVQGwDgO4XKcxV6tQQPxEcLcZPSEEK1yJS8Djfq3Esc,8294
15
15
  dao_treasury/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  dao_treasury/treasury.py,sha256=64_z0lsjOngGFASCVQNUM-QfbC5YqhKMgOdtLh758co,6678
17
- dao_treasury/types.cp311-win32.pyd,sha256=9EqHKF9uP4-LcKuQtFrRdF-rgTNVyvm7iO_OA6s9qPo,9216
17
+ dao_treasury/types.cp311-win32.pyd,sha256=vBibWaVWFPFDiwPERMFJFgLYEcu4uZ250hiMmA6zpLw,9216
18
18
  dao_treasury/types.py,sha256=KFz4WKPp4t_RBwIT6YGwOcgbzw8tdHIOcXTFsUA0pJA,3818
19
- dao_treasury/.grafana/provisioning/dashboards/dashboards.yaml,sha256=DzPkgm6Sz2hB5nNpKyTWTEfRplsYVQ9KUgQZ-yQOu6c,747
19
+ dao_treasury/.grafana/provisioning/dashboards/dashboards.yaml,sha256=PwGrxPA5snT37bmpCuP9WE9T7weACm39N9lEsudr7f0,1337
20
20
  dao_treasury/.grafana/provisioning/dashboards/streams/LlamaPay.json,sha256=zKisR5WewEdpPMMSVLe3w-K8YBg30CYEuzrYjW_LZTQ,3518
21
- dao_treasury/.grafana/provisioning/dashboards/summary/Monthly.json,sha256=pEHnKgiFgL_oscujk2SVEmkwe-PZiuGjlKf7bcLm2uc,8022
22
- dao_treasury/.grafana/provisioning/dashboards/transactions/Treasury Transactions.json,sha256=kXaEYWwbwVbkYmj2iWYpHzHVeeBidFpGQoLm5rxUUGU,16361
23
- dao_treasury/.grafana/provisioning/dashboards/treasury/Cashflow.json,sha256=Q544KS0P30LnBWAjMFr9jHOW83-Eoj76AQEWjNDS93o,43367
21
+ dao_treasury/.grafana/provisioning/dashboards/summary/Monthly.json,sha256=AvwYvGO4BmEKuwkdUQ0lyo2J4dp5E8DsmF0LGDOiA7A,6640
22
+ dao_treasury/.grafana/provisioning/dashboards/transactions/Treasury Transactions.json,sha256=Uvl9FlNQwE5QTqXOahKVUq5jCMIdX-iMYXdksVXwUQ8,13617
23
+ dao_treasury/.grafana/provisioning/dashboards/treasury/Cashflow (Including Unsorted).json,sha256=QimWaoksNwAMm9tDgsTHeaSCNqmHY0P6YjG4ib1103g,26364
24
+ dao_treasury/.grafana/provisioning/dashboards/treasury/Cashflow.json,sha256=TDDhrZu0RRh3JNMNg-NrF9vhXe7QuuIa4WXn74d1rOw,18754
25
+ dao_treasury/.grafana/provisioning/dashboards/treasury/Operating Cashflow.json,sha256=1EyTx0BJoa-s8J9mm_Byho3vNF52n6dNoh1_EzajoOE,14802
24
26
  dao_treasury/.grafana/provisioning/dashboards/treasury/Treasury.json,sha256=6y7Fp-2g1iRanRBtWKKN13sXjaKxBvqld7416ZJu4YI,72196
25
27
  dao_treasury/.grafana/provisioning/datasources/datasources.yaml,sha256=gLmJsOkEXNzWRDibShfHFySWeuExW-dSB_U0OSfH868,344
26
- dao_treasury/sorting/__init__.cp311-win32.pyd,sha256=TnGrfz632MAyjEhNI32SNE-lnvs3HZF4HRQsCTGuBM8,9216
27
- dao_treasury/sorting/__init__.py,sha256=hHH9LLX11m2YR5NFKiTSVtdLBNGdAyJsvgDNzG3BTBI,5977
28
- dao_treasury/sorting/_matchers.cp311-win32.pyd,sha256=UHrKfzAaDDpo2352szcdWrgt29NEvBrYfPYwB5JaUCI,9216
28
+ dao_treasury/sorting/__init__.cp311-win32.pyd,sha256=hM9kXdV5IWZTQTjqUPnk7KKRd_BWVJVb3nwr20yP0P0,9216
29
+ dao_treasury/sorting/__init__.py,sha256=_uxM_FE1paM8oDAhDdHSyhDwnrlxCYX_lGn2DOqCaHU,10666
30
+ dao_treasury/sorting/_matchers.cp311-win32.pyd,sha256=dJVpniVEDgqzVABsXalgKccUKYcz8NdZw-RRbsTtZHQ,9216
29
31
  dao_treasury/sorting/_matchers.py,sha256=ACi6aXZCKW5OTiztsID7CXCGJounj5c6ivhOCg2436M,14392
30
- dao_treasury/sorting/_rules.cp311-win32.pyd,sha256=QBlbPXnP9fvFPTRzCBzPZrAknTaUN9vZ-3ClpiJVKuk,9216
32
+ dao_treasury/sorting/_rules.cp311-win32.pyd,sha256=aBBZjp_CqzYGc8ISJ98FtMaVC0Kv0swtYEMePAKYC0c,9216
31
33
  dao_treasury/sorting/_rules.py,sha256=DxhdUgpS0q0LWeLl9W1Bjn5LZz9z4OLA03vQllPMH9k,9229
32
- dao_treasury/sorting/factory.cp311-win32.pyd,sha256=b89pOmq8WcUXzHiuVkaCcTZF7l6cgNc7b7puRqwDt3I,9216
34
+ dao_treasury/sorting/factory.cp311-win32.pyd,sha256=MqSWA6ykeymzSOP8v3gt5DZezSd5nP5OsbAUhJfIaKY,9216
33
35
  dao_treasury/sorting/factory.py,sha256=zlJ18xlMTxv8ACV6_MimCVIDsw3K5AZcyvKaNYY7R14,10484
34
- dao_treasury/sorting/rule.cp311-win32.pyd,sha256=OYqN1VcuY12oiidTWLirzpINlr8hwZEkxElYqU9ash4,9216
36
+ dao_treasury/sorting/rule.cp311-win32.pyd,sha256=u3UOiQetPbAQBWZtYolFMF0byeTR0a4AA7uM-txy8KU,9216
35
37
  dao_treasury/sorting/rule.py,sha256=TsSlaU4UlYr4QWJBdUY7EOAfC_SK6_VA3wEFOFNUUrU,11837
36
- dao_treasury/sorting/rules/__init__.cp311-win32.pyd,sha256=iH5mudDxnoOXgSGb2iU_1vRNhyeGVZ0h7X00mFWJz70,9216
38
+ dao_treasury/sorting/rules/__init__.cp311-win32.pyd,sha256=FDNH99Zqeei1PLI58m9RNJ5DLXnz0pfrDoLi7P2-gSA,9216
37
39
  dao_treasury/sorting/rules/__init__.py,sha256=hcLfejOEwD8RaM2RE-38Ej6_WkvL9BVGvIIGY848E6E,49
38
- dao_treasury/sorting/rules/ignore/__init__.cp311-win32.pyd,sha256=0owjDJPUACmsx72jZUUsQUZhjwiyxwanLBOZqr0O7t0,9216
40
+ dao_treasury/sorting/rules/ignore/__init__.cp311-win32.pyd,sha256=IeCEUte4aASnW6Z6jFZGPud0rlJKe1go548s-vlFBq4,9216
39
41
  dao_treasury/sorting/rules/ignore/__init__.py,sha256=16THKoGdj6qfkkytuCFVG_R1M6KSErMI4AVE1p0ukS4,58
40
- dao_treasury/sorting/rules/ignore/llamapay.cp311-win32.pyd,sha256=G0bFsnWra4-wPRmLhUpU_x0do3xhKMoRAorLmTMTleY,9216
42
+ dao_treasury/sorting/rules/ignore/llamapay.cp311-win32.pyd,sha256=FRXT2PQIxurUlD0n0cMd8jmSVnsuU1MdFwfocv3Jvkg,9216
41
43
  dao_treasury/sorting/rules/ignore/llamapay.py,sha256=aYyAJRlmv419IeaqkcV5o3ffx0UVfteU0lTl80j0BGo,783
42
- dao_treasury/streams/__init__.cp311-win32.pyd,sha256=eQ_Qz8IkbTifsDmEI-miQEldbDJuMSM-MJm7eF_RPuU,9216
44
+ dao_treasury/streams/__init__.cp311-win32.pyd,sha256=faMh_hEZ5TrQW_1tpxD0WLJvwIv3zJYvR_y1YXVwdSk,9216
43
45
  dao_treasury/streams/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
- dao_treasury/streams/llamapay.cp311-win32.pyd,sha256=61XJjDg1oc8zdD5eo5pcCJNDsmkGQ4N5FhbE5YEJ0Io,9216
46
+ dao_treasury/streams/llamapay.cp311-win32.pyd,sha256=9VdnGAxtu6-61Ec6t06OB0nMmXfIj2pYDDbwPOUnw7Q,9216
45
47
  dao_treasury/streams/llamapay.py,sha256=HXG3Qg8R5l1FTVgmSnpOBRoDt2VchjOI-dU9rrC_mjQ,13150
46
- dao_treasury-0.0.32.dist-info/METADATA,sha256=-MJV9I0Bm8uwE9NjFwVOizFUgmh1GHA4toUB8wNF3Xg,7149
47
- dao_treasury-0.0.32.dist-info/WHEEL,sha256=Ri8zddKrjGdgjlj1OpSsvpDnvHfnQhMQWi3E_v2pqng,97
48
- dao_treasury-0.0.32.dist-info/top_level.txt,sha256=Gw-ri_26lZA_3hwhnOX48mffUbmBGr8NhtoQ0XoMeF8,41
49
- dao_treasury-0.0.32.dist-info/RECORD,,
48
+ dao_treasury-0.0.33.dist-info/METADATA,sha256=TGhPqs8nC23v-UCxZG9gxCW7cnhTTUZUc9USGmin21I,7149
49
+ dao_treasury-0.0.33.dist-info/WHEEL,sha256=Ri8zddKrjGdgjlj1OpSsvpDnvHfnQhMQWi3E_v2pqng,97
50
+ dao_treasury-0.0.33.dist-info/top_level.txt,sha256=Gw-ri_26lZA_3hwhnOX48mffUbmBGr8NhtoQ0XoMeF8,41
51
+ dao_treasury-0.0.33.dist-info/RECORD,,