Skip to content

Conversation

aarmoa
Copy link
Collaborator

@aarmoa aarmoa commented Sep 23, 2025

  • Updated proto definitions to match Injective core v1.16.4 and Indexer v1.16.91
  • Marked the v1 Composer as deprecated, in favor of the v2 Composer

Solves CP-619

Summary by CodeRabbit

  • New Features

    • Composer v2: Cancel Post-Only Mode support.
    • New Auctions V2 and Megavault RPCs (user, subscriptions, redemptions, buckets, TVL/PnL history).
    • Downtime Detector recovery query API.
    • Orderbook V2 now exposes height for spot and derivatives.
    • Expanded exchange/auction params (post-only thresholds, admins, bidders whitelist, etc.).
  • Changes

    • OFAC address list updated.
    • Example market launch scripts set oracle_scale_factor=0.
  • Chores

    • Compiled protos and indexer references updated; Composer v1 marked deprecated (emits warning).
  • Documentation

    • Changelog and project version bumped to 1.11.2.

@aarmoa aarmoa requested a review from Copilot September 23, 2025 17:21
Copy link
Contributor

coderabbitai bot commented Sep 23, 2025

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

Walkthrough

Adds release 1.11.2: regenerated protobufs and gRPC stubs for Injective core v1.16.4/indexer v1.16.91, adds new exchange messages/RPCs (including MsgCancelPostOnlyMode), emits Composer v1 deprecation, updates examples/tests, adds downtimedetector protos, and appends OFAC entries.

Changes

Cohort / File(s) Summary
Docs & Versioning
CHANGELOG.md, pyproject.toml
Added 1.11.2 changelog entry and bumped package version to 1.11.2.
Build/Config
Makefile, buf.gen.yaml
Updated git tags for cloned repos (indexer -> v1.16.91, other repo tags bumped); added proto as a public input in buf.gen.yaml.
Composer (deprecation + v2)
pyinjective/composer.py, pyinjective/composer_v2.py
composer.py now emits a DeprecationWarning on instantiation; composer_v2.py adds msg_cancel_post_only_mode(sender) returning MsgCancelPostOnlyMode.
Examples: oracle_scale_factor
examples/chain_client/exchange/13_MsgInstantBinaryOptionsMarketLaunch.py, examples/chain_client/exchange/4_MsgInstantPerpetualMarketLaunch.py, examples/chain_client/exchange/5_MsgInstantExpiryFuturesMarketLaunch.py
Changed oracle_scale_factor from 6 to 0 in market launch examples.
OFAC list
pyinjective/ofac.json
Appended 10 new hex addresses to the OFAC JSON array.
Exchange v2: params & tx additions
pyinjective/proto/injective/exchange/v2/exchange_pb2.py, .../tx_pb2.py, .../tx_pb2_grpc.py
Params message fields updated (multiple additions, one removal); added MsgSetDelegationTransferReceivers and MsgCancelPostOnlyMode message descriptors and RPCs SetDelegationTransferReceivers, CancelPostOnlyMode.
Auction RPC (indexer)
pyinjective/proto/exchange/injective_auction_rpc_pb2.py, pyinjective/proto/exchange/injective_auction_rpc_pb2_grpc.py
Added _AUCTIONCONTRACT and additional v2 auction descriptors; added RPCs AuctionsHistoryV2, AuctionV2, AccountAuctionsV2 (stubs/servicer/registration).
Megavault RPC
pyinjective/proto/exchange/injective_megavault_rpc_pb2.py, ..._pb2_grpc.py
Renamed GetVaultRequest.vaultvault_address; added nested Vault stats types; added RPCs GetUser, ListSubscriptions, ListRedemptions, GetOperatorRedemptionBuckets, TvlHistory, PnlHistory.
Downtimedetector (new)
pyinjective/proto/injective/downtimedetector/v1beta1/*
Added generated proto modules and gRPC stubs for downtime detector: downtime_duration, genesis, query and corresponding _pb2_grpc.py files.
Descriptor offset updates (proto regen)
pyinjective/proto/exchange/*, pyinjective/proto/injective/*
Many generated protobuf files updated: adjusted _serialized_start/_end offsets and descriptor wiring across exchange, derivative, spot, megavault, auction, and other modules due to proto regeneration.
Auction params field
pyinjective/proto/injective/auction/v1beta1/auction_pb2.py
Added Params.bidders_whitelist (string) field in auction proto.
Orderbook height (protos & tests)
pyinjective/proto/exchange/*_pb2.py, tests/client/indexer/*
Added height field to SpotLimitOrderbookV2 and DerivativeLimitOrderbookV2; tests updated to construct and expect height in fetch and stream flows.
Network tokens URL
pyinjective/core/network.py, tests/core/test_tokens_file_loader.py
Updated tokens list URL path from tokens/<net>.json to json/tokens/<net>.json; tests updated accordingly.
Tests: updated/added
various tests/...
Updated tests to reflect proto/schema changes (auction params, exchange params, orderbook height), added test for Composer v1 deprecation, and test for msg_cancel_post_only_mode.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant Dev as Developer App
  participant CV2 as Composer v2
  participant MsgSvc as exchange.v2.Msg (gRPC)
  participant Chain as Injective Chain

  Dev->>CV2: msg_cancel_post_only_mode(sender)
  CV2-->>Dev: MsgCancelPostOnlyMode (protobuf)

  Dev->>MsgSvc: CancelPostOnlyMode(request)
  MsgSvc->>Chain: submit tx / execute
  alt success
    Chain-->>MsgSvc: MsgCancelPostOnlyModeResponse
    MsgSvc-->>Dev: Response (tx result)
  else failure
    Chain-->>MsgSvc: Error
    MsgSvc-->>Dev: RPC error
  end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Poem

I thump the branch — new protos spring,
A cancel hop, a v2-fling.
Fields and RPCs pop and play,
OFAC seeds and tests at bay.
I nibble deprecations, then bound — v2 carrots found! 🥕

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed The title "release/v1_11_2" succinctly identifies this PR as a version/release bump to v1.11.2 and directly aligns with the PR objectives (proto updates and Composer v1 deprecation); it is specific and relevant for a release branch even though it uses a branch-style name rather than a full sentence.
✨ Finishing touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch release/v1_11_2

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

socket-security bot commented Sep 23, 2025

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Updatedckzg@​2.1.1 ⏵ 2.1.410010090100100
Updatedbitarray@​3.5.2 ⏵ 3.7.194 +2100100100100
Updatedclick@​8.2.1 ⏵ 8.3.096100100100100
Updatedcffi@​1.17.1 ⏵ 2.0.098 +1100100100100
Updatedcharset-normalizer@​3.4.2 ⏵ 3.4.399 +1100100100100
Addedcoincurve@​21.0.0100100100100100
Updatedcertifi@​2025.7.14 ⏵ 2025.8.310010010010070
Addedcoincurve@​18.0.0100100100100100
Addedcoincurve@​20.0.0100100100100100

View full report

Copy link

@Copilot Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This pull request updates the Injective Python SDK to version 1.11.2, incorporating protocol definition updates from Injective core v1.16.4 and Indexer v1.16.91. Additionally, it marks the v1 Composer as deprecated in favor of the v2 Composer.

Key changes include:

  • New proto definitions for exchange v2, auction, downtime detector, and megavault modules
  • Enhanced exchange functionality with new message types and parameters
  • Test updates to reflect new data structures and parameters

Reviewed Changes

Copilot reviewed 34 out of 35 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
pyproject.toml Version bump to 1.11.2
tests/test_composer_v2.py Added test for new MsgCancelPostOnlyMode functionality
tests/test_composer_deprecation_warnings.py Added test for v1 Composer deprecation warning
tests/client/indexer/stream_grpc/ Updated orderbook tests to include height field
tests/client/chain/grpc/ Updated exchange params and auction tests with new parameters
pyinjective/proto/ Multiple proto file updates including new RPC methods and data structures

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

sells=[sell],
sequence=5506752,
timestamp=1698982083606,
height=1000,
Copy link

Copilot AI Sep 23, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] The hardcoded height value '1000' should be extracted to a test constant or variable to improve maintainability and make it easier to update across multiple test files.

Copilot uses AI. Check for mistakes.

sells=[sell],
sequence=5506752,
timestamp=1698982083606,
height=1000,
Copy link

Copilot AI Sep 23, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] The hardcoded height value '1000' should be extracted to a test constant or variable to improve maintainability and make it easier to update across multiple test files.

Copilot uses AI. Check for mistakes.

sells=[sell],
sequence=5506752,
timestamp=1698982083606,
height=1000,
Copy link

Copilot AI Sep 23, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] The hardcoded height value '1000' appears multiple times and should be extracted to a test constant or variable to improve maintainability and consistency across tests.

Copilot uses AI. Check for mistakes.

sells=[sell],
sequence=5506752,
timestamp=1698982083606,
height=1000,
Copy link

Copilot AI Sep 23, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] The hardcoded height value '1000' appears multiple times and should be extracted to a test constant or variable to improve maintainability and consistency across tests.

Copilot uses AI. Check for mistakes.

sells=[sell],
sequence=5506752,
timestamp=1698982083606,
height=1000,
Copy link

Copilot AI Sep 23, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] The hardcoded height value '1000' appears multiple times and should be extracted to a test constant or variable to improve maintainability and consistency across tests.

Copilot uses AI. Check for mistakes.

sells=[sell],
sequence=5506752,
timestamp=1698982083606,
height=1000,
Copy link

Copilot AI Sep 23, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] The hardcoded height value '1000' appears multiple times and should be extracted to a test constant or variable to improve maintainability and consistency across tests.

Copilot uses AI. Check for mistakes.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
tests/test_composer_deprecation_warnings.py (1)

228-235: Fix unused variable in constructor deprecation test (Ruff F841).

No need to assign the instance; constructing it is enough to emit the warning.

Apply this diff:

-    def test_composer_v1_constructor_deprecation_warning(self):
-        with warnings.catch_warnings(record=True) as all_warnings:
-            composer = ComposerV1(network=Network.devnet().string())
+    def test_composer_v1_constructor_deprecation_warning(self):
+        with warnings.catch_warnings(record=True) as all_warnings:
+            ComposerV1(network=Network.devnet().string())
buf.gen.yaml (1)

19-31: Verification failed — buf generate errors: missing .proto files and unreachable injective-core repo

buf generate returned: 'Module "path: """ had no .proto files' and cloning https://github.com/InjectiveLabs/injective-core failed (Repository not found) — generation is blocked.

  • Check buf.gen.yaml (lines 19–31): ensure - directory: proto points to a directory that actually contains .proto files or update to the correct path.
  • Fix the injective-core input: the configured git_repo/tag is unreachable — replace with a valid public repo URL/tag or vendor the protos into the repo.

After fixes, re-run: buf lint && buf generate --template buf.gen.yaml && git status --porcelain

🧹 Nitpick comments (15)
pyinjective/ofac.json (2)

8-8: Normalize address comparisons at runtime (case-insensitive).

The file mixes lowercase and checksummed entries elsewhere; ensure consumers lower/upper-case both sides (or checksum-validate) before matching to avoid false negatives.

Can you confirm the matching code paths normalize address casing before comparison?

Also applies to: 30-30, 33-33, 42-42, 49-49, 59-59, 65-65, 67-67, 70-70, 76-76


8-8: Optional: Keep list sorted for diff hygiene.

Consider keeping addresses sorted (lexicographically) to simplify reviews and reduce merge conflicts for future additions.

Also applies to: 30-30, 33-33, 42-42, 49-49, 59-59, 65-65, 67-67, 70-70, 76-76

pyinjective/proto/injective/downtimedetector/v1beta1/query_pb2_grpc.py (2)

24-31: Ignore linters for generated stubs.

Ruff ARG002 on unused parameters in generated servicer methods is expected. Recommend per-file or path-based ignores for generated proto/grpc files.

Add to your Ruff config:

+[tool.ruff]
+extend-per-file-ignores = { "pyinjective/proto/**/*.py" = ["ARG002","F401","F841"] }

1-78: Ensure grpcio >=1.64.0 at runtime (add_registered_method_handlers added in v1.64.0)

poetry.lock pins grpcio >=1.71.2 (OK); pyproject.toml and Pipfile use grpcio = "*". Add a minimum constraint (>=1.64.0 or >=1.71.2) in pyproject/Pipfile to avoid installs without the lockfile pulling an older, incompatible grpcio.

pyinjective/proto/injective/downtimedetector/v1beta1/genesis_pb2.py (1)

1-43: Pin protobuf runtime to >=5.26.1 and pin grpcio/grpcio-tools consistently across packaging files.

pyproject.toml already has protobuf = "^5.26.1" (good) but pyproject.toml and Pipfile use grpcio/grpcio-tools = "" and Pipfile has protobuf = ""; make them consistent and reproducible:

  • Update pyproject.toml and Pipfile: protobuf = ">=5.26.1,<6.0dev" (or ^5.26.1), grpcio = ">=1.71.2", grpcio-tools = ">=1.75.0".
  • Re-lock/update lockfiles (poetry.lock / Pipfile.lock) so resolved versions match.
pyinjective/proto/exchange/injective_megavault_rpc_pb2.py (1)

26-94: Generated offsets look consistent; keep this file generated-only

LGTM. Recommend excluding pyinjective/proto/** from linters/formatters to avoid churn on generated code.

pyinjective/proto/exchange/injective_megavault_rpc_pb2_grpc.py (1)

66-107: Generated UNIMPLEMENTED methods trip ARG002; exclude generated code from ruff

Avoid touching generated servicer stubs; silence lint by excluding the proto output path.

Add to your Ruff config (example):

+[tool.ruff]
+extend-exclude = ["pyinjective/proto/**"]
pyinjective/proto/exchange/injective_auction_rpc_pb2_grpc.py (1)

73-93: Silence Ruff ARG002 for generated proto stubs (update ruff.toml)

ruff.toml has [lint.per-file-ignores] but no proto entry — add this line under that section to silence ARG002 for generated files:

"/pyinjective/proto//*.py" = ["ARG002"]

pyinjective/composer_v2.py (1)

1192-1194: Add GRPC type mappings for MsgCancelPostOnlyMode.

The constructor helper is good. To enable decoding/unpacking, consider adding the message and response to the GRPC maps.

Suggested additions outside the shown hunk:

  • In GRPC_MESSAGE_TYPE_TO_CLASS_MAP:
    "/injective.exchange.v2.MsgCancelPostOnlyMode": injective_exchange_tx_v2_pb.MsgCancelPostOnlyMode,
  • In GRPC_RESPONSE_TYPE_TO_CLASS_MAP (if a response type exists in protos):
    "/injective.exchange.v2.MsgCancelPostOnlyModeResponse": injective_exchange_tx_v2_pb.MsgCancelPostOnlyModeResponse,
  • Optionally, in REQUEST_TO_RESPONSE_TYPE_MAP (if used via MsgExec unpack):
    "MsgCancelPostOnlyMode": injective_exchange_tx_v2_pb.MsgCancelPostOnlyModeResponse
tests/client/chain/grpc/test_chain_grpc_auction_api.py (1)

26-33: Consider adding edge-case coverage for whitelist

Add tests for:

  • Empty whitelist (expect empty list in output).
  • Multiple addresses (order preserved).
tests/client/indexer/grpc/test_indexer_grpc_derivative_api.py (1)

412-421: Add a test for default/absent height

Validate behavior when height is unset/zero (expect "0" or explicit omission; choose and assert consistently).

tests/client/indexer/grpc/test_indexer_grpc_spot_api.py (1)

201-209: Add an edge-case test for height default

Cover unset/zero height behavior to lock in stable serialization.

pyproject.toml (2)

30-31: Pin a minimum grpc runtime to match generated stubs

Generated stubs use features from grpc/python v1.65.5; consider setting a lower bound to avoid runtime mismatches on older grpcio installations.

Apply this diff:

-grpcio = "*"
-grpcio-tools = "*"
+grpcio = ">=1.65.5"
+grpcio-tools = ">=1.65.5"

83-85: Optional: align Black target versions with supported Python

Project requires Python ^3.10. Keeping py39 is harmless, but you can drop it to reduce noise.

Makefile (1)

15-20: Make sed fix cross‑platform (optional)

sed -i "" works on macOS but not GNU sed. Consider a portable in-place strategy or OS guard to ease Linux usage.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ac4d044 and a114ab2.

⛔ Files ignored due to path filters (1)
  • poetry.lock is excluded by !**/*.lock
📒 Files selected for processing (34)
  • CHANGELOG.md (1 hunks)
  • Makefile (1 hunks)
  • buf.gen.yaml (1 hunks)
  • examples/chain_client/exchange/13_MsgInstantBinaryOptionsMarketLaunch.py (1 hunks)
  • examples/chain_client/exchange/4_MsgInstantPerpetualMarketLaunch.py (1 hunks)
  • examples/chain_client/exchange/5_MsgInstantExpiryFuturesMarketLaunch.py (1 hunks)
  • pyinjective/composer.py (1 hunks)
  • pyinjective/composer_v2.py (1 hunks)
  • pyinjective/ofac.json (4 hunks)
  • pyinjective/proto/exchange/injective_auction_rpc_pb2.py (2 hunks)
  • pyinjective/proto/exchange/injective_auction_rpc_pb2_grpc.py (4 hunks)
  • pyinjective/proto/exchange/injective_derivative_exchange_rpc_pb2.py (2 hunks)
  • pyinjective/proto/exchange/injective_megavault_rpc_pb2.py (2 hunks)
  • pyinjective/proto/exchange/injective_megavault_rpc_pb2_grpc.py (4 hunks)
  • pyinjective/proto/exchange/injective_spot_exchange_rpc_pb2.py (2 hunks)
  • pyinjective/proto/injective/auction/v1beta1/auction_pb2.py (2 hunks)
  • pyinjective/proto/injective/downtimedetector/v1beta1/downtime_duration_pb2.py (1 hunks)
  • pyinjective/proto/injective/downtimedetector/v1beta1/downtime_duration_pb2_grpc.py (1 hunks)
  • pyinjective/proto/injective/downtimedetector/v1beta1/genesis_pb2.py (1 hunks)
  • pyinjective/proto/injective/downtimedetector/v1beta1/genesis_pb2_grpc.py (1 hunks)
  • pyinjective/proto/injective/downtimedetector/v1beta1/query_pb2.py (1 hunks)
  • pyinjective/proto/injective/downtimedetector/v1beta1/query_pb2_grpc.py (1 hunks)
  • pyinjective/proto/injective/exchange/v2/exchange_pb2.py (3 hunks)
  • pyinjective/proto/injective/exchange/v2/tx_pb2.py (3 hunks)
  • pyinjective/proto/injective/exchange/v2/tx_pb2_grpc.py (4 hunks)
  • pyproject.toml (1 hunks)
  • tests/client/chain/grpc/test_chain_grpc_auction_api.py (6 hunks)
  • tests/client/chain/grpc/test_chain_grpc_exchange_v2_api.py (2 hunks)
  • tests/client/indexer/grpc/test_indexer_grpc_derivative_api.py (4 hunks)
  • tests/client/indexer/grpc/test_indexer_grpc_spot_api.py (4 hunks)
  • tests/client/indexer/stream_grpc/test_indexer_grpc_derivative_stream.py (2 hunks)
  • tests/client/indexer/stream_grpc/test_indexer_grpc_spot_stream.py (2 hunks)
  • tests/test_composer_deprecation_warnings.py (1 hunks)
  • tests/test_composer_v2.py (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (3)
tests/test_composer_deprecation_warnings.py (1)
pyinjective/core/network.py (2)
  • devnet (145-160)
  • string (350-351)
tests/test_composer_v2.py (1)
pyinjective/composer_v2.py (1)
  • msg_cancel_post_only_mode (1192-1193)
pyinjective/proto/exchange/injective_megavault_rpc_pb2_grpc.py (1)
pyinjective/core/network.py (1)
  • metadata (20-25)
🪛 Ruff (0.13.1)
tests/test_composer_deprecation_warnings.py

230-230: Local variable composer is assigned to but never used

Remove assignment to unused variable composer

(F841)

pyinjective/proto/injective/downtimedetector/v1beta1/query_pb2_grpc.py

27-27: Unused method argument: request

(ARG002)

pyinjective/proto/exchange/injective_auction_rpc_pb2_grpc.py

73-73: Unused method argument: request

(ARG002)


80-80: Unused method argument: request

(ARG002)


87-87: Unused method argument: request

(ARG002)

pyinjective/proto/injective/exchange/v2/tx_pb2_grpc.py

648-648: Unused method argument: request

(ARG002)


654-654: Unused method argument: request

(ARG002)

pyinjective/proto/exchange/injective_megavault_rpc_pb2_grpc.py

66-66: Unused method argument: request

(ARG002)


73-73: Unused method argument: request

(ARG002)


80-80: Unused method argument: request

(ARG002)


87-87: Unused method argument: request

(ARG002)


94-94: Unused method argument: request

(ARG002)


101-101: Unused method argument: request

(ARG002)

🔇 Additional comments (44)
pyinjective/ofac.json (1)

8-8: Formats & duplicates OK — confirm upstream OFAC source/date in PR. Verified all 10 added addresses are present, correctly formatted (0x + 40 hex) and there are no duplicates; total entries: 84. Add the OFAC SDN update reference or upstream source/date to the PR description/changelog.

pyinjective/proto/exchange/injective_derivative_exchange_rpc_pb2.py (2)

64-176: Generated descriptor offset reindexing — LGTM

Offsets realigned; no semantic/API changes apparent.


4-4: No action required — protobuf runtime matches generated code (5.26.1)
All 402 *_pb2.py files declare "Protobuf Python Version: 5.26.1" and pyproject.toml pins protobuf = ^5.26.1.

pyinjective/proto/injective/downtimedetector/v1beta1/genesis_pb2_grpc.py (1)

1-4: Generated gRPC stub: LGTM.

Boilerplate looks correct for a proto with no RPCs.

pyinjective/proto/injective/downtimedetector/v1beta1/downtime_duration_pb2_grpc.py (1)

1-4: Generated gRPC stub: LGTM.

Header-only stub is fine for an enum-only proto.

pyinjective/proto/injective/downtimedetector/v1beta1/downtime_duration_pb2.py (1)

1-78: Confirm protobuf runtime pin (>= 5.26.1).

Same generator version as other pb2 files; verify packaging pins accordingly.

Use the script in the genesis_pb2.py comment to check pins.

pyinjective/proto/injective/downtimedetector/v1beta1/query_pb2.py (1)

1-47: New Query types: LGTM; verify dependency alignment.

Types and service descriptor wiring look correct. Please confirm protobuf runtime pin as noted earlier.

Use the provided script to confirm pins.

tests/client/indexer/stream_grpc/test_indexer_grpc_spot_stream.py (2)

149-150: Added height to SpotLimitOrderbookV2 fixture — LGTM

The new height field is correctly set in the mocked orderbook payload.


196-197: Asserted height in expected payload with string conversion — LGTM

Repository search shows stream and gRPC API tests (spot, derivative, explorer) consistently use str(height); no inconsistencies found.

pyinjective/proto/exchange/injective_megavault_rpc_pb2_grpc.py (2)

116-146: Server handler registration looks correct

Handlers and serializers/deserializers are wired consistently with the new RPCs.

Note: grpcio version compatibility already flagged above.


23-52: New RPCs use _registered_method=True — ensure grpcio >= 1.63.0 (server API changes ~1.64.0)

File pyinjective/proto/exchange/injective_megavault_rpc_pb2_grpc.py (lines 23–52): stubs pass _registered_method=True; repository search found no grpcio pin. _registered_method was added in grpcio v1.63.0 and server add_registered_method_handlers appeared around v1.64.0 — pin or upgrade grpcio to >=1.63.0 (>=1.64.0 if relying on the server API).

pyinjective/proto/exchange/injective_megavault_rpc_pb2.py (1)

17-17: Proto surface expanded + field rename: update call sites & deps

  • GetVaultRequest field rename (vault → vault_address) is wire‑compatible but source‑breaking — update all call sites, tests, and docs/examples that construct or access this field.
  • Ensure runtime pins: protobuf >= 5.26.x and a grpcio version compatible with the generator that emits the "registered method" metadata.
  • Repo scan found no occurrences of GetVaultRequest constructors or protobuf/grpc pins in this repo — manually verify downstream consumers, examples, published packages, and non-Python callers.
pyinjective/proto/injective/exchange/v2/exchange_pb2.py (3)

71-72: LGTM: human_readable_upgrade_block_height field options wired.


159-232: LGTM: descriptor ranges realigned for new/changed messages.


61-62: Proto drift check — derivative_atomic_market_order_fee_multiplier is present; no action required

Found in pyinjective/proto/injective/exchange/v2/exchange_pb2.py and v1beta1/exchange_pb2.py and referenced in tests (tests/client/chain/grpc/*). Ignore unless the upstream .proto actually removes the field — only then regenerate pb2.

pyinjective/proto/exchange/injective_auction_rpc_pb2.py (2)

17-17: LGTM: v2 auction messages added (history, single, account-based, contract).


30-66: LGTM: descriptor indices updated to include new v2 types.

pyinjective/proto/exchange/injective_auction_rpc_pb2_grpc.py (2)

28-42: LGTM: client stubs for AuctionsHistoryV2, AuctionV2, AccountAuctionsV2.


121-135: LGTM: server handlers registered for new v2 RPCs.

examples/chain_client/exchange/5_MsgInstantExpiryFuturesMarketLaunch.py (1)

51-51: Confirm oracle_scale_factor=0 aligns with oracle feed.

Band/market config must expect 0 here; otherwise price scaling will be off.

tests/test_composer_v2.py (1)

2211-2227: LGTM: new test covers MsgCancelPostOnlyMode (v2).

examples/chain_client/exchange/13_MsgInstantBinaryOptionsMarketLaunch.py (1)

50-50: oracle_scale_factor set to 0 — confirm with provider expectations.

Looks fine and consistent across examples. Please verify 0 matches the oracle’s emitted scale for this market on testnet/mainnet.

examples/chain_client/exchange/4_MsgInstantPerpetualMarketLaunch.py (1)

51-51: oracle_scale_factor=0 change looks good.

Consistent with other launch examples. Double-check against the updated proto/oracle semantics.

pyinjective/composer.py (1)

140-146: Constructor deprecation warning — LGTM.

Clear guidance and correct category/stacklevel.

tests/client/chain/grpc/test_chain_grpc_exchange_v2_api.py (1)

68-71: New Params fields wired correctly.

Field creation and serialized expectations (stringified where applicable) look consistent with existing patterns.

Also applies to: 123-126

tests/client/indexer/stream_grpc/test_indexer_grpc_derivative_stream.py (1)

172-173: Orderbook height propagation — LGTM.

Height added to payload and asserted as string matches the existing conventions.

Also applies to: 219-220

tests/client/chain/grpc/test_chain_grpc_auction_api.py (3)

57-58: Module state: bidders_whitelist propagation is correct

The new field is consistently represented in expected_state.

Also applies to: 96-97


120-121: No-highest-bid path: bidders_whitelist coverage is correct

Good parity with the populated-state case.

Also applies to: 140-141


30-31: Approve — bidders_whitelist correctly mapped to biddersWhitelist

Verified in tests/client/chain/grpc/test_chain_grpc_auction_api.py: expected params/state include "biddersWhitelist": params.bidders_whitelist.

tests/client/indexer/grpc/test_indexer_grpc_derivative_api.py (2)

477-478: OrderbooksV2: height propagated within nested orderbook — OK

Consistent with single orderbook expectations.

Also applies to: 515-516


417-418: OrderbookV2: height mapping verified end-to-end — approve

Indexer gRPC spot/derivative APIs return proto responses via GrpcApiRequestAssistant.execute_call which uses google.protobuf.json_format.MessageToDict; tests assert "height" is emitted as a string (e.g. height=1000 -> "height": str(orderbook.height)).

tests/client/indexer/grpc/test_indexer_grpc_spot_api.py (2)

266-267: Spot OrderbooksV2: nested height propagation — OK

Consistent with single orderbook expectations.

Also applies to: 304-305


206-207: Incorrect: Spot/Derivative OrderbookV2 clients don't set request.height

fetch_orderbook_v2 in pyinjective/client/indexer/grpc/indexer_grpc_spot_api.py and pyinjective/client/indexer/grpc/indexer_grpc_derivative_api.py builds OrderbookV2Request(market_id=market_id, depth=depth) with no request.height assignment; only explorer API assigns height (pyinjective/client/indexer/grpc/indexer_grpc_explorer_api.py). Tests pass height (tests/client/indexer/grpc/test_indexer_grpc_spot_api.py:206–207) but the client mapping does not include it.

Likely an incorrect or invalid review comment.

pyproject.toml (1)

3-3: Version bump LGTM

Matches CHANGELOG 1.11.2. No concerns.

CHANGELOG.md (1)

5-12: Changelog entry LGTM

Accurately documents new Composer v2 support and compiled proto updates; deprecates v1 Composer.

Makefile (1)

34-34: Indexer tag bump to v1.16.91 — LGTM

Matches PR objective and buf inputs.

pyinjective/proto/injective/auction/v1beta1/auction_pb2.py (1)

20-58: Added Params.bidders_whitelist — LGTM

Generated correctly with YAML tag mapping to biddersWhitelist. No manual edits needed.

Confirm any YAML/JSON fixtures and tests expecting Params include biddersWhitelist where applicable.

pyinjective/proto/injective/exchange/v2/tx_pb2_grpc.py (4)

273-282: Client stub: SetDelegationTransferReceivers and CancelPostOnlyMode — LGTM

Endpoints are correctly wired to request/response types.


648-659: Servicer stubs added — expected UNIMPLEMENTED placeholders

These are generated; argument unused warnings can be ignored for excluded paths.


918-927: Server registration updated — LGTM

RPC handlers registered for the new methods.


2317-2370: EXPERIMENTAL static client wrappers added — LGTM

Consistent with other methods.

pyinjective/proto/injective/exchange/v2/tx_pb2.py (2)

546-555: Approve — Composer v2 builder & tests for CancelPostOnlyMode verified

msg_cancel_post_only_mode exists in pyinjective/composer_v2.py; tests in tests/test_composer_v2.py cover MsgCancelPostOnlyMode; protobuf/grpc wiring present in pyinjective/proto/injective/exchange/v2/tx_pb2.py and tx_pb2_grpc.py.


322-326: Note on grpc/protobuf runtime compatibility

Generated code targets grpc/python v1.65.5 and protobuf 26.1 (Python pkg 5.26.x). Local check: import 'grpc' not found (grpcio likely missing); google.protobuf present but version not reported. Ensure runtime has grpcio >= 1.65.5 and protobuf >= 5.26.x (add/pin in pyproject.toml and CI).

pyinjective/proto/exchange/injective_spot_exchange_rpc_pb2.py (1)

45-124: SpotLimitOrderbookV2 now includes height — verify downstream handling

Python search shows SpotLimitOrderbookV2 is only instantiated in tests (tests/client/indexer/grpc/test_indexer_grpc_spot_api.py and tests/client/indexer/stream_grpc/test_indexer_grpc_spot_stream.py); no production code or serialization/parse sites were found. Ensure downstream/non‑Python clients regenerate protos and tolerate/propagate the new height field.

Comment on lines +212 to +291
@staticmethod
def AuctionsHistoryV2(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(
request,
target,
'/injective_auction_rpc.InjectiveAuctionRPC/AuctionsHistoryV2',
exchange_dot_injective__auction__rpc__pb2.AuctionsHistoryV2Request.SerializeToString,
exchange_dot_injective__auction__rpc__pb2.AuctionsHistoryV2Response.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)

@staticmethod
def AuctionV2(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(
request,
target,
'/injective_auction_rpc.InjectiveAuctionRPC/AuctionV2',
exchange_dot_injective__auction__rpc__pb2.AuctionV2Request.SerializeToString,
exchange_dot_injective__auction__rpc__pb2.AuctionV2Response.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)

@staticmethod
def AccountAuctionsV2(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(
request,
target,
'/injective_auction_rpc.InjectiveAuctionRPC/AccountAuctionsV2',
exchange_dot_injective__auction__rpc__pb2.AccountAuctionsV2Request.SerializeToString,
exchange_dot_injective__auction__rpc__pb2.AccountAuctionsV2Response.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

🧩 Analysis chain

Ensure grpcio version supports _registered_method kwarg.

Recent grpcio codegen uses _registered_method. Pin grpcio to a compatible version.

Run to confirm grpcio pin:


🏁 Script executed:

#!/bin/bash
set -euo pipefail
fd -a 'pyproject.toml' -0 2>/dev/null | xargs -0 -I{} sh -c "echo '--- {} ---'; rg -n 'grpcio' {} || true"
fd -a 'requirements*.txt' -0 2>/dev/null | xargs -0 -I{} sh -c "echo '--- {} ---'; rg -n 'grpcio' {} || true"

Length of output: 79


Pin grpcio/grpcio-tools to versions that support the generated _registered_method kwarg

pyproject.toml currently has grpcio = "" and grpcio-tools = ""; pin them to explicit compatible versions (or regenerate stubs without _registered_method) to avoid runtime breakage. Location: pyproject.toml lines 30–31

Comment on lines +185 to +345
@staticmethod
def GetUser(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(
request,
target,
'/injective_megavault_rpc.InjectiveMegavaultRPC/GetUser',
exchange_dot_injective__megavault__rpc__pb2.GetUserRequest.SerializeToString,
exchange_dot_injective__megavault__rpc__pb2.GetUserResponse.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)

@staticmethod
def ListSubscriptions(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(
request,
target,
'/injective_megavault_rpc.InjectiveMegavaultRPC/ListSubscriptions',
exchange_dot_injective__megavault__rpc__pb2.ListSubscriptionsRequest.SerializeToString,
exchange_dot_injective__megavault__rpc__pb2.ListSubscriptionsResponse.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)

@staticmethod
def ListRedemptions(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(
request,
target,
'/injective_megavault_rpc.InjectiveMegavaultRPC/ListRedemptions',
exchange_dot_injective__megavault__rpc__pb2.ListRedemptionsRequest.SerializeToString,
exchange_dot_injective__megavault__rpc__pb2.ListRedemptionsResponse.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)

@staticmethod
def GetOperatorRedemptionBuckets(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(
request,
target,
'/injective_megavault_rpc.InjectiveMegavaultRPC/GetOperatorRedemptionBuckets',
exchange_dot_injective__megavault__rpc__pb2.GetOperatorRedemptionBucketsRequest.SerializeToString,
exchange_dot_injective__megavault__rpc__pb2.GetOperatorRedemptionBucketsResponse.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)

@staticmethod
def TvlHistory(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(
request,
target,
'/injective_megavault_rpc.InjectiveMegavaultRPC/TvlHistory',
exchange_dot_injective__megavault__rpc__pb2.TvlHistoryRequest.SerializeToString,
exchange_dot_injective__megavault__rpc__pb2.TvlHistoryResponse.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)

@staticmethod
def PnlHistory(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(
request,
target,
'/injective_megavault_rpc.InjectiveMegavaultRPC/PnlHistory',
exchange_dot_injective__megavault__rpc__pb2.PnlHistoryRequest.SerializeToString,
exchange_dot_injective__megavault__rpc__pb2.PnlHistoryResponse.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

🧩 Analysis chain

Experimental client helpers added; ensure SDK surface/doc updates

Please expose these RPCs in your higher‑level client wrappers and update docs/examples.

Run to locate wrapper implementations and missing mentions in examples:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Potential wrappers using new RPCs (function names may vary):"
rg -nP --type=py -C2 '\b(get_user|list_subscriptions|list_redemptions|get_operator_redemption_buckets|tvl_history|pnl_history)\b' || true

echo; echo "Examples/docs referencing these RPCs:"
fd -a examples docs 2>/dev/null | xargs -I{} rg -nP -C1 '(GetUser|ListSubscriptions|ListRedemptions|OperatorRedemptionBuckets|TvlHistory|PnlHistory)' {} || true

Length of output: 99


Expose new InjectiveMegavaultRPC methods in SDK client wrappers and update docs/examples

pyinjective/proto/exchange/injective_megavault_rpc_pb2_grpc.py adds GetUser, ListSubscriptions, ListRedemptions, GetOperatorRedemptionBuckets, TvlHistory and PnlHistory; repository search returned no wrappers or docs referencing these — add corresponding higher‑level client methods and update examples/docs.

🤖 Prompt for AI Agents
In pyinjective/proto/exchange/injective_megavault_rpc_pb2_grpc.py around lines
185-345 the new gRPC methods GetUser, ListSubscriptions, ListRedemptions,
GetOperatorRedemptionBuckets, TvlHistory and PnlHistory are exposed at the proto
layer but there are no corresponding higher-level SDK client wrappers or docs;
add methods to the SDK client (e.g., InjectiveMegavaultClient or whichever
wrapper module maps grpc calls to user-friendly methods) that accept
domain-friendly params, construct the proper request proto, call the generated
grpc stub method, handle errors, and return/deserialise the response into SDK
types (or raw proto if consistent with other wrappers); update imports to
reference exchange_dot_injective__megavault__rpc__pb2 and the generated grpc
stub, add unit tests exercising each new wrapper, and update
README/docs/examples to show usage for each new method including
request/response examples and any pagination/timeout/metadata options.



DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$injective/exchange/v2/exchange.proto\x12\x15injective.exchange.v2\x1a\x14gogoproto/gogo.proto\x1a\x11\x61mino/amino.proto\x1a\x1e\x63osmos/base/v1beta1/coin.proto\x1a%injective/oracle/v1beta1/oracle.proto\x1a\"injective/exchange/v2/market.proto\x1a!injective/exchange/v2/order.proto\"\xa4\x17\n\x06Params\x12\x65\n\x1fspot_market_instant_listing_fee\x18\x01 \x01(\x0b\x32\x19.cosmos.base.v1beta1.CoinB\x04\xc8\xde\x1f\x00R\x1bspotMarketInstantListingFee\x12q\n%derivative_market_instant_listing_fee\x18\x02 \x01(\x0b\x32\x19.cosmos.base.v1beta1.CoinB\x04\xc8\xde\x1f\x00R!derivativeMarketInstantListingFee\x12\x61\n\x1b\x64\x65\x66\x61ult_spot_maker_fee_rate\x18\x03 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x17\x64\x65\x66\x61ultSpotMakerFeeRate\x12\x61\n\x1b\x64\x65\x66\x61ult_spot_taker_fee_rate\x18\x04 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x17\x64\x65\x66\x61ultSpotTakerFeeRate\x12m\n!default_derivative_maker_fee_rate\x18\x05 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x1d\x64\x65\x66\x61ultDerivativeMakerFeeRate\x12m\n!default_derivative_taker_fee_rate\x18\x06 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x1d\x64\x65\x66\x61ultDerivativeTakerFeeRate\x12\x64\n\x1c\x64\x65\x66\x61ult_initial_margin_ratio\x18\x07 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x19\x64\x65\x66\x61ultInitialMarginRatio\x12l\n default_maintenance_margin_ratio\x18\x08 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x1d\x64\x65\x66\x61ultMaintenanceMarginRatio\x12\x38\n\x18\x64\x65\x66\x61ult_funding_interval\x18\t \x01(\x03R\x16\x64\x65\x66\x61ultFundingInterval\x12)\n\x10\x66unding_multiple\x18\n \x01(\x03R\x0f\x66undingMultiple\x12X\n\x16relayer_fee_share_rate\x18\x0b \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x13relayerFeeShareRate\x12i\n\x1f\x64\x65\x66\x61ult_hourly_funding_rate_cap\x18\x0c \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x1b\x64\x65\x66\x61ultHourlyFundingRateCap\x12\x64\n\x1c\x64\x65\x66\x61ult_hourly_interest_rate\x18\r \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x19\x64\x65\x66\x61ultHourlyInterestRate\x12\x44\n\x1fmax_derivative_order_side_count\x18\x0e \x01(\rR\x1bmaxDerivativeOrderSideCount\x12s\n\'inj_reward_staked_requirement_threshold\x18\x0f \x01(\tB\x1d\xc8\xde\x1f\x00\xda\xde\x1f\x15\x63osmossdk.io/math.IntR#injRewardStakedRequirementThreshold\x12G\n trading_rewards_vesting_duration\x18\x10 \x01(\x03R\x1dtradingRewardsVestingDuration\x12\x64\n\x1cliquidator_reward_share_rate\x18\x11 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x19liquidatorRewardShareRate\x12x\n)binary_options_market_instant_listing_fee\x18\x12 \x01(\x0b\x32\x19.cosmos.base.v1beta1.CoinB\x04\xc8\xde\x1f\x00R$binaryOptionsMarketInstantListingFee\x12{\n atomic_market_order_access_level\x18\x13 \x01(\x0e\x32\x33.injective.exchange.v2.AtomicMarketOrderAccessLevelR\x1c\x61tomicMarketOrderAccessLevel\x12x\n\'spot_atomic_market_order_fee_multiplier\x18\x14 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\"spotAtomicMarketOrderFeeMultiplier\x12\x84\x01\n-derivative_atomic_market_order_fee_multiplier\x18\x15 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR(derivativeAtomicMarketOrderFeeMultiplier\x12\x8b\x01\n1binary_options_atomic_market_order_fee_multiplier\x18\x16 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR+binaryOptionsAtomicMarketOrderFeeMultiplier\x12^\n\x19minimal_protocol_fee_rate\x18\x17 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x16minimalProtocolFeeRate\x12[\n+is_instant_derivative_market_launch_enabled\x18\x18 \x01(\x08R&isInstantDerivativeMarketLaunchEnabled\x12\x44\n\x1fpost_only_mode_height_threshold\x18\x19 \x01(\x03R\x1bpostOnlyModeHeightThreshold\x12g\n1margin_decrease_price_timestamp_threshold_seconds\x18\x1a \x01(\x03R,marginDecreasePriceTimestampThresholdSeconds\x12\'\n\x0f\x65xchange_admins\x18\x1b \x03(\tR\x0e\x65xchangeAdmins\x12L\n\x13inj_auction_max_cap\x18\x1c \x01(\tB\x1d\xc8\xde\x1f\x00\xda\xde\x1f\x15\x63osmossdk.io/math.IntR\x10injAuctionMaxCap\x12*\n\x11\x66ixed_gas_enabled\x18\x1d \x01(\x08R\x0f\x66ixedGasEnabled\x12;\n\x1a\x65mit_legacy_version_events\x18\x1e \x01(\x08R\x17\x65mitLegacyVersionEvents\x12\x62\n\x1b\x64\x65\x66\x61ult_reduce_margin_ratio\x18\x1f \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x18\x64\x65\x66\x61ultReduceMarginRatio:\x18\xe8\xa0\x1f\x01\x8a\xe7\xb0*\x0f\x65xchange/Params\"=\n\x14NextFundingTimestamp\x12%\n\x0enext_timestamp\x18\x01 \x01(\x03R\rnextTimestamp\"\xea\x01\n\x0eMidPriceAndTOB\x12@\n\tmid_price\x18\x01 \x01(\tB#\xc8\xde\x1f\x01\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x08midPrice\x12I\n\x0e\x62\x65st_buy_price\x18\x02 \x01(\tB#\xc8\xde\x1f\x01\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x0c\x62\x65stBuyPrice\x12K\n\x0f\x62\x65st_sell_price\x18\x03 \x01(\tB#\xc8\xde\x1f\x01\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\rbestSellPrice\"\xa5\x01\n\x07\x44\x65posit\x12P\n\x11\x61vailable_balance\x18\x01 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x10\x61vailableBalance\x12H\n\rtotal_balance\x18\x02 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x0ctotalBalance\",\n\x14SubaccountTradeNonce\x12\x14\n\x05nonce\x18\x01 \x01(\rR\x05nonce\"\xc3\x01\n\x0fSubaccountOrder\x12\x39\n\x05price\x18\x01 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x05price\x12?\n\x08quantity\x18\x02 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x08quantity\x12\"\n\x0cisReduceOnly\x18\x03 \x01(\x08R\x0cisReduceOnly\x12\x10\n\x03\x63id\x18\x04 \x01(\tR\x03\x63id\"r\n\x13SubaccountOrderData\x12<\n\x05order\x18\x01 \x01(\x0b\x32&.injective.exchange.v2.SubaccountOrderR\x05order\x12\x1d\n\norder_hash\x18\x02 \x01(\x0cR\torderHash\"\xc5\x02\n\x08Position\x12\x16\n\x06isLong\x18\x01 \x01(\x08R\x06isLong\x12?\n\x08quantity\x18\x02 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x08quantity\x12\x44\n\x0b\x65ntry_price\x18\x03 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\nentryPrice\x12;\n\x06margin\x18\x04 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x06margin\x12]\n\x18\x63umulative_funding_entry\x18\x05 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x16\x63umulativeFundingEntry\"\x8a\x01\n\x07\x42\x61lance\x12#\n\rsubaccount_id\x18\x01 \x01(\tR\x0csubaccountId\x12\x14\n\x05\x64\x65nom\x18\x02 \x01(\tR\x05\x64\x65nom\x12:\n\x08\x64\x65posits\x18\x03 \x01(\x0b\x32\x1e.injective.exchange.v2.DepositR\x08\x64\x65posits:\x08\x88\xa0\x1f\x00\xe8\xa0\x1f\x00\"\x9d\x01\n\x12\x44\x65rivativePosition\x12#\n\rsubaccount_id\x18\x01 \x01(\tR\x0csubaccountId\x12\x1b\n\tmarket_id\x18\x02 \x01(\tR\x08marketId\x12;\n\x08position\x18\x03 \x01(\x0b\x32\x1f.injective.exchange.v2.PositionR\x08position:\x08\x88\xa0\x1f\x00\xe8\xa0\x1f\x00\"I\n\x14MarketOrderIndicator\x12\x1b\n\tmarket_id\x18\x01 \x01(\tR\x08marketId\x12\x14\n\x05isBuy\x18\x02 \x01(\x08R\x05isBuy\"\xcd\x02\n\x08TradeLog\x12?\n\x08quantity\x18\x01 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x08quantity\x12\x39\n\x05price\x18\x02 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x05price\x12#\n\rsubaccount_id\x18\x03 \x01(\x0cR\x0csubaccountId\x12\x35\n\x03\x66\x65\x65\x18\x04 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x03\x66\x65\x65\x12\x1d\n\norder_hash\x18\x05 \x01(\x0cR\torderHash\x12\x38\n\x15\x66\x65\x65_recipient_address\x18\x06 \x01(\x0c\x42\x04\xc8\xde\x1f\x01R\x13\x66\x65\x65RecipientAddress\x12\x10\n\x03\x63id\x18\x07 \x01(\tR\x03\x63id\"\x9a\x02\n\rPositionDelta\x12\x17\n\x07is_long\x18\x01 \x01(\x08R\x06isLong\x12R\n\x12\x65xecution_quantity\x18\x02 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x11\x65xecutionQuantity\x12N\n\x10\x65xecution_margin\x18\x03 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x0f\x65xecutionMargin\x12L\n\x0f\x65xecution_price\x18\x04 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x0e\x65xecutionPrice\"\x9c\x03\n\x12\x44\x65rivativeTradeLog\x12#\n\rsubaccount_id\x18\x01 \x01(\x0cR\x0csubaccountId\x12K\n\x0eposition_delta\x18\x02 \x01(\x0b\x32$.injective.exchange.v2.PositionDeltaR\rpositionDelta\x12;\n\x06payout\x18\x03 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x06payout\x12\x35\n\x03\x66\x65\x65\x18\x04 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x03\x66\x65\x65\x12\x1d\n\norder_hash\x18\x05 \x01(\x0cR\torderHash\x12\x38\n\x15\x66\x65\x65_recipient_address\x18\x06 \x01(\x0c\x42\x04\xc8\xde\x1f\x01R\x13\x66\x65\x65RecipientAddress\x12\x10\n\x03\x63id\x18\x07 \x01(\tR\x03\x63id\x12\x35\n\x03pnl\x18\x08 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x03pnl\"v\n\x12SubaccountPosition\x12;\n\x08position\x18\x01 \x01(\x0b\x32\x1f.injective.exchange.v2.PositionR\x08position\x12#\n\rsubaccount_id\x18\x02 \x01(\x0cR\x0csubaccountId\"r\n\x11SubaccountDeposit\x12#\n\rsubaccount_id\x18\x01 \x01(\x0cR\x0csubaccountId\x12\x38\n\x07\x64\x65posit\x18\x02 \x01(\x0b\x32\x1e.injective.exchange.v2.DepositR\x07\x64\x65posit\"k\n\rDepositUpdate\x12\x14\n\x05\x64\x65nom\x18\x01 \x01(\tR\x05\x64\x65nom\x12\x44\n\x08\x64\x65posits\x18\x02 \x03(\x0b\x32(.injective.exchange.v2.SubaccountDepositR\x08\x64\x65posits\"\xcc\x01\n\x10PointsMultiplier\x12[\n\x17maker_points_multiplier\x18\x01 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x15makerPointsMultiplier\x12[\n\x17taker_points_multiplier\x18\x02 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x15takerPointsMultiplier\"\xf4\x02\n\x1eTradingRewardCampaignBoostInfo\x12\x35\n\x17\x62oosted_spot_market_ids\x18\x01 \x03(\tR\x14\x62oostedSpotMarketIds\x12\x65\n\x17spot_market_multipliers\x18\x02 \x03(\x0b\x32\'.injective.exchange.v2.PointsMultiplierB\x04\xc8\xde\x1f\x00R\x15spotMarketMultipliers\x12\x41\n\x1d\x62oosted_derivative_market_ids\x18\x03 \x03(\tR\x1a\x62oostedDerivativeMarketIds\x12q\n\x1d\x64\x65rivative_market_multipliers\x18\x04 \x03(\x0b\x32\'.injective.exchange.v2.PointsMultiplierB\x04\xc8\xde\x1f\x00R\x1b\x64\x65rivativeMarketMultipliers\"\xbc\x01\n\x12\x43\x61mpaignRewardPool\x12\'\n\x0fstart_timestamp\x18\x01 \x01(\x03R\x0estartTimestamp\x12}\n\x14max_campaign_rewards\x18\x02 \x03(\x0b\x32\x19.cosmos.base.v1beta1.CoinB0\xc8\xde\x1f\x00\xaa\xdf\x1f(github.com/cosmos/cosmos-sdk/types.CoinsR\x12maxCampaignRewards\"\xa4\x02\n\x19TradingRewardCampaignInfo\x12:\n\x19\x63\x61mpaign_duration_seconds\x18\x01 \x01(\x03R\x17\x63\x61mpaignDurationSeconds\x12!\n\x0cquote_denoms\x18\x02 \x03(\tR\x0bquoteDenoms\x12p\n\x19trading_reward_boost_info\x18\x03 \x01(\x0b\x32\x35.injective.exchange.v2.TradingRewardCampaignBoostInfoR\x16tradingRewardBoostInfo\x12\x36\n\x17\x64isqualified_market_ids\x18\x04 \x03(\tR\x15\x64isqualifiedMarketIds\"\xc0\x02\n\x13\x46\x65\x65\x44iscountTierInfo\x12S\n\x13maker_discount_rate\x18\x01 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x11makerDiscountRate\x12S\n\x13taker_discount_rate\x18\x02 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x11takerDiscountRate\x12\x42\n\rstaked_amount\x18\x03 \x01(\tB\x1d\xc8\xde\x1f\x00\xda\xde\x1f\x15\x63osmossdk.io/math.IntR\x0cstakedAmount\x12;\n\x06volume\x18\x04 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x06volume\"\x87\x02\n\x13\x46\x65\x65\x44iscountSchedule\x12!\n\x0c\x62ucket_count\x18\x01 \x01(\x04R\x0b\x62ucketCount\x12\'\n\x0f\x62ucket_duration\x18\x02 \x01(\x03R\x0e\x62ucketDuration\x12!\n\x0cquote_denoms\x18\x03 \x03(\tR\x0bquoteDenoms\x12I\n\ntier_infos\x18\x04 \x03(\x0b\x32*.injective.exchange.v2.FeeDiscountTierInfoR\ttierInfos\x12\x36\n\x17\x64isqualified_market_ids\x18\x05 \x03(\tR\x15\x64isqualifiedMarketIds\"M\n\x12\x46\x65\x65\x44iscountTierTTL\x12\x12\n\x04tier\x18\x01 \x01(\x04R\x04tier\x12#\n\rttl_timestamp\x18\x02 \x01(\x03R\x0cttlTimestamp\"\x91\x01\n\x0e\x41\x63\x63ountRewards\x12\x18\n\x07\x61\x63\x63ount\x18\x01 \x01(\tR\x07\x61\x63\x63ount\x12\x65\n\x07rewards\x18\x02 \x03(\x0b\x32\x19.cosmos.base.v1beta1.CoinB0\xc8\xde\x1f\x00\xaa\xdf\x1f(github.com/cosmos/cosmos-sdk/types.CoinsR\x07rewards\"\x81\x01\n\x0cTradeRecords\x12\x1b\n\tmarket_id\x18\x01 \x01(\tR\x08marketId\x12T\n\x14latest_trade_records\x18\x02 \x03(\x0b\x32\".injective.exchange.v2.TradeRecordR\x12latestTradeRecords\"6\n\rSubaccountIDs\x12%\n\x0esubaccount_ids\x18\x01 \x03(\x0cR\rsubaccountIds\"\xa7\x01\n\x0bTradeRecord\x12\x1c\n\ttimestamp\x18\x01 \x01(\x03R\ttimestamp\x12\x39\n\x05price\x18\x02 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x05price\x12?\n\x08quantity\x18\x03 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x08quantity\"m\n\x05Level\x12\x31\n\x01p\x18\x01 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x01p\x12\x31\n\x01q\x18\x02 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x01q\"\x92\x01\n\x1f\x41ggregateSubaccountVolumeRecord\x12#\n\rsubaccount_id\x18\x01 \x01(\tR\x0csubaccountId\x12J\n\x0emarket_volumes\x18\x02 \x03(\x0b\x32#.injective.exchange.v2.MarketVolumeR\rmarketVolumes\"\x84\x01\n\x1c\x41ggregateAccountVolumeRecord\x12\x18\n\x07\x61\x63\x63ount\x18\x01 \x01(\tR\x07\x61\x63\x63ount\x12J\n\x0emarket_volumes\x18\x02 \x03(\x0b\x32#.injective.exchange.v2.MarketVolumeR\rmarketVolumes\"A\n\rDenomDecimals\x12\x14\n\x05\x64\x65nom\x18\x01 \x01(\tR\x05\x64\x65nom\x12\x1a\n\x08\x64\x65\x63imals\x18\x02 \x01(\x04R\x08\x64\x65\x63imals\"e\n\x12GrantAuthorization\x12\x18\n\x07grantee\x18\x01 \x01(\tR\x07grantee\x12\x35\n\x06\x61mount\x18\x02 \x01(\tB\x1d\xc8\xde\x1f\x00\xda\xde\x1f\x15\x63osmossdk.io/math.IntR\x06\x61mount\"^\n\x0b\x41\x63tiveGrant\x12\x18\n\x07granter\x18\x01 \x01(\tR\x07granter\x12\x35\n\x06\x61mount\x18\x02 \x01(\tB\x1d\xc8\xde\x1f\x00\xda\xde\x1f\x15\x63osmossdk.io/math.IntR\x06\x61mount\"\x90\x01\n\x0e\x45\x66\x66\x65\x63tiveGrant\x12\x18\n\x07granter\x18\x01 \x01(\tR\x07granter\x12I\n\x11net_granted_stake\x18\x02 \x01(\tB\x1d\xc8\xde\x1f\x00\xda\xde\x1f\x15\x63osmossdk.io/math.IntR\x0fnetGrantedStake\x12\x19\n\x08is_valid\x18\x03 \x01(\x08R\x07isValid\"p\n\x10\x44\x65nomMinNotional\x12\x14\n\x05\x64\x65nom\x18\x01 \x01(\tR\x05\x64\x65nom\x12\x46\n\x0cmin_notional\x18\x02 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x0bminNotional*\xaf\x01\n\rExecutionType\x12\x1c\n\x18UnspecifiedExecutionType\x10\x00\x12\n\n\x06Market\x10\x01\x12\r\n\tLimitFill\x10\x02\x12\x1a\n\x16LimitMatchRestingOrder\x10\x03\x12\x16\n\x12LimitMatchNewOrder\x10\x04\x12\x15\n\x11MarketLiquidation\x10\x05\x12\x1a\n\x16\x45xpiryMarketSettlement\x10\x06\x42\xf3\x01\n\x19\x63om.injective.exchange.v2B\rExchangeProtoP\x01ZQgithub.com/InjectiveLabs/injective-core/injective-chain/modules/exchange/types/v2\xa2\x02\x03IEX\xaa\x02\x15Injective.Exchange.V2\xca\x02\x15Injective\\Exchange\\V2\xe2\x02!Injective\\Exchange\\V2\\GPBMetadata\xea\x02\x17Injective::Exchange::V2b\x06proto3')
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$injective/exchange/v2/exchange.proto\x12\x15injective.exchange.v2\x1a\x14gogoproto/gogo.proto\x1a\x11\x61mino/amino.proto\x1a\x1e\x63osmos/base/v1beta1/coin.proto\x1a%injective/oracle/v1beta1/oracle.proto\x1a\"injective/exchange/v2/market.proto\x1a!injective/exchange/v2/order.proto\"\x85\x19\n\x06Params\x12\x65\n\x1fspot_market_instant_listing_fee\x18\x01 \x01(\x0b\x32\x19.cosmos.base.v1beta1.CoinB\x04\xc8\xde\x1f\x00R\x1bspotMarketInstantListingFee\x12q\n%derivative_market_instant_listing_fee\x18\x02 \x01(\x0b\x32\x19.cosmos.base.v1beta1.CoinB\x04\xc8\xde\x1f\x00R!derivativeMarketInstantListingFee\x12\x61\n\x1b\x64\x65\x66\x61ult_spot_maker_fee_rate\x18\x03 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x17\x64\x65\x66\x61ultSpotMakerFeeRate\x12\x61\n\x1b\x64\x65\x66\x61ult_spot_taker_fee_rate\x18\x04 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x17\x64\x65\x66\x61ultSpotTakerFeeRate\x12m\n!default_derivative_maker_fee_rate\x18\x05 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x1d\x64\x65\x66\x61ultDerivativeMakerFeeRate\x12m\n!default_derivative_taker_fee_rate\x18\x06 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x1d\x64\x65\x66\x61ultDerivativeTakerFeeRate\x12\x64\n\x1c\x64\x65\x66\x61ult_initial_margin_ratio\x18\x07 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x19\x64\x65\x66\x61ultInitialMarginRatio\x12l\n default_maintenance_margin_ratio\x18\x08 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x1d\x64\x65\x66\x61ultMaintenanceMarginRatio\x12\x38\n\x18\x64\x65\x66\x61ult_funding_interval\x18\t \x01(\x03R\x16\x64\x65\x66\x61ultFundingInterval\x12)\n\x10\x66unding_multiple\x18\n \x01(\x03R\x0f\x66undingMultiple\x12X\n\x16relayer_fee_share_rate\x18\x0b \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x13relayerFeeShareRate\x12i\n\x1f\x64\x65\x66\x61ult_hourly_funding_rate_cap\x18\x0c \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x1b\x64\x65\x66\x61ultHourlyFundingRateCap\x12\x64\n\x1c\x64\x65\x66\x61ult_hourly_interest_rate\x18\r \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x19\x64\x65\x66\x61ultHourlyInterestRate\x12\x44\n\x1fmax_derivative_order_side_count\x18\x0e \x01(\rR\x1bmaxDerivativeOrderSideCount\x12s\n\'inj_reward_staked_requirement_threshold\x18\x0f \x01(\tB\x1d\xc8\xde\x1f\x00\xda\xde\x1f\x15\x63osmossdk.io/math.IntR#injRewardStakedRequirementThreshold\x12G\n trading_rewards_vesting_duration\x18\x10 \x01(\x03R\x1dtradingRewardsVestingDuration\x12\x64\n\x1cliquidator_reward_share_rate\x18\x11 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x19liquidatorRewardShareRate\x12x\n)binary_options_market_instant_listing_fee\x18\x12 \x01(\x0b\x32\x19.cosmos.base.v1beta1.CoinB\x04\xc8\xde\x1f\x00R$binaryOptionsMarketInstantListingFee\x12{\n atomic_market_order_access_level\x18\x13 \x01(\x0e\x32\x33.injective.exchange.v2.AtomicMarketOrderAccessLevelR\x1c\x61tomicMarketOrderAccessLevel\x12x\n\'spot_atomic_market_order_fee_multiplier\x18\x14 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\"spotAtomicMarketOrderFeeMultiplier\x12\x84\x01\n-derivative_atomic_market_order_fee_multiplier\x18\x15 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR(derivativeAtomicMarketOrderFeeMultiplier\x12\x8b\x01\n1binary_options_atomic_market_order_fee_multiplier\x18\x16 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR+binaryOptionsAtomicMarketOrderFeeMultiplier\x12^\n\x19minimal_protocol_fee_rate\x18\x17 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x16minimalProtocolFeeRate\x12[\n+is_instant_derivative_market_launch_enabled\x18\x18 \x01(\x08R&isInstantDerivativeMarketLaunchEnabled\x12\x44\n\x1fpost_only_mode_height_threshold\x18\x19 \x01(\x03R\x1bpostOnlyModeHeightThreshold\x12g\n1margin_decrease_price_timestamp_threshold_seconds\x18\x1a \x01(\x03R,marginDecreasePriceTimestampThresholdSeconds\x12\'\n\x0f\x65xchange_admins\x18\x1b \x03(\tR\x0e\x65xchangeAdmins\x12L\n\x13inj_auction_max_cap\x18\x1c \x01(\tB\x1d\xc8\xde\x1f\x00\xda\xde\x1f\x15\x63osmossdk.io/math.IntR\x10injAuctionMaxCap\x12*\n\x11\x66ixed_gas_enabled\x18\x1d \x01(\x08R\x0f\x66ixedGasEnabled\x12;\n\x1a\x65mit_legacy_version_events\x18\x1e \x01(\x08R\x17\x65mitLegacyVersionEvents\x12\x62\n\x1b\x64\x65\x66\x61ult_reduce_margin_ratio\x18\x1f \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x18\x64\x65\x66\x61ultReduceMarginRatio\x12P\n#human_readable_upgrade_block_height\x18 \x01(\x03\x42\x02\x18\x01R\x1fhumanReadableUpgradeBlockHeight\x12>\n\x1cpost_only_mode_blocks_amount\x18! \x01(\x04R\x18postOnlyModeBlocksAmount\x12M\n$min_post_only_mode_downtime_duration\x18\" \x01(\tR\x1fminPostOnlyModeDowntimeDuration:\x18\xe8\xa0\x1f\x01\x8a\xe7\xb0*\x0f\x65xchange/Params\"=\n\x14NextFundingTimestamp\x12%\n\x0enext_timestamp\x18\x01 \x01(\x03R\rnextTimestamp\"\xea\x01\n\x0eMidPriceAndTOB\x12@\n\tmid_price\x18\x01 \x01(\tB#\xc8\xde\x1f\x01\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x08midPrice\x12I\n\x0e\x62\x65st_buy_price\x18\x02 \x01(\tB#\xc8\xde\x1f\x01\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x0c\x62\x65stBuyPrice\x12K\n\x0f\x62\x65st_sell_price\x18\x03 \x01(\tB#\xc8\xde\x1f\x01\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\rbestSellPrice\"\xa5\x01\n\x07\x44\x65posit\x12P\n\x11\x61vailable_balance\x18\x01 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x10\x61vailableBalance\x12H\n\rtotal_balance\x18\x02 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x0ctotalBalance\",\n\x14SubaccountTradeNonce\x12\x14\n\x05nonce\x18\x01 \x01(\rR\x05nonce\"\xc3\x01\n\x0fSubaccountOrder\x12\x39\n\x05price\x18\x01 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x05price\x12?\n\x08quantity\x18\x02 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x08quantity\x12\"\n\x0cisReduceOnly\x18\x03 \x01(\x08R\x0cisReduceOnly\x12\x10\n\x03\x63id\x18\x04 \x01(\tR\x03\x63id\"r\n\x13SubaccountOrderData\x12<\n\x05order\x18\x01 \x01(\x0b\x32&.injective.exchange.v2.SubaccountOrderR\x05order\x12\x1d\n\norder_hash\x18\x02 \x01(\x0cR\torderHash\"\xc5\x02\n\x08Position\x12\x16\n\x06isLong\x18\x01 \x01(\x08R\x06isLong\x12?\n\x08quantity\x18\x02 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x08quantity\x12\x44\n\x0b\x65ntry_price\x18\x03 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\nentryPrice\x12;\n\x06margin\x18\x04 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x06margin\x12]\n\x18\x63umulative_funding_entry\x18\x05 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x16\x63umulativeFundingEntry\"\x8a\x01\n\x07\x42\x61lance\x12#\n\rsubaccount_id\x18\x01 \x01(\tR\x0csubaccountId\x12\x14\n\x05\x64\x65nom\x18\x02 \x01(\tR\x05\x64\x65nom\x12:\n\x08\x64\x65posits\x18\x03 \x01(\x0b\x32\x1e.injective.exchange.v2.DepositR\x08\x64\x65posits:\x08\x88\xa0\x1f\x00\xe8\xa0\x1f\x00\"\x9d\x01\n\x12\x44\x65rivativePosition\x12#\n\rsubaccount_id\x18\x01 \x01(\tR\x0csubaccountId\x12\x1b\n\tmarket_id\x18\x02 \x01(\tR\x08marketId\x12;\n\x08position\x18\x03 \x01(\x0b\x32\x1f.injective.exchange.v2.PositionR\x08position:\x08\x88\xa0\x1f\x00\xe8\xa0\x1f\x00\"I\n\x14MarketOrderIndicator\x12\x1b\n\tmarket_id\x18\x01 \x01(\tR\x08marketId\x12\x14\n\x05isBuy\x18\x02 \x01(\x08R\x05isBuy\"\xcd\x02\n\x08TradeLog\x12?\n\x08quantity\x18\x01 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x08quantity\x12\x39\n\x05price\x18\x02 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x05price\x12#\n\rsubaccount_id\x18\x03 \x01(\x0cR\x0csubaccountId\x12\x35\n\x03\x66\x65\x65\x18\x04 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x03\x66\x65\x65\x12\x1d\n\norder_hash\x18\x05 \x01(\x0cR\torderHash\x12\x38\n\x15\x66\x65\x65_recipient_address\x18\x06 \x01(\x0c\x42\x04\xc8\xde\x1f\x01R\x13\x66\x65\x65RecipientAddress\x12\x10\n\x03\x63id\x18\x07 \x01(\tR\x03\x63id\"\x9a\x02\n\rPositionDelta\x12\x17\n\x07is_long\x18\x01 \x01(\x08R\x06isLong\x12R\n\x12\x65xecution_quantity\x18\x02 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x11\x65xecutionQuantity\x12N\n\x10\x65xecution_margin\x18\x03 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x0f\x65xecutionMargin\x12L\n\x0f\x65xecution_price\x18\x04 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x0e\x65xecutionPrice\"\x9c\x03\n\x12\x44\x65rivativeTradeLog\x12#\n\rsubaccount_id\x18\x01 \x01(\x0cR\x0csubaccountId\x12K\n\x0eposition_delta\x18\x02 \x01(\x0b\x32$.injective.exchange.v2.PositionDeltaR\rpositionDelta\x12;\n\x06payout\x18\x03 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x06payout\x12\x35\n\x03\x66\x65\x65\x18\x04 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x03\x66\x65\x65\x12\x1d\n\norder_hash\x18\x05 \x01(\x0cR\torderHash\x12\x38\n\x15\x66\x65\x65_recipient_address\x18\x06 \x01(\x0c\x42\x04\xc8\xde\x1f\x01R\x13\x66\x65\x65RecipientAddress\x12\x10\n\x03\x63id\x18\x07 \x01(\tR\x03\x63id\x12\x35\n\x03pnl\x18\x08 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x03pnl\"v\n\x12SubaccountPosition\x12;\n\x08position\x18\x01 \x01(\x0b\x32\x1f.injective.exchange.v2.PositionR\x08position\x12#\n\rsubaccount_id\x18\x02 \x01(\x0cR\x0csubaccountId\"r\n\x11SubaccountDeposit\x12#\n\rsubaccount_id\x18\x01 \x01(\x0cR\x0csubaccountId\x12\x38\n\x07\x64\x65posit\x18\x02 \x01(\x0b\x32\x1e.injective.exchange.v2.DepositR\x07\x64\x65posit\"k\n\rDepositUpdate\x12\x14\n\x05\x64\x65nom\x18\x01 \x01(\tR\x05\x64\x65nom\x12\x44\n\x08\x64\x65posits\x18\x02 \x03(\x0b\x32(.injective.exchange.v2.SubaccountDepositR\x08\x64\x65posits\"\xcc\x01\n\x10PointsMultiplier\x12[\n\x17maker_points_multiplier\x18\x01 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x15makerPointsMultiplier\x12[\n\x17taker_points_multiplier\x18\x02 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x15takerPointsMultiplier\"\xf4\x02\n\x1eTradingRewardCampaignBoostInfo\x12\x35\n\x17\x62oosted_spot_market_ids\x18\x01 \x03(\tR\x14\x62oostedSpotMarketIds\x12\x65\n\x17spot_market_multipliers\x18\x02 \x03(\x0b\x32\'.injective.exchange.v2.PointsMultiplierB\x04\xc8\xde\x1f\x00R\x15spotMarketMultipliers\x12\x41\n\x1d\x62oosted_derivative_market_ids\x18\x03 \x03(\tR\x1a\x62oostedDerivativeMarketIds\x12q\n\x1d\x64\x65rivative_market_multipliers\x18\x04 \x03(\x0b\x32\'.injective.exchange.v2.PointsMultiplierB\x04\xc8\xde\x1f\x00R\x1b\x64\x65rivativeMarketMultipliers\"\xbc\x01\n\x12\x43\x61mpaignRewardPool\x12\'\n\x0fstart_timestamp\x18\x01 \x01(\x03R\x0estartTimestamp\x12}\n\x14max_campaign_rewards\x18\x02 \x03(\x0b\x32\x19.cosmos.base.v1beta1.CoinB0\xc8\xde\x1f\x00\xaa\xdf\x1f(github.com/cosmos/cosmos-sdk/types.CoinsR\x12maxCampaignRewards\"\xa4\x02\n\x19TradingRewardCampaignInfo\x12:\n\x19\x63\x61mpaign_duration_seconds\x18\x01 \x01(\x03R\x17\x63\x61mpaignDurationSeconds\x12!\n\x0cquote_denoms\x18\x02 \x03(\tR\x0bquoteDenoms\x12p\n\x19trading_reward_boost_info\x18\x03 \x01(\x0b\x32\x35.injective.exchange.v2.TradingRewardCampaignBoostInfoR\x16tradingRewardBoostInfo\x12\x36\n\x17\x64isqualified_market_ids\x18\x04 \x03(\tR\x15\x64isqualifiedMarketIds\"\xc0\x02\n\x13\x46\x65\x65\x44iscountTierInfo\x12S\n\x13maker_discount_rate\x18\x01 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x11makerDiscountRate\x12S\n\x13taker_discount_rate\x18\x02 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x11takerDiscountRate\x12\x42\n\rstaked_amount\x18\x03 \x01(\tB\x1d\xc8\xde\x1f\x00\xda\xde\x1f\x15\x63osmossdk.io/math.IntR\x0cstakedAmount\x12;\n\x06volume\x18\x04 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x06volume\"\x87\x02\n\x13\x46\x65\x65\x44iscountSchedule\x12!\n\x0c\x62ucket_count\x18\x01 \x01(\x04R\x0b\x62ucketCount\x12\'\n\x0f\x62ucket_duration\x18\x02 \x01(\x03R\x0e\x62ucketDuration\x12!\n\x0cquote_denoms\x18\x03 \x03(\tR\x0bquoteDenoms\x12I\n\ntier_infos\x18\x04 \x03(\x0b\x32*.injective.exchange.v2.FeeDiscountTierInfoR\ttierInfos\x12\x36\n\x17\x64isqualified_market_ids\x18\x05 \x03(\tR\x15\x64isqualifiedMarketIds\"M\n\x12\x46\x65\x65\x44iscountTierTTL\x12\x12\n\x04tier\x18\x01 \x01(\x04R\x04tier\x12#\n\rttl_timestamp\x18\x02 \x01(\x03R\x0cttlTimestamp\"\x91\x01\n\x0e\x41\x63\x63ountRewards\x12\x18\n\x07\x61\x63\x63ount\x18\x01 \x01(\tR\x07\x61\x63\x63ount\x12\x65\n\x07rewards\x18\x02 \x03(\x0b\x32\x19.cosmos.base.v1beta1.CoinB0\xc8\xde\x1f\x00\xaa\xdf\x1f(github.com/cosmos/cosmos-sdk/types.CoinsR\x07rewards\"\x81\x01\n\x0cTradeRecords\x12\x1b\n\tmarket_id\x18\x01 \x01(\tR\x08marketId\x12T\n\x14latest_trade_records\x18\x02 \x03(\x0b\x32\".injective.exchange.v2.TradeRecordR\x12latestTradeRecords\"6\n\rSubaccountIDs\x12%\n\x0esubaccount_ids\x18\x01 \x03(\x0cR\rsubaccountIds\"\xa7\x01\n\x0bTradeRecord\x12\x1c\n\ttimestamp\x18\x01 \x01(\x03R\ttimestamp\x12\x39\n\x05price\x18\x02 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x05price\x12?\n\x08quantity\x18\x03 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x08quantity\"m\n\x05Level\x12\x31\n\x01p\x18\x01 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x01p\x12\x31\n\x01q\x18\x02 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x01q\"\x92\x01\n\x1f\x41ggregateSubaccountVolumeRecord\x12#\n\rsubaccount_id\x18\x01 \x01(\tR\x0csubaccountId\x12J\n\x0emarket_volumes\x18\x02 \x03(\x0b\x32#.injective.exchange.v2.MarketVolumeR\rmarketVolumes\"\x84\x01\n\x1c\x41ggregateAccountVolumeRecord\x12\x18\n\x07\x61\x63\x63ount\x18\x01 \x01(\tR\x07\x61\x63\x63ount\x12J\n\x0emarket_volumes\x18\x02 \x03(\x0b\x32#.injective.exchange.v2.MarketVolumeR\rmarketVolumes\"A\n\rDenomDecimals\x12\x14\n\x05\x64\x65nom\x18\x01 \x01(\tR\x05\x64\x65nom\x12\x1a\n\x08\x64\x65\x63imals\x18\x02 \x01(\x04R\x08\x64\x65\x63imals\"e\n\x12GrantAuthorization\x12\x18\n\x07grantee\x18\x01 \x01(\tR\x07grantee\x12\x35\n\x06\x61mount\x18\x02 \x01(\tB\x1d\xc8\xde\x1f\x00\xda\xde\x1f\x15\x63osmossdk.io/math.IntR\x06\x61mount\"^\n\x0b\x41\x63tiveGrant\x12\x18\n\x07granter\x18\x01 \x01(\tR\x07granter\x12\x35\n\x06\x61mount\x18\x02 \x01(\tB\x1d\xc8\xde\x1f\x00\xda\xde\x1f\x15\x63osmossdk.io/math.IntR\x06\x61mount\"\x90\x01\n\x0e\x45\x66\x66\x65\x63tiveGrant\x12\x18\n\x07granter\x18\x01 \x01(\tR\x07granter\x12I\n\x11net_granted_stake\x18\x02 \x01(\tB\x1d\xc8\xde\x1f\x00\xda\xde\x1f\x15\x63osmossdk.io/math.IntR\x0fnetGrantedStake\x12\x19\n\x08is_valid\x18\x03 \x01(\x08R\x07isValid\"p\n\x10\x44\x65nomMinNotional\x12\x14\n\x05\x64\x65nom\x18\x01 \x01(\tR\x05\x64\x65nom\x12\x46\n\x0cmin_notional\x18\x02 \x01(\tB#\xc8\xde\x1f\x00\xda\xde\x1f\x1b\x63osmossdk.io/math.LegacyDecR\x0bminNotional*\xaf\x01\n\rExecutionType\x12\x1c\n\x18UnspecifiedExecutionType\x10\x00\x12\n\n\x06Market\x10\x01\x12\r\n\tLimitFill\x10\x02\x12\x1a\n\x16LimitMatchRestingOrder\x10\x03\x12\x16\n\x12LimitMatchNewOrder\x10\x04\x12\x15\n\x11MarketLiquidation\x10\x05\x12\x1a\n\x16\x45xpiryMarketSettlement\x10\x06\x42\xf3\x01\n\x19\x63om.injective.exchange.v2B\rExchangeProtoP\x01ZQgithub.com/InjectiveLabs/injective-core/injective-chain/modules/exchange/types/v2\xa2\x02\x03IEX\xaa\x02\x15Injective.Exchange.V2\xca\x02\x15Injective\\Exchange\\V2\xe2\x02!Injective\\Exchange\\V2\\GPBMetadata\xea\x02\x17Injective::Exchange::V2b\x06proto3')
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

🧩 Analysis chain

Generated exchange v2 descriptors updated — verify runtime deps match generator.

Protos were generated with Protobuf Python 5.26.1. Ensure the repo pins protobuf/grpcio to compatible versions to avoid runtime mismatches.

Run to confirm dependency pins:


🏁 Script executed:

#!/bin/bash
set -euo pipefail
echo "Searching dependency declarations for protobuf/grpcio versions..."
fd -a 'pyproject.toml' -0 2>/dev/null | xargs -0 -I{} sh -c "echo '--- {} ---'; rg -n 'protobuf|grpcio' {} || true"
fd -a 'requirements*.txt' -0 2>/dev/null | xargs -0 -I{} sh -c "echo '--- {} ---'; rg -n 'protobuf|grpcio' {} || true"
fd -a 'setup.cfg' -0 2>/dev/null | xargs -0 -I{} sh -c "echo '--- {} ---'; rg -n 'protobuf|grpcio' {} || true"

Length of output: 169


Generated exchange v2 descriptors updated — pin grpcio/grpcio-tools to avoid runtime mismatch

pyproject.toml shows: protobuf = "^5.26.1" (matches generator); grpcio = "" and grpcio-tools = "" — replace wildcard pins with explicit, compatible versions for grpcio/grpcio-tools.

🤖 Prompt for AI Agents
In pyinjective/proto/injective/exchange/v2/exchange_pb2.py around line 23, the
generated descriptors indicate a potential runtime mismatch because
pyproject.toml currently uses wildcard pins for grpcio and grpcio-tools; replace
the "*" entries with explicit, compatible versions (pairing with protobuf
5.26.1) for both grpcio and grpcio-tools, update the lockfile (or reinstall),
and re-generate/verify the protobuf artifacts to ensure runtime compatibility.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (3)
tests/core/test_tokens_file_loader.py (2)

85-89: URLs updated correctly; dedupe the literal to avoid drift.

Use a local tokens_url variable so the mock and the loader call stay in sync.

Apply this diff:

-        aioresponses.get(
-            "https://github.com/InjectiveLabs/injective-lists/raw/master/json/tokens/mainnet.json", payload=tokens_list
-        )
-        loaded_tokens = await loader.load_tokens(
-            tokens_file_url="https://github.com/InjectiveLabs/injective-lists/raw/master/json/tokens/mainnet.json"
-        )
+        tokens_url = "https://github.com/InjectiveLabs/injective-lists/raw/master/json/tokens/mainnet.json"
+        aioresponses.get(tokens_url, payload=tokens_list)
+        loaded_tokens = await loader.load_tokens(tokens_file_url=tokens_url)

107-112: LGTM; mirrors the happy-path test with the new path.

Optional: apply the same URL dedupe pattern here for consistency.

Apply this diff:

-        aioresponses.get(
-            "https://github.com/InjectiveLabs/injective-lists/raw/master/json/tokens/mainnet.json",
-            status=404,
-        )
-        loaded_tokens = await loader.load_tokens(
-            tokens_file_url="https://github.com/InjectiveLabs/injective-lists/raw/master/json/tokens/mainnet.json"
-        )
+        tokens_url = "https://github.com/InjectiveLabs/injective-lists/raw/master/json/tokens/mainnet.json"
+        aioresponses.get(tokens_url, status=404)
+        loaded_tokens = await loader.load_tokens(tokens_file_url=tokens_url)
pyinjective/core/network.py (1)

159-159: Optional: centralize the base tokens URL to avoid duplication.

Define a class/module constant and build per-env URLs to reduce repetition and future churn.

Example:

TOKENS_LIST_BASE = "https://github.com/InjectiveLabs/injective-lists/raw/master/json/tokens"

# Usage:
official_tokens_list_url=f"{TOKENS_LIST_BASE}/devnet.json"

Also applies to: 214-214, 256-256, 274-274

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 99aee0c and dd0888c.

📒 Files selected for processing (2)
  • pyinjective/core/network.py (4 hunks)
  • tests/core/test_tokens_file_loader.py (2 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
tests/core/test_tokens_file_loader.py (1)
pyinjective/core/tokens_file_loader.py (1)
  • load_tokens (29-41)
🪛 GitHub Actions: pre-commit
pyinjective/core/network.py

[error] 159-159: pycodestyle: line too long (123 > 120) [pycodestyle]


[error] 214-214: pycodestyle: line too long (124 > 120) [pycodestyle]


[error] 256-256: pycodestyle: line too long (124 > 120) [pycodestyle]


[error] 274-274: pycodestyle: line too long (124 > 120) [pycodestyle]

@aarmoa aarmoa merged commit fb9fcd0 into master Sep 24, 2025
10 checks passed
@aarmoa aarmoa deleted the release/v1_11_2 branch September 24, 2025 02:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant