Skip to content
This repository was archived by the owner on Apr 14, 2026. It is now read-only.

Commit 1ec00df

Browse files
committed
separate v2 and v3 fees
1 parent 8c71a1e commit 1ec00df

5 files changed

Lines changed: 98 additions & 29 deletions

File tree

combine_payloads.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import argparse
2+
import json
3+
from pathlib import Path
4+
from datetime import datetime
5+
6+
7+
def combine_payloads(fees_file_name: str) -> None:
8+
date_str = fees_file_name.split('_')[1].split('.')[0]
9+
10+
payload_dir = Path("fee_allocator/payloads")
11+
12+
v2_file = payload_dir / f"v2_{date_str}.json"
13+
v3_file = payload_dir / f"v3_{date_str}.json"
14+
15+
if not v2_file.exists() or not v3_file.exists():
16+
raise FileNotFoundError(f"Could not find both v2 and v3 payload files for date {date_str}")
17+
18+
with open(v2_file) as f:
19+
v2_payload = json.load(f)
20+
21+
with open(v3_file) as f:
22+
v3_payload = json.load(f)
23+
24+
combined_payload = {
25+
"version": "1.0",
26+
"chainId": "1",
27+
"createdAt": int(datetime.now().timestamp()),
28+
"meta": {
29+
"name": "Combined V2+V3 Transactions Batch",
30+
"description": "",
31+
"txBuilderVersion": "1.16.3",
32+
"createdFromSafeAddress": v2_payload["meta"]["createdFromSafeAddress"],
33+
"createdFromOwnerAddress": "",
34+
"checksum": "0x0000000000000000000000000000000000000000000000000000000000000000"
35+
},
36+
"transactions": v2_payload["transactions"] + v3_payload["transactions"]
37+
}
38+
39+
output_file = payload_dir / f"{date_str}.json"
40+
with open(output_file, "w") as f:
41+
json.dump(combined_payload, f, indent=2)
42+
43+
print(f"Combined payload written to {output_file}")
44+
print(f"Total transactions: {len(combined_payload['transactions'])}")
45+
46+
def main():
47+
parser = argparse.ArgumentParser()
48+
parser.add_argument("--payload_file_name", help="Fees file name", type=str, required=True)
49+
args = parser.parse_args()
50+
combine_payloads(args.payload_file_name)
51+
52+
if __name__ == "__main__":
53+
main()

fee_allocator/accounting/chains.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ def __init__(
5353
cache_dir: Path = None,
5454
use_cache: bool = True,
5555
core_pools: Dict[str, Dict[str, str]] = None,
56+
protocol_version: str = "v2",
5657
):
5758
# convert wei fees to usd. identified by the lack of a decimal point
5859
self.input_fees = {chain: fee / 1e6 if isinstance(fee, int) else fee for chain, fee in input_fees.items()}
@@ -70,6 +71,7 @@ def __init__(
7071

7172
self._chains: Union[dict[str, CorePoolChain], None] = None
7273
self.aura_vebal_share: Union[Decimal, None] = None
74+
self.protocol_version = protocol_version
7375

7476

7577
def __getattr__(self, name):
@@ -250,19 +252,20 @@ def _fetch_and_process_pool_fee_data(self) -> list[PoolFeeData]:
250252
else self.bal_pools_gauges.core_pools
251253
)
252254

253-
v3_pools = [(p, l) for p, l in core_pools_list if len(p) == 42]
254-
v2_pools = [x for x in core_pools_list if x not in v3_pools]
255-
256-
for pool_id, label in v3_pools:
255+
if self.chains.protocol_version == "v3":
256+
v3_pools = [(p, l) for p, l in core_pools_list if len(p) == 42]
257+
for pool_id, label in v3_pools:
257258
pool_fee_data = self._fetch_twap_prices_and_init_pool_fee_data_v3(pool_id, label, pool_to_gauge)
258259
pools_data.append(pool_fee_data)
259260

260-
for pool_id, label in v2_pools:
261-
start_snap = self._get_latest_snapshot(start_snaps, pool_id)
262-
end_snap = self._get_latest_snapshot(end_snaps, pool_id)
263-
if self._should_add_pool(pool_id, start_snap, end_snap, pool_to_gauge):
264-
pool_fee_data = self._fetch_twap_prices_and_init_pool_fee_data_v2(pool_id, label, pool_to_gauge, start_snap, end_snap)
265-
pools_data.append(pool_fee_data)
261+
elif self.chains.protocol_version == "v2":
262+
v2_pools = [(p, l) for p, l in core_pools_list if len(p) != 42]
263+
for pool_id, label in v2_pools:
264+
start_snap = self._get_latest_snapshot(start_snaps, pool_id)
265+
end_snap = self._get_latest_snapshot(end_snaps, pool_id)
266+
if self._should_add_pool(pool_id, start_snap, end_snap, pool_to_gauge):
267+
pool_fee_data = self._fetch_twap_prices_and_init_pool_fee_data_v2(pool_id, label, pool_to_gauge, start_snap, end_snap)
268+
pools_data.append(pool_fee_data)
266269

267270
return pools_data
268271

fee_allocator/fee_allocator.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ def __init__(
4747
cache_dir: Path = None,
4848
use_cache: bool = True,
4949
core_pools: Dict[str, Dict[str, str]] = None,
50+
protocol_version: str = "v2",
5051
):
5152
self.input_fees = input_fees
5253
self.date_range = date_range
@@ -56,6 +57,7 @@ def __init__(
5657
cache_dir=cache_dir,
5758
use_cache=use_cache,
5859
core_pools=core_pools,
60+
protocol_version=protocol_version,
5961
)
6062
self.book = AddrBook("mainnet").flatbook
6163

@@ -114,9 +116,9 @@ def redistribute_fees(self):
114116
pool.to_aura_incentives_usd += total * self.run_config.aura_vebal_share
115117
pool.to_bal_incentives_usd += total * (1 - self.run_config.aura_vebal_share)
116118

117-
for pool in chain.core_pools:
118-
pool.to_dao_usd = pool.original_earned_fee_share * chain.fees_collected * self.run_config.fee_config.dao_share_pct
119-
pool.to_vebal_usd = pool.original_earned_fee_share * chain.fees_collected * self.run_config.fee_config.vebal_share_pct
119+
# for pool in chain.core_pools:
120+
# pool.to_dao_usd = pool.original_earned_fee_share * chain.fees_collected * self.run_config.fee_config.dao_share_pct
121+
# pool.to_vebal_usd = pool.original_earned_fee_share * chain.fees_collected * self.run_config.fee_config.vebal_share_pct
120122

121123
self._handle_aura_min(buffer=0.25)
122124
self._handle_aura_min()
@@ -220,7 +222,7 @@ def generate_bribe_csv(
220222
datetime_file_header = datetime.datetime.fromtimestamp(
221223
self.date_range[1]
222224
).date()
223-
output_path = PROJECT_ROOT / output_path / f"bribes_{datetime_file_header}.csv"
225+
output_path = PROJECT_ROOT / output_path / f"{self.run_config.protocol_version}_bribes_{datetime_file_header}.csv"
224226
output_path.parent.mkdir(exist_ok=True)
225227

226228
df.to_csv(
@@ -262,7 +264,7 @@ def generate_incentives_csv(
262264
start_date = datetime.datetime.fromtimestamp(self.date_range[0]).date()
263265
end_date = datetime.datetime.fromtimestamp(self.date_range[1]).date()
264266
output_path = (
265-
PROJECT_ROOT / output_path / f"incentives_{start_date}_{end_date}.csv"
267+
PROJECT_ROOT / output_path / f"{self.run_config.protocol_version}_incentives_{start_date}_{end_date}.csv"
266268
)
267269
output_path.parent.mkdir(exist_ok=True)
268270

@@ -342,7 +344,7 @@ def generate_bribe_payload(
342344
self.date_range[1]
343345
).date()
344346

345-
output_path = PROJECT_ROOT / output_path / f"{datetime_file_header}.json"
347+
output_path = PROJECT_ROOT / output_path / f"{self.run_config.protocol_version}_{datetime_file_header}.json"
346348
output_path.parent.mkdir(exist_ok=True)
347349
builder.output_payload(output_path)
348350

@@ -418,7 +420,7 @@ def recon(self) -> None:
418420
"periodEnd": self.date_range[1]
419421
}
420422

421-
recon_file = Path(PROJECT_ROOT) / "fee_allocator/summaries/recon.json"
423+
recon_file = Path(PROJECT_ROOT) / "fee_allocator/summaries" / f"{self.run_config.protocol_version}_recon.json"
422424
recon_file.parent.mkdir(exist_ok=True)
423425

424426
if recon_file.exists():

fee_allocator/fees_collected/get_report.py

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,31 @@ def get_report(start_date, end_date):
2121
},
2222
)
2323
response.raise_for_status()
24+
# breakpoint()
2425
report = response.json()["depositors"]
26+
total = 0
2527
for chain, amount in report.items():
2628
report[chain] = int(amount)
27-
return report
29+
total += int(amount)
30+
if total > 0:
31+
return report
32+
else:
33+
raise ValueError("Sum of collected fees is not > 0")
2834

2935

3036
if __name__ == "__main__":
3137
# run this every other thursday after the end of an epoch
3238
today = datetime.now()
33-
yesterday = today - timedelta(days=1)
34-
epoch_start = today - timedelta(days=14)
35-
36-
report = get_report(yesterday.strftime("%Y-%m-%d"), today.strftime("%Y-%m-%d"))
37-
with open(
38-
f"fee_allocator/fees_collected/fees_{epoch_start.strftime('%Y-%m-%d')}_{today.strftime('%Y-%m-%d')}.json",
39-
"w",
40-
) as f:
41-
json.dump(report, f, indent=2)
39+
40+
if bool(int(today.strftime("%V")) % 2):
41+
# week number is uneven; there should be a new report
42+
43+
yesterday = today - timedelta(days=1)
44+
epoch_start = today - timedelta(days=14)
45+
46+
report = get_report(yesterday.strftime("%Y-%m-%d"), today.strftime("%Y-%m-%d"))
47+
with open(
48+
f"fee_allocator/fees_collected/fees_{epoch_start.strftime('%Y-%m-%d')}_{today.strftime('%Y-%m-%d')}.json",
49+
"w",
50+
) as f:
51+
json.dump(report, f, indent=2)

main.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"--output_file_name", help="Output file name", type=str, required=False
1919
)
2020
parser.add_argument("--fees_file_name", help="Fees file name", type=str, required=False)
21+
parser.add_argument("--protocol_version", help="Protocol version (v2 or v3)", type=str, choices=["v2", "v3"], default="v2")
2122

2223
ROOT = os.path.dirname(__file__)
2324

@@ -42,8 +43,8 @@ def main() -> None:
4243
input_fees = fetch_collected_fees(start_date, end_date, args.fees_file_name)
4344
date_range = (ts_in_the_past, ts_now)
4445

45-
fee_allocator = FeeAllocator(input_fees, date_range)
46-
46+
fee_allocator = FeeAllocator(input_fees, date_range, protocol_version=args.protocol_version)
47+
4748
fee_allocator.allocate()
4849
fee_allocator.recon()
4950

0 commit comments

Comments
 (0)