axis-synome 0.1.0.dev67__tar.gz → 0.1.0.dev69__tar.gz

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 (175) hide show
  1. {axis_synome-0.1.0.dev67/src/axis_synome.egg-info → axis_synome-0.1.0.dev69}/PKG-INFO +1 -1
  2. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/_version.py +2 -2
  3. axis_synome-0.1.0.dev69/src/axis_synome/export_entities.py +399 -0
  4. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/asc/entities/alm_proxies.py +15 -4
  5. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/asc/entities/assets_by_prime.py +57 -11
  6. axis_synome-0.1.0.dev69/src/axis_synome/spec/asc/entities/assets_missing_from_atlas.py +565 -0
  7. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/asc/entities/protocol_sets.py +46 -1
  8. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/asc/entities/tokens.py +3 -0
  9. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69/src/axis_synome.egg-info}/PKG-INFO +1 -1
  10. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome.egg-info/SOURCES.txt +1 -0
  11. axis_synome-0.1.0.dev69/tests/axis_synome/scripts/test_export_entities.py +198 -0
  12. axis_synome-0.1.0.dev67/src/axis_synome/export_entities.py +0 -233
  13. axis_synome-0.1.0.dev67/tests/axis_synome/scripts/test_export_entities.py +0 -76
  14. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/.flake8 +0 -0
  15. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/AGENTS.md +0 -0
  16. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/CLAUDE.md +0 -0
  17. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/README.md +0 -0
  18. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/WRITING_SPECS.md +0 -0
  19. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/examples/01_prime_basics.py +0 -0
  20. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/examples/02_assets_and_tokens_of_a_prime.py +0 -0
  21. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/examples/03_inverse_lookups.py +0 -0
  22. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/examples/04_atlas_provenance.py +0 -0
  23. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/examples/05_feeding_a_formula.py +0 -0
  24. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/examples/README.md +0 -0
  25. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/pyproject.toml +0 -0
  26. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/setup.cfg +0 -0
  27. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/__init__.py +0 -0
  28. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/__init__.py +0 -0
  29. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/all_entities/__init__.py +0 -0
  30. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/all_entities/lending_markets.py +0 -0
  31. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/asc/entities/__init__.py +0 -0
  32. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/asc/entities/asset_categories.py +0 -0
  33. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/asc/entities/assets.py +0 -0
  34. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/asc/entities/networks.py +0 -0
  35. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/asc/entities/primes.py +0 -0
  36. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/asc/entities/types.py +0 -0
  37. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/asc/formulas/asc.py +0 -0
  38. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/asc/formulas/asc_collateral_ratio.py +0 -0
  39. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/asc/formulas/asc_incentive.py +0 -0
  40. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/asc/formulas/dab.py +0 -0
  41. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/asc/formulas/latent_asc.py +0 -0
  42. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/asc/formulas/ratio_latent_asc.py +0 -0
  43. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/asc/formulas/resting_asc.py +0 -0
  44. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/codegen_test/entities/agents.py +0 -0
  45. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/crypto_lending/__init__.py +0 -0
  46. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/crypto_lending/formulas/__init__.py +0 -0
  47. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/crypto_lending/formulas/lif.py +0 -0
  48. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/entities/__init__.py +0 -0
  49. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/entities/audit_firms.py +0 -0
  50. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/entities/capital_types.py +0 -0
  51. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/entities/protocol_risk.py +0 -0
  52. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/entities/risk_categories.py +0 -0
  53. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/entities/smart_contract_risk.py +0 -0
  54. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/__init__.py +0 -0
  55. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/administrative_rrc/__init__.py +0 -0
  56. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/administrative_rrc/administrative_risk.py +0 -0
  57. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/aggregate_rrc.py +0 -0
  58. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/audit_factor.py +0 -0
  59. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/capital_composition.py +0 -0
  60. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/entities/__init__.py +0 -0
  61. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/entities/lending_protocol.py +0 -0
  62. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/entities/precomputed_crr.py +0 -0
  63. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/examples/risk_capital_walkthrough.ipynb +0 -0
  64. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/financial_rrc/__init__.py +0 -0
  65. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/financial_rrc/entities.py +0 -0
  66. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/financial_rrc/perpetual_positions.py +0 -0
  67. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/formulas/__init__.py +0 -0
  68. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/__init__.py +0 -0
  69. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/asset_correlation_coefficient.py +0 -0
  70. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/capital_requirement_without_buffers.py +0 -0
  71. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/exposure_caps.py +0 -0
  72. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/fixed_crr_rrc.py +0 -0
  73. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/instance_financial_rrc.py +0 -0
  74. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/lending_rrc.py +0 -0
  75. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/pipeline.py +0 -0
  76. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/precomputed_crr_rrc.py +0 -0
  77. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/probability_of_default.py +0 -0
  78. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/formulas/required_risk_capital.py +0 -0
  79. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/instance_rrc.py +0 -0
  80. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/jrc_loss_allocation.py +0 -0
  81. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/lindy_factor.py +0 -0
  82. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/smart_contract_rrc/__init__.py +0 -0
  83. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/smart_contract_rrc/exceptions.py +0 -0
  84. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/smart_contract_rrc/smart_contract_risk.py +0 -0
  85. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/risk_capital/total_risk_capital.py +0 -0
  86. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/suraf/README.md +0 -0
  87. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/suraf/entities/assessor_score.py +0 -0
  88. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/suraf/entities/assets.py +0 -0
  89. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/suraf/entities/mappings.py +0 -0
  90. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/suraf/formulas/crr.py +0 -0
  91. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec/suraf/formulas/scoring.py +0 -0
  92. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec_inspect/__init__.py +0 -0
  93. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec_inspect/__main__.py +0 -0
  94. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec_inspect/cli.py +0 -0
  95. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec_support/__init__.py +0 -0
  96. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec_support/correlation_matrix.py +0 -0
  97. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec_support/evm_address.py +0 -0
  98. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec_support/math_protocol.py +0 -0
  99. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec_support/pendle_validation.py +0 -0
  100. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec_support/references/__init__.py +0 -0
  101. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec_support/references/graph.py +0 -0
  102. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec_support/runtime/__init__.py +0 -0
  103. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec_support/runtime/base.py +0 -0
  104. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec_support/runtime/math.py +0 -0
  105. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec_support/runtime/reference.py +0 -0
  106. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec_support/validated_dataclass.py +0 -0
  107. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec_support/validated_str.py +0 -0
  108. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec_validator/__init__.py +0 -0
  109. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec_validator/check_source_uuids.py +0 -0
  110. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec_validator/checker.py +0 -0
  111. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec_validator/flake8_plugin.py +0 -0
  112. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome/spec_validator/python_subset.py +0 -0
  113. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome.egg-info/dependency_links.txt +0 -0
  114. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome.egg-info/entry_points.txt +0 -0
  115. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome.egg-info/requires.txt +0 -0
  116. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/src/axis_synome.egg-info/top_level.txt +0 -0
  117. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/asc/__init__.py +0 -0
  118. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/asc/conftest.py +0 -0
  119. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/asc/mocks.py +0 -0
  120. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/asc/test_alm_proxies.py +0 -0
  121. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/asc/test_asc.py +0 -0
  122. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/asc/test_asc_collateral_ratio.py +0 -0
  123. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/asc/test_asc_incentive.py +0 -0
  124. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/asc/test_asset_categories.py +0 -0
  125. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/asc/test_dab.py +0 -0
  126. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/asc/test_evm_address.py +0 -0
  127. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/asc/test_latent_asc.py +0 -0
  128. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/asc/test_prime_agent_data_validation.py +0 -0
  129. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/asc/test_ratio_latent_asc.py +0 -0
  130. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/asc/test_resting_asc.py +0 -0
  131. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/risk_capital/__init__.py +0 -0
  132. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/risk_capital/administrative_rrc/test_administrative_risk.py +0 -0
  133. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/risk_capital/financial_rrc/__init__.py +0 -0
  134. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/risk_capital/financial_rrc/test_lending_rrc.py +0 -0
  135. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/risk_capital/financial_rrc/test_perpetual_positions.py +0 -0
  136. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/risk_capital/formulas/__init__.py +0 -0
  137. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/risk_capital/formulas/test_correlation_matrix.py +0 -0
  138. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/risk_capital/formulas/test_loss_given_default.py +0 -0
  139. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/risk_capital/smart_contract_rrc/__init__.py +0 -0
  140. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/risk_capital/smart_contract_rrc/test_exceptions.py +0 -0
  141. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/risk_capital/smart_contract_rrc/test_smart_contract_risk.py +0 -0
  142. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/risk_capital/test_a321_a322_integration.py +0 -0
  143. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/risk_capital/test_aggregate_rrc.py +0 -0
  144. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/risk_capital/test_capital_composition.py +0 -0
  145. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/risk_capital/test_instance_rrc.py +0 -0
  146. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/risk_capital/test_jrc_loss_allocation.py +0 -0
  147. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/risk_capital/test_total_risk_capital.py +0 -0
  148. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/spec_inspect/__init__.py +0 -0
  149. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/spec_inspect/test_cli.py +0 -0
  150. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/spec_support/__init__.py +0 -0
  151. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/spec_support/references/__init__.py +0 -0
  152. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/spec_support/references/test_graph.py +0 -0
  153. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/spec_support/runtime/__init__.py +0 -0
  154. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/spec_support/runtime/test_base.py +0 -0
  155. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/spec_support/runtime/test_math.py +0 -0
  156. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/spec_validator/test_check_source_uuids.py +0 -0
  157. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/spec_validator/test_checker.py +0 -0
  158. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/spec_validator/test_flake8_plugin.py +0 -0
  159. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/suraf/__init__.py +0 -0
  160. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/suraf/entities/__init__.py +0 -0
  161. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/suraf/entities/test_assessor_score.py +0 -0
  162. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/suraf/formulas/__init__.py +0 -0
  163. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/suraf/formulas/test_crr.py +0 -0
  164. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/suraf/formulas/test_scoring.py +0 -0
  165. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/suraf/static/aave_ausdc/v1/crr_mapping.csv +0 -0
  166. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/suraf/static/aave_ausdc/v1/penalty.csv +0 -0
  167. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/suraf/static/aave_ausdc/v1/scorecards/Assessor_1_scores.csv +0 -0
  168. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/suraf/static/aave_ausdc/v1/scorecards/Assessor_2_scores.csv +0 -0
  169. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/suraf/static/aave_ausdc/v1/scorecards/Assessor_3_scores.csv +0 -0
  170. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/suraf/static/aave_ausdc/v1/weights.csv +0 -0
  171. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/suraf/suraf_client/__init__.py +0 -0
  172. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/suraf/suraf_client/suraf_client.py +0 -0
  173. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/suraf/suraf_client/test_suraf_client.py +0 -0
  174. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/tests/axis_synome/test_examples.py +0 -0
  175. {axis_synome-0.1.0.dev67 → axis_synome-0.1.0.dev69}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: axis-synome
3
- Version: 0.1.0.dev67
3
+ Version: 0.1.0.dev69
4
4
  Summary: Axis specification modules (entities, formulas, validators)
5
5
  Author-email: Archon Tech <hello@archontech.ai>
6
6
  License: MIT
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.1.0.dev67'
22
- __version_tuple__ = version_tuple = (0, 1, 0, 'dev67')
21
+ __version__ = version = '0.1.0.dev69'
22
+ __version_tuple__ = version_tuple = (0, 1, 0, 'dev69')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -0,0 +1,399 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ import importlib.metadata
5
+ import json
6
+ import re
7
+ import subprocess
8
+ from pathlib import Path
9
+ from typing import Any
10
+
11
+ from pydantic import BaseModel, ConfigDict, Field
12
+
13
+ from axis_synome.spec.asc.entities.alm_proxies import (
14
+ STL_ADDITIONAL_PROXIES,
15
+ AlmProxy,
16
+ )
17
+ from axis_synome.spec.asc.entities.assets_by_prime import ASSETS_BY_PRIME, PrimeName
18
+ from axis_synome.spec.asc.entities.assets_missing_from_atlas import (
19
+ MISSING_FROM_ATLAS_BY_PRIME,
20
+ )
21
+ from axis_synome.spec.asc.entities.networks import STL_CHAIN_BY_NETWORK
22
+ from axis_synome.spec.asc.entities.protocol_sets import (
23
+ ATOKEN_PROTOCOLS,
24
+ ERC4626_PROTOCOLS,
25
+ L1_PSM_PROTOCOLS,
26
+ L2_PSM_PROTOCOLS,
27
+ UNISWAP_STYLE_PROTOCOLS,
28
+ AllocationType,
29
+ Protocol,
30
+ TokenType,
31
+ )
32
+
33
+ # Proxy roles. "alm" is the canonical ALM Proxy holding operational allocation
34
+ # positions; "subproxy" is an additional SubProxy/treasury wallet tracked for the
35
+ # same (star, chain).
36
+ PROXY_ROLE_ALM = "alm"
37
+ PROXY_ROLE_SUBPROXY = "subproxy"
38
+
39
+
40
+ class ProxyEntry(BaseModel):
41
+ """A single ALM-controlled wallet exported for a (star, chain).
42
+
43
+ More than one may exist per (star, chain): the canonical ALM Proxy plus any
44
+ additional SubProxy/treasury wallets. ``role`` lets consumers tell them apart
45
+ without relying on list position.
46
+ """
47
+
48
+ model_config = ConfigDict(extra="forbid")
49
+
50
+ star: str
51
+ chain: str
52
+ address: str
53
+ role: str
54
+
55
+
56
+ class TokenEntryModel(BaseModel):
57
+ model_config = ConfigDict(extra="forbid")
58
+
59
+ contract_address: str
60
+ wallet_address: str
61
+ asset_address: str | None
62
+ star: str
63
+ chain: str
64
+ protocol: str
65
+ allocation_type: AllocationType
66
+ token_type: TokenType
67
+
68
+
69
+ class AssetsByPrimeContainer(BaseModel):
70
+ model_config = ConfigDict(extra="forbid")
71
+
72
+ # star -> list of token entries.
73
+ entries: dict[str, list[TokenEntryModel]] = Field(serialization_alias="ASSETS_BY_PRIME")
74
+
75
+
76
+ class AlmProxiesContainer(BaseModel):
77
+ model_config = ConfigDict(extra="forbid")
78
+
79
+ # star -> chain -> list of proxies.
80
+ proxies: dict[str, dict[str, list[ProxyEntry]]] = Field(serialization_alias="AlmProxy")
81
+
82
+
83
+ class EntitiesModel(BaseModel):
84
+ model_config = ConfigDict(extra="forbid")
85
+
86
+ assets_by_prime: AssetsByPrimeContainer
87
+ alm_proxies: AlmProxiesContainer
88
+
89
+
90
+ class AscModel(BaseModel):
91
+ model_config = ConfigDict(extra="forbid")
92
+
93
+ entities: EntitiesModel
94
+
95
+
96
+ class SpecModel(BaseModel):
97
+ model_config = ConfigDict(extra="forbid")
98
+
99
+ asc: AscModel
100
+
101
+
102
+ class AxisSynomeModel(BaseModel):
103
+ model_config = ConfigDict(extra="forbid")
104
+
105
+ spec: SpecModel
106
+
107
+
108
+ class AxisSynomeContract(BaseModel):
109
+ model_config = ConfigDict(extra="forbid")
110
+
111
+ version: str
112
+ axis_synome_git_commit: str
113
+ axis_synome: AxisSynomeModel
114
+
115
+
116
+ def _slug(text: str) -> str:
117
+ return re.sub(r"[^a-z0-9]+", "-", text.lower()).strip("-")
118
+
119
+
120
+ def _prime_to_star(prime: PrimeName | str) -> str:
121
+ text = prime.value if isinstance(prime, PrimeName) else str(prime)
122
+ return text.lower().replace(" ", "-")
123
+
124
+
125
+ def _token_type(protocol: Protocol, chain: str, token_name: str) -> TokenType:
126
+ if protocol in ATOKEN_PROTOCOLS:
127
+ return TokenType.ATOKEN
128
+
129
+ if protocol in ERC4626_PROTOCOLS:
130
+ return TokenType.ERC4626
131
+
132
+ if protocol == Protocol.CURVE:
133
+ return TokenType.CURVE
134
+
135
+ if protocol in UNISWAP_STYLE_PROTOCOLS:
136
+ if "LP" in token_name.upper():
137
+ return TokenType.UNI_V3_LP
138
+ return TokenType.UNI_V3_POOL
139
+
140
+ if protocol == Protocol.CENTRIFUGE:
141
+ if chain == "plume":
142
+ return TokenType.CENTRIFUGE_FEEDER
143
+ return TokenType.CENTRIFUGE
144
+
145
+ if protocol == Protocol.ANCHORAGE:
146
+ return TokenType.ANCHORAGE
147
+
148
+ if protocol in L1_PSM_PROTOCOLS | L2_PSM_PROTOCOLS:
149
+ return TokenType.PSM3
150
+
151
+ return TokenType.ERC20
152
+
153
+
154
+ def _allocation_type(protocol: Protocol) -> AllocationType:
155
+ if protocol in L1_PSM_PROTOCOLS | L2_PSM_PROTOCOLS:
156
+ return AllocationType.PSM3
157
+ return AllocationType.ALLOCATION
158
+
159
+
160
+ def _version_from_package_metadata() -> str:
161
+ return importlib.metadata.version("axis-synome")
162
+
163
+
164
+ def _axis_synome_git_commit() -> str:
165
+ repo_root = Path(__file__).resolve().parents[2]
166
+ try:
167
+ return subprocess.check_output(
168
+ ["git", "rev-parse", "HEAD"], cwd=repo_root, text=True
169
+ ).strip()
170
+ except (subprocess.CalledProcessError, FileNotFoundError):
171
+ return "unknown"
172
+
173
+
174
+ def build_axis_synome_contract(
175
+ version: str | None = None,
176
+ axis_synome_git_commit: str | None = None,
177
+ ) -> AxisSynomeContract:
178
+ # Canonical ALM Proxy per (star, chain). This is the wallet that holds the
179
+ # operational allocation positions, and the wallet that every token entry on
180
+ # that (star, chain) binds to.
181
+ alm_proxy_by_key: dict[tuple[str, str], str] = {}
182
+ for member in AlmProxy:
183
+ deployment = member.value
184
+ chain = STL_CHAIN_BY_NETWORK.get(deployment.network)
185
+ if chain is None:
186
+ continue
187
+
188
+ star = _prime_to_star(deployment.prime.name)
189
+ alm_proxy_by_key[(star, chain)] = str(deployment.address).lower()
190
+
191
+ # All wallets to export per (star, chain): the canonical ALM Proxy first,
192
+ # then any additional SubProxy/treasury wallets. Additional wallets are
193
+ # appended rather than replacing the ALM Proxy, so both stay tracked.
194
+ # Value is a list of (address, role) so consumers can distinguish the
195
+ # canonical ALM proxy from additional SubProxy wallets.
196
+ proxies_by_key: dict[tuple[str, str], list[tuple[str, str]]] = {
197
+ key: [(address, PROXY_ROLE_ALM)] for key, address in alm_proxy_by_key.items()
198
+ }
199
+ for (prime, network), addresses in STL_ADDITIONAL_PROXIES.items():
200
+ chain = STL_CHAIN_BY_NETWORK.get(network)
201
+ if chain is None:
202
+ continue
203
+
204
+ star = _prime_to_star(prime.name)
205
+ for address in addresses:
206
+ address = str(address).lower()
207
+ existing = proxies_by_key.setdefault((star, chain), [])
208
+ if any(addr == address for addr, _ in existing):
209
+ raise ValueError(
210
+ f"additional proxy {address} for {star}/{chain} duplicates a "
211
+ "canonical ALM proxy; remove it from STL_ADDITIONAL_PROXIES"
212
+ )
213
+ existing.append((address, PROXY_ROLE_SUBPROXY))
214
+
215
+ entries: list[dict[str, Any]] = []
216
+ seen_entry_keys: set[tuple[str, str, str]] = set()
217
+ missing_proxy_keys: set[tuple[str, str]] = set()
218
+ for prime_name, assets in ASSETS_BY_PRIME.items():
219
+ star = _prime_to_star(prime_name)
220
+ if star not in {"spark", "grove"}:
221
+ continue
222
+
223
+ for asset in assets:
224
+ chain = STL_CHAIN_BY_NETWORK.get(asset.network)
225
+ if chain is None:
226
+ continue
227
+
228
+ wallet = alm_proxy_by_key.get((star, chain))
229
+ if wallet is None:
230
+ # Assets exist for this (star, chain) but no ALM proxy is
231
+ # defined, so they would silently vanish from the export. Fail
232
+ # loudly instead, mirroring the duplicate-entry guard below.
233
+ missing_proxy_keys.add((star, chain))
234
+ continue
235
+
236
+ contract_address = str(asset.address).lower()
237
+ entry_key = (chain, contract_address, wallet)
238
+ if entry_key in seen_entry_keys:
239
+ raise ValueError(
240
+ "duplicate token entry for "
241
+ f"chain={chain} contract={contract_address} wallet={wallet}; "
242
+ "resolve the conflicting Asset definitions in assets_by_prime"
243
+ )
244
+ seen_entry_keys.add(entry_key)
245
+
246
+ entries.append({
247
+ "contract_address": contract_address,
248
+ "wallet_address": wallet,
249
+ "asset_address": str(asset.underlying_asset_address).lower(),
250
+ "star": star,
251
+ "chain": chain,
252
+ "protocol": _slug(asset.protocol.value),
253
+ "allocation_type": _allocation_type(asset.protocol),
254
+ "token_type": _token_type(asset.protocol, chain, asset.token.value),
255
+ })
256
+
257
+ # STL positions with no Atlas backing. These bind to the same ALM Proxy and
258
+ # share the duplicate / missing-proxy guards above, but carry their STL
259
+ # protocol, allocation_type and token_type verbatim rather than deriving
260
+ # them — the legacy pol/asset/proxy values are not a function of protocol.
261
+ for prime_name, missing_assets in MISSING_FROM_ATLAS_BY_PRIME.items():
262
+ star = _prime_to_star(prime_name)
263
+ if star not in {"spark", "grove"}:
264
+ continue
265
+
266
+ for missing in missing_assets:
267
+ chain = STL_CHAIN_BY_NETWORK.get(missing.network)
268
+ if chain is None:
269
+ continue
270
+
271
+ # risk_capital holdings bind to an explicit SubProxy wallet; all
272
+ # other rows bind to the canonical ALM Proxy for the (star, chain).
273
+ if missing.wallet_address is not None:
274
+ wallet = str(missing.wallet_address).lower()
275
+ else:
276
+ wallet = alm_proxy_by_key.get((star, chain))
277
+ if wallet is None:
278
+ missing_proxy_keys.add((star, chain))
279
+ continue
280
+
281
+ contract_address = str(missing.address).lower()
282
+ entry_key = (chain, contract_address, wallet)
283
+ if entry_key in seen_entry_keys:
284
+ raise ValueError(
285
+ "duplicate token entry for "
286
+ f"chain={chain} contract={contract_address} wallet={wallet}; "
287
+ "resolve the conflicting Asset definitions in assets_by_prime "
288
+ "and assets_missing_from_atlas"
289
+ )
290
+ seen_entry_keys.add(entry_key)
291
+
292
+ entries.append({
293
+ "contract_address": contract_address,
294
+ "wallet_address": wallet,
295
+ "asset_address": (
296
+ str(missing.underlying_asset_address).lower()
297
+ if missing.underlying_asset_address is not None
298
+ else None
299
+ ),
300
+ "star": star,
301
+ "chain": chain,
302
+ "protocol": _slug(missing.protocol.value) if missing.protocol is not None else "",
303
+ "allocation_type": missing.allocation_type,
304
+ "token_type": missing.token_type,
305
+ })
306
+
307
+ if missing_proxy_keys:
308
+ raise ValueError(
309
+ "assets defined for (star, chain) with no canonical ALM proxy: "
310
+ f"{sorted(missing_proxy_keys)}; add the ALM proxy to the AlmProxy enum"
311
+ )
312
+
313
+ assets_by_prime_export: dict[str, list[TokenEntryModel]] = {}
314
+ for entry in entries:
315
+ assets_by_prime_export.setdefault(entry["star"], []).append(TokenEntryModel(**entry))
316
+
317
+ alm_proxy_export: dict[str, dict[str, list[ProxyEntry]]] = {}
318
+ for (star, chain), addr_roles in proxies_by_key.items():
319
+ alm_proxy_export.setdefault(star, {})[chain] = [
320
+ ProxyEntry(star=star, chain=chain, address=address, role=role)
321
+ for address, role in addr_roles
322
+ ]
323
+
324
+ return AxisSynomeContract(
325
+ version=version or _version_from_package_metadata(),
326
+ axis_synome_git_commit=axis_synome_git_commit or _axis_synome_git_commit(),
327
+ axis_synome=AxisSynomeModel(
328
+ spec=SpecModel(
329
+ asc=AscModel(
330
+ entities=EntitiesModel(
331
+ assets_by_prime=AssetsByPrimeContainer(entries=assets_by_prime_export),
332
+ alm_proxies=AlmProxiesContainer(proxies=alm_proxy_export),
333
+ )
334
+ )
335
+ )
336
+ ),
337
+ )
338
+
339
+
340
+ def export_axis_synome_contract(
341
+ data_path: Path,
342
+ schema_path: Path,
343
+ version: str | None,
344
+ axis_synome_git_commit: str | None,
345
+ ) -> None:
346
+ config = build_axis_synome_contract(
347
+ version=version,
348
+ axis_synome_git_commit=axis_synome_git_commit,
349
+ )
350
+
351
+ data_path.parent.mkdir(parents=True, exist_ok=True)
352
+ schema_path.parent.mkdir(parents=True, exist_ok=True)
353
+
354
+ data_path.write_text(config.model_dump_json(indent=2, by_alias=True), encoding="utf-8")
355
+
356
+ schema = AxisSynomeContract.model_json_schema(by_alias=True)
357
+ schema_path.write_text(json.dumps(schema, indent=2), encoding="utf-8")
358
+
359
+
360
+ def main() -> None:
361
+ parser = argparse.ArgumentParser(
362
+ description="Export axis-synome entities contract JSON and pydantic schema."
363
+ )
364
+ parser.add_argument(
365
+ "--out",
366
+ type=Path,
367
+ default=Path("generated/stl/axis_synome_entities.json"),
368
+ help="Output JSON data path",
369
+ )
370
+ parser.add_argument(
371
+ "--schema-out",
372
+ type=Path,
373
+ default=Path("generated/stl/axis_synome_entities.schema.json"),
374
+ help="Output JSON schema path",
375
+ )
376
+ parser.add_argument(
377
+ "--version",
378
+ type=str,
379
+ default=None,
380
+ help="Version string embedded in exported config (default resolves from pyproject metadata)",
381
+ )
382
+ parser.add_argument(
383
+ "--git-commit",
384
+ type=str,
385
+ default=None,
386
+ help="axis-synome git commit hash embedded in exported config (default resolves from git)",
387
+ )
388
+
389
+ args = parser.parse_args()
390
+ export_axis_synome_contract(
391
+ args.out,
392
+ args.schema_out,
393
+ version=args.version,
394
+ axis_synome_git_commit=args.git_commit,
395
+ )
396
+
397
+
398
+ if __name__ == "__main__":
399
+ main()
@@ -209,8 +209,19 @@ class AlmProxy(Enum):
209
209
  GROVE_MONAD = GROVE_MONAD_ALM_PROXY
210
210
 
211
211
 
212
- # Temporary STL compatibility overrides while tracker config migrates.
213
- STL_ALM_PROXY_ADDRESS_OVERRIDES: Final[dict[tuple[PrimeAgent, Network], str]] = {
214
- (PrimeAgent.SPARK, Network.ETHEREUM_MAINNET): "0x3300f198988e4c9c63f75df86de36421f06af8c4",
215
- (PrimeAgent.GROVE, Network.ETHEREUM_MAINNET): "0x1369f7b2b38c76b6478c0f0e66d94923421891ba",
212
+ STL_ADDITIONAL_PROXIES: Final[dict[tuple[PrimeAgent, Network], list[EvmAddress]]] = {
213
+ (PrimeAgent.SPARK, Network.ETHEREUM_MAINNET): [
214
+ EvmAddress("0x3300f198988e4C9C63F75dF86De36421f06af8c4"),
215
+ ],
216
+ (PrimeAgent.GROVE, Network.ETHEREUM_MAINNET): [
217
+ EvmAddress("0x1369f7b2b38c76B6478c0f0E66D94923421891Ba"),
218
+ ],
216
219
  }
220
+ """Additional ALM-controlled wallets that are NOT the canonical ALM Proxy but
221
+ must still be tracked by downstream consumers. The canonical ALM Proxy holds the
222
+ operational allocation positions; these SubProxy ("risk capital" / treasury)
223
+ wallets hold capital separately and are exported alongside the ALM Proxy for the
224
+ same (Prime, Network) rather than replacing it.
225
+
226
+ Atlas references: the Spark SubProxy is A.6.1.1.1.2.1.1.3.1.1.2 and the Grove
227
+ SubProxy is A.6.1.1.2.2.1.1.3.1.1.2."""
@@ -1,4 +1,5 @@
1
1
  from enum import StrEnum
2
+ from typing import Final
2
3
 
3
4
  from axis_synome.spec.asc.entities.asset_categories import AssetCategory
4
5
  from axis_synome.spec.asc.entities.assets import Asset
@@ -19,6 +20,43 @@ class PrimeName(StrEnum):
19
20
  SPARK = "Spark"
20
21
 
21
22
 
23
+ # Grove positions whose non-obvious provenance is captured in a docstring. They
24
+ # are referenced from ASSETS_BY_PRIME below; a "#" comment on a list element is
25
+ # not machine-readable, so these are named constants instead.
26
+ GROVE_GACLO_1: Final[Asset] = Asset(
27
+ token=Token.GACLO_1,
28
+ network=Network.AVALANCHE,
29
+ protocol=Protocol.GALAXY,
30
+ address=EvmAddress("0x2C0aDFF8e114f3cA106051144353aC703D24B901"),
31
+ source="A.6.1.1.2.2.6.1.3.1.9.1.2.2.1",
32
+ underlying_asset=Token.USDC,
33
+ underlying_asset_address=EvmAddress("0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"),
34
+ underlying_asset_source="A.6.1.1.2.2.6.1.3.1.9.1.2.2.3",
35
+ categories={AssetCategory.REAL_WORLD_ASSET},
36
+ )
37
+ """Galaxy Arch CLOs. The GACLO-1 token is on Avalanche while deposits are made on
38
+ Ethereum Mainnet, so the Atlas-recorded Underlying Asset Address is mainnet USDC
39
+ (0xA0b8…) per the Instance Configuration Document. Network is Avalanche to match
40
+ the token deployment chain."""
41
+
42
+
43
+ GROVE_MONAD_UNISWAP_AUSD_USDC: Final[Asset] = Asset(
44
+ token=Token.UNISWAP_AUSD_USDC_POOL,
45
+ network=Network.MONAD,
46
+ protocol=Protocol.UNISWAP,
47
+ address=EvmAddress("0x6B405DCA74897c9442d369DcF6c0EC230f7E1c7C"),
48
+ source="A.6.1.1.2.2.6.1.3.1.12.1.2.2.1",
49
+ underlying_asset=Token.USDC,
50
+ underlying_asset_address=EvmAddress("0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"),
51
+ underlying_asset_source="A.6.1.1.2.2.6.1.3.1.12.1.2.2.2",
52
+ categories={AssetCategory.CASH_STABLECOIN},
53
+ )
54
+ """Monad Uniswap AUSD/USDC pool. The Atlas Underlying Asset Address node records
55
+ USDC (0xA0b8…), which is the asset supplied by the Grove Liquidity Layer; the
56
+ token name carries no "LP" marker so the export derives token_type
57
+ "uni_v3_pool"."""
58
+
59
+
22
60
  ASSETS_BY_PRIME: dict[PrimeName, list[Asset]] = {
23
61
  PrimeName.GROVE: [
24
62
  Asset(
@@ -263,6 +301,19 @@ ASSETS_BY_PRIME: dict[PrimeName, list[Asset]] = {
263
301
  underlying_asset_source="A.6.1.1.2.2.6.1.3.4.1.1.2.2.2",
264
302
  categories={AssetCategory.LENDING_MARKET},
265
303
  ),
304
+ GROVE_GACLO_1,
305
+ Asset(
306
+ token=Token.ACRDX,
307
+ network=Network.PLUME,
308
+ protocol=Protocol.CENTRIFUGE,
309
+ address=EvmAddress("0x9477724Bb54AD5417de8Baff29e59DF3fB4DA74f"),
310
+ source="A.6.1.1.2.2.6.1.3.5.1.1.2.2.1",
311
+ underlying_asset=Token.USDC,
312
+ underlying_asset_address=EvmAddress("0x222365EF19F7947e5484218551B56bb3965Aa7aF"),
313
+ underlying_asset_source="A.6.1.1.2.2.6.1.3.5.1.1.2.2.2",
314
+ categories={AssetCategory.REAL_WORLD_ASSET},
315
+ ),
316
+ GROVE_MONAD_UNISWAP_AUSD_USDC,
266
317
  ],
267
318
  PrimeName.OBEX: [
268
319
  Asset(
@@ -410,17 +461,12 @@ ASSETS_BY_PRIME: dict[PrimeName, list[Asset]] = {
410
461
  underlying_asset_source="A.6.1.1.1.2.6.1.3.1.2.1.2.2.2",
411
462
  categories={AssetCategory.LENDING_MARKET},
412
463
  ),
413
- Asset(
414
- token=Token.SP_USDC,
415
- network=Network.ETHEREUM_MAINNET,
416
- protocol=Protocol.ARKIS,
417
- address=EvmAddress("0x377C3bd93f2a2984E1E7bE6A5C22c525eD4A4815"),
418
- source="A.6.1.1.1.2.6.1.3.1.10.1.2.2.1",
419
- underlying_asset=Token.USDC,
420
- underlying_asset_address=EvmAddress("0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"),
421
- underlying_asset_source="A.6.1.1.1.2.6.1.3.1.10.1.2.2.2",
422
- categories={AssetCategory.LENDING_MARKET},
423
- ),
464
+ # TODO(axis-synome owners): the real Arkis vault (expected ~0x38464507…)
465
+ # is not yet defined here. The previous ARKIS entry reused the SparkLend
466
+ # USDC aToken address (0x377C3bd9…, kept below under SPARKLEND_PROTOCOL),
467
+ # which collapsed two distinct positions into one. It has been removed;
468
+ # add the Arkis vault with its own address once the Atlas reference is
469
+ # available.
424
470
  Asset(
425
471
  token=Token.BUIDL_I,
426
472
  network=Network.ETHEREUM_MAINNET,