-
Notifications
You must be signed in to change notification settings - Fork 34
release/v1_11_2 #398
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
release/v1_11_2 #398
Conversation
Note Other AI code review bot(s) detectedCodeRabbit 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. WalkthroughAdds 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
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
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests
Comment |
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
There was a problem hiding this 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, |
Copilot
AI
Sep 23, 2025
There was a problem hiding this comment.
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, |
Copilot
AI
Sep 23, 2025
There was a problem hiding this comment.
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, |
Copilot
AI
Sep 23, 2025
There was a problem hiding this comment.
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, |
Copilot
AI
Sep 23, 2025
There was a problem hiding this comment.
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, |
Copilot
AI
Sep 23, 2025
There was a problem hiding this comment.
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, |
Copilot
AI
Sep 23, 2025
There was a problem hiding this comment.
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.
There was a problem hiding this 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 repobuf 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-onlyLGTM. 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 ruffAvoid 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.MsgCancelPostOnlyModeResponsetests/client/chain/grpc/test_chain_grpc_auction_api.py (1)
26-33
: Consider adding edge-case coverage for whitelistAdd 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 heightValidate 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 defaultCover unset/zero height behavior to lock in stable serialization.
pyproject.toml (2)
30-31
: Pin a minimum grpc runtime to match generated stubsGenerated 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 PythonProject 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
⛔ 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 — LGTMOffsets 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 — LGTMThe new
height
field is correctly set in the mocked orderbook payload.
196-197
: Asserted height in expected payload with string conversion — LGTMRepository 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 correctHandlers 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 requiredFound 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 correctThe new field is consistently represented in expected_state.
Also applies to: 96-97
120-121
: No-highest-bid path: bidders_whitelist coverage is correctGood parity with the populated-state case.
Also applies to: 140-141
30-31
: Approve — bidders_whitelist correctly mapped to biddersWhitelistVerified 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 — OKConsistent with single orderbook expectations.
Also applies to: 515-516
417-418
: OrderbookV2: height mapping verified end-to-end — approveIndexer 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 — OKConsistent with single orderbook expectations.
Also applies to: 304-305
206-207
: Incorrect: Spot/Derivative OrderbookV2 clients don't set request.heightfetch_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 LGTMMatches CHANGELOG 1.11.2. No concerns.
CHANGELOG.md (1)
5-12
: Changelog entry LGTMAccurately documents new Composer v2 support and compiled proto updates; deprecates v1 Composer.
Makefile (1)
34-34
: Indexer tag bump to v1.16.91 — LGTMMatches PR objective and buf inputs.
pyinjective/proto/injective/auction/v1beta1/auction_pb2.py (1)
20-58
: Added Params.bidders_whitelist — LGTMGenerated 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 — LGTMEndpoints are correctly wired to request/response types.
648-659
: Servicer stubs added — expected UNIMPLEMENTED placeholdersThese are generated; argument unused warnings can be ignored for excluded paths.
918-927
: Server registration updated — LGTMRPC handlers registered for the new methods.
2317-2370
: EXPERIMENTAL static client wrappers added — LGTMConsistent with other methods.
pyinjective/proto/injective/exchange/v2/tx_pb2.py (2)
546-555
: Approve — Composer v2 builder & tests for CancelPostOnlyMode verifiedmsg_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 compatibilityGenerated 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 includesheight
— verify downstream handlingPython 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.
@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) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 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
@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) |
There was a problem hiding this comment.
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') |
There was a problem hiding this comment.
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.
There was a problem hiding this 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
📒 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]
Solves CP-619
Summary by CodeRabbit
New Features
Changes
Chores
Documentation