proof-of-portfolio 0.0.94__py3-none-any.whl → 0.0.96__py3-none-any.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
@@ -7,6 +7,8 @@ import json
7
7
  import bittensor as bt
8
8
  import traceback
9
9
 
10
+
11
+ ARRAY_SIZE = 256
10
12
  MAX_DAYS = 120
11
13
  MAX_SIGNALS = 256
12
14
  MERKLE_DEPTH = 8
@@ -176,9 +178,21 @@ def generate_bb_proof(circuit_dir):
176
178
 
177
179
  def generate_proof(
178
180
  data=None,
181
+ daily_pnl=None,
179
182
  miner_hotkey=None,
180
183
  verbose=None,
181
184
  annual_risk_free_percentage=4.19,
185
+ calmar_ratio_cap=10,
186
+ days_in_year_crypto=365,
187
+ weighted_average_decay_max=1.0,
188
+ weighted_average_decay_min=0.15,
189
+ weighted_average_decay_rate=0.075,
190
+ omega_loss_minimum=0.01,
191
+ sharpe_stddev_minimum=0.01,
192
+ sortino_downside_minimum=0.01,
193
+ statistical_confidence_minimum_n_ceil=60,
194
+ annual_risk_free_decimal=0.0419,
195
+ drawdown_maxvalue_percentage=10,
182
196
  use_weighting=False,
183
197
  bypass_confidence=False,
184
198
  daily_checkpoints=2,
@@ -199,7 +213,6 @@ def generate_proof(
199
213
  "info",
200
214
  f"Mode: {'Demo' if is_demo_mode else 'Production'}, verbose={verbose}",
201
215
  )
202
-
203
216
  try:
204
217
  if data is None:
205
218
  log_verbose(
@@ -210,6 +223,11 @@ def generate_proof(
210
223
  except Exception as e:
211
224
  bt.logging.error(f"Failed to load data {e}")
212
225
 
226
+ if data is None:
227
+ raise ValueError(
228
+ "Failed to load data from validator_checkpoint.json in demo mode"
229
+ )
230
+
213
231
  if miner_hotkey is None:
214
232
  miner_hotkey = list(data["perf_ledgers"].keys())[0]
215
233
  log_verbose(
@@ -225,6 +243,11 @@ def generate_proof(
225
243
  f"Hotkey '{miner_hotkey}' not found in data. Available: {list(data['perf_ledgers'].keys())}"
226
244
  )
227
245
 
246
+ if daily_pnl is None:
247
+ raise ValueError("daily_pnl must be provided")
248
+ n_pnl = len(daily_pnl)
249
+ scaled_daily_pnl = [int(p * SCALING_FACTOR) for p in daily_pnl]
250
+ scaled_daily_pnl += [0] * (ARRAY_SIZE - n_pnl)
228
251
  positions = data["positions"][miner_hotkey]["positions"]
229
252
  log_verbose(verbose, "info", "Preparing circuit inputs...")
230
253
 
@@ -382,15 +405,17 @@ def generate_proof(
382
405
  main_circuit_dir = os.path.join(current_dir, "circuits")
383
406
 
384
407
  # Pass annual risk-free rate (to match ann_excess_return usage)
385
- annual_risk_free_decimal = annual_risk_free_percentage / 100
408
+ annual_risk_free_decimal = annual_risk_free_decimal
386
409
  risk_free_rate_scaled = int(annual_risk_free_decimal * SCALING_FACTOR)
387
- calmar_cap = int(data.get("calmar_cap", 1) * SCALING_FACTOR)
388
410
 
411
+ calmar_cap = int(calmar_ratio_cap * RATIO_SCALE_FACTOR)
389
412
  account_size = data.get("account_size", 250000)
390
413
  # Finally, LFG
391
414
  main_prover_input = {
392
415
  "log_returns": [str(r) for r in scaled_log_returns],
393
416
  "n_returns": str(n_returns),
417
+ "daily_pnl": [str(p) for p in scaled_daily_pnl],
418
+ "n_pnl": str(n_pnl),
394
419
  "signals": signals,
395
420
  "signals_count": str(signals_count),
396
421
  "path_elements": [
@@ -420,6 +445,16 @@ def generate_proof(
420
445
  "bypass_confidence": str(int(bypass_confidence)),
421
446
  "account_size": str(account_size),
422
447
  "calmar_cap": str(calmar_cap),
448
+ "days_in_year": str(days_in_year_crypto),
449
+ "weighted_decay_max": str(int(weighted_average_decay_max * SCALING_FACTOR)),
450
+ "weighted_decay_min": str(int(weighted_average_decay_min * SCALING_FACTOR)),
451
+ "weighted_decay_rate": str(int(weighted_average_decay_rate * SCALING_FACTOR)),
452
+ "omega_loss_min": str(int(omega_loss_minimum * SCALING_FACTOR)),
453
+ "sharpe_stddev_min": str(int(sharpe_stddev_minimum * SCALING_FACTOR)),
454
+ "sortino_downside_min": str(int(sortino_downside_minimum * SCALING_FACTOR)),
455
+ "stat_conf_min_n": str(statistical_confidence_minimum_n_ceil),
456
+ "annual_risk_free": str(int(annual_risk_free_decimal * SCALING_FACTOR)),
457
+ "drawdown_max_percent": str(drawdown_maxvalue_percentage),
423
458
  }
424
459
 
425
460
  os.makedirs(main_circuit_dir, exist_ok=True)
@@ -482,8 +517,6 @@ def generate_proof(
482
517
  else:
483
518
  returns_merkle_root = f"0x{int(returns_merkle_root_raw):x}"
484
519
 
485
- RATIO_SCALE_FACTOR = 1_000_000
486
-
487
520
  avg_daily_pnl_scaled = avg_daily_pnl_value / SCALING_FACTOR
488
521
  avg_daily_pnl_ptn_scaled = avg_daily_pnl_scaled * 365 * 100
489
522
  sharpe_ratio_scaled = sharpe_ratio_raw / RATIO_SCALE_FACTOR
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: proof-of-portfolio
3
- Version: 0.0.94
3
+ Version: 0.0.96
4
4
  Summary: Zero-Knowledge Proof framework for verifiable, private portfolio performance metrics
5
5
  Author-email: "Inference Labs, Inc." <info@inferencelabs.com>
6
6
  Requires-Python: >=3.10
@@ -1,40 +1,40 @@
1
- proof_of_portfolio/__init__.py,sha256=gqM3xkqAO2az6Rhgez0qIREUzZqB3DZYV4IIQHdpwMA,4845
2
- proof_of_portfolio/_version.py,sha256=mzglcOQRd8foKcxvKov0HC_i0lcPBm4V8N1IEsQGPIM,66
1
+ proof_of_portfolio/__init__.py,sha256=mJ7dM5nXtvzx19SMjuBU1PyI3ZEa2CYsLO24FLjaDRQ,7195
2
+ proof_of_portfolio/_version.py,sha256=utKfDEZlb2GXHWrLXD-fMtiqFDR6AadXdowo5a_5xx4,66
3
3
  proof_of_portfolio/analyze_data.py,sha256=t80ueFtBUzcWTrPiamiC1HXvw5Em-151zXJx0cCk8sQ,3709
4
4
  proof_of_portfolio/main.py,sha256=JbvdAK7B6hw2sQdjT0EVCiglCQZgN3urKphdeWcW43w,30994
5
5
  proof_of_portfolio/min_metrics.py,sha256=U16B7YRl0UbCterdJ1ksqFOxR5DiQeslUzMVGEWNyog,13211
6
6
  proof_of_portfolio/miner.py,sha256=eGXcPMRQVAepzXJj1ePbbDAf-72E9Yj9n-yfP7GohLw,17177
7
7
  proof_of_portfolio/parsing_utils.py,sha256=Hx61Sby5mEbC6uzhG9G69K7YPCLbjU6vK8fazpNBeLc,6463
8
8
  proof_of_portfolio/post_install.py,sha256=e-57Z_h-svQdjA8ibsM985MXmdV6-KLyymQm3Cgu8YM,5654
9
- proof_of_portfolio/proof_generator.py,sha256=Iosb7CUz36A_UmRE0kcPjP-kyWw6objoRY_XYG6LyTE,21524
9
+ proof_of_portfolio/proof_generator.py,sha256=66-IzOSUKL71pR3qKifb96UisKVZdVdhmBCDX0JSPQw,23105
10
10
  proof_of_portfolio/signal_processor.py,sha256=JQjnkMJEbv_MWIgKNrjKjrBIcIT5pAkAlCneEOGsqT0,6702
11
11
  proof_of_portfolio/validator.py,sha256=kt3BeaXOffv-h52PZBKV1YHUWtiGsnPte16m3EJpITY,3839
12
12
  proof_of_portfolio/circuits/Nargo.toml,sha256=D6ycN7H3xiTcWHH5wz4qXYTXn7Ht0WgPr9w4B7d8ZGw,141
13
13
  proof_of_portfolio/circuits/generate_inputs.py,sha256=n9coxeNvOqXj_PleAPlP9reXUbWKUJRDAgxxxGfYZQk,10060
14
14
  proof_of_portfolio/circuits/components/Nargo.toml,sha256=jFQJR9rg6zSNDgJF_yfaXc7-rdIhLO0ucr_pgkgEvaE,76
15
15
  proof_of_portfolio/circuits/components/src/lib.nr,sha256=qTvVLqAAL73jtA3ZniTDUyn8RpniM3jqMiGI0RsuXSM,29
16
- proof_of_portfolio/circuits/components/src/core/calmar.nr,sha256=6u8TFTBs1TySZFZNH7EfQw3o0d09Jq6zgc0Hdz9lbDE,3343
16
+ proof_of_portfolio/circuits/components/src/core/calmar.nr,sha256=WPd_uTdRh-OfAP8_4EqUTWTJdNkk340sorFVh4cz7cc,3468
17
17
  proof_of_portfolio/circuits/components/src/core/drawdown.nr,sha256=DqfLbUaR_y_ZBOF1a2-tlxaDJJ6fE6cauToBbXFyKt8,2703
18
18
  proof_of_portfolio/circuits/components/src/core/merkle.nr,sha256=NcrN92Pye5cxACrAWkPRm1RTSaczqRyku3da6qaJ700,3139
19
19
  proof_of_portfolio/circuits/components/src/core/mod.nr,sha256=5YDicBPqTr4fLaS_rYuMnJ3PDJpakgpyzPzARIYZ3F4,132
20
- proof_of_portfolio/circuits/components/src/core/omega.nr,sha256=UmKV496sosWp5WvLgV8ESZLszAoyA6Ahq_uyqn-i-ek,4141
20
+ proof_of_portfolio/circuits/components/src/core/omega.nr,sha256=UdyL0MGuw1ZtFeN9UaQVtAUvfafBaXqgR2ypFnFEOb4,4124
21
21
  proof_of_portfolio/circuits/components/src/core/pnl_score.nr,sha256=cMfWt2fg2l0dP7aakq7OdjkNbkwdtv6JXz6HBO1I2vk,2481
22
22
  proof_of_portfolio/circuits/components/src/core/position.nr,sha256=KTnq0YhNrwX_0cppEVwRxAN0FMyfStnQ8_dV0Cir8xY,6196
23
23
  proof_of_portfolio/circuits/components/src/core/sharpe.nr,sha256=3ec3aPczoC56cW3reSAjog9L7IuPK5YAnztMlz756oA,2446
24
24
  proof_of_portfolio/circuits/components/src/core/sortino.nr,sha256=Oe-DnraOTbj2r8vupPnPdAWaEl_FvAn4z-bBgYVhNKs,5597
25
25
  proof_of_portfolio/circuits/components/src/core/tstat.nr,sha256=SLL2UnyfeVUN3NdJHVoIdbPPxUUER7DWKYfbPxmHceo,3303
26
- proof_of_portfolio/circuits/components/src/utils/ann_excess_return.nr,sha256=5xryh8HMMA2oHs039_usGHMKPcRoJpl19ZPmPKfDiYQ,1892
26
+ proof_of_portfolio/circuits/components/src/utils/ann_excess_return.nr,sha256=8hmQsiMVFMVLoe6wCFOMcmJ5YmCCy_WGqB5TTw5wk3E,1939
27
27
  proof_of_portfolio/circuits/components/src/utils/ann_volatility.nr,sha256=XTQhYuqwj5R8OhDklgyCUVwkW2_L0aThVQerk45fAdk,2118
28
28
  proof_of_portfolio/circuits/components/src/utils/average.nr,sha256=L6YGvEcwOvOd-c5vMHN_fItGweLyGXaRNOHlevn5mJ4,2246
29
29
  proof_of_portfolio/circuits/components/src/utils/constants.nr,sha256=0sjT1oX9SBbAhzfbJNG9I-7atJcr21s0_G4_74zI2UE,1945
30
30
  proof_of_portfolio/circuits/components/src/utils/mod.nr,sha256=9MpTXbbCd6P6vnWKveEpwYntO3BQTaV_GZb9hgt7JBI,179
31
- proof_of_portfolio/circuits/components/src/utils/risk_normalization.nr,sha256=PXhs3grwz7e3nWqV3zQGYstAYqrG_csfyx4yur4HFfc,1248
31
+ proof_of_portfolio/circuits/components/src/utils/risk_normalization.nr,sha256=hTa6S9HuP8mKYsyKB5StgwlEqfak2u_NP-A4ahT4jDU,1310
32
32
  proof_of_portfolio/circuits/components/src/utils/sqrt.nr,sha256=pkCqXr4cBgfb49fzi_N6JypD31GlNYuMdMUoVssVzFQ,2318
33
33
  proof_of_portfolio/circuits/components/src/utils/variance.nr,sha256=dzVn-idUSV4uykOlH4td9UUnui_OFfbVm9ZtE4BnSK8,2895
34
- proof_of_portfolio/circuits/components/src/utils/weighting_distribution.nr,sha256=ZTdpYmVLI639j-RUtKhluTIVb_sLVxerQdRDoB2zYFQ,1185
35
- proof_of_portfolio/circuits/src/main.nr,sha256=G5VAXQpmGZ5WSzQMrv1IEKweD39E2qyCA3DhOfm-IhE,5453
36
- proof_of_portfolio/circuits/target/circuits.json,sha256=O2RHhkk7whE2ZLuJff30V-vWfBKl9d3ttHZJbXJ7FD8,12807126
37
- proof_of_portfolio/circuits/vk/vk,sha256=FLvF0QEpKK7MyQimLzhemw8gDR5wQtmxMuGlS9bn-dY,1764
34
+ proof_of_portfolio/circuits/components/src/utils/weighting_distribution.nr,sha256=FHIii05q-gtC51bHt--S3cdyNKzryMmgaNLoQkD64I0,1304
35
+ proof_of_portfolio/circuits/src/main.nr,sha256=w1_wPhIa76xa82QaycmoOIl8jjZA0UGw3VP22jzsc9s,4929
36
+ proof_of_portfolio/circuits/target/circuits.json,sha256=DFawNE46ATzeitsi5KPKGRkK_tsxIlRH-5ZbMQ3Ub6E,12183804
37
+ proof_of_portfolio/circuits/vk/vk,sha256=13M8c_7U5aJDc3mdkJoqy4HktQlRfm75DUJ_YI7zWr4,1764
38
38
  proof_of_portfolio/demo/just_calmar/Nargo.toml,sha256=wJ7j03ThqHr4N_jk4ifjvGzAnhnO0CrSouNHdo6pIl8,77
39
39
  proof_of_portfolio/demo/just_calmar/src/main.nr,sha256=xLzzAwAJf-q43IKvChhf08qcmb1BhDP4sVT6bOsSBRs,5351
40
40
  proof_of_portfolio/demo/just_calmar/target/just_calmar.json,sha256=s_7h0ZLMUM3NURBaEtDxrkbgWlVSBkpa7CLPiLYLhk8,1820536
@@ -78,8 +78,8 @@ proof_of_portfolio/tree_generator/Nargo.toml,sha256=O6iSvb-EpV0XcETiDxNgSp7XKNiY
78
78
  proof_of_portfolio/tree_generator/target.gz,sha256=J55ZC5QuFy6vGC2dSJ-0rEWjUKzzxwXwKGDTDUGp06U,225314
79
79
  proof_of_portfolio/tree_generator/src/main.nr,sha256=5Jb46e5PyZ3kpmIJn4W1gVtN3AgHs-fCmTochVB7uOU,2427
80
80
  proof_of_portfolio/tree_generator/target/tree_generator.json,sha256=Uy9AFLrbsd2SayMFTPgmow91-BIs1DrqP3qGfxfZAa0,1540901
81
- proof_of_portfolio-0.0.94.dist-info/METADATA,sha256=wDOY_WQ-72G3vvEr-bQo6B_OVGmIXBzrhBm_ZRCjBdg,7076
82
- proof_of_portfolio-0.0.94.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
83
- proof_of_portfolio-0.0.94.dist-info/entry_points.txt,sha256=KeLSJT_UJtr1WiLTkhlGqWQuPKbO_ylgj6OXOC2gJV4,53
84
- proof_of_portfolio-0.0.94.dist-info/top_level.txt,sha256=sY5xZnE6YuiISK1IuRHPfl71NV0vXO3N3YA2li_SPXU,19
85
- proof_of_portfolio-0.0.94.dist-info/RECORD,,
81
+ proof_of_portfolio-0.0.96.dist-info/METADATA,sha256=YATTjrrr2Ed5_nrGXKcP4fE-yYIXHBOmyT0WqG62LKA,7076
82
+ proof_of_portfolio-0.0.96.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
83
+ proof_of_portfolio-0.0.96.dist-info/entry_points.txt,sha256=KeLSJT_UJtr1WiLTkhlGqWQuPKbO_ylgj6OXOC2gJV4,53
84
+ proof_of_portfolio-0.0.96.dist-info/top_level.txt,sha256=sY5xZnE6YuiISK1IuRHPfl71NV0vXO3N3YA2li_SPXU,19
85
+ proof_of_portfolio-0.0.96.dist-info/RECORD,,