ddx-python 1.0.6__tar.gz → 1.1.6__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 (370) hide show
  1. {ddx_python-1.0.6 → ddx_python-1.1.6}/Cargo.lock +1 -1
  2. {ddx_python-1.0.6 → ddx_python-1.1.6}/PKG-INFO +1 -1
  3. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/common/src/error.rs +25 -0
  4. ddx_python-1.1.6/core/common/src/util/cbor.rs +16 -0
  5. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/common/src/util/mod.rs +3 -0
  6. ddx_python-1.1.6/ddx-operator/core/src/adapter.rs +329 -0
  7. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/execution/accounting.rs +3 -0
  8. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/execution/validation.rs +1 -0
  9. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/types/accounting.rs +3 -3
  10. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/Cargo.toml +1 -1
  11. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/affiliate_tests.py +2 -2
  12. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/common_tests/liquidation.py +57 -57
  13. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/common_tests/matching.py +12 -12
  14. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/common_tests/pnl_realization.py +2 -2
  15. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/futures_tests.py +13 -13
  16. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/execution/matching.py +1 -1
  17. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/perps_tests.py +11 -11
  18. {ddx_python-1.0.6 → ddx_python-1.1.6}/pyproject.toml +1 -1
  19. ddx_python-1.0.6/ddx-operator/core/src/adapter.rs +0 -196
  20. {ddx_python-1.0.6 → ddx_python-1.1.6}/Cargo.toml +0 -0
  21. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/common/Cargo.toml +0 -0
  22. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/common/src/constants.rs +0 -0
  23. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/common/src/global.rs +0 -0
  24. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/common/src/lib.rs +0 -0
  25. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/common/src/types/accounting.rs +0 -0
  26. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/common/src/types/auth.rs +0 -0
  27. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/common/src/types/contract/events.rs +0 -0
  28. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/common/src/types/contract.rs +0 -0
  29. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/common/src/types/exported.rs +0 -0
  30. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/common/src/types/global.rs +0 -0
  31. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/common/src/types/identifiers.rs +0 -0
  32. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/common/src/types/kyc.rs +0 -0
  33. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/common/src/types/mod.rs +0 -0
  34. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/common/src/types/node.rs +0 -0
  35. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/common/src/types/primitives/numbers.rs +0 -0
  36. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/common/src/types/primitives.rs +0 -0
  37. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/common/src/types/state.rs +0 -0
  38. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/common/src/types/transaction.rs +0 -0
  39. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/common/src/util/backoff.rs +0 -0
  40. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/common/src/util/mem.rs +0 -0
  41. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/common/src/util/tokenize.rs +0 -0
  42. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/common/src/util/tracing.rs +0 -0
  43. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/crypto/Cargo.toml +0 -0
  44. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/crypto/src/eip712.rs +0 -0
  45. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/crypto/src/encryption.rs +0 -0
  46. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/crypto/src/lib.rs +0 -0
  47. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/crypto/src/signing.rs +0 -0
  48. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/crypto/src/test_accounts.rs +0 -0
  49. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/ethereum/Cargo.toml +0 -0
  50. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/ethereum/src/checkpoint.rs +0 -0
  51. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/ethereum/src/event.rs +0 -0
  52. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/ethereum/src/lib.rs +0 -0
  53. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/ethereum/src/log.rs +0 -0
  54. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/macros/Cargo.toml +0 -0
  55. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/macros/src/lib.rs +0 -0
  56. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/specs/Cargo.toml +0 -0
  57. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/specs/src/eval.rs +0 -0
  58. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/specs/src/float_parser.rs +0 -0
  59. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/specs/src/lib.rs +0 -0
  60. {ddx_python-1.0.6 → ddx_python-1.1.6}/core/specs/src/str_parser.rs +0 -0
  61. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/Cargo.toml +0 -0
  62. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/constants.rs +0 -0
  63. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/execution/error.rs +0 -0
  64. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/execution/mod.rs +0 -0
  65. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/execution/test_utils.rs +0 -0
  66. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/lib.rs +0 -0
  67. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/specs/constants.rs +0 -0
  68. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/specs/index_fund.rs +0 -0
  69. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/specs/pred_market_future.rs +0 -0
  70. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/specs/quarterly_expiry_future.rs +0 -0
  71. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/specs/types.rs +0 -0
  72. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/specs.rs +0 -0
  73. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/tree/README.md +0 -0
  74. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/tree/mod.rs +0 -0
  75. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/tree/shared_smt.rs +0 -0
  76. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/tree/shared_store.rs +0 -0
  77. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/trusted_settings.rs +0 -0
  78. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/types/accounting/balance.rs +0 -0
  79. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/types/clock.rs +0 -0
  80. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/types/contract_events.rs +0 -0
  81. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/types/data_source.rs +0 -0
  82. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/types/identifiers.rs +0 -0
  83. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/types/mod.rs +0 -0
  84. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/types/order.rs +0 -0
  85. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/types/primitives/product_symbol.rs +0 -0
  86. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/types/primitives.rs +0 -0
  87. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/types/request/submitted_json.rs +0 -0
  88. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/types/request.rs +0 -0
  89. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/types/settlement.rs +0 -0
  90. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/types/state/exported.rs +0 -0
  91. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/types/state/tradable_product.rs +0 -0
  92. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/types/state/trader.rs +0 -0
  93. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/types/state.rs +0 -0
  94. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/types/transaction.rs +0 -0
  95. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/util/convert.rs +0 -0
  96. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/util/eip712.rs +0 -0
  97. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/util/env.rs +0 -0
  98. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/util/ethereum.rs +0 -0
  99. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/util/mod.rs +0 -0
  100. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/src/util/serde.rs +0 -0
  101. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-operator/core/tests/fixtures/signed-request-identity-vectors.json +0 -0
  102. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/AGENTS.md +0 -0
  103. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/build.rs +0 -0
  104. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/AGENTS.md +0 -0
  105. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/Dockerfile +0 -0
  106. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/admin_cli/README.md +0 -0
  107. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/admin_cli/RUNBOOK.comprehension.md +0 -0
  108. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/admin_cli/RUNBOOK.planning.md +0 -0
  109. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/admin_cli/cli.py +0 -0
  110. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/admin_cli/codex_runner.py +0 -0
  111. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/admin_cli/comprehension/__init__.py +0 -0
  112. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/admin_cli/comprehension/cli.py +0 -0
  113. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/admin_cli/comprehension/heartbeat.py +0 -0
  114. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/admin_cli/comprehension/inbound.py +0 -0
  115. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/admin_cli/comprehension/note_edits.py +0 -0
  116. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/admin_cli/project.py +0 -0
  117. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/compose.yml +0 -0
  118. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/experiments/4443-improve-and-cleanup-unit-tests/1_matching_vs_risk_decoupling.md +0 -0
  119. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/experiments/4443-improve-and-cleanup-unit-tests/2_logic_and_sgx_cryptography_conflation.md +0 -0
  120. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/experiments/4443-improve-and-cleanup-unit-tests/3_test_semantics.md +0 -0
  121. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/experiments/4443-improve-and-cleanup-unit-tests/engine_test_audit.md +0 -0
  122. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/experiments/4443-improve-and-cleanup-unit-tests/issues/4727.md +0 -0
  123. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/experiments/4443-improve-and-cleanup-unit-tests/issues/4728.md +0 -0
  124. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/experiments/4443-improve-and-cleanup-unit-tests/issues/4729.md +0 -0
  125. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/experiments/4443-improve-and-cleanup-unit-tests/specs.md +0 -0
  126. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/experiments/blueprint.md +0 -0
  127. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/experiments/ddx-whitepaper.md +0 -0
  128. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/pyproject.toml +0 -0
  129. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/sdlc/calendar.py +0 -0
  130. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/sdlc/common.py +0 -0
  131. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/sdlc/journal.py +0 -0
  132. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/sdlc/mentions.py +0 -0
  133. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/sdlc/pm-charter.md +0 -0
  134. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/sdlc/sync.py +0 -0
  135. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/sdlc/team.yml +0 -0
  136. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/sdlc/time_spent.py +0 -0
  137. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/tests/sdlc/conftest.py +0 -0
  138. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/tests/test_comprehension_protocol.py +0 -0
  139. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/devtools/uv.lock +0 -0
  140. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/exchange-kpis/README.md +0 -0
  141. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/exchange-kpis/exchange_kpis/__init__.py +0 -0
  142. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/exchange-kpis/exchange_kpis/cli.py +0 -0
  143. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/exchange-kpis/exchange_kpis/models.py +0 -0
  144. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/exchange-kpis/exchange_kpis/webhooks.py +0 -0
  145. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/exchange-kpis/pyproject.toml +0 -0
  146. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/exchange-kpis/uv.lock +0 -0
  147. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/README.md +0 -0
  148. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/pyproject.toml +0 -0
  149. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/whitebox_fuzzing/__init__.py +0 -0
  150. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/whitebox_fuzzing/config/marketmaker.conf.json.template +0 -0
  151. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/whitebox_fuzzing/event.py +0 -0
  152. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/whitebox_fuzzing/legacy/README.md +0 -0
  153. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/whitebox_fuzzing/legacy/__init__.py +0 -0
  154. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/whitebox_fuzzing/legacy/chaos_bot.py +0 -0
  155. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/whitebox_fuzzing/legacy/chaos_strategies/__init__.py +0 -0
  156. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/whitebox_fuzzing/legacy/chaos_strategies/full_suite.py +0 -0
  157. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/whitebox_fuzzing/legacy/chaos_strategies/helpers.py +0 -0
  158. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/whitebox_fuzzing/legacy/chaos_strategies/large_deposit.py +0 -0
  159. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/whitebox_fuzzing/legacy/chaos_strategies/spawner.py +0 -0
  160. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/whitebox_fuzzing/legacy/chaos_strategies/trader_bot.py +0 -0
  161. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/whitebox_fuzzing/legacy/chaos_strategies/trader_bot_tests.py +0 -0
  162. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/whitebox_fuzzing/legacy/config/chaos.conf.json.template +0 -0
  163. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/whitebox_fuzzing/legacy/config/marketmaker.conf.json.template +0 -0
  164. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/whitebox_fuzzing/legacy/config/markettaker.conf.json.template +0 -0
  165. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/whitebox_fuzzing/legacy/market_taker.py +0 -0
  166. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/whitebox_fuzzing/legacy/sample_chaos_bot.py +0 -0
  167. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/whitebox_fuzzing/legacy/sample_mm_auditor_bot.py +0 -0
  168. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/whitebox_fuzzing/market_maker.py +0 -0
  169. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/whitebox_fuzzing/test_utils/__init__.py +0 -0
  170. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/whitebox_fuzzing/test_utils/test_derivadex_client.py +0 -0
  171. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/whitebox_fuzzing/test_utils/test_kyc_client.py +0 -0
  172. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/whitebox_fuzzing/test_utils/test_on_chain_client.py +0 -0
  173. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/fuzzing/whitebox_fuzzing/whitebox_derivadex_client.py +0 -0
  174. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/mocks/MANIFEST.in +0 -0
  175. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/mocks/README.md +0 -0
  176. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/mocks/mock_kyc.py +0 -0
  177. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/mocks/price_feed_fuzzer.conf.json.template +0 -0
  178. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/mocks/price_feed_fuzzer.py +0 -0
  179. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/mocks/pyproject.toml +0 -0
  180. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/notebooks/README.md +0 -0
  181. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/notebooks/auditor_replay.ipynb +0 -0
  182. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/notebooks/exchange_dashboard.ipynb +0 -0
  183. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/notebooks/frontend_dashboard.ipynb +0 -0
  184. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/notebooks/monitoring_dashboard.py +0 -0
  185. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/notebooks/multi_node_diverge.ipynb +0 -0
  186. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/notebooks/performance_dashboard.ipynb +0 -0
  187. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/notebooks/pyproject.toml +0 -0
  188. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/notebooks/state_root_mismatch.ipynb +0 -0
  189. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/AGENTS.md +0 -0
  190. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/README.md +0 -0
  191. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/examples/__init__.py +0 -0
  192. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/examples/auditor.py +0 -0
  193. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/examples/delegated_session_deny_list.py +0 -0
  194. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/examples/deposit_usdc.py +0 -0
  195. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/examples/rest_quickstart.py +0 -0
  196. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/examples/session_config.json +0 -0
  197. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/examples/ws_quickstart.py +0 -0
  198. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/fuzz-compose.template.ini +0 -0
  199. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/__init__.py +0 -0
  200. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/common_tests/__init__.py +0 -0
  201. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/common_tests/trade_mining.py +0 -0
  202. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/conftest.py +0 -0
  203. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/decimal/Add_000_001.csv +0 -0
  204. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/decimal/Add_100_100.csv +0 -0
  205. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/decimal/Add_111_111.csv +0 -0
  206. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/decimal/Div_100_100.csv +0 -0
  207. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/decimal/Div_101_010.csv +0 -0
  208. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/decimal/Div_110_000.csv +0 -0
  209. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/decimal/Div_111_110.csv +0 -0
  210. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/decimal/Div_111_111.csv +0 -0
  211. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/decimal/Mul_001_000.csv +0 -0
  212. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/decimal/Mul_010_111.csv +0 -0
  213. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/decimal/Mul_100_101.csv +0 -0
  214. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/decimal/Mul_110_001.csv +0 -0
  215. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/decimal/Mul_111_111.csv +0 -0
  216. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/decimal/Rem_101_101.csv +0 -0
  217. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/decimal/Rem_111_000.csv +0 -0
  218. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/decimal/Rem_111_110.csv +0 -0
  219. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/decimal/Sub_101_110.csv +0 -0
  220. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/decimal/Sub_110_011.csv +0 -0
  221. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/decimal/Sub_111_111.csv +0 -0
  222. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/general_tests.py +0 -0
  223. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/__init__.py +0 -0
  224. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/account.py +0 -0
  225. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/diagnostics.py +0 -0
  226. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/execution/__init__.py +0 -0
  227. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/execution/block.py +0 -0
  228. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/execution/liquidation.py +0 -0
  229. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/execution/listing.py +0 -0
  230. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/execution/settlement.py +0 -0
  231. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/execution/state.py +0 -0
  232. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/execution/trade_mining.py +0 -0
  233. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/execution/trader.py +0 -0
  234. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/execution/utils.py +0 -0
  235. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/market_data_driver/__init__.py +0 -0
  236. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/market_data_driver/custom_market_data_driver.py +0 -0
  237. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/market_data_driver/exchange_market_data_driver.py +0 -0
  238. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/market_data_driver/market_data_driver.py +0 -0
  239. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/market_data_driver/tick.py +0 -0
  240. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/matchers/__init__.py +0 -0
  241. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/matchers/account.py +0 -0
  242. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/matchers/fuzzed_account.py +0 -0
  243. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/matchers/tick.py +0 -0
  244. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/matchers/utils.py +0 -0
  245. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/order_book.py +0 -0
  246. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/store.py +0 -0
  247. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/harness/wallet.py +0 -0
  248. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/mock_transactions.json +0 -0
  249. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/python_only.py +0 -0
  250. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/session_tests.py +0 -0
  251. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/test_ddx_common.py +0 -0
  252. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/test_decimal.py +0 -0
  253. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/test_fuzz_bot_signed_request_contract.py +0 -0
  254. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/unit/auditor_driver_tests.py +0 -0
  255. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/unit/liquidation_tests.py +0 -0
  256. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/tests/unit/package_import_tests.py +0 -0
  257. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/utils/__init__.py +0 -0
  258. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/python/utils/utils.py +0 -0
  259. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/scripts/check-release-wheel.bash +0 -0
  260. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/src/bin/stub_gen.rs +0 -0
  261. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/src/ddx.rs +0 -0
  262. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/src/decimal.rs +0 -0
  263. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/src/h256.rs +0 -0
  264. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/src/lib.rs +0 -0
  265. {ddx_python-1.0.6 → ddx_python-1.1.6}/ddx-python/uv.lock +0 -0
  266. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/__init__.py +0 -0
  267. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/__init__.pyi +0 -0
  268. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/_rust/__init__.pyi +0 -0
  269. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/_rust/common/__init__.pyi +0 -0
  270. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/_rust/common/accounting.pyi +0 -0
  271. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/_rust/common/enums.pyi +0 -0
  272. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/_rust/common/requests/__init__.pyi +0 -0
  273. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/_rust/common/requests/intents.pyi +0 -0
  274. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/_rust/common/specs.pyi +0 -0
  275. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/_rust/common/state/__init__.pyi +0 -0
  276. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/_rust/common/state/keys.pyi +0 -0
  277. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/_rust/common/transactions.pyi +0 -0
  278. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/_rust/decimal.pyi +0 -0
  279. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/_rust/h256.pyi +0 -0
  280. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/app_config/ethereum/addresses.json +0 -0
  281. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/auditor/README.md +0 -0
  282. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/auditor/__init__.py +0 -0
  283. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/auditor/auditor_driver.py +0 -0
  284. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/auditor/websocket_message.py +0 -0
  285. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/__init__.py +0 -0
  286. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/epoch_params.py +0 -0
  287. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/fill_context.py +0 -0
  288. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/item_utils.py +0 -0
  289. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/logging.py +0 -0
  290. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/market_aware_account.py +0 -0
  291. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/market_specs.py +0 -0
  292. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/trade_mining_params.py +0 -0
  293. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transaction_utils.py +0 -0
  294. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/__init__.py +0 -0
  295. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/advance_epoch.py +0 -0
  296. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/advance_settlement_epoch.py +0 -0
  297. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/all_price_checkpoints.py +0 -0
  298. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/cancel.py +0 -0
  299. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/cancel_all.py +0 -0
  300. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/complete_fill.py +0 -0
  301. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/event.py +0 -0
  302. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/fee_distribution.py +0 -0
  303. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/funding.py +0 -0
  304. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/futures_expiry.py +0 -0
  305. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/genesis.py +0 -0
  306. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/inner/__init__.py +0 -0
  307. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/inner/adl_outcome.py +0 -0
  308. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/inner/fill.py +0 -0
  309. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/inner/liquidated_position.py +0 -0
  310. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/inner/liquidation_entry.py +0 -0
  311. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/inner/liquidation_fill.py +0 -0
  312. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/inner/outcome.py +0 -0
  313. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/inner/trade_fill.py +0 -0
  314. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/insurance_fund_update.py +0 -0
  315. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/insurance_fund_withdraw.py +0 -0
  316. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/liquidation.py +0 -0
  317. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/partial_fill.py +0 -0
  318. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/pnl_realization.py +0 -0
  319. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/post.py +0 -0
  320. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/post_order.py +0 -0
  321. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/price_checkpoint.py +0 -0
  322. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/signer_registered.py +0 -0
  323. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/specs_update.py +0 -0
  324. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/strategy_update.py +0 -0
  325. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/tradable_product_update.py +0 -0
  326. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/trade_mining.py +0 -0
  327. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/trader_update.py +0 -0
  328. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/withdraw.py +0 -0
  329. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/transactions/withdraw_ddx.py +0 -0
  330. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/common/utils.py +0 -0
  331. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/config.py +0 -0
  332. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/derivadex_client.py +0 -0
  333. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/models/__init__.py +0 -0
  334. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/models/base.py +0 -0
  335. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/py.typed +0 -0
  336. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/realtime_client/__init__.py +0 -0
  337. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/realtime_client/config.py +0 -0
  338. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/realtime_client/models/__init__.py +0 -0
  339. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/realtime_client/realtime_client.py +0 -0
  340. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/realtime_client/tests/realtime_client_tests.py +0 -0
  341. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/__init__.py +0 -0
  342. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/clients/__init__.py +0 -0
  343. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/clients/base_client.py +0 -0
  344. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/clients/market_client.py +0 -0
  345. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/clients/on_chain_client.py +0 -0
  346. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/clients/signed_client.py +0 -0
  347. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/clients/system_client.py +0 -0
  348. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/clients/trade_client.py +0 -0
  349. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/constants/__init__.py +0 -0
  350. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/constants/endpoints.py +0 -0
  351. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/contracts/__init__.py +0 -0
  352. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/contracts/checkpoint/__init__.py +0 -0
  353. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/contracts/ddx/__init__.py +0 -0
  354. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/contracts/dummy_token/__init__.py +0 -0
  355. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/contracts/i_collateral/__init__.py +0 -0
  356. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/contracts/i_stake/__init__.py +0 -0
  357. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/exceptions/__init__.py +0 -0
  358. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/exceptions/exceptions.py +0 -0
  359. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/http/__init__.py +0 -0
  360. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/http/http_client.py +0 -0
  361. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/models/__init__.py +0 -0
  362. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/models/market.py +0 -0
  363. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/models/signed.py +0 -0
  364. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/models/system.py +0 -0
  365. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/models/trade.py +0 -0
  366. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/tests/signed_client_tests.py +0 -0
  367. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/tests/ticker_tests.py +0 -0
  368. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/utils/__init__.py +0 -0
  369. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/rest_client/utils/encryption_utils.py +0 -0
  370. {ddx_python-1.0.6 → ddx_python-1.1.6}/python/ddx/utils/__init__.py +0 -0
@@ -3129,7 +3129,7 @@ dependencies = [
3129
3129
 
3130
3130
  [[package]]
3131
3131
  name = "ddx-python"
3132
- version = "1.0.6"
3132
+ version = "1.1.6"
3133
3133
  dependencies = [
3134
3134
  "core-common",
3135
3135
  "core-ddx",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ddx-python
3
- Version: 1.0.6
3
+ Version: 1.1.6
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: Topic :: Office/Business :: Financial :: Investment
@@ -5,6 +5,13 @@ use std::string::String;
5
5
  pub enum Error {
6
6
  #[error("Error with crypto tooling: {0}")]
7
7
  Crypto(String),
8
+ #[error("failed to deserialize {context}: {detail}")]
9
+ Deserialize {
10
+ context: &'static str,
11
+ detail: String,
12
+ },
13
+ #[error("Ecall failed with sgx_status={status} retval={retval}")]
14
+ Ecall { status: String, retval: String },
8
15
  #[error(transparent)]
9
16
  EnvVar(#[from] std::env::VarError),
10
17
  #[error(transparent)]
@@ -22,6 +29,11 @@ pub enum Error {
22
29
  Conversion(String),
23
30
  #[error(transparent)]
24
31
  Regex(#[from] regex::Error),
32
+ #[error("failed to serialize {context}: {detail}")]
33
+ Serialize {
34
+ context: &'static str,
35
+ detail: String,
36
+ },
25
37
  #[error("Error with serde serialize/deserialize: {0}")]
26
38
  Serde(String),
27
39
  #[error("Error with Sparse Merkle Tree tooling: {0}")]
@@ -32,6 +44,19 @@ pub enum Error {
32
44
 
33
45
  pub type Result<T, E = Error> = std::result::Result<T, E>;
34
46
 
47
+ impl Error {
48
+ pub fn ecall(
49
+ status: impl ToString,
50
+ retval: Option<impl ToString + std::default::Default>,
51
+ ) -> Self {
52
+ let retval = retval.unwrap_or_default().to_string();
53
+ Self::Ecall {
54
+ status: status.to_string(),
55
+ retval,
56
+ }
57
+ }
58
+ }
59
+
35
60
  impl From<sparse_merkle_tree::error::Error> for Error {
36
61
  fn from(e: sparse_merkle_tree::error::Error) -> Self {
37
62
  Error::SparseMerkleTree(format!("{e:?}"))
@@ -0,0 +1,16 @@
1
+ use crate::{Error, Result};
2
+ use serde::{Serialize, de::DeserializeOwned};
3
+
4
+ pub fn serialize<T: Serialize>(value: &T, context: &'static str) -> Result<Vec<u8>> {
5
+ cbor4ii::serde::to_vec(vec![], value).map_err(|err| Error::Serialize {
6
+ context,
7
+ detail: err.to_string(),
8
+ })
9
+ }
10
+
11
+ pub fn deserialize<T: DeserializeOwned>(bytes: &[u8], context: &'static str) -> Result<T> {
12
+ cbor4ii::serde::from_slice(bytes).map_err(|err| Error::Deserialize {
13
+ context,
14
+ detail: err.to_string(),
15
+ })
16
+ }
@@ -4,12 +4,15 @@ use std::time::{Duration, UNIX_EPOCH};
4
4
 
5
5
  #[cfg(not(target_family = "wasm"))]
6
6
  pub mod backoff;
7
+ pub mod cbor;
7
8
  #[cfg(not(target_family = "wasm"))]
8
9
  pub mod mem;
9
10
  pub mod tokenize;
10
11
  #[cfg(not(target_family = "wasm"))]
11
12
  pub mod tracing;
12
13
 
14
+ pub use cbor::{deserialize, serialize};
15
+
13
16
  pub fn get_app_share_dir(app_name: &str) -> String {
14
17
  let mut share_dir =
15
18
  std::env::var("APP_SHARE").expect("APP_SHARE must be set before running operator tooling");
@@ -0,0 +1,329 @@
1
+ use crate::{
2
+ ExecutionOutcome,
3
+ types::request::{
4
+ AdvanceEpoch, AdvanceSettlementEpoch, Block, CancelAllIntent, CancelOrderIntent,
5
+ ClientRequest, ClientSequencingOutcome, Cmd, IndexPrice, MarketClose, MintPriceCheckpoint,
6
+ ModifyOrderIntent, OrderIntent, PreProcessedRequest, ProfileUpdateIntent, Receipt, Request,
7
+ RequestWithReceipt, SettlementValue, UpdateProductListings, UpgradeParams,
8
+ WithdrawDDXIntent, WithdrawIntent,
9
+ },
10
+ };
11
+ use anyhow::Error;
12
+ use core_common::types::{auth::EnrollmentEvent, primitives::StampedTimeValue};
13
+ use serde::{Deserialize, Serialize, de::DeserializeOwned};
14
+ use thiserror::Error;
15
+
16
+ #[derive(Debug, Error)]
17
+ pub enum AdapterError {
18
+ #[error("failed to serialize {context}")]
19
+ Serialize {
20
+ context: &'static str,
21
+ #[source]
22
+ source: Error,
23
+ },
24
+ #[error("failed to deserialize {context}")]
25
+ Deserialize {
26
+ context: &'static str,
27
+ #[source]
28
+ source: Error,
29
+ },
30
+ }
31
+
32
+ fn serialize<T: Serialize>(value: &T, context: &'static str) -> Result<Vec<u8>, AdapterError> {
33
+ cbor4ii::serde::to_vec(vec![], value).map_err(|err| AdapterError::Serialize {
34
+ context,
35
+ source: Error::new(err),
36
+ })
37
+ }
38
+
39
+ fn deserialize<T: DeserializeOwned>(
40
+ bytes: &[u8],
41
+ context: &'static str,
42
+ ) -> Result<T, AdapterError> {
43
+ cbor4ii::serde::from_slice(bytes).map_err(|err| AdapterError::Deserialize {
44
+ context,
45
+ source: Error::new(err),
46
+ })
47
+ }
48
+
49
+ #[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
50
+ #[serde(tag = "t", content = "c")]
51
+ pub enum RequestWire {
52
+ Order(OrderIntent),
53
+ ModifyOrder(ModifyOrderIntent),
54
+ CancelOrder(CancelOrderIntent),
55
+ CancelAll(CancelAllIntent),
56
+ Withdraw(WithdrawIntent),
57
+ WithdrawDDX(WithdrawDDXIntent),
58
+ #[cfg(feature = "insurance_fund_client_req")]
59
+ InsuranceFundWithdraw(crate::types::request::InsuranceFundWithdrawIntent),
60
+ ProfileUpdate(ProfileUpdateIntent),
61
+ Genesis,
62
+ IndexPrice(IndexPrice),
63
+ MarketClose(MarketClose),
64
+ SettlementValue(SettlementValue),
65
+ Block(Block),
66
+ AdvanceTime(StampedTimeValue),
67
+ AdvanceEpoch(AdvanceEpoch),
68
+ AdvanceSettlementEpoch(AdvanceSettlementEpoch),
69
+ PriceCheckpoint(MintPriceCheckpoint),
70
+ UpdateProductListings(UpdateProductListings),
71
+ UpdateEnrollment(EnrollmentEvent),
72
+ Upgrade(UpgradeParams),
73
+ }
74
+
75
+ #[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
76
+ pub struct RequestWithReceiptWire {
77
+ pub request: RequestWire,
78
+ pub receipt: Receipt,
79
+ }
80
+
81
+ impl From<&Request> for RequestWire {
82
+ fn from(value: &Request) -> Self {
83
+ match value {
84
+ Request::ClientRequest(request) => match request {
85
+ ClientRequest::Order(request) => Self::Order(request.clone()),
86
+ ClientRequest::ModifyOrder(request) => Self::ModifyOrder(request.clone()),
87
+ ClientRequest::CancelOrder(request) => Self::CancelOrder(request.clone()),
88
+ ClientRequest::CancelAll(request) => Self::CancelAll(request.clone()),
89
+ ClientRequest::Withdraw(request) => Self::Withdraw(request.clone()),
90
+ ClientRequest::WithdrawDDX(request) => Self::WithdrawDDX(request.clone()),
91
+ #[cfg(feature = "insurance_fund_client_req")]
92
+ ClientRequest::InsuranceFundWithdraw(request) => {
93
+ Self::InsuranceFundWithdraw(request.clone())
94
+ }
95
+ ClientRequest::ProfileUpdate(request) => Self::ProfileUpdate(request.clone()),
96
+ },
97
+ Request::Cmd(cmd) => match cmd {
98
+ Cmd::Genesis => Self::Genesis,
99
+ Cmd::IndexPrice(cmd) => Self::IndexPrice(cmd.clone()),
100
+ Cmd::MarketClose(cmd) => Self::MarketClose(cmd.clone()),
101
+ Cmd::SettlementValue(cmd) => Self::SettlementValue(cmd.clone()),
102
+ Cmd::Block(cmd) => Self::Block(cmd.clone()),
103
+ Cmd::AdvanceTime(cmd) => Self::AdvanceTime(*cmd),
104
+ Cmd::AdvanceEpoch(cmd) => Self::AdvanceEpoch(cmd.clone()),
105
+ Cmd::AdvanceSettlementEpoch(cmd) => Self::AdvanceSettlementEpoch(cmd.clone()),
106
+ Cmd::PriceCheckpoint(cmd) => Self::PriceCheckpoint(cmd.clone()),
107
+ Cmd::UpdateProductListings(cmd) => Self::UpdateProductListings(cmd.clone()),
108
+ Cmd::UpdateEnrollment(cmd) => Self::UpdateEnrollment(cmd.clone()),
109
+ Cmd::Upgrade(cmd) => Self::Upgrade(cmd.clone()),
110
+ },
111
+ }
112
+ }
113
+ }
114
+
115
+ impl From<RequestWire> for Request {
116
+ fn from(value: RequestWire) -> Self {
117
+ match value {
118
+ RequestWire::Order(request) => Self::ClientRequest(ClientRequest::Order(request)),
119
+ RequestWire::ModifyOrder(request) => {
120
+ Self::ClientRequest(ClientRequest::ModifyOrder(request))
121
+ }
122
+ RequestWire::CancelOrder(request) => {
123
+ Self::ClientRequest(ClientRequest::CancelOrder(request))
124
+ }
125
+ RequestWire::CancelAll(request) => {
126
+ Self::ClientRequest(ClientRequest::CancelAll(request))
127
+ }
128
+ RequestWire::Withdraw(request) => Self::ClientRequest(ClientRequest::Withdraw(request)),
129
+ RequestWire::WithdrawDDX(request) => {
130
+ Self::ClientRequest(ClientRequest::WithdrawDDX(request))
131
+ }
132
+ #[cfg(feature = "insurance_fund_client_req")]
133
+ RequestWire::InsuranceFundWithdraw(request) => {
134
+ Self::ClientRequest(ClientRequest::InsuranceFundWithdraw(request))
135
+ }
136
+ RequestWire::ProfileUpdate(request) => {
137
+ Self::ClientRequest(ClientRequest::ProfileUpdate(request))
138
+ }
139
+ RequestWire::Genesis => Self::Cmd(Cmd::Genesis),
140
+ RequestWire::IndexPrice(cmd) => Self::Cmd(Cmd::IndexPrice(cmd)),
141
+ RequestWire::MarketClose(cmd) => Self::Cmd(Cmd::MarketClose(cmd)),
142
+ RequestWire::SettlementValue(cmd) => Self::Cmd(Cmd::SettlementValue(cmd)),
143
+ RequestWire::Block(cmd) => Self::Cmd(Cmd::Block(cmd)),
144
+ RequestWire::AdvanceTime(cmd) => Self::Cmd(Cmd::AdvanceTime(cmd)),
145
+ RequestWire::AdvanceEpoch(cmd) => Self::Cmd(Cmd::AdvanceEpoch(cmd)),
146
+ RequestWire::AdvanceSettlementEpoch(cmd) => Self::Cmd(Cmd::AdvanceSettlementEpoch(cmd)),
147
+ RequestWire::PriceCheckpoint(cmd) => Self::Cmd(Cmd::PriceCheckpoint(cmd)),
148
+ RequestWire::UpdateProductListings(cmd) => Self::Cmd(Cmd::UpdateProductListings(cmd)),
149
+ RequestWire::UpdateEnrollment(cmd) => Self::Cmd(Cmd::UpdateEnrollment(cmd)),
150
+ RequestWire::Upgrade(cmd) => Self::Cmd(Cmd::Upgrade(cmd)),
151
+ }
152
+ }
153
+ }
154
+
155
+ impl From<&RequestWithReceipt> for RequestWithReceiptWire {
156
+ fn from(value: &RequestWithReceipt) -> Self {
157
+ Self {
158
+ request: RequestWire::from(&value.request),
159
+ receipt: value.receipt.clone(),
160
+ }
161
+ }
162
+ }
163
+
164
+ impl From<RequestWithReceiptWire> for RequestWithReceipt {
165
+ fn from(value: RequestWithReceiptWire) -> Self {
166
+ Self {
167
+ request: value.request.into(),
168
+ receipt: value.receipt,
169
+ }
170
+ }
171
+ }
172
+
173
+ pub fn serialize_preprocessed_request(
174
+ request: &PreProcessedRequest,
175
+ ) -> Result<Vec<u8>, AdapterError> {
176
+ serialize(request, "pre-processed request")
177
+ }
178
+
179
+ pub fn deserialize_preprocessed_request(bytes: &[u8]) -> Result<PreProcessedRequest, AdapterError> {
180
+ deserialize(bytes, "pre-processed request")
181
+ }
182
+
183
+ pub fn serialize_execution_outcome(outcome: &ExecutionOutcome) -> Result<Vec<u8>, AdapterError> {
184
+ serialize(outcome, "execution outcome")
185
+ }
186
+
187
+ pub fn deserialize_execution_outcome(bytes: &[u8]) -> Result<ExecutionOutcome, AdapterError> {
188
+ deserialize(bytes, "execution outcome")
189
+ }
190
+
191
+ pub fn serialize_request_with_receipt(value: &RequestWithReceipt) -> Result<Vec<u8>, AdapterError> {
192
+ serialize(&RequestWithReceiptWire::from(value), "request with receipt")
193
+ }
194
+
195
+ pub fn deserialize_request_with_receipt(bytes: &[u8]) -> Result<RequestWithReceipt, AdapterError> {
196
+ deserialize::<RequestWithReceiptWire>(bytes, "request with receipt").map(Into::into)
197
+ }
198
+
199
+ pub fn serialize_client_sequencing_outcome(
200
+ value: &ClientSequencingOutcome,
201
+ ) -> Result<Vec<u8>, AdapterError> {
202
+ serialize(value, "client sequencing outcome")
203
+ }
204
+
205
+ pub fn deserialize_client_sequencing_outcome(
206
+ bytes: &[u8],
207
+ ) -> Result<ClientSequencingOutcome, AdapterError> {
208
+ deserialize(bytes, "client sequencing outcome")
209
+ }
210
+
211
+ pub fn serialize_request(request: &Request) -> Result<Vec<u8>, AdapterError> {
212
+ serialize(&RequestWire::from(request), "request")
213
+ }
214
+
215
+ pub fn deserialize_request(bytes: &[u8]) -> Result<Request, AdapterError> {
216
+ deserialize::<RequestWire>(bytes, "request").map(Into::into)
217
+ }
218
+
219
+ #[cfg(test)]
220
+ mod tests {
221
+ use super::*;
222
+ use crate::{
223
+ ExecutionOutcome,
224
+ types::{
225
+ request::{
226
+ ClientRequest, ClientSequencingOutcome, Cmd, DdxSessionDelegatedPayload,
227
+ OrderIntent, OrderType, PreProcessedRequest, Receipt, Request, RequestWithReceipt,
228
+ SessionAction,
229
+ },
230
+ transaction::ExecutionOps,
231
+ },
232
+ };
233
+ use core_common::types::primitives::{CompressedKey, OrderSide};
234
+ use core_crypto::eip712::encode_delegated_policy_proof_v2;
235
+ use core_macros::unscaled;
236
+ use std::collections::BTreeSet;
237
+
238
+ fn order_request_with_session_key_signature() -> Request {
239
+ let session_key_signature = encode_delegated_policy_proof_v2(&DdxSessionDelegatedPayload {
240
+ session_signature: Default::default(),
241
+ expiry: 42,
242
+ acl_scope: BTreeSet::from([SessionAction::Order]),
243
+ session_public_key: CompressedKey::from_slice(&[0_u8; 33]),
244
+ })
245
+ .expect("encode delegated payload");
246
+
247
+ Request::ClientRequest(ClientRequest::Order(OrderIntent {
248
+ symbol: "ETHP".into(),
249
+ strategy: Default::default(),
250
+ side: OrderSide::Bid,
251
+ order_type: OrderType::Limit { post_only: false },
252
+ nonce: Default::default(),
253
+ client_timestamp_ms: 0,
254
+ recv_window_ms: crate::types::request::DEFAULT_RECV_WINDOW_MS,
255
+ amount: unscaled!(10),
256
+ price: unscaled!(200),
257
+ stop_price: Default::default(),
258
+ session_key_signature: Some(session_key_signature),
259
+ signature: Default::default(),
260
+ }))
261
+ }
262
+
263
+ #[test]
264
+ fn round_trip_preprocessed_request() {
265
+ let request = PreProcessedRequest::AdvanceTime(Default::default());
266
+ let encoded = serialize_preprocessed_request(&request).unwrap();
267
+ let decoded = deserialize_preprocessed_request(&encoded).unwrap();
268
+ assert_eq!(request, decoded);
269
+ }
270
+
271
+ #[test]
272
+ fn round_trip_execution_outcome() {
273
+ let outcome = ExecutionOutcome::Success(ExecutionOps::NonStateTransitioning(Vec::new()));
274
+ let encoded = serialize_execution_outcome(&outcome).unwrap();
275
+ let decoded = deserialize_execution_outcome(&encoded).unwrap();
276
+ assert_eq!(format!("{outcome:?}"), format!("{decoded:?}"));
277
+ }
278
+
279
+ #[test]
280
+ fn round_trip_request_with_receipt() {
281
+ let request = RequestWithReceipt {
282
+ request: Request::Cmd(Cmd::AdvanceTime(Default::default())),
283
+ receipt: Receipt::Sequenced {
284
+ nonce: Default::default(),
285
+ request_hash: Default::default(),
286
+ request_index: 1,
287
+ sender: Default::default(),
288
+ enclave_signature: Default::default(),
289
+ },
290
+ };
291
+ let encoded = serialize_request_with_receipt(&request).unwrap();
292
+ let decoded = deserialize_request_with_receipt(&encoded).unwrap();
293
+ assert_eq!(request, decoded);
294
+ }
295
+
296
+ #[test]
297
+ fn round_trip_retained_client_sequencing_outcome() {
298
+ let outcome = ClientSequencingOutcome::retained_retry(RequestWithReceipt {
299
+ request: Request::Cmd(Cmd::AdvanceTime(Default::default())),
300
+ receipt: Receipt::Sequenced {
301
+ nonce: Default::default(),
302
+ request_hash: Default::default(),
303
+ request_index: 9,
304
+ sender: Default::default(),
305
+ enclave_signature: Default::default(),
306
+ },
307
+ });
308
+ let encoded = serialize_client_sequencing_outcome(&outcome).unwrap();
309
+ let decoded = deserialize_client_sequencing_outcome(&encoded).unwrap();
310
+ assert_eq!(outcome, decoded);
311
+ assert!(!decoded.is_fresh());
312
+ }
313
+
314
+ #[test]
315
+ fn round_trip_request() {
316
+ let request = Request::Cmd(Cmd::AdvanceTime(Default::default()));
317
+ let encoded = serialize_request(&request).unwrap();
318
+ let decoded = deserialize_request(&encoded).unwrap();
319
+ assert_eq!(request, decoded);
320
+ }
321
+
322
+ #[test]
323
+ fn round_trip_order_request_with_session_key_signature() {
324
+ let request = order_request_with_session_key_signature();
325
+ let encoded = serialize_request(&request).unwrap();
326
+ let decoded = deserialize_request(&encoded).unwrap();
327
+ assert_eq!(request, decoded);
328
+ }
329
+ }
@@ -243,9 +243,12 @@ pub mod tests {
243
243
  fn test_calculate_fees() {
244
244
  let amount = dec!(10);
245
245
  let price = dec!(100);
246
+ let maker_fee = TradeSide::Maker.trading_fee(amount, price);
246
247
  let taker_fee = TradeSide::Taker.trading_fee(amount, price);
247
248
  let notional = amount * price;
248
249
  let fee = notional * *TAKER_FEE_BPS;
250
+ assert_eq!(maker_fee, Decimal::ZERO);
251
+ assert_eq!(taker_fee, dec!(0.5));
249
252
  assert_eq!(taker_fee, fee);
250
253
  }
251
254
 
@@ -1694,6 +1694,7 @@ pub mod test {
1694
1694
  ask_amount: amount,
1695
1695
  },
1696
1696
  },
1697
+ // NOTE: Treat nonzero fixture fee_percentage values as algebra inputs, not current fee-policy constants.
1697
1698
  // Substituting values into derivation 1:
1698
1699
  //
1699
1700
  // delta = 100 / (10 * 1 / 20 + 0.002 * 10) = 100 / (52 / 100) = 10000 / 52
@@ -43,9 +43,9 @@ pub const DEFAULT_MAX_LEVERAGE: u64 = 3;
43
43
 
44
44
  lazy_static! {
45
45
  static ref EMA_PERIODS: Decimal = Decimal::from(30);
46
- pub static ref MAKER_FEE_BPS: Decimal = Decimal::from_f32(0.0).unwrap();
47
- // The taker fee is currently set to 20 bps
48
- pub static ref TAKER_FEE_BPS: Decimal = Decimal::from_f32(0.002).unwrap();
46
+ pub static ref MAKER_FEE_BPS: Decimal = dec!(0);
47
+ // The taker fee is currently set to 5 bps
48
+ pub static ref TAKER_FEE_BPS: Decimal = dec!(0.0005);
49
49
  // The maintenance margin fraction. A maintenance margin fraction of
50
50
  // 0.15 gives a maintenance margin ratio of 0.15 / 3 = 0.05.
51
51
  pub static ref MMR_FRACTION: Decimal = Decimal::from_f32(0.15).unwrap();
@@ -1,7 +1,7 @@
1
1
  [package]
2
2
  name = "ddx-python"
3
3
  # NOTE: The maturin.bash build script replaces this by the SEMVER env variable for distribution.
4
- version = "1.0.6"
4
+ version = "1.1.6"
5
5
  edition = "2024"
6
6
 
7
7
  [lib]
@@ -108,8 +108,8 @@ async def test_affiliate_split_standard_usdc():
108
108
  Decimal("0"),
109
109
  )
110
110
 
111
- # Compute expected split on taker fee: 1 * 100 * 0.002 = 0.2 USDC.
112
- fee = Decimal("0.2")
111
+ # Compute expected split on taker fee: 1 * 100 * 0.0005 = 0.05 USDC.
112
+ fee = Decimal("0.05")
113
113
  expected_l1 = fee * Decimal("0.10")
114
114
  expected_l2 = fee * Decimal("0.05")
115
115
  expected_rebate = fee * Decimal("0.10")