axis-synome 0.1.0.dev73__tar.gz → 0.1.0.dev76__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 (210) hide show
  1. {axis_synome-0.1.0.dev73/src/axis_synome.egg-info → axis_synome-0.1.0.dev76}/PKG-INFO +1 -1
  2. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/_version.py +2 -2
  3. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/export_entities.py +67 -4
  4. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/asc/entities/assets_missing_from_atlas.py +4 -35
  5. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76/src/axis_synome.egg-info}/PKG-INFO +1 -1
  6. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/scripts/test_export_entities.py +58 -5
  7. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/.flake8 +0 -0
  8. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/AGENTS.md +0 -0
  9. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/CLAUDE.md +0 -0
  10. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/README.md +0 -0
  11. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/WRITING_SPECS.md +0 -0
  12. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/examples/01_prime_basics.py +0 -0
  13. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/examples/02_assets_and_tokens_of_a_prime.py +0 -0
  14. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/examples/03_inverse_lookups.py +0 -0
  15. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/examples/04_atlas_provenance.py +0 -0
  16. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/examples/05_feeding_a_formula.py +0 -0
  17. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/examples/README.md +0 -0
  18. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/pyproject.toml +0 -0
  19. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/setup.cfg +0 -0
  20. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/__init__.py +0 -0
  21. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/parser/__init__.py +0 -0
  22. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/parser/__main__.py +0 -0
  23. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/parser/ast_normalizer.py +0 -0
  24. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/parser/ast_utils.py +0 -0
  25. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/parser/checks/numeric_fidelity.py +0 -0
  26. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/parser/converters.py +0 -0
  27. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/parser/entity_parser.py +0 -0
  28. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/parser/formula_extraction.py +0 -0
  29. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/parser/helpers.py +0 -0
  30. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/parser/identity.py +0 -0
  31. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/parser/latex/__init__.py +0 -0
  32. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/parser/latex/converter.py +0 -0
  33. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/parser/latex/formatter.py +0 -0
  34. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/parser/latex/render.py +0 -0
  35. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/parser/parse_expressions.py +0 -0
  36. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/parser/statement_handler.py +0 -0
  37. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/parser/validation.py +0 -0
  38. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/__init__.py +0 -0
  39. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/all_entities/__init__.py +0 -0
  40. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/all_entities/lending_markets.py +0 -0
  41. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/asc/__init__.py +0 -0
  42. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/asc/entities/__init__.py +0 -0
  43. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/asc/entities/alm_proxies.py +0 -0
  44. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/asc/entities/asset_categories.py +0 -0
  45. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/asc/entities/assets.py +0 -0
  46. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/asc/entities/assets_by_prime.py +0 -0
  47. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/asc/entities/networks.py +0 -0
  48. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/asc/entities/primes.py +0 -0
  49. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/asc/entities/protocol_sets.py +0 -0
  50. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/asc/entities/tokens.py +0 -0
  51. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/asc/entities/types.py +0 -0
  52. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/asc/formulas/__init__.py +0 -0
  53. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/asc/formulas/asc.py +0 -0
  54. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/asc/formulas/asc_collateral_ratio.py +0 -0
  55. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/asc/formulas/asc_incentive.py +0 -0
  56. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/asc/formulas/dab.py +0 -0
  57. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/asc/formulas/latent_asc.py +0 -0
  58. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/asc/formulas/ratio_latent_asc.py +0 -0
  59. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/asc/formulas/resting_asc.py +0 -0
  60. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/codegen_test/__init__.py +0 -0
  61. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/codegen_test/entities/__init__.py +0 -0
  62. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/codegen_test/entities/agents.py +0 -0
  63. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/crypto_lending/__init__.py +0 -0
  64. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/crypto_lending/formulas/__init__.py +0 -0
  65. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/crypto_lending/formulas/lif.py +0 -0
  66. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/entities/__init__.py +0 -0
  67. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/entities/audit_firms.py +0 -0
  68. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/entities/capital_types.py +0 -0
  69. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/entities/protocol_risk.py +0 -0
  70. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/entities/risk_categories.py +0 -0
  71. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/entities/smart_contract_risk.py +0 -0
  72. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/__init__.py +0 -0
  73. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/administrative_rrc/__init__.py +0 -0
  74. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/administrative_rrc/administrative_risk.py +0 -0
  75. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/aggregate_rrc.py +0 -0
  76. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/audit_factor.py +0 -0
  77. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/capital_composition.py +0 -0
  78. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/entities/__init__.py +0 -0
  79. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/entities/lending_protocol.py +0 -0
  80. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/entities/precomputed_crr.py +0 -0
  81. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/examples/risk_capital_walkthrough.ipynb +0 -0
  82. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/financial_rrc/__init__.py +0 -0
  83. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/financial_rrc/entities.py +0 -0
  84. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/financial_rrc/perpetual_positions.py +0 -0
  85. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/formulas/__init__.py +0 -0
  86. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/__init__.py +0 -0
  87. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/asset_correlation_coefficient.py +0 -0
  88. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/capital_requirement_without_buffers.py +0 -0
  89. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/exposure_caps.py +0 -0
  90. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/fixed_crr_rrc.py +0 -0
  91. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/instance_financial_rrc.py +0 -0
  92. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/lending_rrc.py +0 -0
  93. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/pipeline.py +0 -0
  94. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/precomputed_crr_rrc.py +0 -0
  95. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/probability_of_default.py +0 -0
  96. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/formulas/required_risk_capital.py +0 -0
  97. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/instance_rrc.py +0 -0
  98. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/jrc_loss_allocation.py +0 -0
  99. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/lindy_factor.py +0 -0
  100. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/smart_contract_rrc/__init__.py +0 -0
  101. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/smart_contract_rrc/exceptions.py +0 -0
  102. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/smart_contract_rrc/smart_contract_risk.py +0 -0
  103. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/risk_capital/total_risk_capital.py +0 -0
  104. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/suraf/README.md +0 -0
  105. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/suraf/__init__.py +0 -0
  106. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/suraf/entities/__init__.py +0 -0
  107. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/suraf/entities/assessor_score.py +0 -0
  108. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/suraf/entities/assets.py +0 -0
  109. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/suraf/entities/mappings.py +0 -0
  110. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/suraf/formulas/__init__.py +0 -0
  111. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/suraf/formulas/crr.py +0 -0
  112. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec/suraf/formulas/scoring.py +0 -0
  113. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec_inspect/__init__.py +0 -0
  114. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec_inspect/__main__.py +0 -0
  115. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec_inspect/cli.py +0 -0
  116. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec_support/__init__.py +0 -0
  117. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec_support/correlation_matrix.py +0 -0
  118. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec_support/evm_address.py +0 -0
  119. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec_support/math_protocol.py +0 -0
  120. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec_support/pendle_validation.py +0 -0
  121. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec_support/references/__init__.py +0 -0
  122. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec_support/references/graph.py +0 -0
  123. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec_support/runtime/__init__.py +0 -0
  124. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec_support/runtime/base.py +0 -0
  125. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec_support/runtime/math.py +0 -0
  126. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec_support/runtime/reference.py +0 -0
  127. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec_support/validated_dataclass.py +0 -0
  128. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec_support/validated_str.py +0 -0
  129. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec_validator/__init__.py +0 -0
  130. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec_validator/check_source_uuids.py +0 -0
  131. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec_validator/checker.py +0 -0
  132. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec_validator/flake8_plugin.py +0 -0
  133. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome/spec_validator/python_subset.py +0 -0
  134. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome.egg-info/SOURCES.txt +0 -0
  135. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome.egg-info/dependency_links.txt +0 -0
  136. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome.egg-info/entry_points.txt +0 -0
  137. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome.egg-info/requires.txt +0 -0
  138. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/src/axis_synome.egg-info/top_level.txt +0 -0
  139. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/asc/__init__.py +0 -0
  140. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/asc/conftest.py +0 -0
  141. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/asc/mocks.py +0 -0
  142. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/asc/test_alm_proxies.py +0 -0
  143. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/asc/test_asc.py +0 -0
  144. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/asc/test_asc_collateral_ratio.py +0 -0
  145. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/asc/test_asc_incentive.py +0 -0
  146. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/asc/test_asset_categories.py +0 -0
  147. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/asc/test_dab.py +0 -0
  148. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/asc/test_evm_address.py +0 -0
  149. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/asc/test_latent_asc.py +0 -0
  150. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/asc/test_prime_agent_data_validation.py +0 -0
  151. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/asc/test_ratio_latent_asc.py +0 -0
  152. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/asc/test_resting_asc.py +0 -0
  153. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/parser/__init__.py +0 -0
  154. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/parser/fixture_latex_chain.py +0 -0
  155. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/parser/fixture_mixed_module.py +0 -0
  156. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/parser/fixture_set_membership.py +0 -0
  157. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/parser/graph_validator.py +0 -0
  158. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/parser/latex/__init__.py +0 -0
  159. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/parser/latex/test_formatter.py +0 -0
  160. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/parser/latex/test_render.py +0 -0
  161. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/parser/test_entity_parser.py +0 -0
  162. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/parser/test_formula_extraction.py +0 -0
  163. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/parser/test_helpers.py +0 -0
  164. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/parser/test_parser.py +0 -0
  165. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/parser/test_set_membership.py +0 -0
  166. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/risk_capital/__init__.py +0 -0
  167. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/risk_capital/administrative_rrc/test_administrative_risk.py +0 -0
  168. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/risk_capital/financial_rrc/__init__.py +0 -0
  169. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/risk_capital/financial_rrc/test_lending_rrc.py +0 -0
  170. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/risk_capital/financial_rrc/test_perpetual_positions.py +0 -0
  171. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/risk_capital/formulas/__init__.py +0 -0
  172. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/risk_capital/formulas/test_correlation_matrix.py +0 -0
  173. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/risk_capital/formulas/test_loss_given_default.py +0 -0
  174. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/risk_capital/smart_contract_rrc/__init__.py +0 -0
  175. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/risk_capital/smart_contract_rrc/test_exceptions.py +0 -0
  176. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/risk_capital/smart_contract_rrc/test_smart_contract_risk.py +0 -0
  177. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/risk_capital/test_a321_a322_integration.py +0 -0
  178. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/risk_capital/test_aggregate_rrc.py +0 -0
  179. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/risk_capital/test_capital_composition.py +0 -0
  180. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/risk_capital/test_instance_rrc.py +0 -0
  181. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/risk_capital/test_jrc_loss_allocation.py +0 -0
  182. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/risk_capital/test_total_risk_capital.py +0 -0
  183. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/spec_inspect/__init__.py +0 -0
  184. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/spec_inspect/test_cli.py +0 -0
  185. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/spec_support/__init__.py +0 -0
  186. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/spec_support/references/__init__.py +0 -0
  187. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/spec_support/references/test_graph.py +0 -0
  188. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/spec_support/runtime/__init__.py +0 -0
  189. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/spec_support/runtime/test_base.py +0 -0
  190. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/spec_support/runtime/test_math.py +0 -0
  191. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/spec_validator/test_check_source_uuids.py +0 -0
  192. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/spec_validator/test_checker.py +0 -0
  193. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/spec_validator/test_flake8_plugin.py +0 -0
  194. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/suraf/__init__.py +0 -0
  195. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/suraf/entities/__init__.py +0 -0
  196. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/suraf/entities/test_assessor_score.py +0 -0
  197. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/suraf/formulas/__init__.py +0 -0
  198. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/suraf/formulas/test_crr.py +0 -0
  199. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/suraf/formulas/test_scoring.py +0 -0
  200. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/suraf/static/aave_ausdc/v1/crr_mapping.csv +0 -0
  201. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/suraf/static/aave_ausdc/v1/penalty.csv +0 -0
  202. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/suraf/static/aave_ausdc/v1/scorecards/Assessor_1_scores.csv +0 -0
  203. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/suraf/static/aave_ausdc/v1/scorecards/Assessor_2_scores.csv +0 -0
  204. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/suraf/static/aave_ausdc/v1/scorecards/Assessor_3_scores.csv +0 -0
  205. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/suraf/static/aave_ausdc/v1/weights.csv +0 -0
  206. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/suraf/suraf_client/__init__.py +0 -0
  207. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/suraf/suraf_client/suraf_client.py +0 -0
  208. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/suraf/suraf_client/test_suraf_client.py +0 -0
  209. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/tests/axis_synome/test_examples.py +0 -0
  210. {axis_synome-0.1.0.dev73 → axis_synome-0.1.0.dev76}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: axis-synome
3
- Version: 0.1.0.dev73
3
+ Version: 0.1.0.dev76
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.dev73'
22
- __version_tuple__ = version_tuple = (0, 1, 0, 'dev73')
21
+ __version__ = version = '0.1.0.dev76'
22
+ __version_tuple__ = version_tuple = (0, 1, 0, 'dev76')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -6,7 +6,7 @@ import json
6
6
  import re
7
7
  import subprocess
8
8
  from pathlib import Path
9
- from typing import Any
9
+ from typing import Any, Final
10
10
 
11
11
  from pydantic import BaseModel, ConfigDict, Field
12
12
 
@@ -157,12 +157,75 @@ def _allocation_type(protocol: Protocol) -> AllocationType:
157
157
  return AllocationType.ALLOCATION
158
158
 
159
159
 
160
+ # Centrifuge ERC-7540 vaults are not balanceOf-able: name/symbol/decimals/balanceOf
161
+ # revert on-chain. The proxy holds the vault's share() ERC20, which is what the
162
+ # allocation tracker reads. The Atlas Token Address for these instances is the vault,
163
+ # so the tracked contract address is resolved to the on-chain share() here. Keyed by
164
+ # (chain, vault address) because the same vault address is reused across chains with
165
+ # different share tokens. share() values verified on-chain (cast) on Ethereum and
166
+ # Avalanche.
167
+ _CENTRIFUGE_VAULT_SHARE: Final[dict[tuple[str, str], str]] = {
168
+ (
169
+ "mainnet",
170
+ "0x4880799ee5200fc58da299e965df644fbf46780b",
171
+ ): "0x5a0f93d040de44e78f251b03c43be9cf317dcf64",
172
+ (
173
+ "mainnet",
174
+ "0xfe6920eb6c421f1179ca8c8d4170530cdbdfd77a",
175
+ ): "0x8c213ee79581ff4984583c6a801e5263418c4b86",
176
+ (
177
+ "avalanche-c",
178
+ "0x1121f4e21ed8b9bc1bb9a2952cdd8639ac897784",
179
+ ): "0x58f93d6b1ef2f44ec379cb975657c132cbed3b6b",
180
+ (
181
+ "avalanche-c",
182
+ "0xfe6920eb6c421f1179ca8c8d4170530cdbdfd77a",
183
+ ): "0xa5d465251fbcc907f5dd6bb2145488dfc6a2627b",
184
+ }
185
+
186
+
187
+ def _tracked_contract_address(chain: str, address: str) -> str:
188
+ """Resolve the balanceOf-able contract address for a position.
189
+
190
+ Centrifuge ERC-7540 vault addresses are mapped to their share() ERC20 (the token
191
+ the proxy actually holds); every other address passes through unchanged.
192
+ """
193
+ return _CENTRIFUGE_VAULT_SHARE.get((chain, address.lower()), address.lower())
194
+
195
+
160
196
  def _version_from_package_metadata() -> str:
161
197
  return importlib.metadata.version("axis-synome")
162
198
 
163
199
 
164
200
  def _axis_synome_git_commit() -> str:
165
- repo_root = Path(__file__).resolve().parents[2]
201
+ """Resolve the axis-synome commit for the exported contract's provenance.
202
+
203
+ Prefer the commit baked into ``_version.py`` at build time. Otherwise fall
204
+ back to ``git rev-parse`` only when running from the axis-synome source tree.
205
+ An installed wheel lives under ``site-packages`` (often nested inside a
206
+ consumer's git repository), and walking up from there would resolve that
207
+ consumer's HEAD, which is not our commit; return ``"unknown"`` instead.
208
+ """
209
+ embedded = _build_embedded_commit()
210
+ if embedded:
211
+ return embedded
212
+ return _git_commit_from_checkout(Path(__file__).resolve().parents[2])
213
+
214
+
215
+ def _build_embedded_commit() -> str | None:
216
+ try:
217
+ from axis_synome._version import commit_id
218
+ except ImportError:
219
+ return None
220
+ return commit_id
221
+
222
+
223
+ def _git_commit_from_checkout(repo_root: Path) -> str:
224
+ # Only trust git inside the axis-synome source tree. When installed as a
225
+ # wheel, repo_root points into site-packages, so a surrounding consumer
226
+ # repository's HEAD must never be mistaken for our commit.
227
+ if not (repo_root / "src" / "axis_synome").is_dir():
228
+ return "unknown"
166
229
  try:
167
230
  return subprocess.check_output(
168
231
  ["git", "rev-parse", "HEAD"], cwd=repo_root, text=True
@@ -233,7 +296,7 @@ def build_axis_synome_contract(
233
296
  missing_proxy_keys.add((star, chain))
234
297
  continue
235
298
 
236
- contract_address = str(asset.address).lower()
299
+ contract_address = _tracked_contract_address(chain, str(asset.address))
237
300
  entry_key = (chain, contract_address, wallet)
238
301
  if entry_key in seen_entry_keys:
239
302
  raise ValueError(
@@ -278,7 +341,7 @@ def build_axis_synome_contract(
278
341
  missing_proxy_keys.add((star, chain))
279
342
  continue
280
343
 
281
- contract_address = str(missing.address).lower()
344
+ contract_address = _tracked_contract_address(chain, str(missing.address))
282
345
  entry_key = (chain, contract_address, wallet)
283
346
  if entry_key in seen_entry_keys:
284
347
  raise ValueError(
@@ -381,17 +381,6 @@ SPARK_ARBITRUM_ASSET_USDC: Final[MissingAtlasAsset] = MissingAtlasAsset(
381
381
 
382
382
  # --- Grove ---
383
383
 
384
- GROVE_MAINNET_JANUS_HENDERSON: Final[MissingAtlasAsset] = MissingAtlasAsset(
385
- network=Network.ETHEREUM_MAINNET,
386
- address=EvmAddress("0x5a0F93D040De44e78F251b03c43be9CF317Dcf64"),
387
- protocol=Protocol.JANUS_HENDERSON,
388
- allocation_type=AllocationType.ALLOCATION,
389
- token_type=TokenType.ERC20,
390
- underlying_asset_address=USDC_MAINNET,
391
- )
392
- """Mainnet Janus Henderson. Absent (no Janus/Henderson docs in the Atlas)."""
393
-
394
-
395
384
  GROVE_MAINNET_CURVE_AUSD_USDC: Final[MissingAtlasAsset] = MissingAtlasAsset(
396
385
  network=Network.ETHEREUM_MAINNET,
397
386
  address=EvmAddress("0xE79C1C7E24755574438A26D5e062Ad2626C04662"),
@@ -416,16 +405,6 @@ GROVE_MAINNET_UNISWAP_AUSD_USDC: Final[MissingAtlasAsset] = MissingAtlasAsset(
416
405
  Address" (A.6.1.1.2.2.6.1.3.1.12.2 / 12.3), not a Token Address."""
417
406
 
418
407
 
419
- GROVE_AVALANCHE_JANUS_HENDERSON: Final[MissingAtlasAsset] = MissingAtlasAsset(
420
- network=Network.AVALANCHE,
421
- address=EvmAddress("0x58F93d6b1EF2F44eC379Cb975657C132CBeD3B6b"),
422
- protocol=Protocol.JANUS_HENDERSON,
423
- allocation_type=AllocationType.ALLOCATION,
424
- token_type=TokenType.ERC20,
425
- )
426
- """Avalanche Janus Henderson. Absent (no Janus/Henderson docs)."""
427
-
428
-
429
408
  GROVE_PLUME_CENTRIFUGE_FEEDER: Final[MissingAtlasAsset] = MissingAtlasAsset(
430
409
  network=Network.PLUME,
431
410
  address=EvmAddress("0xa5d465251fBCc907f5Dd6bB2145488DFC6a2627b"),
@@ -449,17 +428,6 @@ GROVE_PLUME_ASSET_USDC: Final[MissingAtlasAsset] = MissingAtlasAsset(
449
428
  of the ACRDX feeder, not a tracked position of its own."""
450
429
 
451
430
 
452
- GROVE_MAINNET_JANUS_HENDERSON_2: Final[MissingAtlasAsset] = MissingAtlasAsset(
453
- network=Network.ETHEREUM_MAINNET,
454
- address=EvmAddress("0x8c213ee79581Ff4984583C6a801e5263418C4b86"),
455
- protocol=Protocol.JANUS_HENDERSON,
456
- allocation_type=AllocationType.ALLOCATION,
457
- token_type=TokenType.ERC20,
458
- underlying_asset_address=USDC_MAINNET,
459
- )
460
- """Mainnet Janus Henderson (second feeder, distinct from 0x5a0F93D0…)."""
461
-
462
-
463
431
  GROVE_MAINNET_ASSET_DAI: Final[MissingAtlasAsset] = MissingAtlasAsset(
464
432
  network=Network.ETHEREUM_MAINNET,
465
433
  address=EvmAddress("0x6B175474E89094C44Da98b954EedeAC495271d0F"),
@@ -535,13 +503,14 @@ MISSING_FROM_ATLAS_BY_PRIME: Final[dict[PrimeName, list[MissingAtlasAsset]]] = {
535
503
  SPARK_ARBITRUM_ASSET_USDC,
536
504
  ],
537
505
  PrimeName.GROVE: [
538
- GROVE_MAINNET_JANUS_HENDERSON,
506
+ # Grove's Centrifuge JAAA/JTRSY share holdings are emitted from the
507
+ # Centrifuge instances in assets_by_prime.py (the ERC-7540 vault's share()
508
+ # is resolved at export time), so the former Janus-Henderson workaround
509
+ # entries for those share tokens are no longer listed here.
539
510
  GROVE_MAINNET_CURVE_AUSD_USDC,
540
511
  GROVE_MAINNET_UNISWAP_AUSD_USDC,
541
- GROVE_AVALANCHE_JANUS_HENDERSON,
542
512
  GROVE_PLUME_CENTRIFUGE_FEEDER,
543
513
  GROVE_PLUME_ASSET_USDC,
544
- GROVE_MAINNET_JANUS_HENDERSON_2,
545
514
  GROVE_MAINNET_ASSET_DAI,
546
515
  GROVE_MAINNET_POL_USDS,
547
516
  GROVE_MAINNET_RISK_CAPITAL_USDS,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: axis-synome
3
- Version: 0.1.0.dev73
3
+ Version: 0.1.0.dev76
4
4
  Summary: Axis specification modules (entities, formulas, validators)
5
5
  Author-email: Archon Tech <hello@archontech.ai>
6
6
  License: MIT
@@ -4,7 +4,13 @@ import sys
4
4
  from pathlib import Path
5
5
  from typing import cast
6
6
 
7
- from axis_synome.export_entities import _prime_to_star, build_axis_synome_contract
7
+ from axis_synome import export_entities
8
+ from axis_synome.export_entities import (
9
+ _axis_synome_git_commit,
10
+ _git_commit_from_checkout,
11
+ _prime_to_star,
12
+ build_axis_synome_contract,
13
+ )
8
14
  from axis_synome.spec.asc.entities.assets_by_prime import ASSETS_BY_PRIME, PrimeName
9
15
  from axis_synome.spec.asc.entities.assets_missing_from_atlas import (
10
16
  MISSING_FROM_ATLAS_BY_PRIME,
@@ -193,14 +199,22 @@ def test_export_covers_every_spec_position():
193
199
  drops, duplicates, or invents. The downstream contract values are validated
194
200
  end-to-end by the STL sentinel compatibility gates in CI.
195
201
  """
202
+ # Centrifuge ERC-7540 vault addresses are resolved to their share() ERC20 on
203
+ # export, so apply the same resolution when deriving the expectation.
196
204
  expected_contracts: list[str] = []
197
205
  for prime in (PrimeName.SPARK, PrimeName.GROVE):
198
206
  for asset in ASSETS_BY_PRIME.get(prime, []):
199
- if STL_CHAIN_BY_NETWORK.get(asset.network):
200
- expected_contracts.append(str(asset.address).lower())
207
+ chain = STL_CHAIN_BY_NETWORK.get(asset.network)
208
+ if chain:
209
+ expected_contracts.append(
210
+ export_entities._tracked_contract_address(chain, str(asset.address))
211
+ )
201
212
  for missing in MISSING_FROM_ATLAS_BY_PRIME.get(prime, []):
202
- if STL_CHAIN_BY_NETWORK.get(missing.network):
203
- expected_contracts.append(str(missing.address).lower())
213
+ chain = STL_CHAIN_BY_NETWORK.get(missing.network)
214
+ if chain:
215
+ expected_contracts.append(
216
+ export_entities._tracked_contract_address(chain, str(missing.address))
217
+ )
204
218
 
205
219
  exported_contracts = [e["contract_address"] for e in _exported_token_entries()]
206
220
  assert sorted(exported_contracts) == sorted(expected_contracts)
@@ -232,3 +246,42 @@ def test_prime_to_star_round_trips_known_primes():
232
246
  """Sanity: the prime->star slug used to key the export is stable."""
233
247
  assert _prime_to_star(PrimeName.SPARK) == "spark"
234
248
  assert _prime_to_star(PrimeName.GROVE) == "grove"
249
+
250
+
251
+ def test_git_commit_from_checkout_ignores_foreign_repo(tmp_path):
252
+ """A repo_root without src/axis_synome (e.g. an installed wheel nested in a
253
+ consumer repo) must not shell out to git and report that repo's HEAD."""
254
+ assert _git_commit_from_checkout(tmp_path) == "unknown"
255
+
256
+
257
+ def test_git_commit_prefers_build_embedded(monkeypatch):
258
+ """When _version.py carries a build-time commit, it wins over any git probe."""
259
+ monkeypatch.setattr(export_entities, "_build_embedded_commit", lambda: "abc123")
260
+ assert _axis_synome_git_commit() == "abc123"
261
+
262
+
263
+ def test_git_commit_unknown_when_unembedded_and_not_in_checkout(monkeypatch):
264
+ """No embedded commit and not in the source tree resolves to "unknown"."""
265
+ monkeypatch.setattr(export_entities, "_build_embedded_commit", lambda: None)
266
+ monkeypatch.setattr(export_entities, "_git_commit_from_checkout", lambda _root: "unknown")
267
+ assert _axis_synome_git_commit() == "unknown"
268
+
269
+
270
+ def test_tracked_contract_address_resolves_centrifuge_vault_to_share():
271
+ """Centrifuge ERC-7540 vaults resolve to their share() ERC20, keyed by chain
272
+ (the same vault address is reused across chains with different shares)."""
273
+ resolve = export_entities._tracked_contract_address
274
+ assert (
275
+ resolve("mainnet", "0xFE6920eB6C421f1179cA8c8d4170530CDBdfd77A")
276
+ == "0x8c213ee79581ff4984583c6a801e5263418c4b86"
277
+ )
278
+ assert (
279
+ resolve("avalanche-c", "0xFE6920eB6C421f1179cA8c8d4170530CDBdfd77A")
280
+ == "0xa5d465251fbcc907f5dd6bb2145488dfc6a2627b"
281
+ )
282
+
283
+
284
+ def test_tracked_contract_address_passes_through_non_vault():
285
+ """A non-vault address (e.g. Spark's direct JTRSY ERC20) is returned lowercased."""
286
+ addr = "0x8c213ee79581Ff4984583C6a801e5263418C4b86"
287
+ assert export_entities._tracked_contract_address("mainnet", addr) == addr.lower()