dao-treasury 0.0.31__cp312-cp312-win_amd64.whl → 0.0.33__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.
- bf2b4fe1f86ad2ea158b__mypyc.cp312-win_amd64.pyd +0 -0
- dao_treasury/.grafana/provisioning/dashboards/dashboards.yaml +31 -5
- dao_treasury/.grafana/provisioning/dashboards/summary/Monthly.json +5 -10
- dao_treasury/.grafana/provisioning/dashboards/transactions/Treasury Transactions.json +13 -13
- dao_treasury/.grafana/provisioning/dashboards/treasury/Cashflow (Including Unsorted).json +834 -0
- dao_treasury/.grafana/provisioning/dashboards/treasury/Cashflow.json +25 -428
- dao_treasury/.grafana/provisioning/dashboards/treasury/Operating Cashflow.json +491 -0
- dao_treasury/_docker.cp312-win_amd64.pyd +0 -0
- dao_treasury/_nicknames.cp312-win_amd64.pyd +0 -0
- dao_treasury/_wallet.cp312-win_amd64.pyd +0 -0
- dao_treasury/constants.cp312-win_amd64.pyd +0 -0
- dao_treasury/db.py +58 -31
- dao_treasury/sorting/__init__.cp312-win_amd64.pyd +0 -0
- dao_treasury/sorting/__init__.py +109 -6
- dao_treasury/sorting/_matchers.cp312-win_amd64.pyd +0 -0
- dao_treasury/sorting/_rules.cp312-win_amd64.pyd +0 -0
- dao_treasury/sorting/factory.cp312-win_amd64.pyd +0 -0
- dao_treasury/sorting/rule.cp312-win_amd64.pyd +0 -0
- dao_treasury/sorting/rules/__init__.cp312-win_amd64.pyd +0 -0
- dao_treasury/sorting/rules/ignore/__init__.cp312-win_amd64.pyd +0 -0
- dao_treasury/sorting/rules/ignore/llamapay.cp312-win_amd64.pyd +0 -0
- dao_treasury/streams/__init__.cp312-win_amd64.pyd +0 -0
- dao_treasury/streams/llamapay.cp312-win_amd64.pyd +0 -0
- dao_treasury/streams/llamapay.py +27 -14
- dao_treasury/types.cp312-win_amd64.pyd +0 -0
- {dao_treasury-0.0.31.dist-info → dao_treasury-0.0.33.dist-info}/METADATA +2 -2
- dao_treasury-0.0.33.dist-info/RECORD +51 -0
- dao_treasury-0.0.33.dist-info/top_level.txt +2 -0
- 17ebe61b88bd37338d0a__mypyc.cp312-win_amd64.pyd +0 -0
- dao_treasury-0.0.31.dist-info/RECORD +0 -49
- dao_treasury-0.0.31.dist-info/top_level.txt +0 -2
- {dao_treasury-0.0.31.dist-info → dao_treasury-0.0.33.dist-info}/WHEEL +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(
|
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 =
|
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
|
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()
|
Binary file
|
dao_treasury/sorting/__init__.py
CHANGED
@@ -1,5 +1,28 @@
|
|
1
1
|
"""
|
2
|
-
This module
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
dao_treasury/streams/llamapay.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
import asyncio
|
2
|
-
|
3
|
-
|
2
|
+
import datetime as dt
|
3
|
+
import decimal
|
4
4
|
from logging import getLogger
|
5
5
|
from typing import (
|
6
6
|
Awaitable,
|
@@ -21,7 +21,7 @@ from brownie.network.event import _EventItem
|
|
21
21
|
from eth_typing import BlockNumber, ChecksumAddress, HexAddress, HexStr
|
22
22
|
from tqdm.asyncio import tqdm_asyncio
|
23
23
|
|
24
|
-
|
24
|
+
import y
|
25
25
|
from y.time import UnixTimestamp
|
26
26
|
from y.utils.events import decode_logs, get_logs_asap
|
27
27
|
|
@@ -38,18 +38,31 @@ from dao_treasury._wallet import TreasuryWallet
|
|
38
38
|
|
39
39
|
logger: Final = getLogger(__name__)
|
40
40
|
|
41
|
-
_UTC: Final = timezone.utc
|
41
|
+
_UTC: Final = dt.timezone.utc
|
42
42
|
|
43
43
|
_ONE_DAY: Final = 60 * 60 * 24
|
44
44
|
|
45
45
|
_STREAMS_THREAD: Final = AsyncThreadPoolExecutor(1)
|
46
46
|
|
47
47
|
create_task: Final = asyncio.create_task
|
48
|
+
sleep: Final = asyncio.sleep
|
49
|
+
|
50
|
+
datetime: Final = dt.datetime
|
51
|
+
timedelta: Final = dt.timedelta
|
52
|
+
fromtimestamp: Final = datetime.fromtimestamp
|
53
|
+
now: Final = datetime.now
|
54
|
+
|
55
|
+
Decimal: Final = decimal.Decimal
|
48
56
|
|
49
57
|
ObjectNotFound: Final = pony.orm.ObjectNotFound
|
50
58
|
commit: Final = pony.orm.commit
|
51
59
|
db_session: Final = pony.orm.db_session
|
52
60
|
|
61
|
+
Contract: Final = y.Contract
|
62
|
+
Network: Final = y.Network
|
63
|
+
get_block_at_timestamp: Final = y.get_block_at_timestamp
|
64
|
+
get_price: Final = y.get_price
|
65
|
+
|
53
66
|
|
54
67
|
networks: Final = [Network.Mainnet]
|
55
68
|
|
@@ -67,13 +80,13 @@ if yfi_stream_factory := {
|
|
67
80
|
|
68
81
|
|
69
82
|
def _generate_dates(
|
70
|
-
start: datetime, end: datetime, stop_at_today: bool = True
|
71
|
-
) -> Iterator[datetime]:
|
83
|
+
start: dt.datetime, end: dt.datetime, stop_at_today: bool = True
|
84
|
+
) -> Iterator[dt.datetime]:
|
72
85
|
current = start
|
73
86
|
while current < end:
|
74
87
|
yield current
|
75
88
|
current += timedelta(days=1)
|
76
|
-
if stop_at_today and current.date() >
|
89
|
+
if stop_at_today and current.date() > now(_UTC).date():
|
77
90
|
break
|
78
91
|
|
79
92
|
|
@@ -86,7 +99,7 @@ def _get_streamToStart(stream_id: HexStr) -> _StreamToStart:
|
|
86
99
|
if streamToStart := _streamToStart_cache.get(stream_id):
|
87
100
|
return streamToStart
|
88
101
|
with db_session:
|
89
|
-
contract: Contract = Stream[stream_id].contract.contract # type: ignore [misc]
|
102
|
+
contract: y.Contract = Stream[stream_id].contract.contract # type: ignore [misc]
|
90
103
|
streamToStart = contract.streamToStart.coroutine
|
91
104
|
_streamToStart_cache[stream_id] = streamToStart
|
92
105
|
return streamToStart
|
@@ -163,7 +176,7 @@ class LlamaPayProcessor:
|
|
163
176
|
for stream_contract in self.stream_contracts
|
164
177
|
)
|
165
178
|
|
166
|
-
async def _load_contract_events(self, stream_contract: Contract) -> None:
|
179
|
+
async def _load_contract_events(self, stream_contract: y.Contract) -> None:
|
167
180
|
events = decode_logs(
|
168
181
|
await get_logs_asap(stream_contract.address, None, sync=False)
|
169
182
|
)
|
@@ -311,7 +324,7 @@ class LlamaPayProcessor:
|
|
311
324
|
return
|
312
325
|
|
313
326
|
async def process_stream_for_date(
|
314
|
-
self, stream_id: HexStr, date_obj: datetime
|
327
|
+
self, stream_id: HexStr, date_obj: dt.datetime
|
315
328
|
) -> Optional[StreamedFunds]:
|
316
329
|
entity = await _STREAMS_THREAD.run(
|
317
330
|
StreamedFunds.get_entity, stream_id, date_obj
|
@@ -323,8 +336,10 @@ class LlamaPayProcessor:
|
|
323
336
|
Stream._get_token_and_start_date, stream_id
|
324
337
|
)
|
325
338
|
check_at = date_obj + timedelta(days=1) - timedelta(seconds=1)
|
339
|
+
if check_at > now(tz=_UTC):
|
340
|
+
await sleep((check_at - now(tz=_UTC)).total_seconds())
|
326
341
|
block = await get_block_at_timestamp(check_at, sync=False)
|
327
|
-
price_fut =
|
342
|
+
price_fut = create_task(get_price(stream_token, block, sync=False))
|
328
343
|
start_timestamp = await _get_start_timestamp(stream_id, block)
|
329
344
|
if start_timestamp == 0:
|
330
345
|
if await _STREAMS_THREAD.run(Stream.check_closed, stream_id):
|
@@ -335,9 +350,7 @@ class LlamaPayProcessor:
|
|
335
350
|
block -= 1
|
336
351
|
start_timestamp = await _get_start_timestamp(stream_id, block)
|
337
352
|
|
338
|
-
block_datetime =
|
339
|
-
await _get_block_timestamp(block), tz=_UTC
|
340
|
-
)
|
353
|
+
block_datetime = fromtimestamp(await _get_block_timestamp(block), tz=_UTC)
|
341
354
|
assert block_datetime.date() == date_obj.date()
|
342
355
|
seconds_active = (check_at - block_datetime).seconds
|
343
356
|
is_last_day = True
|
Binary file
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: dao_treasury
|
3
|
-
Version: 0.0.
|
3
|
+
Version: 0.0.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.
|
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
|
@@ -0,0 +1,51 @@
|
|
1
|
+
bf2b4fe1f86ad2ea158b__mypyc.cp312-win_amd64.pyd,sha256=8BIkhEUsg-BJ35gOJvzm5Uf1lEeYg6gljdvkTgbxXd4,503808
|
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=T42f-yBta7Ovk5GEZcWZnEinGpw82-5u6SPoOQHisIs,10752
|
5
|
+
dao_treasury/_docker.py,sha256=wY26wCrQ8p-L0KfMJftyzI_YAszHjnBWLw94eh0LxxY,5607
|
6
|
+
dao_treasury/_nicknames.cp312-win_amd64.pyd,sha256=0Vn6gtbsd1l2AHGviIoY4HN-ekQKaVFmwil3_3k-mmQ,10752
|
7
|
+
dao_treasury/_nicknames.py,sha256=NpbQ4NtmZF_A_vqTGSal2KzKzkH5t7_wbI8EtMBqEr4,497
|
8
|
+
dao_treasury/_wallet.cp312-win_amd64.pyd,sha256=uf8MDV5XPYeSx9jktU9q6sIbd-s041AuI8stQh4W9YE,10752
|
9
|
+
dao_treasury/_wallet.py,sha256=q-H3YrRLWHIjOplVEcY2zqYnv6J--nxXtcx_-a1jcQw,10584
|
10
|
+
dao_treasury/constants.cp312-win_amd64.pyd,sha256=9Za_Jly0fiNNlfJIan8Mmm4b0NSyiFq3O6fyqBK7rmw,10752
|
11
|
+
dao_treasury/constants.py,sha256=VNzlrwC8HB8LdKNmoIfncUACKHfXZxp2GtBBrH_lZKE,522
|
12
|
+
dao_treasury/db.py,sha256=FMoPgWtXjg_DjwpkUumpCOgPFqgRBfwmAaSyp_fl9mU,47499
|
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=64_z0lsjOngGFASCVQNUM-QfbC5YqhKMgOdtLh758co,6678
|
17
|
+
dao_treasury/types.cp312-win_amd64.pyd,sha256=s9bwZNP53GCMrjeGfVaD6HwtTn5sidUm70Rx6psxQRA,10752
|
18
|
+
dao_treasury/types.py,sha256=KFz4WKPp4t_RBwIT6YGwOcgbzw8tdHIOcXTFsUA0pJA,3818
|
19
|
+
dao_treasury/.grafana/provisioning/dashboards/dashboards.yaml,sha256=PwGrxPA5snT37bmpCuP9WE9T7weACm39N9lEsudr7f0,1337
|
20
|
+
dao_treasury/.grafana/provisioning/dashboards/streams/LlamaPay.json,sha256=zKisR5WewEdpPMMSVLe3w-K8YBg30CYEuzrYjW_LZTQ,3518
|
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
|
26
|
+
dao_treasury/.grafana/provisioning/dashboards/treasury/Treasury.json,sha256=6y7Fp-2g1iRanRBtWKKN13sXjaKxBvqld7416ZJu4YI,72196
|
27
|
+
dao_treasury/.grafana/provisioning/datasources/datasources.yaml,sha256=gLmJsOkEXNzWRDibShfHFySWeuExW-dSB_U0OSfH868,344
|
28
|
+
dao_treasury/sorting/__init__.cp312-win_amd64.pyd,sha256=aNf4kAK2enEl24i0UZI5DXD7we9wJeBIznwhxKK3_0g,10752
|
29
|
+
dao_treasury/sorting/__init__.py,sha256=_uxM_FE1paM8oDAhDdHSyhDwnrlxCYX_lGn2DOqCaHU,10666
|
30
|
+
dao_treasury/sorting/_matchers.cp312-win_amd64.pyd,sha256=BeP7gzG7294LzqD4HvoCIFr_ejSvDf9MFY0WuSNWUCs,10752
|
31
|
+
dao_treasury/sorting/_matchers.py,sha256=ACi6aXZCKW5OTiztsID7CXCGJounj5c6ivhOCg2436M,14392
|
32
|
+
dao_treasury/sorting/_rules.cp312-win_amd64.pyd,sha256=N9u__rj2F0i3GEzlMxqSOepfS8zDOq-r9jIJh_MjyF0,10752
|
33
|
+
dao_treasury/sorting/_rules.py,sha256=DxhdUgpS0q0LWeLl9W1Bjn5LZz9z4OLA03vQllPMH9k,9229
|
34
|
+
dao_treasury/sorting/factory.cp312-win_amd64.pyd,sha256=53DunOIx3cSlRlSOd615i4I6Nr_PYV8jFSQ3sS2r3RY,10752
|
35
|
+
dao_treasury/sorting/factory.py,sha256=zlJ18xlMTxv8ACV6_MimCVIDsw3K5AZcyvKaNYY7R14,10484
|
36
|
+
dao_treasury/sorting/rule.cp312-win_amd64.pyd,sha256=S5c_Y-CtlWXosFB2YGHIiGaFzwaIR6wqiKSqjdJqSTA,10752
|
37
|
+
dao_treasury/sorting/rule.py,sha256=TsSlaU4UlYr4QWJBdUY7EOAfC_SK6_VA3wEFOFNUUrU,11837
|
38
|
+
dao_treasury/sorting/rules/__init__.cp312-win_amd64.pyd,sha256=SLDX6IEiMX50fzwZuaBhCg0D59el6K9ExeGB4vXunMo,10752
|
39
|
+
dao_treasury/sorting/rules/__init__.py,sha256=hcLfejOEwD8RaM2RE-38Ej6_WkvL9BVGvIIGY848E6E,49
|
40
|
+
dao_treasury/sorting/rules/ignore/__init__.cp312-win_amd64.pyd,sha256=-2De_Iind-CMPs_QYXOBnaxRAI3U17c1cd0N-OePsrw,10752
|
41
|
+
dao_treasury/sorting/rules/ignore/__init__.py,sha256=16THKoGdj6qfkkytuCFVG_R1M6KSErMI4AVE1p0ukS4,58
|
42
|
+
dao_treasury/sorting/rules/ignore/llamapay.cp312-win_amd64.pyd,sha256=pfvXI6wEeZxxw_iVE7U4mkfP95G_Qh2jXOamhirKceU,10752
|
43
|
+
dao_treasury/sorting/rules/ignore/llamapay.py,sha256=aYyAJRlmv419IeaqkcV5o3ffx0UVfteU0lTl80j0BGo,783
|
44
|
+
dao_treasury/streams/__init__.cp312-win_amd64.pyd,sha256=2Tpn9sUW37MPtic4OY2pAU1g8wBHf_1u3SARSITuRGk,10752
|
45
|
+
dao_treasury/streams/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
46
|
+
dao_treasury/streams/llamapay.cp312-win_amd64.pyd,sha256=gZFCi1Z_NZhzGa5xsO23JaSdtyuh8Xk_Jzd1pL143xM,10752
|
47
|
+
dao_treasury/streams/llamapay.py,sha256=HXG3Qg8R5l1FTVgmSnpOBRoDt2VchjOI-dU9rrC_mjQ,13150
|
48
|
+
dao_treasury-0.0.33.dist-info/METADATA,sha256=TGhPqs8nC23v-UCxZG9gxCW7cnhTTUZUc9USGmin21I,7149
|
49
|
+
dao_treasury-0.0.33.dist-info/WHEEL,sha256=8UP9x9puWI0P1V_d7K2oMTBqfeLNm21CTzZ_Ptr0NXU,101
|
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,,
|
Binary file
|
@@ -1,49 +0,0 @@
|
|
1
|
-
17ebe61b88bd37338d0a__mypyc.cp312-win_amd64.pyd,sha256=xEG9guYY74jRDh6YbDvbljCNK8XPKUAMioP2sUaX2w4,498176
|
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=SvQNnXFrGjCZa4TQY0QMnJIAjL_qL-hCRedxKos3pus,10752
|
5
|
-
dao_treasury/_docker.py,sha256=wY26wCrQ8p-L0KfMJftyzI_YAszHjnBWLw94eh0LxxY,5607
|
6
|
-
dao_treasury/_nicknames.cp312-win_amd64.pyd,sha256=GqpjXWXQi4r4-K4FsgSWPWNW1KNc_3Wg5sH5eQFJO-g,10752
|
7
|
-
dao_treasury/_nicknames.py,sha256=NpbQ4NtmZF_A_vqTGSal2KzKzkH5t7_wbI8EtMBqEr4,497
|
8
|
-
dao_treasury/_wallet.cp312-win_amd64.pyd,sha256=7ECvOq8J3R2w8-Ea2DRI-fPpI3bwZSDNzWHdxGpWxQQ,10752
|
9
|
-
dao_treasury/_wallet.py,sha256=q-H3YrRLWHIjOplVEcY2zqYnv6J--nxXtcx_-a1jcQw,10584
|
10
|
-
dao_treasury/constants.cp312-win_amd64.pyd,sha256=iuw-SvnPNIPNDzmN47mGONd9rLAISDZe7ip55yCI8Q8,10752
|
11
|
-
dao_treasury/constants.py,sha256=VNzlrwC8HB8LdKNmoIfncUACKHfXZxp2GtBBrH_lZKE,522
|
12
|
-
dao_treasury/db.py,sha256=naWIASCJCGROMijxdkS-A0g8_HEFrCqCP0FsAjaDRm8,46167
|
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=64_z0lsjOngGFASCVQNUM-QfbC5YqhKMgOdtLh758co,6678
|
17
|
-
dao_treasury/types.cp312-win_amd64.pyd,sha256=fceOt7NJQ_kjjkPIBCfYsKsqVTvgSt5DKsAEo6_yS-M,10752
|
18
|
-
dao_treasury/types.py,sha256=KFz4WKPp4t_RBwIT6YGwOcgbzw8tdHIOcXTFsUA0pJA,3818
|
19
|
-
dao_treasury/.grafana/provisioning/dashboards/dashboards.yaml,sha256=DzPkgm6Sz2hB5nNpKyTWTEfRplsYVQ9KUgQZ-yQOu6c,747
|
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
|
24
|
-
dao_treasury/.grafana/provisioning/dashboards/treasury/Treasury.json,sha256=6y7Fp-2g1iRanRBtWKKN13sXjaKxBvqld7416ZJu4YI,72196
|
25
|
-
dao_treasury/.grafana/provisioning/datasources/datasources.yaml,sha256=gLmJsOkEXNzWRDibShfHFySWeuExW-dSB_U0OSfH868,344
|
26
|
-
dao_treasury/sorting/__init__.cp312-win_amd64.pyd,sha256=wnVWUGdH2iWiGHZLAcW7GQfMWA2Xt3-_432hyNBBFTQ,10752
|
27
|
-
dao_treasury/sorting/__init__.py,sha256=hHH9LLX11m2YR5NFKiTSVtdLBNGdAyJsvgDNzG3BTBI,5977
|
28
|
-
dao_treasury/sorting/_matchers.cp312-win_amd64.pyd,sha256=iJkBwsNi4iJ2QRxhZDuKZzybL2Hm1vASS_TLkV3aZyk,10752
|
29
|
-
dao_treasury/sorting/_matchers.py,sha256=ACi6aXZCKW5OTiztsID7CXCGJounj5c6ivhOCg2436M,14392
|
30
|
-
dao_treasury/sorting/_rules.cp312-win_amd64.pyd,sha256=qITbOzwGnKFmy9usK1RbvI2JjzbdkOUyT-ue2W-Lxsk,10752
|
31
|
-
dao_treasury/sorting/_rules.py,sha256=DxhdUgpS0q0LWeLl9W1Bjn5LZz9z4OLA03vQllPMH9k,9229
|
32
|
-
dao_treasury/sorting/factory.cp312-win_amd64.pyd,sha256=UA20tdt-XcAUJqcAlp7IfzUNvmhR3Iz0Wsi0xir_heU,10752
|
33
|
-
dao_treasury/sorting/factory.py,sha256=zlJ18xlMTxv8ACV6_MimCVIDsw3K5AZcyvKaNYY7R14,10484
|
34
|
-
dao_treasury/sorting/rule.cp312-win_amd64.pyd,sha256=fREquVBMVMyxvD2EJ5Ohouv0I7BwN4Yg7fwqWkOLZ-o,10752
|
35
|
-
dao_treasury/sorting/rule.py,sha256=TsSlaU4UlYr4QWJBdUY7EOAfC_SK6_VA3wEFOFNUUrU,11837
|
36
|
-
dao_treasury/sorting/rules/__init__.cp312-win_amd64.pyd,sha256=VZAIpO0oumsTcRj5nubIZCnqa8ghcWEPBzt0nAOT1FA,10752
|
37
|
-
dao_treasury/sorting/rules/__init__.py,sha256=hcLfejOEwD8RaM2RE-38Ej6_WkvL9BVGvIIGY848E6E,49
|
38
|
-
dao_treasury/sorting/rules/ignore/__init__.cp312-win_amd64.pyd,sha256=xxpn6Xl2XfHoHuDiAJLOlR4u_Lk8jrg_ufSaxr_YAco,10752
|
39
|
-
dao_treasury/sorting/rules/ignore/__init__.py,sha256=16THKoGdj6qfkkytuCFVG_R1M6KSErMI4AVE1p0ukS4,58
|
40
|
-
dao_treasury/sorting/rules/ignore/llamapay.cp312-win_amd64.pyd,sha256=9TUrvjX0vAC7X11rOexBd0_AHznnDsiw2l9V8rmf4-0,10752
|
41
|
-
dao_treasury/sorting/rules/ignore/llamapay.py,sha256=aYyAJRlmv419IeaqkcV5o3ffx0UVfteU0lTl80j0BGo,783
|
42
|
-
dao_treasury/streams/__init__.cp312-win_amd64.pyd,sha256=avZ07zztVmXliyfBrRhsEAc9X3MDCUMuwYbCLCXttX4,10752
|
43
|
-
dao_treasury/streams/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
44
|
-
dao_treasury/streams/llamapay.cp312-win_amd64.pyd,sha256=T1YnZaNWer3rO6rU31sVIunNl2GObawlaN-1pW9BoXM,10752
|
45
|
-
dao_treasury/streams/llamapay.py,sha256=d1nx4WCUDXs2LdEtYqTGVYEHWb9HxREmwE6-gzjPzn8,12828
|
46
|
-
dao_treasury-0.0.31.dist-info/METADATA,sha256=-YSFQ51Hao57Mg7SAVkWdAk2Ala5Q1Spu8PA2MspqmM,7149
|
47
|
-
dao_treasury-0.0.31.dist-info/WHEEL,sha256=8UP9x9puWI0P1V_d7K2oMTBqfeLNm21CTzZ_Ptr0NXU,101
|
48
|
-
dao_treasury-0.0.31.dist-info/top_level.txt,sha256=VtgTZeHElDnBUEn2XLN6Hy_nev5HfhK5c-OnfU04bUs,41
|
49
|
-
dao_treasury-0.0.31.dist-info/RECORD,,
|
File without changes
|