From 97fc0b3576c690a390a8b9d20eb61dc22264bf83 Mon Sep 17 00:00:00 2001 From: Matee ullah Malik Date: Tue, 12 May 2026 19:45:59 +0000 Subject: [PATCH 1/2] fix(x/audit): bridge cascade_kademlia_db_bytes from HostReport to SupernodeMetricsState MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit LEP-6 §12 (PR #122) removed cascade_kademlia_db_bytes from the audit HostReport and rewrote x/supernode getLatestCascadeBytesFromAudit to read from SupernodeMetricsState. The migration was half-completed: no chain-side writer was added to populate SupernodeMetricsState.CascadeKademliaDbBytes from the audit epoch-report channel. The only remaining writer is the now-operationally-dead legacy MsgReportSupernodeMetrics handler. Result on chain 1.12.0 / master today: every Everlight payout-period distribution sees getLatestCascadeBytesFromAudit return found=false for every SuperNode → distributePool skips every candidate → pool is never disbursed. Confirmed live on devnet. This change: 1. Restores HostReport.cascade_kademlia_db_bytes (field 6) on the audit epoch-report proto purely as a metric-courier. The audit module does NOT consume the value for its own consensus logic (LEP-6 §12 intent preserved); it only carries the value into the chain on the audit submission channel that SuperNodes already use. 2. Adds validation in SubmitEpochReport: cascade_kademlia_db_bytes must be a finite number ≥ 0 (NaN, +Inf, -Inf, negative rejected with new ErrInvalidHostMetric). Zero is valid (empty Kademlia store). 3. Adds bridgeCascadeBytesToSupernodeMetrics: after the epoch report is successfully persisted, the audit handler upserts the reporter's SupernodeMetricsState via supernodeKeeper.SetMetricsState — read- modify-write so any non-cascade fields previously persisted are preserved. Bumps Height to current block and ReportCount. 4. Defensive no-op (with audit_cascade_bytes_bridge_skipped event for observability) when the SuperNode record has empty/invalid ValidatorAddress — that is a pre-existing x/supernode invariant violation outside audit's scope; the bridge surfaces it via event but does not fail the epoch report on someone else's data corruption. This is now the SOLE writer of SupernodeMetricsState.CascadeKademliaDbBytes post-LEP-6 §12 (legacy MsgReportSupernodeMetrics handler remains in the codec but no SN sends it; left for a follow-up cleanup PR). Tests: - 4 unit tests covering invariant violations (NaN, +Inf, -Inf, negative) - 1 happy-path test (value bridged into MetricsState with correct validator address, height, ReportCount) - 1 zero-valid test - 1 read-modify-write preservation test (non-cascade fields preserved) - 1 defensive no-op test (empty ValidatorAddress emits event, accepts report, does not call Get/SetMetricsState) - Existing 2 storagefull-transition tests updated with Get/SetMetricsState AnyTimes expectations. make integration-tests passes (incl. tests/integration/everlight, tests/integration/audit, tests/integration/supernode). go vet -tags system_test ./... clean in tests/systemtests/. --- docs/static/openapi.yml | 2 +- proto/lumera/audit/v1/audit.proto | 9 + x/audit/v1/keeper/msg_submit_epoch_report.go | 90 ++++- ..._submit_epoch_report_cascade_bytes_test.go | 255 ++++++++++++++ ...sg_submit_epoch_report_storagefull_test.go | 16 + x/audit/v1/types/audit.pb.go | 329 ++++++++++-------- x/audit/v1/types/errors.go | 1 + 7 files changed, 554 insertions(+), 148 deletions(-) create mode 100644 x/audit/v1/keeper/msg_submit_epoch_report_cascade_bytes_test.go diff --git a/docs/static/openapi.yml b/docs/static/openapi.yml index 542e1f19..8ef7bc18 100644 --- a/docs/static/openapi.yml +++ b/docs/static/openapi.yml @@ -1 +1 @@ -{"id":"github.com/LumeraProtocol/lumera","consumes":["application/json"],"produces":["application/json"],"swagger":"2.0","info":{"contact":{"name":"github.com/LumeraProtocol/lumera"},"description":"Chain github.com/LumeraProtocol/lumera REST API","title":"Lumera REST API","version":"version not set"},"paths":{"/LumeraProtocol/lumera/action/v1/get_action/{actionID}":{"get":{"operationId":"Query_GetAction","parameters":[{"description":"The ID of the action to query","in":"path","name":"actionID","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.QueryGetActionResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"GetAction queries a single action by ID.","tags":["Query"]}},"/LumeraProtocol/lumera/action/v1/get_action_fee/{dataSize}":{"get":{"operationId":"Query_GetActionFee","parameters":[{"in":"path","name":"dataSize","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.QueryGetActionFeeResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Queries a list of GetActionFee items.","tags":["Query"]}},"/LumeraProtocol/lumera/action/v1/list_actions":{"get":{"operationId":"Query_ListActions","parameters":[{"default":"ACTION_TYPE_UNSPECIFIED","description":" - ACTION_TYPE_UNSPECIFIED: The default action type, used when the type is not specified.\n - ACTION_TYPE_SENSE: The action type for sense operations.\n - ACTION_TYPE_CASCADE: The action type for cascade operations.","enum":["ACTION_TYPE_UNSPECIFIED","ACTION_TYPE_SENSE","ACTION_TYPE_CASCADE"],"in":"query","name":"actionType","required":false,"type":"string"},{"default":"ACTION_STATE_UNSPECIFIED","description":" - ACTION_STATE_UNSPECIFIED: The default state, used when the state is not specified.\n - ACTION_STATE_PENDING: The action is pending and has not yet been processed.\n - ACTION_STATE_PROCESSING: The action is currently being processed.\n - ACTION_STATE_DONE: The action has been completed successfully.\n - ACTION_STATE_APPROVED: The action has been approved.\n - ACTION_STATE_REJECTED: The action has been rejected.\n - ACTION_STATE_FAILED: The action has failed.\n - ACTION_STATE_EXPIRED: The action has expired and is no longer valid.","enum":["ACTION_STATE_UNSPECIFIED","ACTION_STATE_PENDING","ACTION_STATE_PROCESSING","ACTION_STATE_DONE","ACTION_STATE_APPROVED","ACTION_STATE_REJECTED","ACTION_STATE_FAILED","ACTION_STATE_EXPIRED"],"in":"query","name":"actionState","required":false,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.QueryListActionsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"List actions with optional type and state filters.","tags":["Query"]}},"/LumeraProtocol/lumera/action/v1/list_actions_by_block_height/{blockHeight}":{"get":{"operationId":"Query_ListActionsByBlockHeight","parameters":[{"format":"int64","in":"path","name":"blockHeight","required":true,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.QueryListActionsByBlockHeightResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"List actions created at a specific block height.","tags":["Query"]}},"/LumeraProtocol/lumera/action/v1/list_actions_by_creator/{creator}":{"get":{"operationId":"Query_ListActionsByCreator","parameters":[{"in":"path","name":"creator","required":true,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.QueryListActionsByCreatorResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"List actions created by a specific address.","tags":["Query"]}},"/LumeraProtocol/lumera/action/v1/list_actions_by_supernode/{superNodeAddress}":{"get":{"operationId":"Query_ListActionsBySuperNode","parameters":[{"in":"path","name":"superNodeAddress","required":true,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.QueryListActionsBySuperNodeResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"List actions for a specific supernode.","tags":["Query"]}},"/LumeraProtocol/lumera/action/v1/list_expired_actions":{"get":{"operationId":"Query_ListExpiredActions","parameters":[{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.QueryListExpiredActionsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"List expired actions.","tags":["Query"]}},"/LumeraProtocol/lumera/action/v1/params":{"get":{"operationId":"Query_Params","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.QueryParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Parameters queries the parameters of the module.","tags":["Query"]}},"/LumeraProtocol/lumera/action/v1/query_action_by_metadata":{"get":{"operationId":"Query_QueryActionByMetadata","parameters":[{"default":"ACTION_TYPE_UNSPECIFIED","description":" - ACTION_TYPE_UNSPECIFIED: The default action type, used when the type is not specified.\n - ACTION_TYPE_SENSE: The action type for sense operations.\n - ACTION_TYPE_CASCADE: The action type for cascade operations.","enum":["ACTION_TYPE_UNSPECIFIED","ACTION_TYPE_SENSE","ACTION_TYPE_CASCADE"],"in":"query","name":"actionType","required":false,"type":"string"},{"description":"e.g., \"field=value\"","in":"query","name":"metadataQuery","required":false,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.QueryActionByMetadataResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Query actions based on metadata.","tags":["Query"]}},"/lumera.action.v1.Msg/ApproveAction":{"post":{"operationId":"Msg_ApproveAction","parameters":[{"description":"MsgApproveAction is the Msg/ApproveAction request type.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.action.v1.MsgApproveAction"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.MsgApproveActionResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"ApproveAction defines a message for approving an action.","tags":["Msg"]}},"/lumera.action.v1.Msg/FinalizeAction":{"post":{"operationId":"Msg_FinalizeAction","parameters":[{"description":"MsgFinalizeAction is the Msg/FinalizeAction request type.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.action.v1.MsgFinalizeAction"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.MsgFinalizeActionResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"FinalizeAction defines a message for finalizing an action.","tags":["Msg"]}},"/lumera.action.v1.Msg/RequestAction":{"post":{"operationId":"Msg_RequestAction","parameters":[{"description":"MsgRequestAction is the Msg/RequestAction request type.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.action.v1.MsgRequestAction"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.MsgRequestActionResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"RequestAction defines a message for requesting an action.","tags":["Msg"]}},"/lumera.action.v1.Msg/UpdateParams":{"post":{"operationId":"Msg_UpdateParams","parameters":[{"description":"MsgUpdateParams is the Msg/UpdateParams request type.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.action.v1.MsgUpdateParams"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.MsgUpdateParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"UpdateParams defines a (governance) operation for updating the module\nparameters. The authority defaults to the x/gov module account.","tags":["Msg"]}},"/LumeraProtocol/lumera/audit/v1/assigned_targets/{supernode_account}":{"get":{"operationId":"Query_AssignedTargets","parameters":[{"in":"path","name":"supernode_account","required":true,"type":"string"},{"format":"uint64","in":"query","name":"epoch_id","required":false,"type":"string"},{"in":"query","name":"filter_by_epoch_id","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryAssignedTargetsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"AssignedTargets returns the prober -\u003e targets assignment for a given supernode_account.\nIf filter_by_epoch_id is false, it returns the assignments for the current epoch.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/current_epoch":{"get":{"operationId":"Query_CurrentEpoch","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryCurrentEpochResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"CurrentEpoch returns the current derived epoch boundaries at the current chain height.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/current_epoch_anchor":{"get":{"operationId":"Query_CurrentEpochAnchor","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryCurrentEpochAnchorResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"CurrentEpochAnchor returns the persisted epoch anchor for the current epoch.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/epoch_anchor/{epoch_id}":{"get":{"operationId":"Query_EpochAnchor","parameters":[{"format":"uint64","in":"path","name":"epoch_id","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryEpochAnchorResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"EpochAnchor returns the persisted epoch anchor for the given epoch_id.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/epoch_report/{epoch_id}/{supernode_account}":{"get":{"operationId":"Query_EpochReport","parameters":[{"format":"uint64","in":"path","name":"epoch_id","required":true,"type":"string"},{"in":"path","name":"supernode_account","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryEpochReportResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"EpochReport returns the submitted epoch report for (epoch_id, supernode_account).","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/epoch_reports_by_reporter/{supernode_account}":{"get":{"operationId":"Query_EpochReportsByReporter","parameters":[{"in":"path","name":"supernode_account","required":true,"type":"string"},{"format":"uint64","in":"query","name":"epoch_id","required":false,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"},{"in":"query","name":"filter_by_epoch_id","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryEpochReportsByReporterResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"EpochReportsByReporter returns epoch reports submitted by the given reporter across epochs.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/evidence/by_action/{action_id}":{"get":{"operationId":"Query_EvidenceByAction","parameters":[{"in":"path","name":"action_id","required":true,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryEvidenceByActionResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"EvidenceByAction queries evidence records by action id.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/evidence/by_subject/{subject_address}":{"get":{"operationId":"Query_EvidenceBySubject","parameters":[{"in":"path","name":"subject_address","required":true,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryEvidenceBySubjectResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"EvidenceBySubject queries evidence records by subject address.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/evidence/{evidence_id}":{"get":{"operationId":"Query_EvidenceById","parameters":[{"format":"uint64","in":"path","name":"evidence_id","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryEvidenceByIdResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"EvidenceById queries a single evidence record by id.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/heal_op/{heal_op_id}":{"get":{"operationId":"Query_HealOp","parameters":[{"format":"uint64","in":"path","name":"heal_op_id","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryHealOpResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"HealOp returns a single storage-truth heal operation by id.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/heal_ops/by_status/{status}":{"get":{"operationId":"Query_HealOpsByStatus","parameters":[{"enum":["HEAL_OP_STATUS_UNSPECIFIED","HEAL_OP_STATUS_SCHEDULED","HEAL_OP_STATUS_IN_PROGRESS","HEAL_OP_STATUS_HEALER_REPORTED","HEAL_OP_STATUS_VERIFIED","HEAL_OP_STATUS_FAILED","HEAL_OP_STATUS_EXPIRED"],"in":"path","name":"status","required":true,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryHealOpsByStatusResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"HealOpsByStatus returns storage-truth heal operations filtered by status.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/heal_ops/by_ticket/{ticket_id}":{"get":{"operationId":"Query_HealOpsByTicket","parameters":[{"in":"path","name":"ticket_id","required":true,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryHealOpsByTicketResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"HealOpsByTicket returns storage-truth heal operations for a ticket id.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/host_reports/{supernode_account}":{"get":{"operationId":"Query_HostReports","parameters":[{"in":"path","name":"supernode_account","required":true,"type":"string"},{"format":"uint64","in":"query","name":"epoch_id","required":false,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"},{"in":"query","name":"filter_by_epoch_id","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryHostReportsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"HostReports returns host reports submitted by the given supernode_account across epochs.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/node_suspicion_state/{supernode_account}":{"get":{"operationId":"Query_NodeSuspicionState","parameters":[{"in":"path","name":"supernode_account","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryNodeSuspicionStateResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"NodeSuspicionState returns storage-truth node suspicion state for a supernode account.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/params":{"get":{"operationId":"Query_Params","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Parameters queries the parameters of the module.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/reporter_reliability_state/{reporter_supernode_account}":{"get":{"operationId":"Query_ReporterReliabilityState","parameters":[{"in":"path","name":"reporter_supernode_account","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryReporterReliabilityStateResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"ReporterReliabilityState returns storage-truth reporter reliability state for a reporter account.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/storage_challenge_reports/{supernode_account}":{"get":{"operationId":"Query_StorageChallengeReports","parameters":[{"in":"path","name":"supernode_account","required":true,"type":"string"},{"format":"uint64","in":"query","name":"epoch_id","required":false,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"},{"in":"query","name":"filter_by_epoch_id","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryStorageChallengeReportsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"StorageChallengeReports returns all reports that include storage-challenge observations about the given supernode_account.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/ticket_deterioration_state/{ticket_id}":{"get":{"operationId":"Query_TicketDeteriorationState","parameters":[{"in":"path","name":"ticket_id","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryTicketDeteriorationStateResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"TicketDeteriorationState returns storage-truth ticket deterioration state for a ticket id.","tags":["Query"]}},"/lumera.audit.v1.Msg/ClaimHealComplete":{"post":{"operationId":"Msg_ClaimHealComplete","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.audit.v1.MsgClaimHealComplete"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.MsgClaimHealCompleteResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"ClaimHealComplete defines the healer claim path for a chain-tracked heal op.","tags":["Msg"]}},"/lumera.audit.v1.Msg/SubmitEpochReport":{"post":{"operationId":"Msg_SubmitEpochReport","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.audit.v1.MsgSubmitEpochReport"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.MsgSubmitEpochReportResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"tags":["Msg"]}},"/lumera.audit.v1.Msg/SubmitEvidence":{"post":{"operationId":"Msg_SubmitEvidence","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.audit.v1.MsgSubmitEvidence"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.MsgSubmitEvidenceResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"SubmitEvidence defines the SubmitEvidence RPC.","tags":["Msg"]}},"/lumera.audit.v1.Msg/SubmitHealVerification":{"post":{"operationId":"Msg_SubmitHealVerification","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.audit.v1.MsgSubmitHealVerification"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.MsgSubmitHealVerificationResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"SubmitHealVerification defines the verifier submission path for a chain-tracked heal op.","tags":["Msg"]}},"/lumera.audit.v1.Msg/SubmitStorageRecheckEvidence":{"post":{"operationId":"Msg_SubmitStorageRecheckEvidence","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.audit.v1.MsgSubmitStorageRecheckEvidence"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.MsgSubmitStorageRecheckEvidenceResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"SubmitStorageRecheckEvidence defines the storage-truth recheck submission path.","tags":["Msg"]}},"/lumera.audit.v1.Msg/UpdateParams":{"post":{"operationId":"Msg_UpdateParams","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.audit.v1.MsgUpdateParams"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.MsgUpdateParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"UpdateParams defines a (governance) operation for updating the module\nparameters. The authority defaults to the x/gov module account.","tags":["Msg"]}},"/LumeraProtocol/lumera/claim/claim_record/{address}":{"get":{"operationId":"Query_ClaimRecord","parameters":[{"in":"path","name":"address","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.claim.QueryClaimRecordResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Queries a list of ClaimRecord items.","tags":["Query"]}},"/LumeraProtocol/lumera/claim/list_claimed/{vestedTerm}":{"get":{"operationId":"Query_ListClaimed","parameters":[{"format":"int64","in":"path","name":"vestedTerm","required":true,"type":"integer"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.claim.QueryListClaimedResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Queries a list of ListClaimed items.","tags":["Query"]}},"/LumeraProtocol/lumera/claim/params":{"get":{"operationId":"Query_Params","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.claim.QueryParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Parameters queries the parameters of the module.","tags":["Query"]}},"/lumera.claim.Msg/Claim":{"post":{"operationId":"Msg_Claim","parameters":[{"description":"MsgClaim is the Msg/Claim request type.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.claim.MsgClaim"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.claim.MsgClaimResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Claim defines a message for claiming tokens.","tags":["Msg"]}},"/lumera.claim.Msg/DelayedClaim":{"post":{"operationId":"Msg_DelayedClaim","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.claim.MsgDelayedClaim"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.claim.MsgDelayedClaimResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"tags":["Msg"]}},"/lumera.claim.Msg/UpdateParams":{"post":{"operationId":"Msg_UpdateParams","parameters":[{"description":"MsgUpdateParams is the Msg/UpdateParams request type.\nMsgUpdateParams is the Msg/UpdateParams request type.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.claim.MsgUpdateParams"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.claim.MsgUpdateParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"UpdateParams defines a (governance) operation for updating the module\nparameters. The authority defaults to the x/gov module account.","tags":["Msg"]}},"/lumera.erc20policy.Msg/SetRegistrationPolicy":{"post":{"operationId":"Msg_SetRegistrationPolicy","parameters":[{"description":"MsgSetRegistrationPolicy configures the IBC voucher ERC20 auto-registration\npolicy. It allows governance to control which IBC denoms are automatically\nregistered as ERC20 token pairs on first IBC receive.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.erc20policy.MsgSetRegistrationPolicy"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.erc20policy.MsgSetRegistrationPolicyResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"SetRegistrationPolicy sets the IBC voucher ERC20 auto-registration policy.\nOnly the governance module account (x/gov authority) may call this.","tags":["Msg"]}},"/lumera/evmigration/legacy_accounts":{"get":{"operationId":"Query_LegacyAccounts","parameters":[{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.evmigration.QueryLegacyAccountsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"LegacyAccounts lists accounts that still use secp256k1 pubkey and have\nnon-zero balance or delegations (i.e. accounts that should migrate).","tags":["Query"]}},"/lumera/evmigration/migrated_accounts":{"get":{"operationId":"Query_MigratedAccounts","parameters":[{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.evmigration.QueryMigratedAccountsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"MigratedAccounts lists all completed migrations with full detail.","tags":["Query"]}},"/lumera/evmigration/migration_estimate/{legacy_address}":{"get":{"operationId":"Query_MigrationEstimate","parameters":[{"description":"legacy_address is the coin-type-118 address to estimate migration for.","in":"path","name":"legacy_address","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.evmigration.QueryMigrationEstimateResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"MigrationEstimate returns a dry-run estimate of what would be migrated\nfor a given legacy address (delegation count, unbonding count, etc.).\nUseful for validators to pre-check before submitting MsgMigrateValidator.","tags":["Query"]}},"/lumera/evmigration/migration_record/{legacy_address}":{"get":{"operationId":"Query_MigrationRecord","parameters":[{"description":"legacy_address is the coin-type-118 address to look up.","in":"path","name":"legacy_address","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.evmigration.QueryMigrationRecordResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"MigrationRecord returns the migration record for a single legacy address.\nReturns nil record if the address has not been migrated.","tags":["Query"]}},"/lumera/evmigration/migration_record_by_new_address/{new_address}":{"get":{"operationId":"Query_MigrationRecordByNewAddress","parameters":[{"description":"new_address is the coin-type-60 destination address to look up.","in":"path","name":"new_address","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.evmigration.QueryMigrationRecordByNewAddressResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"MigrationRecordByNewAddress returns the migration record for a single new address.\nReturns nil record if the new address has not been used as a migration destination.","tags":["Query"]}},"/lumera/evmigration/migration_records":{"get":{"operationId":"Query_MigrationRecords","parameters":[{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.evmigration.QueryMigrationRecordsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"MigrationRecords returns all completed migration records with pagination.","tags":["Query"]}},"/lumera/evmigration/migration_stats":{"get":{"operationId":"Query_MigrationStats","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.evmigration.QueryMigrationStatsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"MigrationStats returns aggregate counters: total migrated, total legacy,\ntotal legacy staked, total validators migrated/legacy.","tags":["Query"]}},"/lumera/evmigration/params":{"get":{"operationId":"Query_Params","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.evmigration.QueryParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Params returns the current migration parameters.","tags":["Query"]}},"/lumera.evmigration.Msg/ClaimLegacyAccount":{"post":{"operationId":"Msg_ClaimLegacyAccount","parameters":[{"description":"MsgClaimLegacyAccount migrates on-chain state from legacy_address to new_address.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.evmigration.MsgClaimLegacyAccount"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.evmigration.MsgClaimLegacyAccountResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"ClaimLegacyAccount migrates all on-chain state from a legacy (coin-type-118)\naddress to a new (coin-type-60) address. Requires dual-signature proof.","tags":["Msg"]}},"/lumera.evmigration.Msg/MigrateValidator":{"post":{"operationId":"Msg_MigrateValidator","parameters":[{"description":"MsgMigrateValidator migrates a validator operator from legacy to new address.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.evmigration.MsgMigrateValidator"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.evmigration.MsgMigrateValidatorResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"MigrateValidator migrates a validator operator from legacy to new address,\nincluding all delegations, distribution state, supernode records, and\naccount-level state.","tags":["Msg"]}},"/lumera.evmigration.Msg/UpdateParams":{"post":{"operationId":"Msg_UpdateParams","parameters":[{"description":"MsgUpdateParams is the Msg/UpdateParams request type.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.evmigration.MsgUpdateParams"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.evmigration.MsgUpdateParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"UpdateParams defines a (governance) operation for updating the module\nparameters. The authority defaults to the x/gov module account.","tags":["Msg"]}},"/LumeraProtocol/lumera/lumeraid/params":{"get":{"operationId":"Query_Params","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.lumeraid.QueryParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Parameters queries the parameters of the module.","tags":["Query"]}},"/lumera.lumeraid.Msg/UpdateParams":{"post":{"operationId":"Msg_UpdateParams","parameters":[{"description":"MsgUpdateParams is the Msg/UpdateParams request type.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.lumeraid.MsgUpdateParams"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.lumeraid.MsgUpdateParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"UpdateParams defines a (governance) operation for updating the module\nparameters. The authority defaults to the x/gov module account.","tags":["Msg"]}},"/LumeraProtocol/lumera/supernode/v1/get_super_node/{validatorAddress}":{"get":{"operationId":"Query_GetSuperNode","parameters":[{"in":"path","name":"validatorAddress","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.QueryGetSuperNodeResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Queries a SuperNode by validatorAddress.","tags":["Query"]}},"/LumeraProtocol/lumera/supernode/v1/get_super_node_by_address/{supernodeAddress}":{"get":{"operationId":"Query_GetSuperNodeBySuperNodeAddress","parameters":[{"in":"path","name":"supernodeAddress","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.QueryGetSuperNodeBySuperNodeAddressResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Queries a SuperNode by supernodeAddress.","tags":["Query"]}},"/LumeraProtocol/lumera/supernode/v1/get_top_super_nodes_for_block/{blockHeight}":{"get":{"operationId":"Query_GetTopSuperNodesForBlock","parameters":[{"format":"int32","in":"path","name":"blockHeight","required":true,"type":"integer"},{"format":"int32","in":"query","name":"limit","required":false,"type":"integer"},{"in":"query","name":"state","required":false,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.QueryGetTopSuperNodesForBlockResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Queries a list of GetTopSuperNodesForBlock items.","tags":["Query"]}},"/LumeraProtocol/lumera/supernode/v1/list_super_nodes":{"get":{"operationId":"Query_ListSuperNodes","parameters":[{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.QueryListSuperNodesResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Queries a list of SuperNodes.","tags":["Query"]}},"/LumeraProtocol/lumera/supernode/v1/metrics/{validatorAddress}":{"get":{"operationId":"Query_GetMetrics","parameters":[{"in":"path","name":"validatorAddress","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.QueryGetMetricsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Queries the latest metrics state for a validator.","tags":["Query"]}},"/LumeraProtocol/lumera/supernode/v1/params":{"get":{"operationId":"Query_Params","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.QueryParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Parameters queries the parameters of the module.","tags":["Query"]}},"/LumeraProtocol/lumera/supernode/v1/payout_history/{validator_address}":{"get":{"operationId":"Query_PayoutHistory","parameters":[{"in":"path","name":"validator_address","required":true,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.QueryPayoutHistoryResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"PayoutHistory returns distribution payout history for a validator.","tags":["Query"]}},"/LumeraProtocol/lumera/supernode/v1/pool_state":{"get":{"operationId":"Query_PoolState","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.QueryPoolStateResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"PoolState queries the current state of the Everlight pool.","tags":["Query"]}},"/LumeraProtocol/lumera/supernode/v1/sn_eligibility/{validator_address}":{"get":{"operationId":"Query_SNEligibility","parameters":[{"in":"path","name":"validator_address","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.QuerySNEligibilityResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"SNEligibility queries whether a specific SuperNode is eligible for payouts.","tags":["Query"]}},"/lumera.supernode.v1.Msg/DeregisterSupernode":{"post":{"operationId":"Msg_DeregisterSupernode","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgDeregisterSupernode"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgDeregisterSupernodeResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"tags":["Msg"]}},"/lumera.supernode.v1.Msg/RegisterSupernode":{"post":{"operationId":"Msg_RegisterSupernode","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgRegisterSupernode"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgRegisterSupernodeResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"tags":["Msg"]}},"/lumera.supernode.v1.Msg/ReportSupernodeMetrics":{"post":{"operationId":"Msg_ReportSupernodeMetrics","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgReportSupernodeMetrics"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgReportSupernodeMetricsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"tags":["Msg"]}},"/lumera.supernode.v1.Msg/StartSupernode":{"post":{"operationId":"Msg_StartSupernode","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgStartSupernode"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgStartSupernodeResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"tags":["Msg"]}},"/lumera.supernode.v1.Msg/StopSupernode":{"post":{"operationId":"Msg_StopSupernode","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgStopSupernode"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgStopSupernodeResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"tags":["Msg"]}},"/lumera.supernode.v1.Msg/UpdateParams":{"post":{"operationId":"Msg_UpdateParams","parameters":[{"description":"MsgUpdateParams is the Msg/UpdateParams request type.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgUpdateParams"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgUpdateParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"UpdateParams defines a (governance) operation for updating the module\nparameters. The authority defaults to the x/gov module account.","tags":["Msg"]}},"/lumera.supernode.v1.Msg/UpdateSupernode":{"post":{"operationId":"Msg_UpdateSupernode","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgUpdateSupernode"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgUpdateSupernodeResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"tags":["Msg"]}},"/cosmos/evm/erc20/v1/params":{"get":{"operationId":"Query_Params","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.erc20.v1.QueryParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Params retrieves the erc20 module params","tags":["Query"]}},"/cosmos/evm/erc20/v1/token_pairs":{"get":{"operationId":"Query_TokenPairs","parameters":[{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.erc20.v1.QueryTokenPairsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"TokenPairs retrieves registered token pairs (mappings)x","tags":["Query"]}},"/cosmos/evm/erc20/v1/token_pairs/{token}":{"get":{"operationId":"Query_TokenPair","parameters":[{"description":"token identifier can be either the hex contract address of the ERC20 or the\nCosmos base denomination","in":"path","name":"token","pattern":".+","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.erc20.v1.QueryTokenPairResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"TokenPair retrieves a registered token pair (mapping)","tags":["Query"]}},"/cosmos.evm.erc20.v1.Msg/RegisterERC20":{"post":{"operationId":"Msg_RegisterERC20","parameters":[{"description":"MsgRegisterERC20 is the Msg/RegisterERC20 request type for registering\nan Erc20 contract token pair.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/cosmos.evm.erc20.v1.MsgRegisterERC20"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.erc20.v1.MsgRegisterERC20Response"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"RegisterERC20 defines a governance operation for registering a token pair\nfor the specified erc20 contract. The authority is hard-coded to the Cosmos\nSDK x/gov module account","tags":["Msg"]}},"/cosmos.evm.erc20.v1.Msg/ToggleConversion":{"post":{"operationId":"Msg_ToggleConversion","parameters":[{"description":"MsgToggleConversion is the Msg/MsgToggleConversion request type for toggling\nan Erc20 contract conversion capability.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/cosmos.evm.erc20.v1.MsgToggleConversion"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.erc20.v1.MsgToggleConversionResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"ToggleConversion defines a governance operation for enabling/disabling a\ntoken pair conversion. The authority is hard-coded to the Cosmos SDK x/gov\nmodule account","tags":["Msg"]}},"/cosmos.evm.erc20.v1.Msg/UpdateParams":{"post":{"operationId":"Msg_UpdateParams","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/cosmos.evm.erc20.v1.MsgUpdateParams"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.erc20.v1.MsgUpdateParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"UpdateParams defines a governance operation for updating the x/erc20 module\nparameters. The authority is hard-coded to the Cosmos SDK x/gov module\naccount","tags":["Msg"]}},"/cosmos/evm/erc20/v1/tx/convert_coin":{"get":{"operationId":"Msg_ConvertCoin","parameters":[{"in":"query","name":"coin.denom","required":false,"type":"string"},{"in":"query","name":"coin.amount","required":false,"type":"string"},{"description":"receiver is the hex address to receive ERC20 token","in":"query","name":"receiver","required":false,"type":"string"},{"description":"sender is the cosmos bech32 address from the owner of the given Cosmos\ncoins","in":"query","name":"sender","required":false,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.erc20.v1.MsgConvertCoinResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"ConvertCoin mints a ERC20 token representation of the native Cosmos coin\nthat is registered on the token mapping.","tags":["Msg"]}},"/cosmos/evm/erc20/v1/tx/convert_erc20":{"get":{"operationId":"Msg_ConvertERC20","parameters":[{"description":"contract_address of an ERC20 token contract, that is registered in a token\npair","in":"query","name":"contract_address","required":false,"type":"string"},{"description":"amount of ERC20 tokens to convert","in":"query","name":"amount","required":false,"type":"string"},{"description":"receiver is the bech32 address to receive native Cosmos coins","in":"query","name":"receiver","required":false,"type":"string"},{"description":"sender is the hex address from the owner of the given ERC20 tokens","in":"query","name":"sender","required":false,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.erc20.v1.MsgConvertERC20Response"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"ConvertERC20 mints a native Cosmos coin representation of the ERC20 token\ncontract that is registered on the token mapping.","tags":["Msg"]}},"/cosmos/evm/feemarket/v1/base_fee":{"get":{"operationId":"Query_BaseFee","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.feemarket.v1.QueryBaseFeeResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"BaseFee queries the base fee of the parent block of the current block.","tags":["Query"]}},"/cosmos/evm/feemarket/v1/block_gas":{"get":{"operationId":"Query_BlockGas","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.feemarket.v1.QueryBlockGasResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"BlockGas queries the gas used at a given block height","tags":["Query"]}},"/cosmos/evm/feemarket/v1/params":{"get":{"operationId":"Query_Params","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.feemarket.v1.QueryParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Params queries the parameters of x/feemarket module.","tags":["Query"]}},"/cosmos.evm.feemarket.v1.Msg/UpdateParams":{"post":{"operationId":"Msg_UpdateParams","parameters":[{"description":"MsgUpdateParams defines a Msg for updating the x/feemarket module parameters.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/cosmos.evm.feemarket.v1.MsgUpdateParams"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.feemarket.v1.MsgUpdateParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"UpdateParams defined a governance operation for updating the x/feemarket\nmodule parameters. The authority is hard-coded to the Cosmos SDK x/gov\nmodule account","tags":["Msg"]}},"/cosmos/evm/precisebank/v1/fractional_balance/{address}":{"get":{"operationId":"Query_FractionalBalance","parameters":[{"description":"address is the account address to query fractional balance for.","in":"path","name":"address","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.precisebank.v1.QueryFractionalBalanceResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"FractionalBalance returns only the fractional balance of an address. This\ndoes not include any integer balance.","tags":["Query"]}},"/cosmos/evm/precisebank/v1/remainder":{"get":{"operationId":"Query_Remainder","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.precisebank.v1.QueryRemainderResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Remainder returns the amount backed by the reserve, but not yet owned by\nany account, i.e. not in circulation.","tags":["Query"]}},"/cosmos/evm/vm/v1/account/{address}":{"get":{"operationId":"Query_Account","parameters":[{"description":"address is the ethereum hex address to query the account for.","in":"path","name":"address","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.vm.v1.QueryAccountResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Account queries an Ethereum account.","tags":["Query"]}},"/cosmos/evm/vm/v1/balances/{address}":{"get":{"operationId":"Query_Balance","parameters":[{"description":"address is the ethereum hex address to query the balance for.","in":"path","name":"address","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.vm.v1.QueryBalanceResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Balance queries the balance of a the EVM denomination for a single\naccount.","tags":["Query"]}},"/cosmos/evm/vm/v1/base_fee":{"get":{"operationId":"Query_BaseFee","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.vm.v1.QueryBaseFeeResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"BaseFee queries the base fee of the parent block of the current block,\nit's similar to feemarket module's method, but also checks london hardfork\nstatus.","tags":["Query"]}},"/cosmos/evm/vm/v1/codes/{address}":{"get":{"operationId":"Query_Code","parameters":[{"description":"address is the ethereum hex address to query the code for.","in":"path","name":"address","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.vm.v1.QueryCodeResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Code queries the balance of all coins for a single account.","tags":["Query"]}},"/cosmos/evm/vm/v1/config":{"get":{"operationId":"Query_Config","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.vm.v1.QueryConfigResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Config queries the EVM configuration","tags":["Query"]}},"/cosmos/evm/vm/v1/cosmos_account/{address}":{"get":{"operationId":"Query_CosmosAccount","parameters":[{"description":"address is the ethereum hex address to query the account for.","in":"path","name":"address","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.vm.v1.QueryCosmosAccountResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"CosmosAccount queries an Ethereum account's Cosmos Address.","tags":["Query"]}},"/cosmos/evm/vm/v1/estimate_gas":{"get":{"operationId":"Query_EstimateGas","parameters":[{"description":"args uses the same json format as the json rpc api.","format":"byte","in":"query","name":"args","required":false,"type":"string"},{"description":"gas_cap defines the default gas cap to be used","format":"uint64","in":"query","name":"gas_cap","required":false,"type":"string"},{"description":"proposer_address of the requested block in hex format","format":"byte","in":"query","name":"proposer_address","required":false,"type":"string"},{"description":"chain_id is the eip155 chain id parsed from the requested block header","format":"int64","in":"query","name":"chain_id","required":false,"type":"string"},{"description":"state overrides encoded as json","format":"byte","in":"query","name":"overrides","required":false,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.vm.v1.EstimateGasResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"EstimateGas implements the `eth_estimateGas` rpc api","tags":["Query"]}},"/cosmos/evm/vm/v1/eth_call":{"get":{"operationId":"Query_EthCall","parameters":[{"description":"args uses the same json format as the json rpc api.","format":"byte","in":"query","name":"args","required":false,"type":"string"},{"description":"gas_cap defines the default gas cap to be used","format":"uint64","in":"query","name":"gas_cap","required":false,"type":"string"},{"description":"proposer_address of the requested block in hex format","format":"byte","in":"query","name":"proposer_address","required":false,"type":"string"},{"description":"chain_id is the eip155 chain id parsed from the requested block header","format":"int64","in":"query","name":"chain_id","required":false,"type":"string"},{"description":"state overrides encoded as json","format":"byte","in":"query","name":"overrides","required":false,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.vm.v1.MsgEthereumTxResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"EthCall implements the `eth_call` rpc api","tags":["Query"]}},"/cosmos/evm/vm/v1/min_gas_price":{"get":{"operationId":"Query_GlobalMinGasPrice","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.vm.v1.QueryGlobalMinGasPriceResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"GlobalMinGasPrice queries the MinGasPrice\nit's similar to feemarket module's method,\nbut makes the conversion to 18 decimals\nwhen the evm denom is represented with a different precision.","tags":["Query"]}},"/cosmos/evm/vm/v1/params":{"get":{"operationId":"Query_Params","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.vm.v1.QueryParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Params queries the parameters of x/vm module.","tags":["Query"]}},"/cosmos/evm/vm/v1/storage/{address}/{key}":{"get":{"operationId":"Query_Storage","parameters":[{"description":"address is the ethereum hex address to query the storage state for.","in":"path","name":"address","required":true,"type":"string"},{"description":"key defines the key of the storage state","in":"path","name":"key","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.vm.v1.QueryStorageResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Storage queries the balance of all coins for a single account.","tags":["Query"]}},"/cosmos/evm/vm/v1/trace_block":{"get":{"operationId":"Query_TraceBlock","parameters":[{"description":"tracer is a custom javascript tracer","in":"query","name":"trace_config.tracer","required":false,"type":"string"},{"description":"timeout overrides the default timeout of 5 seconds for JavaScript-based\ntracing calls","in":"query","name":"trace_config.timeout","required":false,"type":"string"},{"description":"reexec defines the number of blocks the tracer is willing to go back","format":"uint64","in":"query","name":"trace_config.reexec","required":false,"type":"string"},{"description":"disable_stack switches stack capture","in":"query","name":"trace_config.disable_stack","required":false,"type":"boolean"},{"description":"disable_storage switches storage capture","in":"query","name":"trace_config.disable_storage","required":false,"type":"boolean"},{"description":"debug can be used to print output during capture end","in":"query","name":"trace_config.debug","required":false,"type":"boolean"},{"description":"limit defines the maximum length of output, but zero means unlimited","format":"int32","in":"query","name":"trace_config.limit","required":false,"type":"integer"},{"description":"homestead_block switch (nil no fork, 0 = already homestead)","in":"query","name":"trace_config.overrides.homestead_block","required":false,"type":"string"},{"description":"dao_fork_block corresponds to TheDAO hard-fork switch block (nil no fork)","in":"query","name":"trace_config.overrides.dao_fork_block","required":false,"type":"string"},{"description":"dao_fork_support defines whether the nodes supports or opposes the DAO\nhard-fork","in":"query","name":"trace_config.overrides.dao_fork_support","required":false,"type":"boolean"},{"description":"eip150_block: EIP150 implements the Gas price changes\n(https://github.com/ethereum/EIPs/issues/150) EIP150 HF block (nil no fork)","in":"query","name":"trace_config.overrides.eip150_block","required":false,"type":"string"},{"description":"eip155_block: EIP155Block HF block","in":"query","name":"trace_config.overrides.eip155_block","required":false,"type":"string"},{"description":"eip158_block: EIP158 HF block","in":"query","name":"trace_config.overrides.eip158_block","required":false,"type":"string"},{"description":"byzantium_block: Byzantium switch block (nil no fork, 0 = already on\nbyzantium)","in":"query","name":"trace_config.overrides.byzantium_block","required":false,"type":"string"},{"description":"constantinople_block: Constantinople switch block (nil no fork, 0 = already\nactivated)","in":"query","name":"trace_config.overrides.constantinople_block","required":false,"type":"string"},{"description":"petersburg_block: Petersburg switch block (nil same as Constantinople)","in":"query","name":"trace_config.overrides.petersburg_block","required":false,"type":"string"},{"description":"istanbul_block: Istanbul switch block (nil no fork, 0 = already on\nistanbul)","in":"query","name":"trace_config.overrides.istanbul_block","required":false,"type":"string"},{"description":"muir_glacier_block: Eip-2384 (bomb delay) switch block (nil no fork, 0 =\nalready activated)","in":"query","name":"trace_config.overrides.muir_glacier_block","required":false,"type":"string"},{"description":"berlin_block: Berlin switch block (nil = no fork, 0 = already on berlin)","in":"query","name":"trace_config.overrides.berlin_block","required":false,"type":"string"},{"description":"london_block: London switch block (nil = no fork, 0 = already on london)","in":"query","name":"trace_config.overrides.london_block","required":false,"type":"string"},{"description":"arrow_glacier_block: Eip-4345 (bomb delay) switch block (nil = no fork, 0 =\nalready activated)","in":"query","name":"trace_config.overrides.arrow_glacier_block","required":false,"type":"string"},{"description":"gray_glacier_block: EIP-5133 (bomb delay) switch block (nil = no fork, 0 =\nalready activated)","in":"query","name":"trace_config.overrides.gray_glacier_block","required":false,"type":"string"},{"description":"merge_netsplit_block: Virtual fork after The Merge to use as a network\nsplitter","in":"query","name":"trace_config.overrides.merge_netsplit_block","required":false,"type":"string"},{"description":"chain_id is the id of the chain (EIP-155)","format":"uint64","in":"query","name":"trace_config.overrides.chain_id","required":false,"type":"string"},{"description":"denom is the denomination used on the EVM","in":"query","name":"trace_config.overrides.denom","required":false,"type":"string"},{"description":"decimals is the real decimal precision of the denomination used on the EVM","format":"uint64","in":"query","name":"trace_config.overrides.decimals","required":false,"type":"string"},{"description":"shanghai_time: Shanghai switch time (nil = no fork, 0 = already on\nshanghai)","in":"query","name":"trace_config.overrides.shanghai_time","required":false,"type":"string"},{"description":"cancun_time: Cancun switch time (nil = no fork, 0 = already on cancun)","in":"query","name":"trace_config.overrides.cancun_time","required":false,"type":"string"},{"description":"prague_time: Prague switch time (nil = no fork, 0 = already on prague)","in":"query","name":"trace_config.overrides.prague_time","required":false,"type":"string"},{"description":"verkle_time: Verkle switch time (nil = no fork, 0 = already on verkle)","in":"query","name":"trace_config.overrides.verkle_time","required":false,"type":"string"},{"description":"osaka_time: Osaka switch time (nil = no fork, 0 = already on osaka)","in":"query","name":"trace_config.overrides.osaka_time","required":false,"type":"string"},{"description":"enable_memory switches memory capture","in":"query","name":"trace_config.enable_memory","required":false,"type":"boolean"},{"description":"enable_return_data switches the capture of return data","in":"query","name":"trace_config.enable_return_data","required":false,"type":"boolean"},{"description":"tracer_json_config configures the tracer using a JSON string","in":"query","name":"trace_config.tracer_json_config","required":false,"type":"string"},{"description":"block_number of the traced block","format":"int64","in":"query","name":"block_number","required":false,"type":"string"},{"description":"block_hash (hex) of the traced block","in":"query","name":"block_hash","required":false,"type":"string"},{"description":"block_time of the traced block","format":"date-time","in":"query","name":"block_time","required":false,"type":"string"},{"description":"proposer_address is the address of the requested block","format":"byte","in":"query","name":"proposer_address","required":false,"type":"string"},{"description":"chain_id is the eip155 chain id parsed from the requested block header","format":"int64","in":"query","name":"chain_id","required":false,"type":"string"},{"description":"block_max_gas of the traced block","format":"int64","in":"query","name":"block_max_gas","required":false,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.vm.v1.QueryTraceBlockResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"TraceBlock implements the `debug_traceBlockByNumber` and\n`debug_traceBlockByHash` rpc api","tags":["Query"]}},"/cosmos/evm/vm/v1/trace_call":{"get":{"operationId":"Query_TraceCall","parameters":[{"description":"args uses the same json format as the json rpc api.","format":"byte","in":"query","name":"args","required":false,"type":"string"},{"description":"gas_cap defines the default gas cap to be used","format":"uint64","in":"query","name":"gas_cap","required":false,"type":"string"},{"description":"proposer_address of the requested block in hex format","format":"byte","in":"query","name":"proposer_address","required":false,"type":"string"},{"description":"tracer is a custom javascript tracer","in":"query","name":"trace_config.tracer","required":false,"type":"string"},{"description":"timeout overrides the default timeout of 5 seconds for JavaScript-based\ntracing calls","in":"query","name":"trace_config.timeout","required":false,"type":"string"},{"description":"reexec defines the number of blocks the tracer is willing to go back","format":"uint64","in":"query","name":"trace_config.reexec","required":false,"type":"string"},{"description":"disable_stack switches stack capture","in":"query","name":"trace_config.disable_stack","required":false,"type":"boolean"},{"description":"disable_storage switches storage capture","in":"query","name":"trace_config.disable_storage","required":false,"type":"boolean"},{"description":"debug can be used to print output during capture end","in":"query","name":"trace_config.debug","required":false,"type":"boolean"},{"description":"limit defines the maximum length of output, but zero means unlimited","format":"int32","in":"query","name":"trace_config.limit","required":false,"type":"integer"},{"description":"homestead_block switch (nil no fork, 0 = already homestead)","in":"query","name":"trace_config.overrides.homestead_block","required":false,"type":"string"},{"description":"dao_fork_block corresponds to TheDAO hard-fork switch block (nil no fork)","in":"query","name":"trace_config.overrides.dao_fork_block","required":false,"type":"string"},{"description":"dao_fork_support defines whether the nodes supports or opposes the DAO\nhard-fork","in":"query","name":"trace_config.overrides.dao_fork_support","required":false,"type":"boolean"},{"description":"eip150_block: EIP150 implements the Gas price changes\n(https://github.com/ethereum/EIPs/issues/150) EIP150 HF block (nil no fork)","in":"query","name":"trace_config.overrides.eip150_block","required":false,"type":"string"},{"description":"eip155_block: EIP155Block HF block","in":"query","name":"trace_config.overrides.eip155_block","required":false,"type":"string"},{"description":"eip158_block: EIP158 HF block","in":"query","name":"trace_config.overrides.eip158_block","required":false,"type":"string"},{"description":"byzantium_block: Byzantium switch block (nil no fork, 0 = already on\nbyzantium)","in":"query","name":"trace_config.overrides.byzantium_block","required":false,"type":"string"},{"description":"constantinople_block: Constantinople switch block (nil no fork, 0 = already\nactivated)","in":"query","name":"trace_config.overrides.constantinople_block","required":false,"type":"string"},{"description":"petersburg_block: Petersburg switch block (nil same as Constantinople)","in":"query","name":"trace_config.overrides.petersburg_block","required":false,"type":"string"},{"description":"istanbul_block: Istanbul switch block (nil no fork, 0 = already on\nistanbul)","in":"query","name":"trace_config.overrides.istanbul_block","required":false,"type":"string"},{"description":"muir_glacier_block: Eip-2384 (bomb delay) switch block (nil no fork, 0 =\nalready activated)","in":"query","name":"trace_config.overrides.muir_glacier_block","required":false,"type":"string"},{"description":"berlin_block: Berlin switch block (nil = no fork, 0 = already on berlin)","in":"query","name":"trace_config.overrides.berlin_block","required":false,"type":"string"},{"description":"london_block: London switch block (nil = no fork, 0 = already on london)","in":"query","name":"trace_config.overrides.london_block","required":false,"type":"string"},{"description":"arrow_glacier_block: Eip-4345 (bomb delay) switch block (nil = no fork, 0 =\nalready activated)","in":"query","name":"trace_config.overrides.arrow_glacier_block","required":false,"type":"string"},{"description":"gray_glacier_block: EIP-5133 (bomb delay) switch block (nil = no fork, 0 =\nalready activated)","in":"query","name":"trace_config.overrides.gray_glacier_block","required":false,"type":"string"},{"description":"merge_netsplit_block: Virtual fork after The Merge to use as a network\nsplitter","in":"query","name":"trace_config.overrides.merge_netsplit_block","required":false,"type":"string"},{"description":"chain_id is the id of the chain (EIP-155)","format":"uint64","in":"query","name":"trace_config.overrides.chain_id","required":false,"type":"string"},{"description":"denom is the denomination used on the EVM","in":"query","name":"trace_config.overrides.denom","required":false,"type":"string"},{"description":"decimals is the real decimal precision of the denomination used on the EVM","format":"uint64","in":"query","name":"trace_config.overrides.decimals","required":false,"type":"string"},{"description":"shanghai_time: Shanghai switch time (nil = no fork, 0 = already on\nshanghai)","in":"query","name":"trace_config.overrides.shanghai_time","required":false,"type":"string"},{"description":"cancun_time: Cancun switch time (nil = no fork, 0 = already on cancun)","in":"query","name":"trace_config.overrides.cancun_time","required":false,"type":"string"},{"description":"prague_time: Prague switch time (nil = no fork, 0 = already on prague)","in":"query","name":"trace_config.overrides.prague_time","required":false,"type":"string"},{"description":"verkle_time: Verkle switch time (nil = no fork, 0 = already on verkle)","in":"query","name":"trace_config.overrides.verkle_time","required":false,"type":"string"},{"description":"osaka_time: Osaka switch time (nil = no fork, 0 = already on osaka)","in":"query","name":"trace_config.overrides.osaka_time","required":false,"type":"string"},{"description":"enable_memory switches memory capture","in":"query","name":"trace_config.enable_memory","required":false,"type":"boolean"},{"description":"enable_return_data switches the capture of return data","in":"query","name":"trace_config.enable_return_data","required":false,"type":"boolean"},{"description":"tracer_json_config configures the tracer using a JSON string","in":"query","name":"trace_config.tracer_json_config","required":false,"type":"string"},{"description":"block_number of requested transaction","format":"int64","in":"query","name":"block_number","required":false,"type":"string"},{"description":"block_hash of requested transaction","in":"query","name":"block_hash","required":false,"type":"string"},{"description":"block_time of requested transaction","format":"date-time","in":"query","name":"block_time","required":false,"type":"string"},{"description":"chain_id is the the eip155 chain id parsed from the requested block header","format":"int64","in":"query","name":"chain_id","required":false,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.vm.v1.QueryTraceCallResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"TraceCall implements the `debug_traceCall` rpc api","tags":["Query"]}},"/cosmos/evm/vm/v1/trace_tx":{"get":{"operationId":"Query_TraceTx","parameters":[{"description":"from is the bytes of ethereum signer address. This address value is checked\nagainst the address derived from the signature (V, R, S) using the\nsecp256k1 elliptic curve","format":"byte","in":"query","name":"msg.from","required":false,"type":"string"},{"description":"raw is the raw ethereum transaction","format":"byte","in":"query","name":"msg.raw","required":false,"type":"string"},{"description":"tracer is a custom javascript tracer","in":"query","name":"trace_config.tracer","required":false,"type":"string"},{"description":"timeout overrides the default timeout of 5 seconds for JavaScript-based\ntracing calls","in":"query","name":"trace_config.timeout","required":false,"type":"string"},{"description":"reexec defines the number of blocks the tracer is willing to go back","format":"uint64","in":"query","name":"trace_config.reexec","required":false,"type":"string"},{"description":"disable_stack switches stack capture","in":"query","name":"trace_config.disable_stack","required":false,"type":"boolean"},{"description":"disable_storage switches storage capture","in":"query","name":"trace_config.disable_storage","required":false,"type":"boolean"},{"description":"debug can be used to print output during capture end","in":"query","name":"trace_config.debug","required":false,"type":"boolean"},{"description":"limit defines the maximum length of output, but zero means unlimited","format":"int32","in":"query","name":"trace_config.limit","required":false,"type":"integer"},{"description":"homestead_block switch (nil no fork, 0 = already homestead)","in":"query","name":"trace_config.overrides.homestead_block","required":false,"type":"string"},{"description":"dao_fork_block corresponds to TheDAO hard-fork switch block (nil no fork)","in":"query","name":"trace_config.overrides.dao_fork_block","required":false,"type":"string"},{"description":"dao_fork_support defines whether the nodes supports or opposes the DAO\nhard-fork","in":"query","name":"trace_config.overrides.dao_fork_support","required":false,"type":"boolean"},{"description":"eip150_block: EIP150 implements the Gas price changes\n(https://github.com/ethereum/EIPs/issues/150) EIP150 HF block (nil no fork)","in":"query","name":"trace_config.overrides.eip150_block","required":false,"type":"string"},{"description":"eip155_block: EIP155Block HF block","in":"query","name":"trace_config.overrides.eip155_block","required":false,"type":"string"},{"description":"eip158_block: EIP158 HF block","in":"query","name":"trace_config.overrides.eip158_block","required":false,"type":"string"},{"description":"byzantium_block: Byzantium switch block (nil no fork, 0 = already on\nbyzantium)","in":"query","name":"trace_config.overrides.byzantium_block","required":false,"type":"string"},{"description":"constantinople_block: Constantinople switch block (nil no fork, 0 = already\nactivated)","in":"query","name":"trace_config.overrides.constantinople_block","required":false,"type":"string"},{"description":"petersburg_block: Petersburg switch block (nil same as Constantinople)","in":"query","name":"trace_config.overrides.petersburg_block","required":false,"type":"string"},{"description":"istanbul_block: Istanbul switch block (nil no fork, 0 = already on\nistanbul)","in":"query","name":"trace_config.overrides.istanbul_block","required":false,"type":"string"},{"description":"muir_glacier_block: Eip-2384 (bomb delay) switch block (nil no fork, 0 =\nalready activated)","in":"query","name":"trace_config.overrides.muir_glacier_block","required":false,"type":"string"},{"description":"berlin_block: Berlin switch block (nil = no fork, 0 = already on berlin)","in":"query","name":"trace_config.overrides.berlin_block","required":false,"type":"string"},{"description":"london_block: London switch block (nil = no fork, 0 = already on london)","in":"query","name":"trace_config.overrides.london_block","required":false,"type":"string"},{"description":"arrow_glacier_block: Eip-4345 (bomb delay) switch block (nil = no fork, 0 =\nalready activated)","in":"query","name":"trace_config.overrides.arrow_glacier_block","required":false,"type":"string"},{"description":"gray_glacier_block: EIP-5133 (bomb delay) switch block (nil = no fork, 0 =\nalready activated)","in":"query","name":"trace_config.overrides.gray_glacier_block","required":false,"type":"string"},{"description":"merge_netsplit_block: Virtual fork after The Merge to use as a network\nsplitter","in":"query","name":"trace_config.overrides.merge_netsplit_block","required":false,"type":"string"},{"description":"chain_id is the id of the chain (EIP-155)","format":"uint64","in":"query","name":"trace_config.overrides.chain_id","required":false,"type":"string"},{"description":"denom is the denomination used on the EVM","in":"query","name":"trace_config.overrides.denom","required":false,"type":"string"},{"description":"decimals is the real decimal precision of the denomination used on the EVM","format":"uint64","in":"query","name":"trace_config.overrides.decimals","required":false,"type":"string"},{"description":"shanghai_time: Shanghai switch time (nil = no fork, 0 = already on\nshanghai)","in":"query","name":"trace_config.overrides.shanghai_time","required":false,"type":"string"},{"description":"cancun_time: Cancun switch time (nil = no fork, 0 = already on cancun)","in":"query","name":"trace_config.overrides.cancun_time","required":false,"type":"string"},{"description":"prague_time: Prague switch time (nil = no fork, 0 = already on prague)","in":"query","name":"trace_config.overrides.prague_time","required":false,"type":"string"},{"description":"verkle_time: Verkle switch time (nil = no fork, 0 = already on verkle)","in":"query","name":"trace_config.overrides.verkle_time","required":false,"type":"string"},{"description":"osaka_time: Osaka switch time (nil = no fork, 0 = already on osaka)","in":"query","name":"trace_config.overrides.osaka_time","required":false,"type":"string"},{"description":"enable_memory switches memory capture","in":"query","name":"trace_config.enable_memory","required":false,"type":"boolean"},{"description":"enable_return_data switches the capture of return data","in":"query","name":"trace_config.enable_return_data","required":false,"type":"boolean"},{"description":"tracer_json_config configures the tracer using a JSON string","in":"query","name":"trace_config.tracer_json_config","required":false,"type":"string"},{"description":"block_number of requested transaction","format":"int64","in":"query","name":"block_number","required":false,"type":"string"},{"description":"block_hash of requested transaction","in":"query","name":"block_hash","required":false,"type":"string"},{"description":"block_time of requested transaction","format":"date-time","in":"query","name":"block_time","required":false,"type":"string"},{"description":"proposer_address is the proposer of the requested block","format":"byte","in":"query","name":"proposer_address","required":false,"type":"string"},{"description":"chain_id is the eip155 chain id parsed from the requested block header","format":"int64","in":"query","name":"chain_id","required":false,"type":"string"},{"description":"block_max_gas of the block of the requested transaction","format":"int64","in":"query","name":"block_max_gas","required":false,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.vm.v1.QueryTraceTxResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"TraceTx implements the `debug_traceTransaction` rpc api","tags":["Query"]}},"/cosmos/evm/vm/v1/validator_account/{cons_address}":{"get":{"operationId":"Query_ValidatorAccount","parameters":[{"description":"cons_address is the validator cons address to query the account for.","in":"path","name":"cons_address","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.vm.v1.QueryValidatorAccountResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"ValidatorAccount queries an Ethereum account's from a validator consensus\nAddress.","tags":["Query"]}},"/cosmos.evm.vm.v1.Msg/RegisterPreinstalls":{"post":{"operationId":"Msg_RegisterPreinstalls","parameters":[{"description":"MsgRegisterPreinstalls defines a Msg for creating preinstalls in evm state.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/cosmos.evm.vm.v1.MsgRegisterPreinstalls"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.vm.v1.MsgRegisterPreinstallsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"RegisterPreinstalls defines a governance operation for directly registering\npreinstalled contracts in the EVM. The authority is the same as is used for\nParams updates.","tags":["Msg"]}},"/cosmos.evm.vm.v1.Msg/UpdateParams":{"post":{"operationId":"Msg_UpdateParams","parameters":[{"description":"MsgUpdateParams defines a Msg for updating the x/vm module parameters.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/cosmos.evm.vm.v1.MsgUpdateParams"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.vm.v1.MsgUpdateParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"UpdateParams defined a governance operation for updating the x/vm module\nparameters. The authority is hard-coded to the Cosmos SDK x/gov module\naccount","tags":["Msg"]}},"/cosmos/evm/vm/v1/ethereum_tx":{"post":{"operationId":"Msg_EthereumTx","parameters":[{"description":"from is the bytes of ethereum signer address. This address value is checked\nagainst the address derived from the signature (V, R, S) using the\nsecp256k1 elliptic curve","format":"byte","in":"query","name":"from","required":false,"type":"string"},{"description":"raw is the raw ethereum transaction","format":"byte","in":"query","name":"raw","required":false,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/cosmos.evm.vm.v1.MsgEthereumTxResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"EthereumTx defines a method submitting Ethereum transactions.","tags":["Msg"]}}},"definitions":{"cosmos.base.query.v1beta1.PageRequest":{"description":"message SomeRequest {\n Foo some_parameter = 1;\n PageRequest pagination = 2;\n }","properties":{"count_total":{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","type":"boolean"},"key":{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","type":"string"},"limit":{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","type":"string"},"offset":{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","type":"string"},"reverse":{"description":"reverse is set to true if results are to be returned in the descending order.\n\nSince: cosmos-sdk 0.43","type":"boolean"}},"title":"PageRequest is to be embedded in gRPC request messages for efficient\npagination. Ex:","type":"object"},"cosmos.base.query.v1beta1.PageResponse":{"description":"PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }","properties":{"next_key":{"description":"next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.","format":"byte","type":"string"},"total":{"format":"uint64","title":"total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise","type":"string"}},"type":"object"},"cosmos.base.v1beta1.Coin":{"description":"Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto.","properties":{"amount":{"type":"string"},"denom":{"type":"string"}},"type":"object"},"cosmos.evm.erc20.v1.MsgConvertCoinResponse":{"title":"MsgConvertCoinResponse returns no fields","type":"object"},"cosmos.evm.erc20.v1.MsgConvertERC20Response":{"title":"MsgConvertERC20Response returns no fields","type":"object"},"cosmos.evm.erc20.v1.MsgRegisterERC20":{"description":"MsgRegisterERC20 is the Msg/RegisterERC20 request type for registering\nan Erc20 contract token pair.","properties":{"erc20addresses":{"items":{"type":"string"},"title":"erc20addresses is a slice of ERC20 token contract hex addresses","type":"array"},"signer":{"title":"signer is the address registering the erc20 pairs","type":"string"}},"type":"object"},"cosmos.evm.erc20.v1.MsgRegisterERC20Response":{"description":"MsgRegisterERC20Response defines the response structure for executing a\nMsgRegisterERC20 message.","type":"object"},"cosmos.evm.erc20.v1.MsgToggleConversion":{"description":"MsgToggleConversion is the Msg/MsgToggleConversion request type for toggling\nan Erc20 contract conversion capability.","properties":{"authority":{"description":"authority is the address of the governance account.","type":"string"},"token":{"title":"token identifier can be either the hex contract address of the ERC20 or the\nCosmos base denomination","type":"string"}},"type":"object"},"cosmos.evm.erc20.v1.MsgToggleConversionResponse":{"description":"MsgToggleConversionResponse defines the response structure for executing a\nToggleConversion message.","type":"object"},"cosmos.evm.erc20.v1.MsgUpdateParams":{"properties":{"authority":{"description":"authority is the address of the governance account.","type":"string"},"params":{"$ref":"#/definitions/cosmos.evm.erc20.v1.Params","description":"params defines the x/vm parameters to update.\nNOTE: All parameters must be supplied."}},"title":"MsgUpdateParams is the Msg/UpdateParams request type for Erc20 parameters.\nSince: cosmos-sdk 0.47","type":"object"},"cosmos.evm.erc20.v1.MsgUpdateParamsResponse":{"title":"MsgUpdateParamsResponse defines the response structure for executing a\nMsgUpdateParams message.\nSince: cosmos-sdk 0.47","type":"object"},"cosmos.evm.erc20.v1.Owner":{"default":"OWNER_UNSPECIFIED","description":"Owner enumerates the ownership of a ERC20 contract.\n\n - OWNER_UNSPECIFIED: OWNER_UNSPECIFIED defines an invalid/undefined owner.\n - OWNER_MODULE: OWNER_MODULE - erc20 is owned by the erc20 module account.\n - OWNER_EXTERNAL: OWNER_EXTERNAL - erc20 is owned by an external account.","enum":["OWNER_UNSPECIFIED","OWNER_MODULE","OWNER_EXTERNAL"],"type":"string"},"cosmos.evm.erc20.v1.Params":{"properties":{"enable_erc20":{"description":"enable_erc20 is the parameter to enable the conversion of Cosmos coins \u003c--\u003e\nERC20 tokens.","type":"boolean"},"permissionless_registration":{"title":"permissionless_registration is the parameter that allows ERC20s to be\npermissionlessly registered to be converted to bank tokens and vice versa","type":"boolean"}},"title":"Params defines the erc20 module params","type":"object"},"cosmos.evm.erc20.v1.QueryParamsResponse":{"description":"QueryParamsResponse is the response type for the Query/Params RPC\nmethod.","properties":{"params":{"$ref":"#/definitions/cosmos.evm.erc20.v1.Params","title":"params are the erc20 module parameters"}},"type":"object"},"cosmos.evm.erc20.v1.QueryTokenPairResponse":{"description":"QueryTokenPairResponse is the response type for the Query/TokenPair RPC\nmethod.","properties":{"token_pair":{"$ref":"#/definitions/cosmos.evm.erc20.v1.TokenPair","title":"token_pairs returns the info about a registered token pair for the erc20\nmodule"}},"type":"object"},"cosmos.evm.erc20.v1.QueryTokenPairsResponse":{"description":"QueryTokenPairsResponse is the response type for the Query/TokenPairs RPC\nmethod.","properties":{"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse","description":"pagination defines the pagination in the response."},"token_pairs":{"items":{"$ref":"#/definitions/cosmos.evm.erc20.v1.TokenPair","type":"object"},"title":"token_pairs is a slice of registered token pairs for the erc20 module","type":"array"}},"type":"object"},"cosmos.evm.erc20.v1.TokenPair":{"description":"TokenPair defines an instance that records a pairing (mapping) consisting of a native\nCosmos Coin and an ERC20 token address. The \"pair\" does not imply an asset swap exchange.","properties":{"contract_owner":{"$ref":"#/definitions/cosmos.evm.erc20.v1.Owner","title":"contract_owner is the an ENUM specifying the type of ERC20 owner (0\ninvalid, 1 ModuleAccount, 2 external address)"},"denom":{"title":"denom defines the cosmos base denomination to be mapped to","type":"string"},"enabled":{"title":"enabled defines the token mapping enable status","type":"boolean"},"erc20_address":{"title":"erc20_address is the hex address of ERC20 contract token","type":"string"}},"type":"object"},"cosmos.evm.feemarket.v1.MsgUpdateParams":{"description":"MsgUpdateParams defines a Msg for updating the x/feemarket module parameters.","properties":{"authority":{"description":"authority is the address of the governance account.","type":"string"},"params":{"$ref":"#/definitions/cosmos.evm.feemarket.v1.Params","description":"params defines the x/feemarket parameters to update.\nNOTE: All parameters must be supplied."}},"type":"object"},"cosmos.evm.feemarket.v1.MsgUpdateParamsResponse":{"description":"MsgUpdateParamsResponse defines the response structure for executing a\nMsgUpdateParams message.","type":"object"},"cosmos.evm.feemarket.v1.Params":{"properties":{"base_fee":{"description":"base_fee for EIP-1559 blocks.","type":"string"},"base_fee_change_denominator":{"description":"base_fee_change_denominator bounds the amount the base fee can change\nbetween blocks.","format":"int64","type":"integer"},"elasticity_multiplier":{"description":"elasticity_multiplier bounds the maximum gas limit an EIP-1559 block may\nhave.","format":"int64","type":"integer"},"enable_height":{"description":"enable_height defines at which block height the base fee calculation is\nenabled.","format":"int64","type":"string"},"min_gas_multiplier":{"title":"min_gas_multiplier bounds the minimum gas used to be charged\nto senders based on gas limit","type":"string"},"min_gas_price":{"title":"min_gas_price defines the minimum gas price value for cosmos and eth\ntransactions","type":"string"},"no_base_fee":{"title":"no_base_fee forces the EIP-1559 base fee to 0 (needed for 0 price calls)","type":"boolean"}},"title":"Params defines the EVM module parameters","type":"object"},"cosmos.evm.feemarket.v1.QueryBaseFeeResponse":{"description":"QueryBaseFeeResponse returns the EIP1559 base fee.","properties":{"base_fee":{"title":"base_fee is the EIP1559 base fee","type":"string"}},"type":"object"},"cosmos.evm.feemarket.v1.QueryBlockGasResponse":{"description":"QueryBlockGasResponse returns block gas used for a given height.","properties":{"gas":{"format":"int64","title":"gas is the returned block gas","type":"string"}},"type":"object"},"cosmos.evm.feemarket.v1.QueryParamsResponse":{"description":"QueryParamsResponse defines the response type for querying x/vm parameters.","properties":{"params":{"$ref":"#/definitions/cosmos.evm.feemarket.v1.Params","description":"params define the evm module parameters."}},"type":"object"},"cosmos.evm.precisebank.v1.QueryFractionalBalanceResponse":{"description":"QueryFractionalBalanceResponse defines the response type for\nQuery/FractionalBalance method.","properties":{"fractional_balance":{"$ref":"#/definitions/cosmos.base.v1beta1.Coin","description":"fractional_balance is the fractional balance of the address."}},"type":"object"},"cosmos.evm.precisebank.v1.QueryRemainderResponse":{"description":"QueryRemainderResponse defines the response type for Query/Remainder method.","properties":{"remainder":{"$ref":"#/definitions/cosmos.base.v1beta1.Coin","description":"remainder is the amount backed by the reserve, but not yet owned by any\naccount, i.e. not in circulation."}},"type":"object"},"cosmos.evm.vm.v1.AccessControl":{"properties":{"call":{"$ref":"#/definitions/cosmos.evm.vm.v1.AccessControlType","title":"call defines the permission policy for calling contracts"},"create":{"$ref":"#/definitions/cosmos.evm.vm.v1.AccessControlType","title":"create defines the permission policy for creating contracts"}},"title":"AccessControl defines the permission policy of the EVM\nfor creating and calling contracts","type":"object"},"cosmos.evm.vm.v1.AccessControlType":{"properties":{"access_control_list":{"items":{"type":"string"},"title":"access_control_list defines defines different things depending on the\nAccessType:\n- ACCESS_TYPE_PERMISSIONLESS: list of addresses that are blocked from\nperforming the operation\n- ACCESS_TYPE_RESTRICTED: ignored\n- ACCESS_TYPE_PERMISSIONED: list of addresses that are allowed to perform\nthe operation","type":"array"},"access_type":{"$ref":"#/definitions/cosmos.evm.vm.v1.AccessType","title":"access_type defines which type of permission is required for the operation"}},"title":"AccessControlType defines the permission type for policies","type":"object"},"cosmos.evm.vm.v1.AccessType":{"default":"ACCESS_TYPE_PERMISSIONLESS","description":"- ACCESS_TYPE_PERMISSIONLESS: ACCESS_TYPE_PERMISSIONLESS does not restrict the operation to anyone\n - ACCESS_TYPE_RESTRICTED: ACCESS_TYPE_RESTRICTED restrict the operation to anyone\n - ACCESS_TYPE_PERMISSIONED: ACCESS_TYPE_PERMISSIONED only allows the operation for specific addresses","enum":["ACCESS_TYPE_PERMISSIONLESS","ACCESS_TYPE_RESTRICTED","ACCESS_TYPE_PERMISSIONED"],"title":"AccessType defines the types of permissions for the operations","type":"string"},"cosmos.evm.vm.v1.ChainConfig":{"description":"ChainConfig defines the Ethereum ChainConfig parameters using *sdk.Int values\ninstead of *big.Int.","properties":{"arrow_glacier_block":{"title":"arrow_glacier_block: Eip-4345 (bomb delay) switch block (nil = no fork, 0 =\nalready activated)","type":"string"},"berlin_block":{"title":"berlin_block: Berlin switch block (nil = no fork, 0 = already on berlin)","type":"string"},"byzantium_block":{"title":"byzantium_block: Byzantium switch block (nil no fork, 0 = already on\nbyzantium)","type":"string"},"cancun_time":{"title":"cancun_time: Cancun switch time (nil = no fork, 0 = already on cancun)","type":"string"},"chain_id":{"format":"uint64","title":"chain_id is the id of the chain (EIP-155)","type":"string"},"constantinople_block":{"title":"constantinople_block: Constantinople switch block (nil no fork, 0 = already\nactivated)","type":"string"},"dao_fork_block":{"title":"dao_fork_block corresponds to TheDAO hard-fork switch block (nil no fork)","type":"string"},"dao_fork_support":{"title":"dao_fork_support defines whether the nodes supports or opposes the DAO\nhard-fork","type":"boolean"},"decimals":{"format":"uint64","title":"decimals is the real decimal precision of the denomination used on the EVM","type":"string"},"denom":{"title":"denom is the denomination used on the EVM","type":"string"},"eip150_block":{"title":"eip150_block: EIP150 implements the Gas price changes\n(https://github.com/ethereum/EIPs/issues/150) EIP150 HF block (nil no fork)","type":"string"},"eip155_block":{"title":"eip155_block: EIP155Block HF block","type":"string"},"eip158_block":{"title":"eip158_block: EIP158 HF block","type":"string"},"gray_glacier_block":{"title":"gray_glacier_block: EIP-5133 (bomb delay) switch block (nil = no fork, 0 =\nalready activated)","type":"string"},"homestead_block":{"title":"homestead_block switch (nil no fork, 0 = already homestead)","type":"string"},"istanbul_block":{"title":"istanbul_block: Istanbul switch block (nil no fork, 0 = already on\nistanbul)","type":"string"},"london_block":{"title":"london_block: London switch block (nil = no fork, 0 = already on london)","type":"string"},"merge_netsplit_block":{"title":"merge_netsplit_block: Virtual fork after The Merge to use as a network\nsplitter","type":"string"},"muir_glacier_block":{"title":"muir_glacier_block: Eip-2384 (bomb delay) switch block (nil no fork, 0 =\nalready activated)","type":"string"},"osaka_time":{"title":"osaka_time: Osaka switch time (nil = no fork, 0 = already on osaka)","type":"string"},"petersburg_block":{"title":"petersburg_block: Petersburg switch block (nil same as Constantinople)","type":"string"},"prague_time":{"title":"prague_time: Prague switch time (nil = no fork, 0 = already on prague)","type":"string"},"shanghai_time":{"title":"shanghai_time: Shanghai switch time (nil = no fork, 0 = already on\nshanghai)","type":"string"},"verkle_time":{"title":"verkle_time: Verkle switch time (nil = no fork, 0 = already on verkle)","type":"string"}},"type":"object"},"cosmos.evm.vm.v1.EstimateGasResponse":{"properties":{"gas":{"format":"uint64","title":"gas returns the estimated gas","type":"string"},"ret":{"format":"byte","title":"ret is the returned data from evm function (result or data supplied with\nrevert opcode)","type":"string"},"vm_error":{"title":"vm_error is the error returned by vm execution","type":"string"}},"title":"EstimateGasResponse defines EstimateGas response","type":"object"},"cosmos.evm.vm.v1.ExtendedDenomOptions":{"properties":{"extended_denom":{"type":"string"}},"type":"object"},"cosmos.evm.vm.v1.Log":{"description":"Log represents an protobuf compatible Ethereum Log that defines a contract\nlog event. These events are generated by the LOG opcode and stored/indexed by\nthe node.\n\nNOTE: address, topics and data are consensus fields. The rest of the fields\nare derived, i.e. filled in by the nodes, but not secured by consensus.","properties":{"address":{"title":"address of the contract that generated the event","type":"string"},"block_hash":{"title":"block_hash of the block in which the transaction was included","type":"string"},"block_number":{"format":"uint64","title":"block_number of the block in which the transaction was included","type":"string"},"block_timestamp":{"format":"uint64","title":"block_timestamp is the timestamp of the block in which the transaction was","type":"string"},"data":{"format":"byte","title":"data which is supplied by the contract, usually ABI-encoded","type":"string"},"index":{"format":"uint64","title":"index of the log in the block","type":"string"},"removed":{"description":"removed is true if this log was reverted due to a chain\nreorganisation. You must pay attention to this field if you receive logs\nthrough a filter query.","type":"boolean"},"topics":{"description":"topics is a list of topics provided by the contract.","items":{"type":"string"},"type":"array"},"tx_hash":{"title":"tx_hash is the transaction hash","type":"string"},"tx_index":{"format":"uint64","title":"tx_index of the transaction in the block","type":"string"}},"type":"object"},"cosmos.evm.vm.v1.MsgEthereumTx":{"description":"MsgEthereumTx encapsulates an Ethereum transaction as an SDK message.","properties":{"from":{"format":"byte","title":"from is the bytes of ethereum signer address. This address value is checked\nagainst the address derived from the signature (V, R, S) using the\nsecp256k1 elliptic curve","type":"string"},"raw":{"format":"byte","title":"raw is the raw ethereum transaction","type":"string"}},"type":"object"},"cosmos.evm.vm.v1.MsgEthereumTxResponse":{"description":"MsgEthereumTxResponse defines the Msg/EthereumTx response type.","properties":{"block_hash":{"format":"byte","title":"include the block hash for json-rpc to use","type":"string"},"block_timestamp":{"format":"uint64","title":"include the block timestamp for json-rpc to use","type":"string"},"gas_used":{"format":"uint64","title":"gas_used specifies how much gas was consumed by the transaction","type":"string"},"hash":{"title":"hash of the ethereum transaction in hex format. This hash differs from the\nCometBFT sha256 hash of the transaction bytes. See\nhttps://github.com/tendermint/tendermint/issues/6539 for reference","type":"string"},"logs":{"description":"logs contains the transaction hash and the proto-compatible ethereum\nlogs.","items":{"$ref":"#/definitions/cosmos.evm.vm.v1.Log","type":"object"},"type":"array"},"max_used_gas":{"format":"uint64","title":"max_used_gas specifies the gas consumed by the transaction, not including refunds","type":"string"},"ret":{"format":"byte","title":"ret is the returned data from evm function (result or data supplied with\nrevert opcode)","type":"string"},"vm_error":{"title":"vm_error is the error returned by vm execution","type":"string"}},"type":"object"},"cosmos.evm.vm.v1.MsgRegisterPreinstalls":{"description":"MsgRegisterPreinstalls defines a Msg for creating preinstalls in evm state.","properties":{"authority":{"description":"authority is the address of the governance account.","type":"string"},"preinstalls":{"description":"preinstalls defines the preinstalls to create.","items":{"$ref":"#/definitions/cosmos.evm.vm.v1.Preinstall","type":"object"},"type":"array"}},"type":"object"},"cosmos.evm.vm.v1.MsgRegisterPreinstallsResponse":{"description":"MsgRegisterPreinstallsResponse defines the response structure for executing a\nMsgRegisterPreinstalls message.","type":"object"},"cosmos.evm.vm.v1.MsgUpdateParams":{"description":"MsgUpdateParams defines a Msg for updating the x/vm module parameters.","properties":{"authority":{"description":"authority is the address of the governance account.","type":"string"},"params":{"$ref":"#/definitions/cosmos.evm.vm.v1.Params","description":"params defines the x/vm parameters to update.\nNOTE: All parameters must be supplied."}},"type":"object"},"cosmos.evm.vm.v1.MsgUpdateParamsResponse":{"description":"MsgUpdateParamsResponse defines the response structure for executing a\nMsgUpdateParams message.","type":"object"},"cosmos.evm.vm.v1.Params":{"properties":{"access_control":{"$ref":"#/definitions/cosmos.evm.vm.v1.AccessControl","title":"access_control defines the permission policy of the EVM"},"active_static_precompiles":{"items":{"type":"string"},"title":"active_static_precompiles defines the slice of hex addresses of the\nprecompiled contracts that are active","type":"array"},"evm_channels":{"items":{"type":"string"},"title":"evm_channels is the list of channel identifiers from EVM compatible chains","type":"array"},"evm_denom":{"description":"evm_denom represents the token denomination used to run the EVM state\ntransitions.","type":"string"},"extended_denom_options":{"$ref":"#/definitions/cosmos.evm.vm.v1.ExtendedDenomOptions"},"extra_eips":{"items":{"format":"int64","type":"string"},"title":"extra_eips defines the additional EIPs for the vm.Config","type":"array"},"history_serve_window":{"format":"uint64","type":"string"}},"title":"Params defines the EVM module parameters","type":"object"},"cosmos.evm.vm.v1.Preinstall":{"properties":{"address":{"title":"address in hex format of the preinstall contract","type":"string"},"code":{"title":"code in hex format for the preinstall contract","type":"string"},"name":{"title":"name of the preinstall contract","type":"string"}},"title":"Preinstall defines a contract that is preinstalled on-chain with a specific\ncontract address and bytecode","type":"object"},"cosmos.evm.vm.v1.QueryAccountResponse":{"description":"QueryAccountResponse is the response type for the Query/Account RPC method.","properties":{"balance":{"description":"balance is the balance of the EVM denomination.","type":"string"},"code_hash":{"description":"code_hash is the hex-formatted code bytes from the EOA.","type":"string"},"nonce":{"description":"nonce is the account's sequence number.","format":"uint64","type":"string"}},"type":"object"},"cosmos.evm.vm.v1.QueryBalanceResponse":{"description":"QueryBalanceResponse is the response type for the Query/Balance RPC method.","properties":{"balance":{"description":"balance is the balance of the EVM denomination.","type":"string"}},"type":"object"},"cosmos.evm.vm.v1.QueryBaseFeeResponse":{"description":"QueryBaseFeeResponse returns the EIP1559 base fee.","properties":{"base_fee":{"title":"base_fee is the EIP1559 base fee","type":"string"}},"type":"object"},"cosmos.evm.vm.v1.QueryCodeResponse":{"description":"QueryCodeResponse is the response type for the Query/Code RPC\nmethod.","properties":{"code":{"description":"code represents the code bytes from an ethereum address.","format":"byte","type":"string"}},"type":"object"},"cosmos.evm.vm.v1.QueryConfigResponse":{"description":"QueryConfigResponse returns the EVM config.","properties":{"config":{"$ref":"#/definitions/cosmos.evm.vm.v1.ChainConfig","title":"config is the evm configuration"}},"type":"object"},"cosmos.evm.vm.v1.QueryCosmosAccountResponse":{"description":"QueryCosmosAccountResponse is the response type for the Query/CosmosAccount\nRPC method.","properties":{"account_number":{"format":"uint64","title":"account_number is the account number","type":"string"},"cosmos_address":{"description":"cosmos_address is the cosmos address of the account.","type":"string"},"sequence":{"description":"sequence is the account's sequence number.","format":"uint64","type":"string"}},"type":"object"},"cosmos.evm.vm.v1.QueryGlobalMinGasPriceResponse":{"properties":{"min_gas_price":{"title":"min_gas_price is the feemarket's min_gas_price","type":"string"}},"title":"QueryGlobalMinGasPriceResponse returns the GlobalMinGasPrice","type":"object"},"cosmos.evm.vm.v1.QueryParamsResponse":{"description":"QueryParamsResponse defines the response type for querying x/vm parameters.","properties":{"params":{"$ref":"#/definitions/cosmos.evm.vm.v1.Params","description":"params define the evm module parameters."}},"type":"object"},"cosmos.evm.vm.v1.QueryStorageResponse":{"description":"QueryStorageResponse is the response type for the Query/Storage RPC\nmethod.","properties":{"value":{"description":"value defines the storage state value hash associated with the given key.","type":"string"}},"type":"object"},"cosmos.evm.vm.v1.QueryTraceBlockResponse":{"properties":{"data":{"format":"byte","title":"data is the response serialized in bytes","type":"string"}},"title":"QueryTraceBlockResponse defines TraceBlock response","type":"object"},"cosmos.evm.vm.v1.QueryTraceCallResponse":{"properties":{"data":{"format":"byte","title":"data is the response serialized in bytes","type":"string"}},"title":"QueryTraceCallResponse defines TraceCall response","type":"object"},"cosmos.evm.vm.v1.QueryTraceTxResponse":{"properties":{"data":{"format":"byte","title":"data is the response serialized in bytes","type":"string"}},"title":"QueryTraceTxResponse defines TraceTx response","type":"object"},"cosmos.evm.vm.v1.QueryValidatorAccountResponse":{"description":"QueryValidatorAccountResponse is the response type for the\nQuery/ValidatorAccount RPC method.","properties":{"account_address":{"description":"account_address is the cosmos address of the account in bech32 format.","type":"string"},"account_number":{"format":"uint64","title":"account_number is the account number","type":"string"},"sequence":{"description":"sequence is the account's sequence number.","format":"uint64","type":"string"}},"type":"object"},"cosmos.evm.vm.v1.TraceConfig":{"description":"TraceConfig holds extra parameters to trace functions.","properties":{"debug":{"title":"debug can be used to print output during capture end","type":"boolean"},"disable_stack":{"title":"disable_stack switches stack capture","type":"boolean"},"disable_storage":{"title":"disable_storage switches storage capture","type":"boolean"},"enable_memory":{"title":"enable_memory switches memory capture","type":"boolean"},"enable_return_data":{"title":"enable_return_data switches the capture of return data","type":"boolean"},"limit":{"format":"int32","title":"limit defines the maximum length of output, but zero means unlimited","type":"integer"},"overrides":{"$ref":"#/definitions/cosmos.evm.vm.v1.ChainConfig","title":"overrides can be used to execute a trace using future fork rules"},"reexec":{"format":"uint64","title":"reexec defines the number of blocks the tracer is willing to go back","type":"string"},"timeout":{"title":"timeout overrides the default timeout of 5 seconds for JavaScript-based\ntracing calls","type":"string"},"tracer":{"title":"tracer is a custom javascript tracer","type":"string"},"tracer_json_config":{"title":"tracer_json_config configures the tracer using a JSON string","type":"string"}},"type":"object"},"google.protobuf.Any":{"additionalProperties":{},"properties":{"@type":{"type":"string"}},"type":"object"},"google.rpc.Status":{"properties":{"code":{"format":"int32","type":"integer"},"details":{"items":{"$ref":"#/definitions/google.protobuf.Any","type":"object"},"type":"array"},"message":{"type":"string"}},"type":"object"},"lumera.action.v1.Action":{"description":"Action represents a specific action within the Lumera protocol.","properties":{"actionID":{"type":"string"},"actionType":{"$ref":"#/definitions/lumera.action.v1.ActionType"},"app_pubkey":{"format":"byte","type":"string"},"blockHeight":{"format":"int64","type":"string"},"creator":{"type":"string"},"expirationTime":{"format":"int64","type":"string"},"fileSizeKbs":{"format":"int64","type":"string"},"metadata":{"format":"byte","type":"string"},"price":{"type":"string"},"state":{"$ref":"#/definitions/lumera.action.v1.ActionState"},"superNodes":{"items":{"type":"string"},"type":"array"}},"type":"object"},"lumera.action.v1.ActionState":{"default":"ACTION_STATE_UNSPECIFIED","description":"ActionState enum represents the various states an action can be in.\n\n - ACTION_STATE_UNSPECIFIED: The default state, used when the state is not specified.\n - ACTION_STATE_PENDING: The action is pending and has not yet been processed.\n - ACTION_STATE_PROCESSING: The action is currently being processed.\n - ACTION_STATE_DONE: The action has been completed successfully.\n - ACTION_STATE_APPROVED: The action has been approved.\n - ACTION_STATE_REJECTED: The action has been rejected.\n - ACTION_STATE_FAILED: The action has failed.\n - ACTION_STATE_EXPIRED: The action has expired and is no longer valid.","enum":["ACTION_STATE_UNSPECIFIED","ACTION_STATE_PENDING","ACTION_STATE_PROCESSING","ACTION_STATE_DONE","ACTION_STATE_APPROVED","ACTION_STATE_REJECTED","ACTION_STATE_FAILED","ACTION_STATE_EXPIRED"],"type":"string"},"lumera.action.v1.ActionType":{"default":"ACTION_TYPE_UNSPECIFIED","description":"ActionType enum represents the various types of actions that can be performed.\n\n - ACTION_TYPE_UNSPECIFIED: The default action type, used when the type is not specified.\n - ACTION_TYPE_SENSE: The action type for sense operations.\n - ACTION_TYPE_CASCADE: The action type for cascade operations.","enum":["ACTION_TYPE_UNSPECIFIED","ACTION_TYPE_SENSE","ACTION_TYPE_CASCADE"],"type":"string"},"lumera.action.v1.MsgApproveAction":{"description":"MsgApproveAction is the Msg/ApproveAction request type.","properties":{"actionId":{"type":"string"},"creator":{"type":"string"}},"type":"object"},"lumera.action.v1.MsgApproveActionResponse":{"properties":{"actionId":{"type":"string"},"status":{"type":"string"}},"title":"MsgApproveActionResponse defines the response structure for executing a MsgApproveAction","type":"object"},"lumera.action.v1.MsgFinalizeAction":{"description":"MsgFinalizeAction is the Msg/FinalizeAction request type.","properties":{"actionId":{"type":"string"},"actionType":{"type":"string"},"creator":{"title":"must be supernode address","type":"string"},"metadata":{"type":"string"}},"type":"object"},"lumera.action.v1.MsgFinalizeActionResponse":{"title":"MsgFinalizeActionResponse defines the response structure for executing a MsgFinalizeAction","type":"object"},"lumera.action.v1.MsgRequestAction":{"description":"MsgRequestAction is the Msg/RequestAction request type.","properties":{"actionType":{"type":"string"},"app_pubkey":{"format":"byte","type":"string"},"creator":{"type":"string"},"expirationTime":{"type":"string"},"fileSizeKbs":{"type":"string"},"metadata":{"type":"string"},"price":{"type":"string"}},"type":"object"},"lumera.action.v1.MsgRequestActionResponse":{"properties":{"actionId":{"type":"string"},"status":{"type":"string"}},"title":"MsgRequestActionResponse defines the response structure for executing a MsgRequestAction","type":"object"},"lumera.action.v1.MsgUpdateParams":{"description":"MsgUpdateParams is the Msg/UpdateParams request type.","properties":{"authority":{"description":"authority is the address that controls the module (defaults to x/gov unless overwritten).","type":"string"},"params":{"$ref":"#/definitions/lumera.action.v1.Params","description":"NOTE: All parameters must be supplied."}},"type":"object"},"lumera.action.v1.MsgUpdateParamsResponse":{"description":"MsgUpdateParamsResponse defines the response structure for executing a\nMsgUpdateParams message.","type":"object"},"lumera.action.v1.Params":{"description":"Params defines the parameters for the module.","properties":{"base_action_fee":{"$ref":"#/definitions/cosmos.base.v1beta1.Coin","title":"Fees"},"expiration_duration":{"title":"Time Constraints","type":"string"},"fee_per_kbyte":{"$ref":"#/definitions/cosmos.base.v1beta1.Coin"},"foundation_fee_share":{"type":"string"},"max_actions_per_block":{"format":"uint64","title":"Limits","type":"string"},"max_dd_and_fingerprints":{"format":"uint64","type":"string"},"max_processing_time":{"type":"string"},"max_raptor_q_symbols":{"format":"uint64","type":"string"},"min_processing_time":{"type":"string"},"min_super_nodes":{"format":"uint64","type":"string"},"super_node_fee_share":{"title":"Reward Distribution","type":"string"},"svc_challenge_count":{"description":"Number of chunks to challenge (default: 8)","format":"int64","title":"LEP-5: Storage Verification Challenge parameters","type":"integer"},"svc_min_chunks_for_challenge":{"format":"int64","title":"Minimum chunks required for SVC (default: 4)","type":"integer"}},"type":"object"},"lumera.action.v1.QueryActionByMetadataResponse":{"properties":{"actions":{"items":{"$ref":"#/definitions/lumera.action.v1.Action","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"},"total":{"format":"uint64","type":"string"}},"title":"QueryActionByMetadataResponse is a response type to query actions by metadata","type":"object"},"lumera.action.v1.QueryGetActionFeeResponse":{"properties":{"amount":{"type":"string"}},"title":"QueryGetActionFeeResponse is a response type to get action fee","type":"object"},"lumera.action.v1.QueryGetActionResponse":{"properties":{"action":{"$ref":"#/definitions/lumera.action.v1.Action"}},"title":"Response type for GetAction","type":"object"},"lumera.action.v1.QueryListActionsByBlockHeightResponse":{"properties":{"actions":{"items":{"$ref":"#/definitions/lumera.action.v1.Action","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"},"total":{"format":"uint64","type":"string"}},"title":"QueryListActionsByBlockHeightResponse is a response type to list actions by block height","type":"object"},"lumera.action.v1.QueryListActionsByCreatorResponse":{"properties":{"actions":{"items":{"$ref":"#/definitions/lumera.action.v1.Action","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"},"total":{"format":"uint64","type":"string"}},"title":"QueryListActionsByCreatorResponse is a response type to list actions for a specific creator","type":"object"},"lumera.action.v1.QueryListActionsBySuperNodeResponse":{"properties":{"actions":{"items":{"$ref":"#/definitions/lumera.action.v1.Action","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"},"total":{"format":"uint64","type":"string"}},"title":"QueryListActionsBySuperNodeResponse is a response type to list actions for a specific supernode","type":"object"},"lumera.action.v1.QueryListActionsResponse":{"properties":{"actions":{"items":{"$ref":"#/definitions/lumera.action.v1.Action","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"},"total":{"format":"uint64","type":"string"}},"title":"QueryListActionsResponse is a response type to list actions","type":"object"},"lumera.action.v1.QueryListExpiredActionsResponse":{"properties":{"actions":{"items":{"$ref":"#/definitions/lumera.action.v1.Action","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"},"total":{"format":"uint64","type":"string"}},"title":"QueryListExpiredActionsResponse is a response type to list expired actions","type":"object"},"lumera.action.v1.QueryParamsResponse":{"description":"QueryParamsResponse is response type for the Query/Params RPC method.","properties":{"params":{"$ref":"#/definitions/lumera.action.v1.Params","description":"params holds all the parameters of this module."}},"type":"object"},"lumera.audit.v1.EpochAnchor":{"description":"EpochAnchor is a minimal per-epoch on-chain anchor that freezes the deterministic seed\nand the eligible supernode sets used for deterministic selection off-chain.","properties":{"active_set_commitment":{"format":"byte","type":"string"},"active_supernode_accounts":{"description":"active_supernode_accounts is the sorted list of ACTIVE supernodes at epoch start.","items":{"type":"string"},"type":"array"},"epoch_end_height":{"format":"int64","type":"string"},"epoch_id":{"format":"uint64","type":"string"},"epoch_length_blocks":{"format":"uint64","type":"string"},"epoch_start_height":{"format":"int64","type":"string"},"params_commitment":{"description":"params_commitment is a hash commitment to Params (with defaults) at epoch start.","format":"byte","type":"string"},"seed":{"description":"seed is a fixed 32-byte value derived at epoch start (domain-separated).","format":"byte","type":"string"},"target_supernode_accounts":{"description":"target_supernode_accounts is the sorted list of eligible targets at epoch start:\nACTIVE + POSTPONED supernodes.","items":{"type":"string"},"type":"array"},"targets_set_commitment":{"format":"byte","type":"string"}},"type":"object"},"lumera.audit.v1.EpochReport":{"description":"EpochReport is a single per-epoch report submitted by a Supernode.","properties":{"epoch_id":{"format":"uint64","type":"string"},"host_report":{"$ref":"#/definitions/lumera.audit.v1.HostReport"},"report_height":{"format":"int64","type":"string"},"storage_challenge_observations":{"items":{"$ref":"#/definitions/lumera.audit.v1.StorageChallengeObservation","type":"object"},"type":"array"},"storage_proof_results":{"items":{"$ref":"#/definitions/lumera.audit.v1.StorageProofResult","type":"object"},"type":"array"},"supernode_account":{"type":"string"}},"type":"object"},"lumera.audit.v1.Evidence":{"description":"Evidence is a stable outer record that stores evidence about an audited subject.\nType-specific fields are encoded into the `metadata` bytes field.","properties":{"action_id":{"description":"action_id optionally links this evidence to a specific action.","type":"string"},"evidence_id":{"description":"evidence_id is a chain-assigned unique identifier.","format":"uint64","type":"string"},"evidence_type":{"$ref":"#/definitions/lumera.audit.v1.EvidenceType","description":"evidence_type is a stable discriminator used to interpret metadata."},"metadata":{"description":"metadata is protobuf-binary bytes of a type-specific Evidence metadata message.","format":"byte","type":"string"},"reported_height":{"description":"reported_height is the block height when the evidence was submitted.","format":"uint64","type":"string"},"reporter_address":{"description":"reporter_address is the submitter of the evidence.","type":"string"},"subject_address":{"description":"subject_address is the audited subject (e.g. supernode-related actor).","type":"string"}},"type":"object"},"lumera.audit.v1.EvidenceType":{"default":"EVIDENCE_TYPE_UNSPECIFIED","description":" - EVIDENCE_TYPE_ACTION_FINALIZATION_SIGNATURE_FAILURE: action finalization rejected due to an invalid signature / signature-derived data.\n - EVIDENCE_TYPE_ACTION_FINALIZATION_NOT_IN_TOP_10: action finalization rejected because the attempted finalizer is not in the top-10 supernodes.\n - EVIDENCE_TYPE_STORAGE_CHALLENGE_FAILURE: storage challenge failure evidence submitted by the deterministic challenger.\n - EVIDENCE_TYPE_CASCADE_CLIENT_FAILURE: client-observed cascade flow failure (upload/download).","enum":["EVIDENCE_TYPE_UNSPECIFIED","EVIDENCE_TYPE_ACTION_FINALIZATION_SIGNATURE_FAILURE","EVIDENCE_TYPE_ACTION_FINALIZATION_NOT_IN_TOP_10","EVIDENCE_TYPE_ACTION_EXPIRED","EVIDENCE_TYPE_STORAGE_CHALLENGE_FAILURE","EVIDENCE_TYPE_CASCADE_CLIENT_FAILURE"],"type":"string"},"lumera.audit.v1.HealOp":{"description":"HealOp is the chain-tracked storage-truth healing operation state.","properties":{"created_height":{"format":"uint64","type":"string"},"deadline_epoch_id":{"format":"uint64","type":"string"},"heal_op_id":{"format":"uint64","type":"string"},"healer_supernode_account":{"type":"string"},"notes":{"type":"string"},"result_hash":{"type":"string"},"scheduled_epoch_id":{"format":"uint64","type":"string"},"status":{"$ref":"#/definitions/lumera.audit.v1.HealOpStatus"},"ticket_id":{"type":"string"},"updated_height":{"format":"uint64","type":"string"},"verifier_supernode_accounts":{"items":{"type":"string"},"type":"array"}},"type":"object"},"lumera.audit.v1.HealOpStatus":{"default":"HEAL_OP_STATUS_UNSPECIFIED","enum":["HEAL_OP_STATUS_UNSPECIFIED","HEAL_OP_STATUS_SCHEDULED","HEAL_OP_STATUS_IN_PROGRESS","HEAL_OP_STATUS_HEALER_REPORTED","HEAL_OP_STATUS_VERIFIED","HEAL_OP_STATUS_FAILED","HEAL_OP_STATUS_EXPIRED"],"type":"string"},"lumera.audit.v1.HostReport":{"description":"HostReport is the Supernode's self-reported host metrics and counters for an epoch.","properties":{"cpu_usage_percent":{"format":"double","type":"number"},"disk_usage_percent":{"format":"double","type":"number"},"failed_actions_count":{"format":"int64","type":"integer"},"inbound_port_states":{"items":{"$ref":"#/definitions/lumera.audit.v1.PortState"},"type":"array"},"mem_usage_percent":{"format":"double","type":"number"}},"type":"object"},"lumera.audit.v1.HostReportEntry":{"properties":{"epoch_id":{"format":"uint64","type":"string"},"host_report":{"$ref":"#/definitions/lumera.audit.v1.HostReport"},"report_height":{"format":"int64","type":"string"}},"type":"object"},"lumera.audit.v1.MsgClaimHealComplete":{"properties":{"creator":{"type":"string"},"details":{"type":"string"},"heal_manifest_hash":{"type":"string"},"heal_op_id":{"format":"uint64","type":"string"},"ticket_id":{"type":"string"}},"type":"object"},"lumera.audit.v1.MsgClaimHealCompleteResponse":{"type":"object"},"lumera.audit.v1.MsgSubmitEpochReport":{"properties":{"creator":{"description":"creator is the transaction signer.","type":"string"},"epoch_id":{"format":"uint64","type":"string"},"host_report":{"$ref":"#/definitions/lumera.audit.v1.HostReport"},"storage_challenge_observations":{"items":{"$ref":"#/definitions/lumera.audit.v1.StorageChallengeObservation","type":"object"},"type":"array"},"storage_proof_results":{"items":{"$ref":"#/definitions/lumera.audit.v1.StorageProofResult","type":"object"},"type":"array"}},"type":"object"},"lumera.audit.v1.MsgSubmitEpochReportResponse":{"type":"object"},"lumera.audit.v1.MsgSubmitEvidence":{"properties":{"action_id":{"type":"string"},"creator":{"type":"string"},"evidence_type":{"$ref":"#/definitions/lumera.audit.v1.EvidenceType"},"metadata":{"description":"metadata is JSON for the type-specific Evidence metadata message.\nThe chain stores protobuf-binary bytes derived from this JSON.","type":"string"},"subject_address":{"type":"string"}},"type":"object"},"lumera.audit.v1.MsgSubmitEvidenceResponse":{"properties":{"evidence_id":{"format":"uint64","type":"string"}},"type":"object"},"lumera.audit.v1.MsgSubmitHealVerification":{"properties":{"creator":{"type":"string"},"details":{"type":"string"},"heal_op_id":{"format":"uint64","type":"string"},"verification_hash":{"type":"string"},"verified":{"type":"boolean"}},"type":"object"},"lumera.audit.v1.MsgSubmitHealVerificationResponse":{"type":"object"},"lumera.audit.v1.MsgSubmitStorageRecheckEvidence":{"properties":{"challenged_result_transcript_hash":{"type":"string"},"challenged_supernode_account":{"type":"string"},"creator":{"type":"string"},"details":{"type":"string"},"epoch_id":{"format":"uint64","type":"string"},"recheck_result_class":{"$ref":"#/definitions/lumera.audit.v1.StorageProofResultClass"},"recheck_transcript_hash":{"type":"string"},"ticket_id":{"type":"string"}},"type":"object"},"lumera.audit.v1.MsgSubmitStorageRecheckEvidenceResponse":{"type":"object"},"lumera.audit.v1.MsgUpdateParams":{"properties":{"authority":{"type":"string"},"params":{"$ref":"#/definitions/lumera.audit.v1.Params"}},"type":"object"},"lumera.audit.v1.MsgUpdateParamsResponse":{"type":"object"},"lumera.audit.v1.NodeSuspicionState":{"description":"NodeSuspicionState is the persisted storage-truth node-level suspicion snapshot.","properties":{"class_a_count_window":{"format":"int64","type":"integer"},"class_b_count_window":{"format":"int64","type":"integer"},"clean_pass_count":{"format":"int64","type":"integer"},"clean_pass_count_at_postpone":{"description":"Per 121-F8 — recovery delta from snapshot, not cumulative.","format":"int64","type":"integer"},"distinct_ticket_fail_window":{"format":"int64","type":"integer"},"last_class_a_epoch":{"format":"uint64","type":"string"},"last_class_b_epoch":{"format":"uint64","type":"string"},"last_clean_pass_epoch":{"format":"uint64","type":"string"},"last_index_fail_epoch":{"format":"uint64","type":"string"},"last_old_fail_epoch":{"format":"uint64","type":"string"},"last_recent_fail_epoch":{"format":"uint64","type":"string"},"last_updated_epoch":{"format":"uint64","type":"string"},"supernode_account":{"type":"string"},"suspicion_score":{"format":"int64","type":"string"},"window_start_epoch":{"format":"uint64","type":"string"}},"type":"object"},"lumera.audit.v1.Params":{"description":"Params defines the parameters for the audit module.","properties":{"action_finalization_not_in_top10_consecutive_epochs":{"description":"action_finalization_not_in_top10_consecutive_epochs is the consecutive epochs threshold\nfor EVIDENCE_TYPE_ACTION_FINALIZATION_NOT_IN_TOP_10.","format":"int64","type":"integer"},"action_finalization_not_in_top10_evidences_per_epoch":{"description":"action_finalization_not_in_top10_evidences_per_epoch is the per-epoch count threshold\nfor EVIDENCE_TYPE_ACTION_FINALIZATION_NOT_IN_TOP_10.","format":"int64","type":"integer"},"action_finalization_recovery_epochs":{"description":"action_finalization_recovery_epochs is the number of epochs to wait before considering recovery.","format":"int64","type":"integer"},"action_finalization_recovery_max_total_bad_evidences":{"description":"action_finalization_recovery_max_total_bad_evidences is the maximum allowed total count of bad\naction-finalization evidences in the recovery epoch-span for auto-recovery to occur.\nRecovery happens ONLY IF total_bad \u003c this value.","format":"int64","type":"integer"},"action_finalization_signature_failure_consecutive_epochs":{"description":"action_finalization_signature_failure_consecutive_epochs is the consecutive epochs threshold\nfor EVIDENCE_TYPE_ACTION_FINALIZATION_SIGNATURE_FAILURE.","format":"int64","type":"integer"},"action_finalization_signature_failure_evidences_per_epoch":{"description":"action_finalization_signature_failure_evidences_per_epoch is the per-epoch count threshold\nfor EVIDENCE_TYPE_ACTION_FINALIZATION_SIGNATURE_FAILURE.","format":"int64","type":"integer"},"consecutive_epochs_to_postpone":{"description":"Number of consecutive epochs a required port must be reported CLOSED by peers\nat or above peer_port_postpone_threshold_percent before postponing the supernode.","format":"int64","type":"integer"},"epoch_length_blocks":{"format":"uint64","type":"string"},"epoch_zero_height":{"description":"epoch_zero_height defines the reference chain height at which epoch_id = 0 starts.\nThis makes epoch boundaries deterministic from genesis without needing to query state.","format":"uint64","type":"string"},"keep_last_epoch_entries":{"description":"How many completed epochs to keep in state for epoch-scoped data like EpochReport\nand related indices. Pruning runs at epoch end.","format":"uint64","type":"string"},"max_probe_targets_per_epoch":{"format":"int64","type":"integer"},"min_cpu_free_percent":{"description":"Minimum required host free capacity (self reported).\nfree% = 100 - usage%\nA usage% of 0 is treated as \"unknown\" (no action).","format":"int64","type":"integer"},"min_disk_free_percent":{"format":"int64","type":"integer"},"min_mem_free_percent":{"format":"int64","type":"integer"},"min_probe_targets_per_epoch":{"format":"int64","type":"integer"},"peer_port_postpone_threshold_percent":{"description":"Minimum percent (1-100) of peer reports that must report a required port as CLOSED\nfor the port to be treated as CLOSED for postponement purposes.\n\n100 means unanimous.\nExample: to approximate a 2/3 threshold, use 66 (since 2/3 ≈ 66.6%).","format":"int64","type":"integer"},"peer_quorum_reports":{"format":"int64","type":"integer"},"required_open_ports":{"items":{"format":"int64","type":"integer"},"type":"array"},"sc_challengers_per_epoch":{"format":"int64","type":"integer"},"sc_enabled":{"description":"Storage Challenge (SC) params.","type":"boolean"},"storage_truth_challenge_target_divisor":{"format":"int64","type":"integer"},"storage_truth_class_a_fault_window":{"description":"Class A and B fault windows.","format":"int64","type":"integer"},"storage_truth_class_b_fault_window":{"format":"int64","type":"integer"},"storage_truth_compound_range_len_bytes":{"format":"int64","type":"integer"},"storage_truth_compound_ranges_per_artifact":{"format":"int64","type":"integer"},"storage_truth_contradiction_window_epochs":{"description":"Contradiction confirmation window in epochs (default 7).","format":"int64","type":"integer"},"storage_truth_divergence_window_epochs":{"description":"Statistical divergence scoring params.","format":"int64","type":"integer"},"storage_truth_enforcement_mode":{"$ref":"#/definitions/lumera.audit.v1.StorageTruthEnforcementMode","description":"Storage-truth rollout gate."},"storage_truth_heal_deadline_epochs":{"description":"Heal deadline in epochs (default 3).","format":"int64","type":"integer"},"storage_truth_heal_verifier_count":{"description":"Number of verifier supernodes assigned per heal-op (NEW-B-3, default 2).\nVerifiers cross-check the healer's recovery; making this a Param allows\ngovernance to tune redundancy if heal volume / failure rate shifts.","format":"int64","type":"integer"},"storage_truth_max_self_heal_ops_per_epoch":{"description":"Storage-truth scoring and healing params.","format":"int64","type":"integer"},"storage_truth_node_suspicion_decay_per_epoch":{"format":"int64","type":"string"},"storage_truth_node_suspicion_threshold_postpone":{"format":"int64","type":"string"},"storage_truth_node_suspicion_threshold_probation":{"format":"int64","type":"string"},"storage_truth_node_suspicion_threshold_strong_postpone":{"description":"Strong-postpone threshold (default 140).","format":"int64","type":"string"},"storage_truth_node_suspicion_threshold_watch":{"format":"int64","type":"string"},"storage_truth_old_bucket_min_blocks":{"format":"uint64","type":"string"},"storage_truth_old_class_a_fault_window":{"description":"OLD Class-A distinct-ticket window in epochs (default 21).","format":"int64","type":"integer"},"storage_truth_pattern_escalation_window":{"description":"Pattern escalation window in epochs (default 14).","format":"int64","type":"integer"},"storage_truth_probation_epochs":{"format":"int64","type":"integer"},"storage_truth_recent_bucket_max_blocks":{"description":"Storage-truth challenge shape params.","format":"uint64","type":"string"},"storage_truth_recovery_clean_pass_count":{"description":"Recovery requires this many clean passes (default 3).","format":"int64","type":"integer"},"storage_truth_reporter_ineligible_duration_epochs":{"description":"Reporter challenger ineligibility duration in epochs (default 7).","format":"int64","type":"integer"},"storage_truth_reporter_min_reports_for_divergence":{"format":"int64","type":"integer"},"storage_truth_reporter_reliability_decay_per_epoch":{"format":"int64","type":"string"},"storage_truth_reporter_reliability_degraded_threshold":{"description":"New LEP-6 spec-alignment params.\nReporter reliability degraded threshold (positive-penalty model).","format":"int64","type":"string"},"storage_truth_reporter_reliability_ineligible_threshold":{"format":"int64","type":"string"},"storage_truth_reporter_reliability_low_trust_threshold":{"format":"int64","type":"string"},"storage_truth_strong_recovery_clean_pass_count":{"description":"Strong-band recovery clean-pass requirement (F121-F12, default 5).","format":"int64","type":"integer"},"storage_truth_ticket_deterioration_decay_per_epoch":{"format":"int64","type":"string"},"storage_truth_ticket_deterioration_heal_threshold":{"format":"int64","type":"string"}},"type":"object"},"lumera.audit.v1.PortState":{"default":"PORT_STATE_UNKNOWN","enum":["PORT_STATE_UNKNOWN","PORT_STATE_OPEN","PORT_STATE_CLOSED"],"type":"string"},"lumera.audit.v1.QueryAssignedTargetsResponse":{"properties":{"epoch_id":{"format":"uint64","type":"string"},"epoch_start_height":{"format":"int64","type":"string"},"required_open_ports":{"items":{"format":"int64","type":"integer"},"type":"array"},"target_supernode_accounts":{"items":{"type":"string"},"type":"array"}},"type":"object"},"lumera.audit.v1.QueryCurrentEpochAnchorResponse":{"properties":{"anchor":{"$ref":"#/definitions/lumera.audit.v1.EpochAnchor"}},"type":"object"},"lumera.audit.v1.QueryCurrentEpochResponse":{"properties":{"epoch_end_height":{"format":"int64","type":"string"},"epoch_id":{"format":"uint64","type":"string"},"epoch_start_height":{"format":"int64","type":"string"}},"type":"object"},"lumera.audit.v1.QueryEpochAnchorResponse":{"properties":{"anchor":{"$ref":"#/definitions/lumera.audit.v1.EpochAnchor"}},"type":"object"},"lumera.audit.v1.QueryEpochReportResponse":{"properties":{"report":{"$ref":"#/definitions/lumera.audit.v1.EpochReport"}},"type":"object"},"lumera.audit.v1.QueryEpochReportsByReporterResponse":{"properties":{"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"},"reports":{"items":{"$ref":"#/definitions/lumera.audit.v1.EpochReport","type":"object"},"type":"array"}},"type":"object"},"lumera.audit.v1.QueryEvidenceByActionResponse":{"properties":{"evidence":{"items":{"$ref":"#/definitions/lumera.audit.v1.Evidence","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"}},"type":"object"},"lumera.audit.v1.QueryEvidenceByIdResponse":{"properties":{"evidence":{"$ref":"#/definitions/lumera.audit.v1.Evidence"}},"type":"object"},"lumera.audit.v1.QueryEvidenceBySubjectResponse":{"properties":{"evidence":{"items":{"$ref":"#/definitions/lumera.audit.v1.Evidence","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"}},"type":"object"},"lumera.audit.v1.QueryHealOpResponse":{"properties":{"heal_op":{"$ref":"#/definitions/lumera.audit.v1.HealOp"}},"type":"object"},"lumera.audit.v1.QueryHealOpsByStatusResponse":{"properties":{"heal_ops":{"items":{"$ref":"#/definitions/lumera.audit.v1.HealOp","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"}},"type":"object"},"lumera.audit.v1.QueryHealOpsByTicketResponse":{"properties":{"heal_ops":{"items":{"$ref":"#/definitions/lumera.audit.v1.HealOp","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"}},"type":"object"},"lumera.audit.v1.QueryHostReportsResponse":{"properties":{"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"},"reports":{"items":{"$ref":"#/definitions/lumera.audit.v1.HostReportEntry","type":"object"},"type":"array"}},"type":"object"},"lumera.audit.v1.QueryNodeSuspicionStateResponse":{"properties":{"state":{"$ref":"#/definitions/lumera.audit.v1.NodeSuspicionState"}},"type":"object"},"lumera.audit.v1.QueryParamsResponse":{"properties":{"params":{"$ref":"#/definitions/lumera.audit.v1.Params"}},"type":"object"},"lumera.audit.v1.QueryReporterReliabilityStateResponse":{"properties":{"state":{"$ref":"#/definitions/lumera.audit.v1.ReporterReliabilityState"}},"type":"object"},"lumera.audit.v1.QueryStorageChallengeReportsResponse":{"properties":{"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"},"reports":{"items":{"$ref":"#/definitions/lumera.audit.v1.StorageChallengeReport","type":"object"},"type":"array"}},"type":"object"},"lumera.audit.v1.QueryTicketDeteriorationStateResponse":{"properties":{"state":{"$ref":"#/definitions/lumera.audit.v1.TicketDeteriorationState"}},"type":"object"},"lumera.audit.v1.ReporterReliabilityState":{"description":"ReporterReliabilityState is the persisted storage-truth reporter reliability snapshot.","properties":{"contradiction_count":{"format":"uint64","type":"string"},"ineligible_until_epoch":{"format":"uint64","type":"string"},"last_updated_epoch":{"format":"uint64","type":"string"},"reliability_score":{"format":"int64","type":"string"},"reporter_supernode_account":{"type":"string"},"trust_band":{"$ref":"#/definitions/lumera.audit.v1.ReporterTrustBand"},"window_negative_count":{"format":"int64","type":"integer"},"window_positive_count":{"format":"int64","type":"integer"},"window_start_epoch":{"format":"uint64","type":"string"}},"type":"object"},"lumera.audit.v1.ReporterTrustBand":{"default":"REPORTER_TRUST_BAND_UNSPECIFIED","enum":["REPORTER_TRUST_BAND_UNSPECIFIED","REPORTER_TRUST_BAND_NORMAL","REPORTER_TRUST_BAND_LOW_TRUST","REPORTER_TRUST_BAND_CHALLENGER_INELIGIBLE","REPORTER_TRUST_BAND_DEGRADED"],"type":"string"},"lumera.audit.v1.StorageChallengeObservation":{"description":"StorageChallengeObservation is a prober's reachability observation about an assigned target.","properties":{"port_states":{"description":"port_states[i] refers to required_open_ports[i] for the epoch.","items":{"$ref":"#/definitions/lumera.audit.v1.PortState"},"type":"array"},"target_supernode_account":{"type":"string"}},"type":"object"},"lumera.audit.v1.StorageChallengeReport":{"properties":{"epoch_id":{"format":"uint64","type":"string"},"port_states":{"items":{"$ref":"#/definitions/lumera.audit.v1.PortState"},"type":"array"},"report_height":{"format":"int64","type":"string"},"reporter_supernode_account":{"type":"string"}},"type":"object"},"lumera.audit.v1.StorageProofArtifactClass":{"default":"STORAGE_PROOF_ARTIFACT_CLASS_UNSPECIFIED","enum":["STORAGE_PROOF_ARTIFACT_CLASS_UNSPECIFIED","STORAGE_PROOF_ARTIFACT_CLASS_INDEX","STORAGE_PROOF_ARTIFACT_CLASS_SYMBOL"],"type":"string"},"lumera.audit.v1.StorageProofBucketType":{"default":"STORAGE_PROOF_BUCKET_TYPE_UNSPECIFIED","enum":["STORAGE_PROOF_BUCKET_TYPE_UNSPECIFIED","STORAGE_PROOF_BUCKET_TYPE_RECENT","STORAGE_PROOF_BUCKET_TYPE_OLD","STORAGE_PROOF_BUCKET_TYPE_PROBATION","STORAGE_PROOF_BUCKET_TYPE_RECHECK"],"type":"string"},"lumera.audit.v1.StorageProofResult":{"description":"StorageProofResult captures one storage-truth storage-proof check outcome.\n\nNOTE: StorageProofResult stores transcript_hash plus a compact deterministic\nderivation/signature envelope so transcript disagreements become explicit on-chain.","properties":{"artifact_class":{"$ref":"#/definitions/lumera.audit.v1.StorageProofArtifactClass"},"artifact_count":{"description":"artifact_count is the class-specific denominator used for deterministic\nordinal selection: artifact_ordinal = H(...) mod artifact_count.","format":"int64","type":"integer"},"artifact_key":{"type":"string"},"artifact_ordinal":{"description":"artifact_ordinal is the deterministic ordinal selected inside the artifact class.","format":"int64","type":"integer"},"bucket_type":{"$ref":"#/definitions/lumera.audit.v1.StorageProofBucketType"},"challenger_signature":{"description":"challenger_signature is the challenger's signature over transcript commitment.","type":"string"},"challenger_supernode_account":{"type":"string"},"derivation_input_hash":{"description":"derivation_input_hash commits deterministic derivation inputs (seed, range\nselection inputs, and resolver inputs) used off-chain for transcript build.","type":"string"},"details":{"description":"details is an optional short diagnostic summary for non-pass outcomes.","type":"string"},"observer_attestation_signatures":{"description":"observer_attestation_signatures carries observer attestations for the\ntranscript commitment when available.","items":{"type":"string"},"type":"array"},"result_class":{"$ref":"#/definitions/lumera.audit.v1.StorageProofResultClass"},"target_supernode_account":{"type":"string"},"ticket_id":{"description":"ticket_id identifies the ticket selected by deterministic bucket logic.","type":"string"},"transcript_hash":{"type":"string"}},"type":"object"},"lumera.audit.v1.StorageProofResultClass":{"default":"STORAGE_PROOF_RESULT_CLASS_UNSPECIFIED","enum":["STORAGE_PROOF_RESULT_CLASS_UNSPECIFIED","STORAGE_PROOF_RESULT_CLASS_PASS","STORAGE_PROOF_RESULT_CLASS_HASH_MISMATCH","STORAGE_PROOF_RESULT_CLASS_TIMEOUT_OR_NO_RESPONSE","STORAGE_PROOF_RESULT_CLASS_OBSERVER_QUORUM_FAIL","STORAGE_PROOF_RESULT_CLASS_NO_ELIGIBLE_TICKET","STORAGE_PROOF_RESULT_CLASS_INVALID_TRANSCRIPT","STORAGE_PROOF_RESULT_CLASS_RECHECK_CONFIRMED_FAIL"],"type":"string"},"lumera.audit.v1.StorageTruthEnforcementMode":{"default":"STORAGE_TRUTH_ENFORCEMENT_MODE_UNSPECIFIED","enum":["STORAGE_TRUTH_ENFORCEMENT_MODE_UNSPECIFIED","STORAGE_TRUTH_ENFORCEMENT_MODE_SHADOW","STORAGE_TRUTH_ENFORCEMENT_MODE_SOFT","STORAGE_TRUTH_ENFORCEMENT_MODE_FULL"],"type":"string"},"lumera.audit.v1.TicketDeteriorationState":{"description":"TicketDeteriorationState is the persisted storage-truth ticket deterioration snapshot.","properties":{"active_heal_op_id":{"format":"uint64","type":"string"},"contradiction_count":{"format":"uint64","type":"string"},"deterioration_score":{"format":"int64","type":"string"},"distinct_holder_failure_count":{"format":"int64","type":"integer"},"last_failure_epoch":{"format":"uint64","type":"string"},"last_heal_epoch":{"format":"uint64","type":"string"},"last_index_failure_epoch":{"format":"uint64","type":"string"},"last_reporter_supernode_account":{"type":"string"},"last_result_class":{"$ref":"#/definitions/lumera.audit.v1.StorageProofResultClass"},"last_result_epoch":{"format":"uint64","type":"string"},"last_target_supernode_account":{"type":"string"},"last_updated_epoch":{"format":"uint64","type":"string"},"old_bucket_failure_epoch":{"format":"uint64","type":"string"},"probation_until_epoch":{"format":"uint64","type":"string"},"recent_bucket_failure_epoch":{"format":"uint64","type":"string"},"recent_failure_epoch_count":{"format":"int64","type":"integer"},"ticket_id":{"type":"string"}},"type":"object"},"lumera.claim.ClaimRecord":{"description":"ClaimRecord represents a record of a claim made by a user.","properties":{"balance":{"items":{"$ref":"#/definitions/cosmos.base.v1beta1.Coin","type":"object"},"type":"array"},"claimTime":{"format":"int64","type":"string"},"claimed":{"type":"boolean"},"destAddress":{"type":"string"},"oldAddress":{"type":"string"},"vestedTier":{"format":"int64","type":"integer"}},"type":"object"},"lumera.claim.MsgClaim":{"description":"MsgClaim is the Msg/Claim request type.","properties":{"creator":{"type":"string"},"newAddress":{"type":"string"},"oldAddress":{"type":"string"},"pubKey":{"type":"string"},"signature":{"type":"string"}},"type":"object"},"lumera.claim.MsgClaimResponse":{"title":"MsgClaimResponse defines the response structure for executing a","type":"object"},"lumera.claim.MsgDelayedClaim":{"properties":{"creator":{"type":"string"},"newAddress":{"type":"string"},"oldAddress":{"type":"string"},"pubKey":{"type":"string"},"signature":{"type":"string"},"tier":{"format":"int64","type":"integer"}},"type":"object"},"lumera.claim.MsgDelayedClaimResponse":{"type":"object"},"lumera.claim.MsgUpdateParams":{"description":"MsgUpdateParams is the Msg/UpdateParams request type.\nMsgUpdateParams is the Msg/UpdateParams request type.","properties":{"authority":{"description":"authority is the address that controls the module (defaults to x/gov unless overwritten).","type":"string"},"params":{"$ref":"#/definitions/lumera.claim.Params","description":"params defines the x/claim parameters to update.\nNOTE: All parameters must be supplied."}},"type":"object"},"lumera.claim.MsgUpdateParamsResponse":{"description":"MsgUpdateParamsResponse defines the response structure for executing a\nMsgUpdateParams message.","type":"object"},"lumera.claim.Params":{"description":"Params defines the parameters for the module.","properties":{"claim_end_time":{"format":"int64","type":"string"},"enable_claims":{"type":"boolean"},"max_claims_per_block":{"format":"uint64","type":"string"}},"type":"object"},"lumera.claim.QueryClaimRecordResponse":{"description":"QueryClaimRecordResponse is response type for the Query/ClaimRecord RPC method.","properties":{"record":{"$ref":"#/definitions/lumera.claim.ClaimRecord"}},"type":"object"},"lumera.claim.QueryListClaimedResponse":{"properties":{"claims":{"items":{"$ref":"#/definitions/lumera.claim.ClaimRecord","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"}},"type":"object"},"lumera.claim.QueryParamsResponse":{"description":"QueryParamsResponse is response type for the Query/Params RPC method.","properties":{"params":{"$ref":"#/definitions/lumera.claim.Params","description":"params holds all the parameters of this module."}},"type":"object"},"lumera.erc20policy.AllowedBaseDenomTrace":{"description":"AllowedBaseDenomTrace binds a base denomination to a specific IBC provenance\npath. The trace is the full expected sequence of hops for the received denom:\n[{destPort, destChannel}, ...priorHops]. An empty trace is a valid placeholder\nthat never matches a real IBC packet (all packets have at least one hop).","properties":{"base_denom":{"type":"string"},"trace":{"items":{"$ref":"#/definitions/lumera.erc20policy.SourceHop","type":"object"},"type":"array"}},"type":"object"},"lumera.erc20policy.MsgSetRegistrationPolicy":{"description":"MsgSetRegistrationPolicy configures the IBC voucher ERC20 auto-registration\npolicy. It allows governance to control which IBC denoms are automatically\nregistered as ERC20 token pairs on first IBC receive.","properties":{"add_base_denom_traces":{"description":"add_base_denom_traces adds provenance-bound base denom entries to the\nallowlist. Each entry binds a base denom (e.g. \"uatom\") to a specific\nIBC trace (the full expected hop sequence). Governance must provide the\ntrace to activate a base denom entry.","items":{"$ref":"#/definitions/lumera.erc20policy.AllowedBaseDenomTrace","type":"object"},"type":"array"},"add_denoms":{"description":"add_denoms is a list of exact IBC denoms (e.g. \"ibc/HASH...\") to add to\nthe allowlist. Only meaningful when mode is \"allowlist\".","items":{"type":"string"},"type":"array"},"authority":{"description":"authority is the address that controls the policy (defaults to x/gov).","type":"string"},"mode":{"description":"mode is the registration policy mode: \"all\", \"allowlist\", or \"none\".\nIf empty, the mode is not changed.","type":"string"},"remove_base_denom_traces":{"description":"remove_base_denom_traces removes provenance-bound base denom entries.","items":{"$ref":"#/definitions/lumera.erc20policy.AllowedBaseDenomTrace","type":"object"},"type":"array"},"remove_denoms":{"description":"remove_denoms is a list of exact IBC denoms to remove from the allowlist.","items":{"type":"string"},"type":"array"}},"type":"object"},"lumera.erc20policy.MsgSetRegistrationPolicyResponse":{"description":"MsgSetRegistrationPolicyResponse is the response type for\nMsgSetRegistrationPolicy.","type":"object"},"lumera.erc20policy.SourceHop":{"description":"SourceHop represents a single port/channel pair in an IBC denom trace.","properties":{"channel_id":{"type":"string"},"port_id":{"type":"string"}},"type":"object"},"lumera.evmigration.LegacyAccountInfo":{"description":"LegacyAccountInfo provides summary information about a legacy account\nthat has not yet been migrated.","properties":{"address":{"description":"address is the bech32 account address.","type":"string"},"balance_summary":{"description":"balance_summary is a human-readable total balance across all denoms.","type":"string"},"has_delegations":{"description":"has_delegations is true if the account has active staking delegations.","type":"boolean"},"is_multisig":{"description":"is_multisig is true when the account's on-chain pubkey is a flat Cosmos\nmultisig of secp256k1 sub-keys.","type":"boolean"},"is_validator":{"description":"is_validator is true if the account is a validator operator.","type":"boolean"},"num_signers":{"description":"num_signers is N for K-of-N multisig (0 when !is_multisig).","format":"int64","type":"integer"},"threshold":{"description":"threshold is K for K-of-N multisig (0 when !is_multisig).","format":"int64","type":"integer"}},"type":"object"},"lumera.evmigration.MigrationProof":{"properties":{"multisig":{"$ref":"#/definitions/lumera.evmigration.MultisigProof"},"single":{"$ref":"#/definitions/lumera.evmigration.SingleKeyProof"}},"type":"object"},"lumera.evmigration.MigrationRecord":{"description":"MigrationRecord stores the result of a completed legacy account migration,\nrecording the source and destination addresses plus the time and height.","properties":{"legacy_address":{"description":"legacy_address is the coin-type-118 source address that was migrated.","type":"string"},"migration_height":{"description":"migration_height is the block height when migration completed.","format":"int64","type":"string"},"migration_time":{"description":"migration_time is the block time (unix seconds) when migration completed.","format":"int64","type":"string"},"new_address":{"description":"new_address is the coin-type-60 destination address.","type":"string"}},"type":"object"},"lumera.evmigration.MsgClaimLegacyAccount":{"description":"MsgClaimLegacyAccount migrates on-chain state from legacy_address to new_address.","properties":{"legacy_address":{"type":"string"},"legacy_proof":{"$ref":"#/definitions/lumera.evmigration.MigrationProof"},"new_address":{"type":"string"},"new_proof":{"$ref":"#/definitions/lumera.evmigration.MigrationProof"}},"type":"object"},"lumera.evmigration.MsgClaimLegacyAccountResponse":{"description":"MsgClaimLegacyAccountResponse is the response type for MsgClaimLegacyAccount.","type":"object"},"lumera.evmigration.MsgMigrateValidator":{"description":"MsgMigrateValidator migrates a validator operator from legacy to new address.","properties":{"legacy_address":{"type":"string"},"legacy_proof":{"$ref":"#/definitions/lumera.evmigration.MigrationProof"},"new_address":{"type":"string"},"new_proof":{"$ref":"#/definitions/lumera.evmigration.MigrationProof"}},"type":"object"},"lumera.evmigration.MsgMigrateValidatorResponse":{"description":"MsgMigrateValidatorResponse is the response type for MsgMigrateValidator.","type":"object"},"lumera.evmigration.MsgUpdateParams":{"description":"MsgUpdateParams is the Msg/UpdateParams request type.","properties":{"authority":{"description":"authority is the address that controls the module (defaults to x/gov unless overwritten).","type":"string"},"params":{"$ref":"#/definitions/lumera.evmigration.Params","description":"params defines the module parameters to update.\n\nNOTE: All parameters must be supplied."}},"type":"object"},"lumera.evmigration.MsgUpdateParamsResponse":{"description":"MsgUpdateParamsResponse defines the response structure for executing a\nMsgUpdateParams message.","type":"object"},"lumera.evmigration.MultisigProof":{"properties":{"sig_format":{"$ref":"#/definitions/lumera.evmigration.SigFormat"},"signer_indices":{"items":{"format":"int64","type":"integer"},"type":"array"},"sub_pub_keys":{"items":{"format":"byte","type":"string"},"type":"array"},"sub_signatures":{"items":{"format":"byte","type":"string"},"type":"array"},"threshold":{"format":"int64","type":"integer"}},"type":"object"},"lumera.evmigration.Params":{"description":"Params defines the governance-controlled parameters for the evmigration module.\nThese knobs determine when migrations are accepted and how much work the\nchain performs per block during the legacy-to-EVM migration window.","properties":{"enable_migration":{"description":"enable_migration is the master switch for the migration window.\nWhen false, all MsgClaimLegacyAccount and MsgMigrateValidator messages\nare rejected regardless of other parameter values.\nGovernance should set this to false once the migration window closes.\nDefault: true.","type":"boolean"},"max_migrations_per_block":{"description":"max_migrations_per_block is the maximum number of MsgClaimLegacyAccount\nmessages processed in a single block. Once this limit is reached,\nadditional claims in the same block are rejected. This prevents a burst\nof migrations from consuming excessive block gas.\nDefault: 50.","format":"uint64","type":"string"},"max_multisig_sub_keys":{"description":"max_multisig_sub_keys caps the number of sub-keys in a multisig legacy\naccount's MultisigProof. Bounds per-tx verification cost.\nDefault: 20.","format":"int64","type":"integer"},"max_validator_delegations":{"description":"max_validator_delegations is the safety cap for MsgMigrateValidator.\nA validator migration must re-key every delegation and unbonding-delegation\nrecord. If the total count exceeds this threshold the message is rejected\nbecause the gas cost of iterating all records would be prohibitive.\nValidators that exceed the cap must shed delegations before migrating.\nDefault: 2000.","format":"uint64","type":"string"},"migration_end_time":{"description":"migration_end_time is an optional hard deadline expressed as a unix\ntimestamp (seconds). If non-zero, any migration message whose block time\nexceeds this value is rejected. A value of 0 disables the deadline,\nleaving enable_migration as the sole on/off control.\nDefault: 0 (no deadline).","format":"int64","type":"string"}},"type":"object"},"lumera.evmigration.QueryLegacyAccountsResponse":{"description":"QueryLegacyAccountsResponse is the response type for the Query/LegacyAccounts RPC method.","properties":{"accounts":{"description":"accounts is the list of legacy accounts that need migration.","items":{"$ref":"#/definitions/lumera.evmigration.LegacyAccountInfo","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse","description":"pagination defines the pagination in the response."}},"type":"object"},"lumera.evmigration.QueryMigratedAccountsResponse":{"description":"QueryMigratedAccountsResponse is the response type for the Query/MigratedAccounts RPC method.","properties":{"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse","description":"pagination defines the pagination in the response."},"records":{"description":"records is the list of completed migration records.","items":{"$ref":"#/definitions/lumera.evmigration.MigrationRecord","type":"object"},"type":"array"}},"type":"object"},"lumera.evmigration.QueryMigrationEstimateResponse":{"description":"QueryMigrationEstimateResponse is the response type for the Query/MigrationEstimate RPC method.\nIt provides a dry-run estimate of what would be migrated.","properties":{"action_count":{"description":"action_count is the number of action records where this address appears\neither as creator or in the SuperNodes list.","format":"uint64","type":"string"},"authz_grant_count":{"description":"authz_grant_count is the number of authz grants as granter or grantee.","format":"uint64","type":"string"},"balance_summary":{"description":"balance_summary is a human-readable total balance across all denoms (e.g. \"10000000000ulume\").","type":"string"},"delegation_count":{"description":"delegation_count is the number of active delegations from this address.","format":"uint64","type":"string"},"feegrant_count":{"description":"feegrant_count is the number of fee allowances as granter or grantee.","format":"uint64","type":"string"},"has_supernode":{"description":"has_supernode is true if the legacy address owns a registered supernode.","type":"boolean"},"is_multisig":{"description":"is_multisig is true when the account's on-chain pubkey is a flat Cosmos\nmultisig of secp256k1 sub-keys.","type":"boolean"},"is_validator":{"description":"is_validator is true if the legacy address is a validator operator.","type":"boolean"},"num_signers":{"description":"num_signers is N for K-of-N multisig (0 when !is_multisig).","format":"int64","type":"integer"},"redelegation_count":{"description":"redelegation_count is the number of redelegation entries.","format":"uint64","type":"string"},"rejection_reason":{"description":"rejection_reason is non-empty if would_succeed is false.","type":"string"},"threshold":{"description":"threshold is K for K-of-N multisig (0 when !is_multisig).","format":"int64","type":"integer"},"total_touched":{"description":"total_touched is the sum of all records that would be re-keyed.","format":"uint64","type":"string"},"unbonding_count":{"description":"unbonding_count is the number of unbonding delegation entries.","format":"uint64","type":"string"},"val_delegation_count":{"description":"val_delegation_count is delegations TO this validator (from all delegators).\nPopulated only when is_validator is true.","format":"uint64","type":"string"},"val_redelegation_count":{"description":"val_redelegation_count is redelegations referencing this validator as src or dst.\nPopulated only when is_validator is true.","format":"uint64","type":"string"},"val_unbonding_count":{"description":"val_unbonding_count is unbonding delegations TO this validator.\nPopulated only when is_validator is true.","format":"uint64","type":"string"},"validator_jailed":{"description":"validator_jailed is the staking jailed flag of the validator entity.\nPopulated only when is_validator is true. A jailed validator is always\nalso Unbonding or Unbonded; surfacing both fields lets callers\ndistinguish \"jailed for downtime/equivocation\" (actionable: unjail\nafter slashing window) from \"voluntarily unbonded\" (not actionable).","type":"boolean"},"validator_status":{"description":"validator_status is the staking BondStatus of the validator entity, as\na stable enum string (\"BOND_STATUS_BONDED\" | \"BOND_STATUS_UNBONDING\" |\n\"BOND_STATUS_UNBONDED\" | \"BOND_STATUS_UNSPECIFIED\"). Populated only when\nis_validator is true; empty otherwise. Surfaced so callers can show why\nwould_succeed is false without a separate staking query.","type":"string"},"would_succeed":{"description":"would_succeed is false if migration would be rejected.","type":"boolean"}},"type":"object"},"lumera.evmigration.QueryMigrationRecordByNewAddressResponse":{"description":"QueryMigrationRecordByNewAddressResponse is the response type for the Query/MigrationRecordByNewAddress RPC method.","properties":{"record":{"$ref":"#/definitions/lumera.evmigration.MigrationRecord","description":"record is the migration record, or nil if not found."}},"type":"object"},"lumera.evmigration.QueryMigrationRecordResponse":{"description":"QueryMigrationRecordResponse is the response type for the Query/MigrationRecord RPC method.","properties":{"record":{"$ref":"#/definitions/lumera.evmigration.MigrationRecord","description":"record is the migration record, or nil if not found."}},"type":"object"},"lumera.evmigration.QueryMigrationRecordsResponse":{"description":"QueryMigrationRecordsResponse is the response type for the Query/MigrationRecords RPC method.","properties":{"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse","description":"pagination defines the pagination in the response."},"records":{"description":"records is the list of completed migration records.","items":{"$ref":"#/definitions/lumera.evmigration.MigrationRecord","type":"object"},"type":"array"}},"type":"object"},"lumera.evmigration.QueryMigrationStatsResponse":{"description":"QueryMigrationStatsResponse is the response type for the Query/MigrationStats RPC method.\nIt provides aggregate counters for the migration dashboard.","properties":{"total_legacy":{"description":"total_legacy is the number of accounts with secp256k1 pubkey and non-zero balance.","format":"uint64","type":"string"},"total_legacy_staked":{"description":"total_legacy_staked is the subset of total_legacy with active delegations.","format":"uint64","type":"string"},"total_migrated":{"description":"total_migrated is the number of accounts that completed migration (O(1) from state counter).","format":"uint64","type":"string"},"total_validators_legacy":{"description":"total_validators_legacy is the number of validators with legacy operator address.","format":"uint64","type":"string"},"total_validators_migrated":{"description":"total_validators_migrated is the number of validators that completed migration.","format":"uint64","type":"string"}},"type":"object"},"lumera.evmigration.QueryParamsResponse":{"description":"QueryParamsResponse is the response type for the Query/Params RPC method.","properties":{"params":{"$ref":"#/definitions/lumera.evmigration.Params","description":"params holds all the parameters of this module."}},"type":"object"},"lumera.evmigration.SigFormat":{"default":"SIG_FORMAT_UNSPECIFIED","description":"SigFormat enumerates accepted signing envelopes for migration proofs.\n\n - SIG_FORMAT_CLI: Sign(SHA256(payload)) via Cosmos keyring; Sign(payload → Keccak256) for eth keyring\n - SIG_FORMAT_ADR036: ADR-036 signArbitrary canonical JSON\n - SIG_FORMAT_EIP191: Eth \"\\x19Ethereum Signed Message:\\n…\" envelope — new-side single-key proofs only","enum":["SIG_FORMAT_UNSPECIFIED","SIG_FORMAT_CLI","SIG_FORMAT_ADR036","SIG_FORMAT_EIP191"],"type":"string"},"lumera.evmigration.SingleKeyProof":{"properties":{"pub_key":{"format":"byte","type":"string"},"sig_format":{"$ref":"#/definitions/lumera.evmigration.SigFormat"},"signature":{"format":"byte","type":"string"}},"type":"object"},"lumera.lumeraid.MsgUpdateParams":{"description":"MsgUpdateParams is the Msg/UpdateParams request type.","properties":{"authority":{"description":"authority is the address that controls the module (defaults to x/gov unless overwritten).","type":"string"},"params":{"$ref":"#/definitions/lumera.lumeraid.Params","description":"NOTE: All parameters must be supplied."}},"type":"object"},"lumera.lumeraid.MsgUpdateParamsResponse":{"description":"MsgUpdateParamsResponse defines the response structure for executing a\nMsgUpdateParams message.","type":"object"},"lumera.lumeraid.Params":{"description":"Params defines the parameters for the module.","type":"object"},"lumera.lumeraid.QueryParamsResponse":{"description":"QueryParamsResponse is response type for the Query/Params RPC method.","properties":{"params":{"$ref":"#/definitions/lumera.lumeraid.Params","description":"params holds all the parameters of this module."}},"type":"object"},"lumera.supernode.v1.Evidence":{"description":"Evidence defines the evidence structure for the supernode module.","properties":{"action_id":{"type":"string"},"description":{"type":"string"},"evidence_type":{"type":"string"},"height":{"format":"int32","type":"integer"},"reporter_address":{"type":"string"},"severity":{"format":"uint64","type":"string"},"validator_address":{"type":"string"}},"type":"object"},"lumera.supernode.v1.IPAddressHistory":{"properties":{"address":{"type":"string"},"height":{"format":"int64","type":"string"}},"type":"object"},"lumera.supernode.v1.MetricValue":{"properties":{"name":{"type":"string"},"value":{"format":"double","type":"number"}},"type":"object"},"lumera.supernode.v1.MetricsAggregate":{"properties":{"height":{"format":"int64","type":"string"},"metrics":{"items":{"$ref":"#/definitions/lumera.supernode.v1.MetricValue","type":"object"},"type":"array"},"report_count":{"format":"uint64","type":"string"}},"type":"object"},"lumera.supernode.v1.MsgDeregisterSupernode":{"properties":{"creator":{"type":"string"},"validatorAddress":{"type":"string"}},"type":"object"},"lumera.supernode.v1.MsgDeregisterSupernodeResponse":{"type":"object"},"lumera.supernode.v1.MsgRegisterSupernode":{"properties":{"creator":{"type":"string"},"ipAddress":{"type":"string"},"p2p_port":{"type":"string"},"supernodeAccount":{"type":"string"},"validatorAddress":{"type":"string"}},"type":"object"},"lumera.supernode.v1.MsgRegisterSupernodeResponse":{"type":"object"},"lumera.supernode.v1.MsgReportSupernodeMetrics":{"properties":{"metrics":{"$ref":"#/definitions/lumera.supernode.v1.SupernodeMetrics"},"supernode_account":{"type":"string"},"validator_address":{"type":"string"}},"type":"object"},"lumera.supernode.v1.MsgReportSupernodeMetricsResponse":{"properties":{"compliant":{"type":"boolean"},"issues":{"items":{"type":"string"},"type":"array"}},"type":"object"},"lumera.supernode.v1.MsgStartSupernode":{"properties":{"creator":{"type":"string"},"validatorAddress":{"type":"string"}},"type":"object"},"lumera.supernode.v1.MsgStartSupernodeResponse":{"type":"object"},"lumera.supernode.v1.MsgStopSupernode":{"properties":{"creator":{"type":"string"},"reason":{"type":"string"},"validatorAddress":{"type":"string"}},"type":"object"},"lumera.supernode.v1.MsgStopSupernodeResponse":{"type":"object"},"lumera.supernode.v1.MsgUpdateParams":{"description":"MsgUpdateParams is the Msg/UpdateParams request type.","properties":{"authority":{"description":"authority is the address that controls the module (defaults to x/gov unless overwritten).","type":"string"},"params":{"$ref":"#/definitions/lumera.supernode.v1.Params","description":"NOTE: All parameters must be supplied."}},"type":"object"},"lumera.supernode.v1.MsgUpdateParamsResponse":{"description":"MsgUpdateParamsResponse defines the response structure for executing a\nMsgUpdateParams message.","type":"object"},"lumera.supernode.v1.MsgUpdateSupernode":{"properties":{"creator":{"type":"string"},"ipAddress":{"type":"string"},"note":{"type":"string"},"p2p_port":{"type":"string"},"supernodeAccount":{"type":"string"},"validatorAddress":{"type":"string"}},"type":"object"},"lumera.supernode.v1.MsgUpdateSupernodeResponse":{"type":"object"},"lumera.supernode.v1.Params":{"description":"Params defines the parameters for the module.","properties":{"evidence_retention_period":{"type":"string"},"inactivity_penalty_period":{"type":"string"},"max_cpu_usage_percent":{"format":"uint64","type":"string"},"max_mem_usage_percent":{"format":"uint64","type":"string"},"max_storage_usage_percent":{"format":"uint64","type":"string"},"metrics_freshness_max_blocks":{"description":"Maximum acceptable staleness (in blocks) for a metrics report when\nvalidating freshness.","format":"uint64","type":"string"},"metrics_grace_period_blocks":{"description":"Additional grace (in blocks) before marking metrics overdue/stale.","format":"uint64","type":"string"},"metrics_thresholds":{"type":"string"},"metrics_update_interval_blocks":{"description":"Expected cadence (in blocks) between supernode metrics reports. The daemon\ncan run on a timer using expected block time, but the chain enforces\nheight-based staleness strictly in blocks.","format":"uint64","type":"string"},"min_cpu_cores":{"format":"uint64","type":"string"},"min_mem_gb":{"format":"uint64","type":"string"},"min_storage_gb":{"format":"uint64","type":"string"},"min_supernode_version":{"type":"string"},"minimum_stake_for_sn":{"$ref":"#/definitions/cosmos.base.v1beta1.Coin"},"reporting_threshold":{"format":"uint64","type":"string"},"required_open_ports":{"items":{"format":"int64","type":"integer"},"type":"array"},"reward_distribution":{"$ref":"#/definitions/lumera.supernode.v1.RewardDistribution"},"slashing_fraction":{"type":"string"},"slashing_threshold":{"format":"uint64","type":"string"}},"type":"object"},"lumera.supernode.v1.PayoutHistoryEntry":{"properties":{"amount":{"items":{"$ref":"#/definitions/cosmos.base.v1beta1.Coin","type":"object"},"type":"array"},"effective_weight":{"format":"double","type":"number"},"height":{"format":"int64","type":"string"},"ramp_weight":{"format":"double","type":"number"},"raw_bytes":{"format":"double","type":"number"},"smoothed_bytes":{"format":"double","type":"number"},"supernode_account":{"type":"string"},"validator_address":{"type":"string"}},"type":"object"},"lumera.supernode.v1.PortState":{"default":"PORT_STATE_UNKNOWN","description":"PortState defines tri-state port reporting. UNKNOWN is the default for proto3\nand is treated as \"not reported / not measured\".","enum":["PORT_STATE_UNKNOWN","PORT_STATE_OPEN","PORT_STATE_CLOSED"],"type":"string"},"lumera.supernode.v1.PortStatus":{"description":"PortStatus reports the state of a specific TCP port.","properties":{"port":{"format":"int64","type":"integer"},"state":{"$ref":"#/definitions/lumera.supernode.v1.PortState"}},"type":"object"},"lumera.supernode.v1.QueryGetMetricsResponse":{"description":"QueryGetMetricsResponse is response type for the Query/GetMetrics RPC method.","properties":{"metrics_state":{"$ref":"#/definitions/lumera.supernode.v1.SupernodeMetricsState"}},"type":"object"},"lumera.supernode.v1.QueryGetSuperNodeBySuperNodeAddressResponse":{"description":"QueryGetSuperNodeBySuperNodeAddressResponse is response type for the Query/GetSuperNodeBySuperNodeAddress RPC method.","properties":{"supernode":{"$ref":"#/definitions/lumera.supernode.v1.SuperNode"}},"type":"object"},"lumera.supernode.v1.QueryGetSuperNodeResponse":{"description":"QueryGetSuperNodeResponse is response type for the Query/GetSuperNode RPC method.","properties":{"supernode":{"$ref":"#/definitions/lumera.supernode.v1.SuperNode"}},"type":"object"},"lumera.supernode.v1.QueryGetTopSuperNodesForBlockResponse":{"description":"QueryGetTopSuperNodesForBlockResponse is response type for the Query/GetTopSuperNodesForBlock RPC method.","properties":{"supernodes":{"items":{"$ref":"#/definitions/lumera.supernode.v1.SuperNode","type":"object"},"type":"array"}},"type":"object"},"lumera.supernode.v1.QueryListSuperNodesResponse":{"description":"QueryListSuperNodesResponse is response type for the Query/ListSuperNodes RPC method.","properties":{"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"},"supernodes":{"items":{"$ref":"#/definitions/lumera.supernode.v1.SuperNode","type":"object"},"type":"array"}},"type":"object"},"lumera.supernode.v1.QueryParamsResponse":{"description":"QueryParamsResponse is response type for the Query/Params RPC method.","properties":{"params":{"$ref":"#/definitions/lumera.supernode.v1.Params","description":"params holds all the parameters of this module."}},"type":"object"},"lumera.supernode.v1.QueryPayoutHistoryResponse":{"properties":{"entries":{"items":{"$ref":"#/definitions/lumera.supernode.v1.PayoutHistoryEntry","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"}},"type":"object"},"lumera.supernode.v1.QueryPoolStateResponse":{"description":"QueryPoolStateResponse is response type for the Query/PoolState RPC method.","properties":{"balance":{"description":"balance is the current undistributed pool balance.","items":{"$ref":"#/definitions/cosmos.base.v1beta1.Coin","type":"object"},"type":"array"},"eligible_sn_count":{"description":"eligible_sn_count is the number of SuperNodes currently eligible for payouts.","format":"uint64","type":"string"},"last_distribution_height":{"description":"last_distribution_height is the block height of the last distribution.","format":"int64","type":"string"},"total_distributed":{"description":"total_distributed is the cumulative amount distributed.","items":{"$ref":"#/definitions/cosmos.base.v1beta1.Coin","type":"object"},"type":"array"}},"type":"object"},"lumera.supernode.v1.QuerySNEligibilityResponse":{"description":"QuerySNEligibilityResponse is response type for the Query/SNEligibility RPC method.","properties":{"cascade_kademlia_db_bytes":{"format":"double","type":"number"},"eligible":{"type":"boolean"},"reason":{"type":"string"},"smoothed_weight":{"format":"double","type":"number"}},"type":"object"},"lumera.supernode.v1.RewardDistribution":{"description":"RewardDistribution governs the Everlight reward pool's payout cadence,\neligibility floor, ramp-up, smoothing window and growth cap. All fields\nare governance-mutable via supernode MsgUpdateParams.","properties":{"measurement_smoothing_periods":{"description":"Rolling average window (in payment periods) for weight smoothing.","format":"uint64","type":"string"},"min_cascade_bytes_for_payment":{"description":"Minimum cascade_kademlia_db_bytes for a SuperNode to qualify for payouts.","format":"uint64","type":"string"},"new_sn_ramp_up_periods":{"description":"Number of payment periods for new SuperNode payout ramp-up.","format":"uint64","type":"string"},"payment_period_blocks":{"description":"Distribution period in blocks. Pool balance distributed every this many blocks.","format":"uint64","type":"string"},"registration_fee_share_bps":{"description":"Share of action registration fees routed to Everlight pool, in basis points.","format":"uint64","type":"string"},"usage_growth_cap_bps_per_period":{"description":"Maximum rate of reported cascade bytes increase per period, in basis points.","format":"uint64","type":"string"}},"type":"object"},"lumera.supernode.v1.SuperNode":{"properties":{"evidence":{"items":{"$ref":"#/definitions/lumera.supernode.v1.Evidence","type":"object"},"type":"array"},"metrics":{"$ref":"#/definitions/lumera.supernode.v1.MetricsAggregate"},"note":{"type":"string"},"p2p_port":{"type":"string"},"prev_ip_addresses":{"items":{"$ref":"#/definitions/lumera.supernode.v1.IPAddressHistory","type":"object"},"type":"array"},"prev_supernode_accounts":{"items":{"$ref":"#/definitions/lumera.supernode.v1.SupernodeAccountHistory","type":"object"},"type":"array"},"states":{"items":{"$ref":"#/definitions/lumera.supernode.v1.SuperNodeStateRecord","type":"object"},"type":"array"},"supernode_account":{"type":"string"},"validator_address":{"type":"string"}},"type":"object"},"lumera.supernode.v1.SuperNodeState":{"default":"SUPERNODE_STATE_UNSPECIFIED","description":"SuperNodeState is the lifecycle state of a SuperNode. Transitions are\ngoverned by the supernode and audit modules; see x/supernode/v1/keeper\nand x/audit/v1/keeper for the authoritative state machine.\n\n - SUPERNODE_STATE_UNSPECIFIED: SUPERNODE_STATE_UNSPECIFIED is the proto3 zero value; never persisted.\n - SUPERNODE_STATE_ACTIVE: SUPERNODE_STATE_ACTIVE: SuperNode is healthy and eligible for all duties.\n - SUPERNODE_STATE_DISABLED: SUPERNODE_STATE_DISABLED: operator-disabled (deregistered) SuperNode.\n - SUPERNODE_STATE_STOPPED: SUPERNODE_STATE_STOPPED: operator-stopped SuperNode (recoverable).\n - SUPERNODE_STATE_PENALIZED: SUPERNODE_STATE_PENALIZED: penalized by chain enforcement (e.g. slashing).\n - SUPERNODE_STATE_POSTPONED: SUPERNODE_STATE_POSTPONED: temporarily ineligible due to missing/overdue\nmetrics or compliance violations; recovers on the next healthy report.\n - SUPERNODE_STATE_STORAGE_FULL: SUPERNODE_STATE_STORAGE_FULL: storage usage above max threshold;\nexcluded from Cascade duties but still eligible for Sense/Agents.","enum":["SUPERNODE_STATE_UNSPECIFIED","SUPERNODE_STATE_ACTIVE","SUPERNODE_STATE_DISABLED","SUPERNODE_STATE_STOPPED","SUPERNODE_STATE_PENALIZED","SUPERNODE_STATE_POSTPONED","SUPERNODE_STATE_STORAGE_FULL"],"type":"string"},"lumera.supernode.v1.SuperNodeStateRecord":{"description":"SuperNodeStateRecord is one entry in the append-only state history of a\nSuperNode. The latest entry is the current state.","properties":{"height":{"format":"int64","type":"string"},"reason":{"description":"reason is an optional string describing why the state transition occurred.\nIt is currently set only for transitions into POSTPONED.","type":"string"},"state":{"$ref":"#/definitions/lumera.supernode.v1.SuperNodeState"}},"type":"object"},"lumera.supernode.v1.SupernodeAccountHistory":{"properties":{"account":{"type":"string"},"height":{"format":"int64","type":"string"}},"type":"object"},"lumera.supernode.v1.SupernodeMetrics":{"description":"SupernodeMetrics defines the structured metrics reported by a supernode.","properties":{"cascade_kademlia_db_bytes":{"description":"Cascade Kademlia DB size in bytes (LEP-4 metric for Everlight payouts).","format":"double","type":"number"},"cpu_cores_total":{"description":"CPU metrics.","format":"double","type":"number"},"cpu_usage_percent":{"format":"double","type":"number"},"disk_free_gb":{"format":"double","type":"number"},"disk_total_gb":{"description":"Storage metrics (GB).","format":"double","type":"number"},"disk_usage_percent":{"format":"double","type":"number"},"mem_free_gb":{"format":"double","type":"number"},"mem_total_gb":{"description":"Memory metrics (GB).","format":"double","type":"number"},"mem_usage_percent":{"format":"double","type":"number"},"open_ports":{"description":"Tri-state port reporting for required ports.","items":{"$ref":"#/definitions/lumera.supernode.v1.PortStatus","type":"object"},"type":"array"},"peers_count":{"format":"int64","type":"integer"},"uptime_seconds":{"description":"Uptime and connectivity.","format":"double","type":"number"},"version_major":{"description":"Semantic version of the supernode software.","format":"int64","type":"integer"},"version_minor":{"format":"int64","type":"integer"},"version_patch":{"format":"int64","type":"integer"}},"type":"object"},"lumera.supernode.v1.SupernodeMetricsState":{"description":"SupernodeMetricsState stores the latest metrics state for a validator.","properties":{"height":{"format":"int64","type":"string"},"metrics":{"$ref":"#/definitions/lumera.supernode.v1.SupernodeMetrics"},"report_count":{"format":"uint64","type":"string"},"validator_address":{"type":"string"}},"type":"object"}}} \ No newline at end of file +{"id":"github.com/LumeraProtocol/lumera","consumes":["application/json"],"produces":["application/json"],"swagger":"2.0","info":{"contact":{"name":"github.com/LumeraProtocol/lumera"},"description":"Chain github.com/LumeraProtocol/lumera REST API","title":"Lumera REST API","version":"version not set"},"paths":{"/LumeraProtocol/lumera/action/v1/get_action/{actionID}":{"get":{"operationId":"Query_GetAction","parameters":[{"description":"The ID of the action to query","in":"path","name":"actionID","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.QueryGetActionResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"GetAction queries a single action by ID.","tags":["Query"]}},"/LumeraProtocol/lumera/action/v1/get_action_fee/{dataSize}":{"get":{"operationId":"Query_GetActionFee","parameters":[{"in":"path","name":"dataSize","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.QueryGetActionFeeResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Queries a list of GetActionFee items.","tags":["Query"]}},"/LumeraProtocol/lumera/action/v1/list_actions":{"get":{"operationId":"Query_ListActions","parameters":[{"default":"ACTION_TYPE_UNSPECIFIED","description":" - ACTION_TYPE_UNSPECIFIED: The default action type, used when the type is not specified.\n - ACTION_TYPE_SENSE: The action type for sense operations.\n - ACTION_TYPE_CASCADE: The action type for cascade operations.","enum":["ACTION_TYPE_UNSPECIFIED","ACTION_TYPE_SENSE","ACTION_TYPE_CASCADE"],"in":"query","name":"actionType","required":false,"type":"string"},{"default":"ACTION_STATE_UNSPECIFIED","description":" - ACTION_STATE_UNSPECIFIED: The default state, used when the state is not specified.\n - ACTION_STATE_PENDING: The action is pending and has not yet been processed.\n - ACTION_STATE_PROCESSING: The action is currently being processed.\n - ACTION_STATE_DONE: The action has been completed successfully.\n - ACTION_STATE_APPROVED: The action has been approved.\n - ACTION_STATE_REJECTED: The action has been rejected.\n - ACTION_STATE_FAILED: The action has failed.\n - ACTION_STATE_EXPIRED: The action has expired and is no longer valid.","enum":["ACTION_STATE_UNSPECIFIED","ACTION_STATE_PENDING","ACTION_STATE_PROCESSING","ACTION_STATE_DONE","ACTION_STATE_APPROVED","ACTION_STATE_REJECTED","ACTION_STATE_FAILED","ACTION_STATE_EXPIRED"],"in":"query","name":"actionState","required":false,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.QueryListActionsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"List actions with optional type and state filters.","tags":["Query"]}},"/LumeraProtocol/lumera/action/v1/list_actions_by_block_height/{blockHeight}":{"get":{"operationId":"Query_ListActionsByBlockHeight","parameters":[{"format":"int64","in":"path","name":"blockHeight","required":true,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.QueryListActionsByBlockHeightResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"List actions created at a specific block height.","tags":["Query"]}},"/LumeraProtocol/lumera/action/v1/list_actions_by_creator/{creator}":{"get":{"operationId":"Query_ListActionsByCreator","parameters":[{"in":"path","name":"creator","required":true,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.QueryListActionsByCreatorResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"List actions created by a specific address.","tags":["Query"]}},"/LumeraProtocol/lumera/action/v1/list_actions_by_supernode/{superNodeAddress}":{"get":{"operationId":"Query_ListActionsBySuperNode","parameters":[{"in":"path","name":"superNodeAddress","required":true,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.QueryListActionsBySuperNodeResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"List actions for a specific supernode.","tags":["Query"]}},"/LumeraProtocol/lumera/action/v1/list_expired_actions":{"get":{"operationId":"Query_ListExpiredActions","parameters":[{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.QueryListExpiredActionsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"List expired actions.","tags":["Query"]}},"/LumeraProtocol/lumera/action/v1/params":{"get":{"operationId":"Query_Params","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.QueryParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Parameters queries the parameters of the module.","tags":["Query"]}},"/LumeraProtocol/lumera/action/v1/query_action_by_metadata":{"get":{"operationId":"Query_QueryActionByMetadata","parameters":[{"default":"ACTION_TYPE_UNSPECIFIED","description":" - ACTION_TYPE_UNSPECIFIED: The default action type, used when the type is not specified.\n - ACTION_TYPE_SENSE: The action type for sense operations.\n - ACTION_TYPE_CASCADE: The action type for cascade operations.","enum":["ACTION_TYPE_UNSPECIFIED","ACTION_TYPE_SENSE","ACTION_TYPE_CASCADE"],"in":"query","name":"actionType","required":false,"type":"string"},{"description":"e.g., \"field=value\"","in":"query","name":"metadataQuery","required":false,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.QueryActionByMetadataResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Query actions based on metadata.","tags":["Query"]}},"/lumera.action.v1.Msg/ApproveAction":{"post":{"operationId":"Msg_ApproveAction","parameters":[{"description":"MsgApproveAction is the Msg/ApproveAction request type.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.action.v1.MsgApproveAction"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.MsgApproveActionResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"ApproveAction defines a message for approving an action.","tags":["Msg"]}},"/lumera.action.v1.Msg/FinalizeAction":{"post":{"operationId":"Msg_FinalizeAction","parameters":[{"description":"MsgFinalizeAction is the Msg/FinalizeAction request type.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.action.v1.MsgFinalizeAction"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.MsgFinalizeActionResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"FinalizeAction defines a message for finalizing an action.","tags":["Msg"]}},"/lumera.action.v1.Msg/RequestAction":{"post":{"operationId":"Msg_RequestAction","parameters":[{"description":"MsgRequestAction is the Msg/RequestAction request type.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.action.v1.MsgRequestAction"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.MsgRequestActionResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"RequestAction defines a message for requesting an action.","tags":["Msg"]}},"/lumera.action.v1.Msg/UpdateParams":{"post":{"operationId":"Msg_UpdateParams","parameters":[{"description":"MsgUpdateParams is the Msg/UpdateParams request type.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.action.v1.MsgUpdateParams"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.action.v1.MsgUpdateParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"UpdateParams defines a (governance) operation for updating the module\nparameters. The authority defaults to the x/gov module account.","tags":["Msg"]}},"/LumeraProtocol/lumera/audit/v1/assigned_targets/{supernode_account}":{"get":{"operationId":"Query_AssignedTargets","parameters":[{"in":"path","name":"supernode_account","required":true,"type":"string"},{"format":"uint64","in":"query","name":"epoch_id","required":false,"type":"string"},{"in":"query","name":"filter_by_epoch_id","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryAssignedTargetsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"AssignedTargets returns the prober -\u003e targets assignment for a given supernode_account.\nIf filter_by_epoch_id is false, it returns the assignments for the current epoch.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/current_epoch":{"get":{"operationId":"Query_CurrentEpoch","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryCurrentEpochResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"CurrentEpoch returns the current derived epoch boundaries at the current chain height.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/current_epoch_anchor":{"get":{"operationId":"Query_CurrentEpochAnchor","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryCurrentEpochAnchorResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"CurrentEpochAnchor returns the persisted epoch anchor for the current epoch.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/epoch_anchor/{epoch_id}":{"get":{"operationId":"Query_EpochAnchor","parameters":[{"format":"uint64","in":"path","name":"epoch_id","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryEpochAnchorResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"EpochAnchor returns the persisted epoch anchor for the given epoch_id.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/epoch_report/{epoch_id}/{supernode_account}":{"get":{"operationId":"Query_EpochReport","parameters":[{"format":"uint64","in":"path","name":"epoch_id","required":true,"type":"string"},{"in":"path","name":"supernode_account","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryEpochReportResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"EpochReport returns the submitted epoch report for (epoch_id, supernode_account).","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/epoch_reports_by_reporter/{supernode_account}":{"get":{"operationId":"Query_EpochReportsByReporter","parameters":[{"in":"path","name":"supernode_account","required":true,"type":"string"},{"format":"uint64","in":"query","name":"epoch_id","required":false,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"},{"in":"query","name":"filter_by_epoch_id","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryEpochReportsByReporterResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"EpochReportsByReporter returns epoch reports submitted by the given reporter across epochs.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/evidence/by_action/{action_id}":{"get":{"operationId":"Query_EvidenceByAction","parameters":[{"in":"path","name":"action_id","required":true,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryEvidenceByActionResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"EvidenceByAction queries evidence records by action id.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/evidence/by_subject/{subject_address}":{"get":{"operationId":"Query_EvidenceBySubject","parameters":[{"in":"path","name":"subject_address","required":true,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryEvidenceBySubjectResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"EvidenceBySubject queries evidence records by subject address.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/evidence/{evidence_id}":{"get":{"operationId":"Query_EvidenceById","parameters":[{"format":"uint64","in":"path","name":"evidence_id","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryEvidenceByIdResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"EvidenceById queries a single evidence record by id.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/heal_op/{heal_op_id}":{"get":{"operationId":"Query_HealOp","parameters":[{"format":"uint64","in":"path","name":"heal_op_id","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryHealOpResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"HealOp returns a single storage-truth heal operation by id.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/heal_ops/by_status/{status}":{"get":{"operationId":"Query_HealOpsByStatus","parameters":[{"enum":["HEAL_OP_STATUS_UNSPECIFIED","HEAL_OP_STATUS_SCHEDULED","HEAL_OP_STATUS_IN_PROGRESS","HEAL_OP_STATUS_HEALER_REPORTED","HEAL_OP_STATUS_VERIFIED","HEAL_OP_STATUS_FAILED","HEAL_OP_STATUS_EXPIRED"],"in":"path","name":"status","required":true,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryHealOpsByStatusResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"HealOpsByStatus returns storage-truth heal operations filtered by status.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/heal_ops/by_ticket/{ticket_id}":{"get":{"operationId":"Query_HealOpsByTicket","parameters":[{"in":"path","name":"ticket_id","required":true,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryHealOpsByTicketResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"HealOpsByTicket returns storage-truth heal operations for a ticket id.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/host_reports/{supernode_account}":{"get":{"operationId":"Query_HostReports","parameters":[{"in":"path","name":"supernode_account","required":true,"type":"string"},{"format":"uint64","in":"query","name":"epoch_id","required":false,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"},{"in":"query","name":"filter_by_epoch_id","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryHostReportsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"HostReports returns host reports submitted by the given supernode_account across epochs.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/node_suspicion_state/{supernode_account}":{"get":{"operationId":"Query_NodeSuspicionState","parameters":[{"in":"path","name":"supernode_account","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryNodeSuspicionStateResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"NodeSuspicionState returns storage-truth node suspicion state for a supernode account.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/params":{"get":{"operationId":"Query_Params","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Parameters queries the parameters of the module.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/reporter_reliability_state/{reporter_supernode_account}":{"get":{"operationId":"Query_ReporterReliabilityState","parameters":[{"in":"path","name":"reporter_supernode_account","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryReporterReliabilityStateResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"ReporterReliabilityState returns storage-truth reporter reliability state for a reporter account.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/storage_challenge_reports/{supernode_account}":{"get":{"operationId":"Query_StorageChallengeReports","parameters":[{"in":"path","name":"supernode_account","required":true,"type":"string"},{"format":"uint64","in":"query","name":"epoch_id","required":false,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"},{"in":"query","name":"filter_by_epoch_id","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryStorageChallengeReportsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"StorageChallengeReports returns all reports that include storage-challenge observations about the given supernode_account.","tags":["Query"]}},"/LumeraProtocol/lumera/audit/v1/ticket_deterioration_state/{ticket_id}":{"get":{"operationId":"Query_TicketDeteriorationState","parameters":[{"in":"path","name":"ticket_id","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.QueryTicketDeteriorationStateResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"TicketDeteriorationState returns storage-truth ticket deterioration state for a ticket id.","tags":["Query"]}},"/lumera.audit.v1.Msg/ClaimHealComplete":{"post":{"operationId":"Msg_ClaimHealComplete","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.audit.v1.MsgClaimHealComplete"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.MsgClaimHealCompleteResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"ClaimHealComplete defines the healer claim path for a chain-tracked heal op.","tags":["Msg"]}},"/lumera.audit.v1.Msg/SubmitEpochReport":{"post":{"operationId":"Msg_SubmitEpochReport","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.audit.v1.MsgSubmitEpochReport"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.MsgSubmitEpochReportResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"tags":["Msg"]}},"/lumera.audit.v1.Msg/SubmitEvidence":{"post":{"operationId":"Msg_SubmitEvidence","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.audit.v1.MsgSubmitEvidence"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.MsgSubmitEvidenceResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"SubmitEvidence defines the SubmitEvidence RPC.","tags":["Msg"]}},"/lumera.audit.v1.Msg/SubmitHealVerification":{"post":{"operationId":"Msg_SubmitHealVerification","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.audit.v1.MsgSubmitHealVerification"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.MsgSubmitHealVerificationResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"SubmitHealVerification defines the verifier submission path for a chain-tracked heal op.","tags":["Msg"]}},"/lumera.audit.v1.Msg/SubmitStorageRecheckEvidence":{"post":{"operationId":"Msg_SubmitStorageRecheckEvidence","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.audit.v1.MsgSubmitStorageRecheckEvidence"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.MsgSubmitStorageRecheckEvidenceResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"SubmitStorageRecheckEvidence defines the storage-truth recheck submission path.","tags":["Msg"]}},"/lumera.audit.v1.Msg/UpdateParams":{"post":{"operationId":"Msg_UpdateParams","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.audit.v1.MsgUpdateParams"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.audit.v1.MsgUpdateParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"UpdateParams defines a (governance) operation for updating the module\nparameters. The authority defaults to the x/gov module account.","tags":["Msg"]}},"/LumeraProtocol/lumera/claim/claim_record/{address}":{"get":{"operationId":"Query_ClaimRecord","parameters":[{"in":"path","name":"address","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.claim.QueryClaimRecordResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Queries a list of ClaimRecord items.","tags":["Query"]}},"/LumeraProtocol/lumera/claim/list_claimed/{vestedTerm}":{"get":{"operationId":"Query_ListClaimed","parameters":[{"format":"int64","in":"path","name":"vestedTerm","required":true,"type":"integer"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.claim.QueryListClaimedResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Queries a list of ListClaimed items.","tags":["Query"]}},"/LumeraProtocol/lumera/claim/params":{"get":{"operationId":"Query_Params","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.claim.QueryParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Parameters queries the parameters of the module.","tags":["Query"]}},"/lumera.claim.Msg/Claim":{"post":{"operationId":"Msg_Claim","parameters":[{"description":"MsgClaim is the Msg/Claim request type.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.claim.MsgClaim"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.claim.MsgClaimResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Claim defines a message for claiming tokens.","tags":["Msg"]}},"/lumera.claim.Msg/DelayedClaim":{"post":{"operationId":"Msg_DelayedClaim","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.claim.MsgDelayedClaim"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.claim.MsgDelayedClaimResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"tags":["Msg"]}},"/lumera.claim.Msg/UpdateParams":{"post":{"operationId":"Msg_UpdateParams","parameters":[{"description":"MsgUpdateParams is the Msg/UpdateParams request type.\nMsgUpdateParams is the Msg/UpdateParams request type.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.claim.MsgUpdateParams"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.claim.MsgUpdateParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"UpdateParams defines a (governance) operation for updating the module\nparameters. The authority defaults to the x/gov module account.","tags":["Msg"]}},"/lumera.erc20policy.Msg/SetRegistrationPolicy":{"post":{"operationId":"Msg_SetRegistrationPolicy","parameters":[{"description":"MsgSetRegistrationPolicy configures the IBC voucher ERC20 auto-registration\npolicy. It allows governance to control which IBC denoms are automatically\nregistered as ERC20 token pairs on first IBC receive.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.erc20policy.MsgSetRegistrationPolicy"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.erc20policy.MsgSetRegistrationPolicyResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"SetRegistrationPolicy sets the IBC voucher ERC20 auto-registration policy.\nOnly the governance module account (x/gov authority) may call this.","tags":["Msg"]}},"/lumera/evmigration/legacy_accounts":{"get":{"operationId":"Query_LegacyAccounts","parameters":[{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.evmigration.QueryLegacyAccountsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"LegacyAccounts lists accounts that still use secp256k1 pubkey and have\nnon-zero balance or delegations (i.e. accounts that should migrate).","tags":["Query"]}},"/lumera/evmigration/migrated_accounts":{"get":{"operationId":"Query_MigratedAccounts","parameters":[{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.evmigration.QueryMigratedAccountsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"MigratedAccounts lists all completed migrations with full detail.","tags":["Query"]}},"/lumera/evmigration/migration_estimate/{legacy_address}":{"get":{"operationId":"Query_MigrationEstimate","parameters":[{"description":"legacy_address is the coin-type-118 address to estimate migration for.","in":"path","name":"legacy_address","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.evmigration.QueryMigrationEstimateResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"MigrationEstimate returns a dry-run estimate of what would be migrated\nfor a given legacy address (delegation count, unbonding count, etc.).\nUseful for validators to pre-check before submitting MsgMigrateValidator.","tags":["Query"]}},"/lumera/evmigration/migration_record/{legacy_address}":{"get":{"operationId":"Query_MigrationRecord","parameters":[{"description":"legacy_address is the coin-type-118 address to look up.","in":"path","name":"legacy_address","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.evmigration.QueryMigrationRecordResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"MigrationRecord returns the migration record for a single legacy address.\nReturns nil record if the address has not been migrated.","tags":["Query"]}},"/lumera/evmigration/migration_record_by_new_address/{new_address}":{"get":{"operationId":"Query_MigrationRecordByNewAddress","parameters":[{"description":"new_address is the coin-type-60 destination address to look up.","in":"path","name":"new_address","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.evmigration.QueryMigrationRecordByNewAddressResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"MigrationRecordByNewAddress returns the migration record for a single new address.\nReturns nil record if the new address has not been used as a migration destination.","tags":["Query"]}},"/lumera/evmigration/migration_records":{"get":{"operationId":"Query_MigrationRecords","parameters":[{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.evmigration.QueryMigrationRecordsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"MigrationRecords returns all completed migration records with pagination.","tags":["Query"]}},"/lumera/evmigration/migration_stats":{"get":{"operationId":"Query_MigrationStats","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.evmigration.QueryMigrationStatsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"MigrationStats returns aggregate counters: total migrated, total legacy,\ntotal legacy staked, total validators migrated/legacy.","tags":["Query"]}},"/lumera/evmigration/params":{"get":{"operationId":"Query_Params","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.evmigration.QueryParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Params returns the current migration parameters.","tags":["Query"]}},"/lumera.evmigration.Msg/ClaimLegacyAccount":{"post":{"operationId":"Msg_ClaimLegacyAccount","parameters":[{"description":"MsgClaimLegacyAccount migrates on-chain state from legacy_address to new_address.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.evmigration.MsgClaimLegacyAccount"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.evmigration.MsgClaimLegacyAccountResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"ClaimLegacyAccount migrates all on-chain state from a legacy (coin-type-118)\naddress to a new (coin-type-60) address. Requires dual-signature proof.","tags":["Msg"]}},"/lumera.evmigration.Msg/MigrateValidator":{"post":{"operationId":"Msg_MigrateValidator","parameters":[{"description":"MsgMigrateValidator migrates a validator operator from legacy to new address.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.evmigration.MsgMigrateValidator"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.evmigration.MsgMigrateValidatorResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"MigrateValidator migrates a validator operator from legacy to new address,\nincluding all delegations, distribution state, supernode records, and\naccount-level state.","tags":["Msg"]}},"/lumera.evmigration.Msg/UpdateParams":{"post":{"operationId":"Msg_UpdateParams","parameters":[{"description":"MsgUpdateParams is the Msg/UpdateParams request type.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.evmigration.MsgUpdateParams"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.evmigration.MsgUpdateParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"UpdateParams defines a (governance) operation for updating the module\nparameters. The authority defaults to the x/gov module account.","tags":["Msg"]}},"/LumeraProtocol/lumera/lumeraid/params":{"get":{"operationId":"Query_Params","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.lumeraid.QueryParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Parameters queries the parameters of the module.","tags":["Query"]}},"/lumera.lumeraid.Msg/UpdateParams":{"post":{"operationId":"Msg_UpdateParams","parameters":[{"description":"MsgUpdateParams is the Msg/UpdateParams request type.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.lumeraid.MsgUpdateParams"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.lumeraid.MsgUpdateParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"UpdateParams defines a (governance) operation for updating the module\nparameters. The authority defaults to the x/gov module account.","tags":["Msg"]}},"/LumeraProtocol/lumera/supernode/v1/get_super_node/{validatorAddress}":{"get":{"operationId":"Query_GetSuperNode","parameters":[{"in":"path","name":"validatorAddress","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.QueryGetSuperNodeResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Queries a SuperNode by validatorAddress.","tags":["Query"]}},"/LumeraProtocol/lumera/supernode/v1/get_super_node_by_address/{supernodeAddress}":{"get":{"operationId":"Query_GetSuperNodeBySuperNodeAddress","parameters":[{"in":"path","name":"supernodeAddress","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.QueryGetSuperNodeBySuperNodeAddressResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Queries a SuperNode by supernodeAddress.","tags":["Query"]}},"/LumeraProtocol/lumera/supernode/v1/get_top_super_nodes_for_block/{blockHeight}":{"get":{"operationId":"Query_GetTopSuperNodesForBlock","parameters":[{"format":"int32","in":"path","name":"blockHeight","required":true,"type":"integer"},{"format":"int32","in":"query","name":"limit","required":false,"type":"integer"},{"in":"query","name":"state","required":false,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.QueryGetTopSuperNodesForBlockResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Queries a list of GetTopSuperNodesForBlock items.","tags":["Query"]}},"/LumeraProtocol/lumera/supernode/v1/list_super_nodes":{"get":{"operationId":"Query_ListSuperNodes","parameters":[{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.QueryListSuperNodesResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Queries a list of SuperNodes.","tags":["Query"]}},"/LumeraProtocol/lumera/supernode/v1/metrics/{validatorAddress}":{"get":{"operationId":"Query_GetMetrics","parameters":[{"in":"path","name":"validatorAddress","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.QueryGetMetricsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Queries the latest metrics state for a validator.","tags":["Query"]}},"/LumeraProtocol/lumera/supernode/v1/params":{"get":{"operationId":"Query_Params","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.QueryParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"Parameters queries the parameters of the module.","tags":["Query"]}},"/LumeraProtocol/lumera/supernode/v1/payout_history/{validator_address}":{"get":{"operationId":"Query_PayoutHistory","parameters":[{"in":"path","name":"validator_address","required":true,"type":"string"},{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","in":"query","name":"pagination.key","required":false,"type":"string"},{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","in":"query","name":"pagination.offset","required":false,"type":"string"},{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","in":"query","name":"pagination.limit","required":false,"type":"string"},{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","in":"query","name":"pagination.count_total","required":false,"type":"boolean"},{"description":"reverse is set to true if results are to be returned in the descending order.","in":"query","name":"pagination.reverse","required":false,"type":"boolean"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.QueryPayoutHistoryResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"PayoutHistory returns distribution payout history for a validator.","tags":["Query"]}},"/LumeraProtocol/lumera/supernode/v1/pool_state":{"get":{"operationId":"Query_PoolState","responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.QueryPoolStateResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"PoolState queries the current state of the Everlight pool.","tags":["Query"]}},"/LumeraProtocol/lumera/supernode/v1/sn_eligibility/{validator_address}":{"get":{"operationId":"Query_SNEligibility","parameters":[{"in":"path","name":"validator_address","required":true,"type":"string"}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.QuerySNEligibilityResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"SNEligibility queries whether a specific SuperNode is eligible for payouts.","tags":["Query"]}},"/lumera.supernode.v1.Msg/DeregisterSupernode":{"post":{"operationId":"Msg_DeregisterSupernode","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgDeregisterSupernode"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgDeregisterSupernodeResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"tags":["Msg"]}},"/lumera.supernode.v1.Msg/RegisterSupernode":{"post":{"operationId":"Msg_RegisterSupernode","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgRegisterSupernode"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgRegisterSupernodeResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"tags":["Msg"]}},"/lumera.supernode.v1.Msg/ReportSupernodeMetrics":{"post":{"operationId":"Msg_ReportSupernodeMetrics","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgReportSupernodeMetrics"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgReportSupernodeMetricsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"tags":["Msg"]}},"/lumera.supernode.v1.Msg/StartSupernode":{"post":{"operationId":"Msg_StartSupernode","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgStartSupernode"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgStartSupernodeResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"tags":["Msg"]}},"/lumera.supernode.v1.Msg/StopSupernode":{"post":{"operationId":"Msg_StopSupernode","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgStopSupernode"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgStopSupernodeResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"tags":["Msg"]}},"/lumera.supernode.v1.Msg/UpdateParams":{"post":{"operationId":"Msg_UpdateParams","parameters":[{"description":"MsgUpdateParams is the Msg/UpdateParams request type.","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgUpdateParams"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgUpdateParamsResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"summary":"UpdateParams defines a (governance) operation for updating the module\nparameters. The authority defaults to the x/gov module account.","tags":["Msg"]}},"/lumera.supernode.v1.Msg/UpdateSupernode":{"post":{"operationId":"Msg_UpdateSupernode","parameters":[{"in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgUpdateSupernode"}}],"responses":{"200":{"description":"A successful response.","schema":{"$ref":"#/definitions/lumera.supernode.v1.MsgUpdateSupernodeResponse"}},"default":{"description":"An unexpected error response.","schema":{"$ref":"#/definitions/google.rpc.Status"}}},"tags":["Msg"]}}},"definitions":{"cosmos.base.query.v1beta1.PageRequest":{"description":"message SomeRequest {\n Foo some_parameter = 1;\n PageRequest pagination = 2;\n }","properties":{"count_total":{"description":"count_total is set to true to indicate that the result set should include\na count of the total number of items available for pagination in UIs.\ncount_total is only respected when offset is used. It is ignored when key\nis set.","type":"boolean"},"key":{"description":"key is a value returned in PageResponse.next_key to begin\nquerying the next page most efficiently. Only one of offset or key\nshould be set.","format":"byte","type":"string"},"limit":{"description":"limit is the total number of results to be returned in the result page.\nIf left empty it will default to a value to be set by each app.","format":"uint64","type":"string"},"offset":{"description":"offset is a numeric offset that can be used when key is unavailable.\nIt is less efficient than using key. Only one of offset or key should\nbe set.","format":"uint64","type":"string"},"reverse":{"description":"reverse is set to true if results are to be returned in the descending order.","type":"boolean"}},"title":"PageRequest is to be embedded in gRPC request messages for efficient\npagination. Ex:","type":"object"},"cosmos.base.query.v1beta1.PageResponse":{"description":"PageResponse is to be embedded in gRPC response messages where the\ncorresponding request message has used PageRequest.\n\n message SomeResponse {\n repeated Bar results = 1;\n PageResponse page = 2;\n }","properties":{"next_key":{"description":"next_key is the key to be passed to PageRequest.key to\nquery the next page most efficiently. It will be empty if\nthere are no more results.","format":"byte","type":"string"},"total":{"format":"uint64","title":"total is total number of results available if PageRequest.count_total\nwas set, its value is undefined otherwise","type":"string"}},"type":"object"},"cosmos.base.v1beta1.Coin":{"description":"Coin defines a token with a denomination and an amount.\n\nNOTE: The amount field is an Int which implements the custom method\nsignatures required by gogoproto.","properties":{"amount":{"type":"string"},"denom":{"type":"string"}},"type":"object"},"google.protobuf.Any":{"additionalProperties":{},"properties":{"@type":{"type":"string"}},"type":"object"},"google.rpc.Status":{"properties":{"code":{"format":"int32","type":"integer"},"details":{"items":{"$ref":"#/definitions/google.protobuf.Any","type":"object"},"type":"array"},"message":{"type":"string"}},"type":"object"},"lumera.action.v1.Action":{"description":"Action represents a specific action within the Lumera protocol.","properties":{"actionID":{"type":"string"},"actionType":{"$ref":"#/definitions/lumera.action.v1.ActionType"},"app_pubkey":{"format":"byte","type":"string"},"blockHeight":{"format":"int64","type":"string"},"creator":{"type":"string"},"expirationTime":{"format":"int64","type":"string"},"fileSizeKbs":{"format":"int64","type":"string"},"metadata":{"format":"byte","type":"string"},"price":{"type":"string"},"state":{"$ref":"#/definitions/lumera.action.v1.ActionState"},"superNodes":{"items":{"type":"string"},"type":"array"}},"type":"object"},"lumera.action.v1.ActionState":{"default":"ACTION_STATE_UNSPECIFIED","description":"ActionState enum represents the various states an action can be in.\n\n - ACTION_STATE_UNSPECIFIED: The default state, used when the state is not specified.\n - ACTION_STATE_PENDING: The action is pending and has not yet been processed.\n - ACTION_STATE_PROCESSING: The action is currently being processed.\n - ACTION_STATE_DONE: The action has been completed successfully.\n - ACTION_STATE_APPROVED: The action has been approved.\n - ACTION_STATE_REJECTED: The action has been rejected.\n - ACTION_STATE_FAILED: The action has failed.\n - ACTION_STATE_EXPIRED: The action has expired and is no longer valid.","enum":["ACTION_STATE_UNSPECIFIED","ACTION_STATE_PENDING","ACTION_STATE_PROCESSING","ACTION_STATE_DONE","ACTION_STATE_APPROVED","ACTION_STATE_REJECTED","ACTION_STATE_FAILED","ACTION_STATE_EXPIRED"],"type":"string"},"lumera.action.v1.ActionType":{"default":"ACTION_TYPE_UNSPECIFIED","description":"ActionType enum represents the various types of actions that can be performed.\n\n - ACTION_TYPE_UNSPECIFIED: The default action type, used when the type is not specified.\n - ACTION_TYPE_SENSE: The action type for sense operations.\n - ACTION_TYPE_CASCADE: The action type for cascade operations.","enum":["ACTION_TYPE_UNSPECIFIED","ACTION_TYPE_SENSE","ACTION_TYPE_CASCADE"],"type":"string"},"lumera.action.v1.MsgApproveAction":{"description":"MsgApproveAction is the Msg/ApproveAction request type.","properties":{"actionId":{"type":"string"},"creator":{"type":"string"}},"type":"object"},"lumera.action.v1.MsgApproveActionResponse":{"properties":{"actionId":{"type":"string"},"status":{"type":"string"}},"title":"MsgApproveActionResponse defines the response structure for executing a MsgApproveAction","type":"object"},"lumera.action.v1.MsgFinalizeAction":{"description":"MsgFinalizeAction is the Msg/FinalizeAction request type.","properties":{"actionId":{"type":"string"},"actionType":{"type":"string"},"creator":{"title":"must be supernode address","type":"string"},"metadata":{"type":"string"}},"type":"object"},"lumera.action.v1.MsgFinalizeActionResponse":{"title":"MsgFinalizeActionResponse defines the response structure for executing a MsgFinalizeAction","type":"object"},"lumera.action.v1.MsgRequestAction":{"description":"MsgRequestAction is the Msg/RequestAction request type.","properties":{"actionType":{"type":"string"},"app_pubkey":{"format":"byte","type":"string"},"creator":{"type":"string"},"expirationTime":{"type":"string"},"fileSizeKbs":{"type":"string"},"metadata":{"type":"string"},"price":{"type":"string"}},"type":"object"},"lumera.action.v1.MsgRequestActionResponse":{"properties":{"actionId":{"type":"string"},"status":{"type":"string"}},"title":"MsgRequestActionResponse defines the response structure for executing a MsgRequestAction","type":"object"},"lumera.action.v1.MsgUpdateParams":{"description":"MsgUpdateParams is the Msg/UpdateParams request type.","properties":{"authority":{"description":"authority is the address that controls the module (defaults to x/gov unless overwritten).","type":"string"},"params":{"$ref":"#/definitions/lumera.action.v1.Params","description":"NOTE: All parameters must be supplied."}},"type":"object"},"lumera.action.v1.MsgUpdateParamsResponse":{"description":"MsgUpdateParamsResponse defines the response structure for executing a\nMsgUpdateParams message.","type":"object"},"lumera.action.v1.Params":{"description":"Params defines the parameters for the module.","properties":{"base_action_fee":{"$ref":"#/definitions/cosmos.base.v1beta1.Coin","title":"Fees"},"expiration_duration":{"title":"Time Constraints","type":"string"},"fee_per_kbyte":{"$ref":"#/definitions/cosmos.base.v1beta1.Coin"},"foundation_fee_share":{"type":"string"},"max_actions_per_block":{"format":"uint64","title":"Limits","type":"string"},"max_dd_and_fingerprints":{"format":"uint64","type":"string"},"max_processing_time":{"type":"string"},"max_raptor_q_symbols":{"format":"uint64","type":"string"},"min_processing_time":{"type":"string"},"min_super_nodes":{"format":"uint64","type":"string"},"super_node_fee_share":{"title":"Reward Distribution","type":"string"},"svc_challenge_count":{"description":"Number of chunks to challenge (default: 8)","format":"int64","title":"LEP-5: Storage Verification Challenge parameters","type":"integer"},"svc_min_chunks_for_challenge":{"format":"int64","title":"Minimum chunks required for SVC (default: 4)","type":"integer"}},"type":"object"},"lumera.action.v1.QueryActionByMetadataResponse":{"properties":{"actions":{"items":{"$ref":"#/definitions/lumera.action.v1.Action","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"},"total":{"format":"uint64","type":"string"}},"title":"QueryActionByMetadataResponse is a response type to query actions by metadata","type":"object"},"lumera.action.v1.QueryGetActionFeeResponse":{"properties":{"amount":{"type":"string"}},"title":"QueryGetActionFeeResponse is a response type to get action fee","type":"object"},"lumera.action.v1.QueryGetActionResponse":{"properties":{"action":{"$ref":"#/definitions/lumera.action.v1.Action"}},"title":"Response type for GetAction","type":"object"},"lumera.action.v1.QueryListActionsByBlockHeightResponse":{"properties":{"actions":{"items":{"$ref":"#/definitions/lumera.action.v1.Action","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"},"total":{"format":"uint64","type":"string"}},"title":"QueryListActionsByBlockHeightResponse is a response type to list actions by block height","type":"object"},"lumera.action.v1.QueryListActionsByCreatorResponse":{"properties":{"actions":{"items":{"$ref":"#/definitions/lumera.action.v1.Action","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"},"total":{"format":"uint64","type":"string"}},"title":"QueryListActionsByCreatorResponse is a response type to list actions for a specific creator","type":"object"},"lumera.action.v1.QueryListActionsBySuperNodeResponse":{"properties":{"actions":{"items":{"$ref":"#/definitions/lumera.action.v1.Action","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"},"total":{"format":"uint64","type":"string"}},"title":"QueryListActionsBySuperNodeResponse is a response type to list actions for a specific supernode","type":"object"},"lumera.action.v1.QueryListActionsResponse":{"properties":{"actions":{"items":{"$ref":"#/definitions/lumera.action.v1.Action","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"},"total":{"format":"uint64","type":"string"}},"title":"QueryListActionsResponse is a response type to list actions","type":"object"},"lumera.action.v1.QueryListExpiredActionsResponse":{"properties":{"actions":{"items":{"$ref":"#/definitions/lumera.action.v1.Action","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"},"total":{"format":"uint64","type":"string"}},"title":"QueryListExpiredActionsResponse is a response type to list expired actions","type":"object"},"lumera.action.v1.QueryParamsResponse":{"description":"QueryParamsResponse is response type for the Query/Params RPC method.","properties":{"params":{"$ref":"#/definitions/lumera.action.v1.Params","description":"params holds all the parameters of this module."}},"type":"object"},"lumera.audit.v1.EpochAnchor":{"description":"EpochAnchor is a minimal per-epoch on-chain anchor that freezes the deterministic seed\nand the eligible supernode sets used for deterministic selection off-chain.","properties":{"active_set_commitment":{"format":"byte","type":"string"},"active_supernode_accounts":{"description":"active_supernode_accounts is the sorted list of ACTIVE supernodes at epoch start.","items":{"type":"string"},"type":"array"},"epoch_end_height":{"format":"int64","type":"string"},"epoch_id":{"format":"uint64","type":"string"},"epoch_length_blocks":{"format":"uint64","type":"string"},"epoch_start_height":{"format":"int64","type":"string"},"params_commitment":{"description":"params_commitment is a hash commitment to Params (with defaults) at epoch start.","format":"byte","type":"string"},"seed":{"description":"seed is a fixed 32-byte value derived at epoch start (domain-separated).","format":"byte","type":"string"},"target_supernode_accounts":{"description":"target_supernode_accounts is the sorted list of eligible targets at epoch start:\nACTIVE + POSTPONED supernodes.","items":{"type":"string"},"type":"array"},"targets_set_commitment":{"format":"byte","type":"string"}},"type":"object"},"lumera.audit.v1.EpochReport":{"description":"EpochReport is a single per-epoch report submitted by a Supernode.","properties":{"epoch_id":{"format":"uint64","type":"string"},"host_report":{"$ref":"#/definitions/lumera.audit.v1.HostReport"},"report_height":{"format":"int64","type":"string"},"storage_challenge_observations":{"items":{"$ref":"#/definitions/lumera.audit.v1.StorageChallengeObservation","type":"object"},"type":"array"},"storage_proof_results":{"items":{"$ref":"#/definitions/lumera.audit.v1.StorageProofResult","type":"object"},"type":"array"},"supernode_account":{"type":"string"}},"type":"object"},"lumera.audit.v1.Evidence":{"description":"Evidence is a stable outer record that stores evidence about an audited subject.\nType-specific fields are encoded into the `metadata` bytes field.","properties":{"action_id":{"description":"action_id optionally links this evidence to a specific action.","type":"string"},"evidence_id":{"description":"evidence_id is a chain-assigned unique identifier.","format":"uint64","type":"string"},"evidence_type":{"$ref":"#/definitions/lumera.audit.v1.EvidenceType","description":"evidence_type is a stable discriminator used to interpret metadata."},"metadata":{"description":"metadata is protobuf-binary bytes of a type-specific Evidence metadata message.","format":"byte","type":"string"},"reported_height":{"description":"reported_height is the block height when the evidence was submitted.","format":"uint64","type":"string"},"reporter_address":{"description":"reporter_address is the submitter of the evidence.","type":"string"},"subject_address":{"description":"subject_address is the audited subject (e.g. supernode-related actor).","type":"string"}},"type":"object"},"lumera.audit.v1.EvidenceType":{"default":"EVIDENCE_TYPE_UNSPECIFIED","description":" - EVIDENCE_TYPE_ACTION_FINALIZATION_SIGNATURE_FAILURE: action finalization rejected due to an invalid signature / signature-derived data.\n - EVIDENCE_TYPE_ACTION_FINALIZATION_NOT_IN_TOP_10: action finalization rejected because the attempted finalizer is not in the top-10 supernodes.\n - EVIDENCE_TYPE_STORAGE_CHALLENGE_FAILURE: storage challenge failure evidence submitted by the deterministic challenger.\n - EVIDENCE_TYPE_CASCADE_CLIENT_FAILURE: client-observed cascade flow failure (upload/download).","enum":["EVIDENCE_TYPE_UNSPECIFIED","EVIDENCE_TYPE_ACTION_FINALIZATION_SIGNATURE_FAILURE","EVIDENCE_TYPE_ACTION_FINALIZATION_NOT_IN_TOP_10","EVIDENCE_TYPE_ACTION_EXPIRED","EVIDENCE_TYPE_STORAGE_CHALLENGE_FAILURE","EVIDENCE_TYPE_CASCADE_CLIENT_FAILURE"],"type":"string"},"lumera.audit.v1.HealOp":{"description":"HealOp is the chain-tracked storage-truth healing operation state.","properties":{"created_height":{"format":"uint64","type":"string"},"deadline_epoch_id":{"format":"uint64","type":"string"},"heal_op_id":{"format":"uint64","type":"string"},"healer_supernode_account":{"type":"string"},"notes":{"type":"string"},"result_hash":{"type":"string"},"scheduled_epoch_id":{"format":"uint64","type":"string"},"status":{"$ref":"#/definitions/lumera.audit.v1.HealOpStatus"},"ticket_id":{"type":"string"},"updated_height":{"format":"uint64","type":"string"},"verifier_supernode_accounts":{"items":{"type":"string"},"type":"array"}},"type":"object"},"lumera.audit.v1.HealOpStatus":{"default":"HEAL_OP_STATUS_UNSPECIFIED","enum":["HEAL_OP_STATUS_UNSPECIFIED","HEAL_OP_STATUS_SCHEDULED","HEAL_OP_STATUS_IN_PROGRESS","HEAL_OP_STATUS_HEALER_REPORTED","HEAL_OP_STATUS_VERIFIED","HEAL_OP_STATUS_FAILED","HEAL_OP_STATUS_EXPIRED"],"type":"string"},"lumera.audit.v1.HostReport":{"description":"HostReport is the Supernode's self-reported host metrics and counters for an epoch.","properties":{"cascade_kademlia_db_bytes":{"description":"Cascade Kademlia DB size in bytes, self-reported by the SuperNode.\nCarried on HostReport purely as a metric-courier on the audit epoch report\nchannel — the audit module does NOT consume this value for its own\nconsensus logic (LEP-6 §12). On successful epoch-report acceptance the\naudit handler bridges this value into x/supernode SupernodeMetricsState,\nwhich is the sole source consulted by Everlight payout / eligibility.\nMUST be finite and non-negative; zero is valid (empty Kademlia store).","format":"double","type":"number"},"cpu_usage_percent":{"format":"double","type":"number"},"disk_usage_percent":{"format":"double","type":"number"},"failed_actions_count":{"format":"int64","type":"integer"},"inbound_port_states":{"items":{"$ref":"#/definitions/lumera.audit.v1.PortState"},"type":"array"},"mem_usage_percent":{"format":"double","type":"number"}},"type":"object"},"lumera.audit.v1.HostReportEntry":{"properties":{"epoch_id":{"format":"uint64","type":"string"},"host_report":{"$ref":"#/definitions/lumera.audit.v1.HostReport"},"report_height":{"format":"int64","type":"string"}},"type":"object"},"lumera.audit.v1.MsgClaimHealComplete":{"properties":{"creator":{"type":"string"},"details":{"type":"string"},"heal_manifest_hash":{"type":"string"},"heal_op_id":{"format":"uint64","type":"string"},"ticket_id":{"type":"string"}},"type":"object"},"lumera.audit.v1.MsgClaimHealCompleteResponse":{"type":"object"},"lumera.audit.v1.MsgSubmitEpochReport":{"properties":{"creator":{"description":"creator is the transaction signer.","type":"string"},"epoch_id":{"format":"uint64","type":"string"},"host_report":{"$ref":"#/definitions/lumera.audit.v1.HostReport"},"storage_challenge_observations":{"items":{"$ref":"#/definitions/lumera.audit.v1.StorageChallengeObservation","type":"object"},"type":"array"},"storage_proof_results":{"items":{"$ref":"#/definitions/lumera.audit.v1.StorageProofResult","type":"object"},"type":"array"}},"type":"object"},"lumera.audit.v1.MsgSubmitEpochReportResponse":{"type":"object"},"lumera.audit.v1.MsgSubmitEvidence":{"properties":{"action_id":{"type":"string"},"creator":{"type":"string"},"evidence_type":{"$ref":"#/definitions/lumera.audit.v1.EvidenceType"},"metadata":{"description":"metadata is JSON for the type-specific Evidence metadata message.\nThe chain stores protobuf-binary bytes derived from this JSON.","type":"string"},"subject_address":{"type":"string"}},"type":"object"},"lumera.audit.v1.MsgSubmitEvidenceResponse":{"properties":{"evidence_id":{"format":"uint64","type":"string"}},"type":"object"},"lumera.audit.v1.MsgSubmitHealVerification":{"properties":{"creator":{"type":"string"},"details":{"type":"string"},"heal_op_id":{"format":"uint64","type":"string"},"verification_hash":{"type":"string"},"verified":{"type":"boolean"}},"type":"object"},"lumera.audit.v1.MsgSubmitHealVerificationResponse":{"type":"object"},"lumera.audit.v1.MsgSubmitStorageRecheckEvidence":{"properties":{"challenged_result_transcript_hash":{"type":"string"},"challenged_supernode_account":{"type":"string"},"creator":{"type":"string"},"details":{"type":"string"},"epoch_id":{"format":"uint64","type":"string"},"recheck_result_class":{"$ref":"#/definitions/lumera.audit.v1.StorageProofResultClass"},"recheck_transcript_hash":{"type":"string"},"ticket_id":{"type":"string"}},"type":"object"},"lumera.audit.v1.MsgSubmitStorageRecheckEvidenceResponse":{"type":"object"},"lumera.audit.v1.MsgUpdateParams":{"properties":{"authority":{"type":"string"},"params":{"$ref":"#/definitions/lumera.audit.v1.Params"}},"type":"object"},"lumera.audit.v1.MsgUpdateParamsResponse":{"type":"object"},"lumera.audit.v1.NodeSuspicionState":{"description":"NodeSuspicionState is the persisted storage-truth node-level suspicion snapshot.","properties":{"class_a_count_window":{"format":"int64","type":"integer"},"class_b_count_window":{"format":"int64","type":"integer"},"clean_pass_count":{"format":"int64","type":"integer"},"clean_pass_count_at_postpone":{"description":"Per 121-F8 — recovery delta from snapshot, not cumulative.","format":"int64","type":"integer"},"distinct_ticket_fail_window":{"format":"int64","type":"integer"},"last_class_a_epoch":{"format":"uint64","type":"string"},"last_class_b_epoch":{"format":"uint64","type":"string"},"last_clean_pass_epoch":{"format":"uint64","type":"string"},"last_index_fail_epoch":{"format":"uint64","type":"string"},"last_old_fail_epoch":{"format":"uint64","type":"string"},"last_recent_fail_epoch":{"format":"uint64","type":"string"},"last_updated_epoch":{"format":"uint64","type":"string"},"supernode_account":{"type":"string"},"suspicion_score":{"format":"int64","type":"string"},"window_start_epoch":{"format":"uint64","type":"string"}},"type":"object"},"lumera.audit.v1.Params":{"description":"Params defines the parameters for the audit module.","properties":{"action_finalization_not_in_top10_consecutive_epochs":{"description":"action_finalization_not_in_top10_consecutive_epochs is the consecutive epochs threshold\nfor EVIDENCE_TYPE_ACTION_FINALIZATION_NOT_IN_TOP_10.","format":"int64","type":"integer"},"action_finalization_not_in_top10_evidences_per_epoch":{"description":"action_finalization_not_in_top10_evidences_per_epoch is the per-epoch count threshold\nfor EVIDENCE_TYPE_ACTION_FINALIZATION_NOT_IN_TOP_10.","format":"int64","type":"integer"},"action_finalization_recovery_epochs":{"description":"action_finalization_recovery_epochs is the number of epochs to wait before considering recovery.","format":"int64","type":"integer"},"action_finalization_recovery_max_total_bad_evidences":{"description":"action_finalization_recovery_max_total_bad_evidences is the maximum allowed total count of bad\naction-finalization evidences in the recovery epoch-span for auto-recovery to occur.\nRecovery happens ONLY IF total_bad \u003c this value.","format":"int64","type":"integer"},"action_finalization_signature_failure_consecutive_epochs":{"description":"action_finalization_signature_failure_consecutive_epochs is the consecutive epochs threshold\nfor EVIDENCE_TYPE_ACTION_FINALIZATION_SIGNATURE_FAILURE.","format":"int64","type":"integer"},"action_finalization_signature_failure_evidences_per_epoch":{"description":"action_finalization_signature_failure_evidences_per_epoch is the per-epoch count threshold\nfor EVIDENCE_TYPE_ACTION_FINALIZATION_SIGNATURE_FAILURE.","format":"int64","type":"integer"},"consecutive_epochs_to_postpone":{"description":"Number of consecutive epochs a required port must be reported CLOSED by peers\nat or above peer_port_postpone_threshold_percent before postponing the supernode.","format":"int64","type":"integer"},"epoch_length_blocks":{"format":"uint64","type":"string"},"epoch_zero_height":{"description":"epoch_zero_height defines the reference chain height at which epoch_id = 0 starts.\nThis makes epoch boundaries deterministic from genesis without needing to query state.","format":"uint64","type":"string"},"keep_last_epoch_entries":{"description":"How many completed epochs to keep in state for epoch-scoped data like EpochReport\nand related indices. Pruning runs at epoch end.","format":"uint64","type":"string"},"max_probe_targets_per_epoch":{"format":"int64","type":"integer"},"min_cpu_free_percent":{"description":"Minimum required host free capacity (self reported).\nfree% = 100 - usage%\nA usage% of 0 is treated as \"unknown\" (no action).","format":"int64","type":"integer"},"min_disk_free_percent":{"format":"int64","type":"integer"},"min_mem_free_percent":{"format":"int64","type":"integer"},"min_probe_targets_per_epoch":{"format":"int64","type":"integer"},"peer_port_postpone_threshold_percent":{"description":"Minimum percent (1-100) of peer reports that must report a required port as CLOSED\nfor the port to be treated as CLOSED for postponement purposes.\n\n100 means unanimous.\nExample: to approximate a 2/3 threshold, use 66 (since 2/3 ≈ 66.6%).","format":"int64","type":"integer"},"peer_quorum_reports":{"format":"int64","type":"integer"},"required_open_ports":{"items":{"format":"int64","type":"integer"},"type":"array"},"sc_challengers_per_epoch":{"format":"int64","type":"integer"},"sc_enabled":{"description":"Storage Challenge (SC) params.","type":"boolean"},"storage_truth_challenge_target_divisor":{"format":"int64","type":"integer"},"storage_truth_class_a_fault_window":{"description":"Class A and B fault windows.","format":"int64","type":"integer"},"storage_truth_class_b_fault_window":{"format":"int64","type":"integer"},"storage_truth_compound_range_len_bytes":{"format":"int64","type":"integer"},"storage_truth_compound_ranges_per_artifact":{"format":"int64","type":"integer"},"storage_truth_contradiction_window_epochs":{"description":"Contradiction confirmation window in epochs (default 7).","format":"int64","type":"integer"},"storage_truth_divergence_window_epochs":{"description":"Statistical divergence scoring params.","format":"int64","type":"integer"},"storage_truth_enforcement_mode":{"$ref":"#/definitions/lumera.audit.v1.StorageTruthEnforcementMode","description":"Storage-truth rollout gate."},"storage_truth_heal_deadline_epochs":{"description":"Heal deadline in epochs (default 3).","format":"int64","type":"integer"},"storage_truth_heal_verifier_count":{"description":"Number of verifier supernodes assigned per heal-op (NEW-B-3, default 2).\nVerifiers cross-check the healer's recovery; making this a Param allows\ngovernance to tune redundancy if heal volume / failure rate shifts.","format":"int64","type":"integer"},"storage_truth_max_self_heal_ops_per_epoch":{"description":"Storage-truth scoring and healing params.","format":"int64","type":"integer"},"storage_truth_node_suspicion_decay_per_epoch":{"format":"int64","type":"string"},"storage_truth_node_suspicion_threshold_postpone":{"format":"int64","type":"string"},"storage_truth_node_suspicion_threshold_probation":{"format":"int64","type":"string"},"storage_truth_node_suspicion_threshold_strong_postpone":{"description":"Strong-postpone threshold (default 140).","format":"int64","type":"string"},"storage_truth_node_suspicion_threshold_watch":{"format":"int64","type":"string"},"storage_truth_old_bucket_min_blocks":{"format":"uint64","type":"string"},"storage_truth_old_class_a_fault_window":{"description":"OLD Class-A distinct-ticket window in epochs (default 21).","format":"int64","type":"integer"},"storage_truth_pattern_escalation_window":{"description":"Pattern escalation window in epochs (default 14).","format":"int64","type":"integer"},"storage_truth_probation_epochs":{"format":"int64","type":"integer"},"storage_truth_recent_bucket_max_blocks":{"description":"Storage-truth challenge shape params.","format":"uint64","type":"string"},"storage_truth_recovery_clean_pass_count":{"description":"Recovery requires this many clean passes (default 3).","format":"int64","type":"integer"},"storage_truth_reporter_ineligible_duration_epochs":{"description":"Reporter challenger ineligibility duration in epochs (default 7).","format":"int64","type":"integer"},"storage_truth_reporter_min_reports_for_divergence":{"format":"int64","type":"integer"},"storage_truth_reporter_reliability_decay_per_epoch":{"format":"int64","type":"string"},"storage_truth_reporter_reliability_degraded_threshold":{"description":"New LEP-6 spec-alignment params.\nReporter reliability degraded threshold (positive-penalty model).","format":"int64","type":"string"},"storage_truth_reporter_reliability_ineligible_threshold":{"format":"int64","type":"string"},"storage_truth_reporter_reliability_low_trust_threshold":{"format":"int64","type":"string"},"storage_truth_strong_recovery_clean_pass_count":{"description":"Strong-band recovery clean-pass requirement (F121-F12, default 5).","format":"int64","type":"integer"},"storage_truth_ticket_deterioration_decay_per_epoch":{"format":"int64","type":"string"},"storage_truth_ticket_deterioration_heal_threshold":{"format":"int64","type":"string"}},"type":"object"},"lumera.audit.v1.PortState":{"default":"PORT_STATE_UNKNOWN","enum":["PORT_STATE_UNKNOWN","PORT_STATE_OPEN","PORT_STATE_CLOSED"],"type":"string"},"lumera.audit.v1.QueryAssignedTargetsResponse":{"properties":{"epoch_id":{"format":"uint64","type":"string"},"epoch_start_height":{"format":"int64","type":"string"},"required_open_ports":{"items":{"format":"int64","type":"integer"},"type":"array"},"target_supernode_accounts":{"items":{"type":"string"},"type":"array"}},"type":"object"},"lumera.audit.v1.QueryCurrentEpochAnchorResponse":{"properties":{"anchor":{"$ref":"#/definitions/lumera.audit.v1.EpochAnchor"}},"type":"object"},"lumera.audit.v1.QueryCurrentEpochResponse":{"properties":{"epoch_end_height":{"format":"int64","type":"string"},"epoch_id":{"format":"uint64","type":"string"},"epoch_start_height":{"format":"int64","type":"string"}},"type":"object"},"lumera.audit.v1.QueryEpochAnchorResponse":{"properties":{"anchor":{"$ref":"#/definitions/lumera.audit.v1.EpochAnchor"}},"type":"object"},"lumera.audit.v1.QueryEpochReportResponse":{"properties":{"report":{"$ref":"#/definitions/lumera.audit.v1.EpochReport"}},"type":"object"},"lumera.audit.v1.QueryEpochReportsByReporterResponse":{"properties":{"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"},"reports":{"items":{"$ref":"#/definitions/lumera.audit.v1.EpochReport","type":"object"},"type":"array"}},"type":"object"},"lumera.audit.v1.QueryEvidenceByActionResponse":{"properties":{"evidence":{"items":{"$ref":"#/definitions/lumera.audit.v1.Evidence","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"}},"type":"object"},"lumera.audit.v1.QueryEvidenceByIdResponse":{"properties":{"evidence":{"$ref":"#/definitions/lumera.audit.v1.Evidence"}},"type":"object"},"lumera.audit.v1.QueryEvidenceBySubjectResponse":{"properties":{"evidence":{"items":{"$ref":"#/definitions/lumera.audit.v1.Evidence","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"}},"type":"object"},"lumera.audit.v1.QueryHealOpResponse":{"properties":{"heal_op":{"$ref":"#/definitions/lumera.audit.v1.HealOp"}},"type":"object"},"lumera.audit.v1.QueryHealOpsByStatusResponse":{"properties":{"heal_ops":{"items":{"$ref":"#/definitions/lumera.audit.v1.HealOp","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"}},"type":"object"},"lumera.audit.v1.QueryHealOpsByTicketResponse":{"properties":{"heal_ops":{"items":{"$ref":"#/definitions/lumera.audit.v1.HealOp","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"}},"type":"object"},"lumera.audit.v1.QueryHostReportsResponse":{"properties":{"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"},"reports":{"items":{"$ref":"#/definitions/lumera.audit.v1.HostReportEntry","type":"object"},"type":"array"}},"type":"object"},"lumera.audit.v1.QueryNodeSuspicionStateResponse":{"properties":{"state":{"$ref":"#/definitions/lumera.audit.v1.NodeSuspicionState"}},"type":"object"},"lumera.audit.v1.QueryParamsResponse":{"properties":{"params":{"$ref":"#/definitions/lumera.audit.v1.Params"}},"type":"object"},"lumera.audit.v1.QueryReporterReliabilityStateResponse":{"properties":{"state":{"$ref":"#/definitions/lumera.audit.v1.ReporterReliabilityState"}},"type":"object"},"lumera.audit.v1.QueryStorageChallengeReportsResponse":{"properties":{"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"},"reports":{"items":{"$ref":"#/definitions/lumera.audit.v1.StorageChallengeReport","type":"object"},"type":"array"}},"type":"object"},"lumera.audit.v1.QueryTicketDeteriorationStateResponse":{"properties":{"state":{"$ref":"#/definitions/lumera.audit.v1.TicketDeteriorationState"}},"type":"object"},"lumera.audit.v1.ReporterReliabilityState":{"description":"ReporterReliabilityState is the persisted storage-truth reporter reliability snapshot.","properties":{"contradiction_count":{"format":"uint64","type":"string"},"ineligible_until_epoch":{"format":"uint64","type":"string"},"last_updated_epoch":{"format":"uint64","type":"string"},"reliability_score":{"format":"int64","type":"string"},"reporter_supernode_account":{"type":"string"},"trust_band":{"$ref":"#/definitions/lumera.audit.v1.ReporterTrustBand"},"window_negative_count":{"format":"int64","type":"integer"},"window_positive_count":{"format":"int64","type":"integer"},"window_start_epoch":{"format":"uint64","type":"string"}},"type":"object"},"lumera.audit.v1.ReporterTrustBand":{"default":"REPORTER_TRUST_BAND_UNSPECIFIED","enum":["REPORTER_TRUST_BAND_UNSPECIFIED","REPORTER_TRUST_BAND_NORMAL","REPORTER_TRUST_BAND_LOW_TRUST","REPORTER_TRUST_BAND_CHALLENGER_INELIGIBLE","REPORTER_TRUST_BAND_DEGRADED"],"type":"string"},"lumera.audit.v1.StorageChallengeObservation":{"description":"StorageChallengeObservation is a prober's reachability observation about an assigned target.","properties":{"port_states":{"description":"port_states[i] refers to required_open_ports[i] for the epoch.","items":{"$ref":"#/definitions/lumera.audit.v1.PortState"},"type":"array"},"target_supernode_account":{"type":"string"}},"type":"object"},"lumera.audit.v1.StorageChallengeReport":{"properties":{"epoch_id":{"format":"uint64","type":"string"},"port_states":{"items":{"$ref":"#/definitions/lumera.audit.v1.PortState"},"type":"array"},"report_height":{"format":"int64","type":"string"},"reporter_supernode_account":{"type":"string"}},"type":"object"},"lumera.audit.v1.StorageProofArtifactClass":{"default":"STORAGE_PROOF_ARTIFACT_CLASS_UNSPECIFIED","enum":["STORAGE_PROOF_ARTIFACT_CLASS_UNSPECIFIED","STORAGE_PROOF_ARTIFACT_CLASS_INDEX","STORAGE_PROOF_ARTIFACT_CLASS_SYMBOL"],"type":"string"},"lumera.audit.v1.StorageProofBucketType":{"default":"STORAGE_PROOF_BUCKET_TYPE_UNSPECIFIED","enum":["STORAGE_PROOF_BUCKET_TYPE_UNSPECIFIED","STORAGE_PROOF_BUCKET_TYPE_RECENT","STORAGE_PROOF_BUCKET_TYPE_OLD","STORAGE_PROOF_BUCKET_TYPE_PROBATION","STORAGE_PROOF_BUCKET_TYPE_RECHECK"],"type":"string"},"lumera.audit.v1.StorageProofResult":{"description":"StorageProofResult captures one storage-truth storage-proof check outcome.\n\nNOTE: StorageProofResult stores transcript_hash plus a compact deterministic\nderivation/signature envelope so transcript disagreements become explicit on-chain.","properties":{"artifact_class":{"$ref":"#/definitions/lumera.audit.v1.StorageProofArtifactClass"},"artifact_count":{"description":"artifact_count is the class-specific denominator used for deterministic\nordinal selection: artifact_ordinal = H(...) mod artifact_count.","format":"int64","type":"integer"},"artifact_key":{"type":"string"},"artifact_ordinal":{"description":"artifact_ordinal is the deterministic ordinal selected inside the artifact class.","format":"int64","type":"integer"},"bucket_type":{"$ref":"#/definitions/lumera.audit.v1.StorageProofBucketType"},"challenger_signature":{"description":"challenger_signature is the challenger's signature over transcript commitment.","type":"string"},"challenger_supernode_account":{"type":"string"},"derivation_input_hash":{"description":"derivation_input_hash commits deterministic derivation inputs (seed, range\nselection inputs, and resolver inputs) used off-chain for transcript build.","type":"string"},"details":{"description":"details is an optional short diagnostic summary for non-pass outcomes.","type":"string"},"observer_attestation_signatures":{"description":"observer_attestation_signatures carries observer attestations for the\ntranscript commitment when available.","items":{"type":"string"},"type":"array"},"result_class":{"$ref":"#/definitions/lumera.audit.v1.StorageProofResultClass"},"target_supernode_account":{"type":"string"},"ticket_id":{"description":"ticket_id identifies the ticket selected by deterministic bucket logic.","type":"string"},"transcript_hash":{"type":"string"}},"type":"object"},"lumera.audit.v1.StorageProofResultClass":{"default":"STORAGE_PROOF_RESULT_CLASS_UNSPECIFIED","enum":["STORAGE_PROOF_RESULT_CLASS_UNSPECIFIED","STORAGE_PROOF_RESULT_CLASS_PASS","STORAGE_PROOF_RESULT_CLASS_HASH_MISMATCH","STORAGE_PROOF_RESULT_CLASS_TIMEOUT_OR_NO_RESPONSE","STORAGE_PROOF_RESULT_CLASS_OBSERVER_QUORUM_FAIL","STORAGE_PROOF_RESULT_CLASS_NO_ELIGIBLE_TICKET","STORAGE_PROOF_RESULT_CLASS_INVALID_TRANSCRIPT","STORAGE_PROOF_RESULT_CLASS_RECHECK_CONFIRMED_FAIL"],"type":"string"},"lumera.audit.v1.StorageTruthEnforcementMode":{"default":"STORAGE_TRUTH_ENFORCEMENT_MODE_UNSPECIFIED","enum":["STORAGE_TRUTH_ENFORCEMENT_MODE_UNSPECIFIED","STORAGE_TRUTH_ENFORCEMENT_MODE_SHADOW","STORAGE_TRUTH_ENFORCEMENT_MODE_SOFT","STORAGE_TRUTH_ENFORCEMENT_MODE_FULL"],"type":"string"},"lumera.audit.v1.TicketDeteriorationState":{"description":"TicketDeteriorationState is the persisted storage-truth ticket deterioration snapshot.","properties":{"active_heal_op_id":{"format":"uint64","type":"string"},"contradiction_count":{"format":"uint64","type":"string"},"deterioration_score":{"format":"int64","type":"string"},"distinct_holder_failure_count":{"format":"int64","type":"integer"},"last_failure_epoch":{"format":"uint64","type":"string"},"last_heal_epoch":{"format":"uint64","type":"string"},"last_index_failure_epoch":{"format":"uint64","type":"string"},"last_reporter_supernode_account":{"type":"string"},"last_result_class":{"$ref":"#/definitions/lumera.audit.v1.StorageProofResultClass"},"last_result_epoch":{"format":"uint64","type":"string"},"last_target_supernode_account":{"type":"string"},"last_updated_epoch":{"format":"uint64","type":"string"},"old_bucket_failure_epoch":{"format":"uint64","type":"string"},"probation_until_epoch":{"format":"uint64","type":"string"},"recent_bucket_failure_epoch":{"format":"uint64","type":"string"},"recent_failure_epoch_count":{"format":"int64","type":"integer"},"ticket_id":{"type":"string"}},"type":"object"},"lumera.claim.ClaimRecord":{"description":"ClaimRecord represents a record of a claim made by a user.","properties":{"balance":{"items":{"$ref":"#/definitions/cosmos.base.v1beta1.Coin","type":"object"},"type":"array"},"claimTime":{"format":"int64","type":"string"},"claimed":{"type":"boolean"},"destAddress":{"type":"string"},"oldAddress":{"type":"string"},"vestedTier":{"format":"int64","type":"integer"}},"type":"object"},"lumera.claim.MsgClaim":{"description":"MsgClaim is the Msg/Claim request type.","properties":{"creator":{"type":"string"},"newAddress":{"type":"string"},"oldAddress":{"type":"string"},"pubKey":{"type":"string"},"signature":{"type":"string"}},"type":"object"},"lumera.claim.MsgClaimResponse":{"title":"MsgClaimResponse defines the response structure for executing a","type":"object"},"lumera.claim.MsgDelayedClaim":{"properties":{"creator":{"type":"string"},"newAddress":{"type":"string"},"oldAddress":{"type":"string"},"pubKey":{"type":"string"},"signature":{"type":"string"},"tier":{"format":"int64","type":"integer"}},"type":"object"},"lumera.claim.MsgDelayedClaimResponse":{"type":"object"},"lumera.claim.MsgUpdateParams":{"description":"MsgUpdateParams is the Msg/UpdateParams request type.\nMsgUpdateParams is the Msg/UpdateParams request type.","properties":{"authority":{"description":"authority is the address that controls the module (defaults to x/gov unless overwritten).","type":"string"},"params":{"$ref":"#/definitions/lumera.claim.Params","description":"params defines the x/claim parameters to update.\nNOTE: All parameters must be supplied."}},"type":"object"},"lumera.claim.MsgUpdateParamsResponse":{"description":"MsgUpdateParamsResponse defines the response structure for executing a\nMsgUpdateParams message.","type":"object"},"lumera.claim.Params":{"description":"Params defines the parameters for the module.","properties":{"claim_end_time":{"format":"int64","type":"string"},"enable_claims":{"type":"boolean"},"max_claims_per_block":{"format":"uint64","type":"string"}},"type":"object"},"lumera.claim.QueryClaimRecordResponse":{"description":"QueryClaimRecordResponse is response type for the Query/ClaimRecord RPC method.","properties":{"record":{"$ref":"#/definitions/lumera.claim.ClaimRecord"}},"type":"object"},"lumera.claim.QueryListClaimedResponse":{"properties":{"claims":{"items":{"$ref":"#/definitions/lumera.claim.ClaimRecord","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"}},"type":"object"},"lumera.claim.QueryParamsResponse":{"description":"QueryParamsResponse is response type for the Query/Params RPC method.","properties":{"params":{"$ref":"#/definitions/lumera.claim.Params","description":"params holds all the parameters of this module."}},"type":"object"},"lumera.erc20policy.AllowedBaseDenomTrace":{"description":"AllowedBaseDenomTrace binds a base denomination to a specific IBC provenance\npath. The trace is the full expected sequence of hops for the received denom:\n[{destPort, destChannel}, ...priorHops]. An empty trace is a valid placeholder\nthat never matches a real IBC packet (all packets have at least one hop).","properties":{"base_denom":{"type":"string"},"trace":{"items":{"$ref":"#/definitions/lumera.erc20policy.SourceHop","type":"object"},"type":"array"}},"type":"object"},"lumera.erc20policy.MsgSetRegistrationPolicy":{"description":"MsgSetRegistrationPolicy configures the IBC voucher ERC20 auto-registration\npolicy. It allows governance to control which IBC denoms are automatically\nregistered as ERC20 token pairs on first IBC receive.","properties":{"add_base_denom_traces":{"description":"add_base_denom_traces adds provenance-bound base denom entries to the\nallowlist. Each entry binds a base denom (e.g. \"uatom\") to a specific\nIBC trace (the full expected hop sequence). Governance must provide the\ntrace to activate a base denom entry.","items":{"$ref":"#/definitions/lumera.erc20policy.AllowedBaseDenomTrace","type":"object"},"type":"array"},"add_denoms":{"description":"add_denoms is a list of exact IBC denoms (e.g. \"ibc/HASH...\") to add to\nthe allowlist. Only meaningful when mode is \"allowlist\".","items":{"type":"string"},"type":"array"},"authority":{"description":"authority is the address that controls the policy (defaults to x/gov).","type":"string"},"mode":{"description":"mode is the registration policy mode: \"all\", \"allowlist\", or \"none\".\nIf empty, the mode is not changed.","type":"string"},"remove_base_denom_traces":{"description":"remove_base_denom_traces removes provenance-bound base denom entries.","items":{"$ref":"#/definitions/lumera.erc20policy.AllowedBaseDenomTrace","type":"object"},"type":"array"},"remove_denoms":{"description":"remove_denoms is a list of exact IBC denoms to remove from the allowlist.","items":{"type":"string"},"type":"array"}},"type":"object"},"lumera.erc20policy.MsgSetRegistrationPolicyResponse":{"description":"MsgSetRegistrationPolicyResponse is the response type for\nMsgSetRegistrationPolicy.","type":"object"},"lumera.erc20policy.SourceHop":{"description":"SourceHop represents a single port/channel pair in an IBC denom trace.","properties":{"channel_id":{"type":"string"},"port_id":{"type":"string"}},"type":"object"},"lumera.evmigration.LegacyAccountInfo":{"description":"LegacyAccountInfo provides summary information about a legacy account\nthat has not yet been migrated.","properties":{"address":{"description":"address is the bech32 account address.","type":"string"},"balance_summary":{"description":"balance_summary is a human-readable total balance across all denoms.","type":"string"},"has_delegations":{"description":"has_delegations is true if the account has active staking delegations.","type":"boolean"},"is_multisig":{"description":"is_multisig is true when the account's on-chain pubkey is a flat Cosmos\nmultisig of secp256k1 sub-keys.","type":"boolean"},"is_validator":{"description":"is_validator is true if the account is a validator operator.","type":"boolean"},"num_signers":{"description":"num_signers is N for K-of-N multisig (0 when !is_multisig).","format":"int64","type":"integer"},"threshold":{"description":"threshold is K for K-of-N multisig (0 when !is_multisig).","format":"int64","type":"integer"}},"type":"object"},"lumera.evmigration.MigrationProof":{"properties":{"multisig":{"$ref":"#/definitions/lumera.evmigration.MultisigProof"},"single":{"$ref":"#/definitions/lumera.evmigration.SingleKeyProof"}},"type":"object"},"lumera.evmigration.MigrationRecord":{"description":"MigrationRecord stores the result of a completed legacy account migration,\nrecording the source and destination addresses plus the time and height.","properties":{"legacy_address":{"description":"legacy_address is the coin-type-118 source address that was migrated.","type":"string"},"migration_height":{"description":"migration_height is the block height when migration completed.","format":"int64","type":"string"},"migration_time":{"description":"migration_time is the block time (unix seconds) when migration completed.","format":"int64","type":"string"},"new_address":{"description":"new_address is the coin-type-60 destination address.","type":"string"}},"type":"object"},"lumera.evmigration.MsgClaimLegacyAccount":{"description":"MsgClaimLegacyAccount migrates on-chain state from legacy_address to new_address.","properties":{"legacy_address":{"type":"string"},"legacy_proof":{"$ref":"#/definitions/lumera.evmigration.MigrationProof"},"new_address":{"type":"string"},"new_proof":{"$ref":"#/definitions/lumera.evmigration.MigrationProof"}},"type":"object"},"lumera.evmigration.MsgClaimLegacyAccountResponse":{"description":"MsgClaimLegacyAccountResponse is the response type for MsgClaimLegacyAccount.","type":"object"},"lumera.evmigration.MsgMigrateValidator":{"description":"MsgMigrateValidator migrates a validator operator from legacy to new address.","properties":{"legacy_address":{"type":"string"},"legacy_proof":{"$ref":"#/definitions/lumera.evmigration.MigrationProof"},"new_address":{"type":"string"},"new_proof":{"$ref":"#/definitions/lumera.evmigration.MigrationProof"}},"type":"object"},"lumera.evmigration.MsgMigrateValidatorResponse":{"description":"MsgMigrateValidatorResponse is the response type for MsgMigrateValidator.","type":"object"},"lumera.evmigration.MsgUpdateParams":{"description":"MsgUpdateParams is the Msg/UpdateParams request type.","properties":{"authority":{"description":"authority is the address that controls the module (defaults to x/gov unless overwritten).","type":"string"},"params":{"$ref":"#/definitions/lumera.evmigration.Params","description":"params defines the module parameters to update.\n\nNOTE: All parameters must be supplied."}},"type":"object"},"lumera.evmigration.MsgUpdateParamsResponse":{"description":"MsgUpdateParamsResponse defines the response structure for executing a\nMsgUpdateParams message.","type":"object"},"lumera.evmigration.MultisigProof":{"properties":{"sig_format":{"$ref":"#/definitions/lumera.evmigration.SigFormat"},"signer_indices":{"items":{"format":"int64","type":"integer"},"type":"array"},"sub_pub_keys":{"items":{"format":"byte","type":"string"},"type":"array"},"sub_signatures":{"items":{"format":"byte","type":"string"},"type":"array"},"threshold":{"format":"int64","type":"integer"}},"type":"object"},"lumera.evmigration.Params":{"description":"Params defines the governance-controlled parameters for the evmigration module.\nThese knobs determine when migrations are accepted and how much work the\nchain performs per block during the legacy-to-EVM migration window.","properties":{"enable_migration":{"description":"enable_migration is the master switch for the migration window.\nWhen false, all MsgClaimLegacyAccount and MsgMigrateValidator messages\nare rejected regardless of other parameter values.\nGovernance should set this to false once the migration window closes.\nDefault: true.","type":"boolean"},"max_migrations_per_block":{"description":"max_migrations_per_block is the maximum number of MsgClaimLegacyAccount\nmessages processed in a single block. Once this limit is reached,\nadditional claims in the same block are rejected. This prevents a burst\nof migrations from consuming excessive block gas.\nDefault: 50.","format":"uint64","type":"string"},"max_multisig_sub_keys":{"description":"max_multisig_sub_keys caps the number of sub-keys in a multisig legacy\naccount's MultisigProof. Bounds per-tx verification cost.\nDefault: 20.","format":"int64","type":"integer"},"max_validator_delegations":{"description":"max_validator_delegations is the safety cap for MsgMigrateValidator.\nA validator migration must re-key every delegation and unbonding-delegation\nrecord. If the total count exceeds this threshold the message is rejected\nbecause the gas cost of iterating all records would be prohibitive.\nValidators that exceed the cap must shed delegations before migrating.\nDefault: 2000.","format":"uint64","type":"string"},"migration_end_time":{"description":"migration_end_time is an optional hard deadline expressed as a unix\ntimestamp (seconds). If non-zero, any migration message whose block time\nexceeds this value is rejected. A value of 0 disables the deadline,\nleaving enable_migration as the sole on/off control.\nDefault: 0 (no deadline).","format":"int64","type":"string"}},"type":"object"},"lumera.evmigration.QueryLegacyAccountsResponse":{"description":"QueryLegacyAccountsResponse is the response type for the Query/LegacyAccounts RPC method.","properties":{"accounts":{"description":"accounts is the list of legacy accounts that need migration.","items":{"$ref":"#/definitions/lumera.evmigration.LegacyAccountInfo","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse","description":"pagination defines the pagination in the response."}},"type":"object"},"lumera.evmigration.QueryMigratedAccountsResponse":{"description":"QueryMigratedAccountsResponse is the response type for the Query/MigratedAccounts RPC method.","properties":{"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse","description":"pagination defines the pagination in the response."},"records":{"description":"records is the list of completed migration records.","items":{"$ref":"#/definitions/lumera.evmigration.MigrationRecord","type":"object"},"type":"array"}},"type":"object"},"lumera.evmigration.QueryMigrationEstimateResponse":{"description":"QueryMigrationEstimateResponse is the response type for the Query/MigrationEstimate RPC method.\nIt provides a dry-run estimate of what would be migrated.","properties":{"action_count":{"description":"action_count is the number of action records where this address appears\neither as creator or in the SuperNodes list.","format":"uint64","type":"string"},"authz_grant_count":{"description":"authz_grant_count is the number of authz grants as granter or grantee.","format":"uint64","type":"string"},"balance_summary":{"description":"balance_summary is a human-readable total balance across all denoms (e.g. \"10000000000ulume\").","type":"string"},"delegation_count":{"description":"delegation_count is the number of active delegations from this address.","format":"uint64","type":"string"},"feegrant_count":{"description":"feegrant_count is the number of fee allowances as granter or grantee.","format":"uint64","type":"string"},"has_supernode":{"description":"has_supernode is true if the legacy address owns a registered supernode.","type":"boolean"},"is_multisig":{"description":"is_multisig is true when the account's on-chain pubkey is a flat Cosmos\nmultisig of secp256k1 sub-keys.","type":"boolean"},"is_validator":{"description":"is_validator is true if the legacy address is a validator operator.","type":"boolean"},"num_signers":{"description":"num_signers is N for K-of-N multisig (0 when !is_multisig).","format":"int64","type":"integer"},"redelegation_count":{"description":"redelegation_count is the number of redelegation entries.","format":"uint64","type":"string"},"rejection_reason":{"description":"rejection_reason is non-empty if would_succeed is false.","type":"string"},"threshold":{"description":"threshold is K for K-of-N multisig (0 when !is_multisig).","format":"int64","type":"integer"},"total_touched":{"description":"total_touched is the sum of all records that would be re-keyed.","format":"uint64","type":"string"},"unbonding_count":{"description":"unbonding_count is the number of unbonding delegation entries.","format":"uint64","type":"string"},"val_delegation_count":{"description":"val_delegation_count is delegations TO this validator (from all delegators).\nPopulated only when is_validator is true.","format":"uint64","type":"string"},"val_redelegation_count":{"description":"val_redelegation_count is redelegations referencing this validator as src or dst.\nPopulated only when is_validator is true.","format":"uint64","type":"string"},"val_unbonding_count":{"description":"val_unbonding_count is unbonding delegations TO this validator.\nPopulated only when is_validator is true.","format":"uint64","type":"string"},"validator_jailed":{"description":"validator_jailed is the staking jailed flag of the validator entity.\nPopulated only when is_validator is true. A jailed validator is always\nalso Unbonding or Unbonded; surfacing both fields lets callers\ndistinguish \"jailed for downtime/equivocation\" (actionable: unjail\nafter slashing window) from \"voluntarily unbonded\" (not actionable).","type":"boolean"},"validator_status":{"description":"validator_status is the staking BondStatus of the validator entity, as\na stable enum string (\"BOND_STATUS_BONDED\" | \"BOND_STATUS_UNBONDING\" |\n\"BOND_STATUS_UNBONDED\" | \"BOND_STATUS_UNSPECIFIED\"). Populated only when\nis_validator is true; empty otherwise. Surfaced so callers can show why\nwould_succeed is false without a separate staking query.","type":"string"},"would_succeed":{"description":"would_succeed is false if migration would be rejected.","type":"boolean"}},"type":"object"},"lumera.evmigration.QueryMigrationRecordByNewAddressResponse":{"description":"QueryMigrationRecordByNewAddressResponse is the response type for the Query/MigrationRecordByNewAddress RPC method.","properties":{"record":{"$ref":"#/definitions/lumera.evmigration.MigrationRecord","description":"record is the migration record, or nil if not found."}},"type":"object"},"lumera.evmigration.QueryMigrationRecordResponse":{"description":"QueryMigrationRecordResponse is the response type for the Query/MigrationRecord RPC method.","properties":{"record":{"$ref":"#/definitions/lumera.evmigration.MigrationRecord","description":"record is the migration record, or nil if not found."}},"type":"object"},"lumera.evmigration.QueryMigrationRecordsResponse":{"description":"QueryMigrationRecordsResponse is the response type for the Query/MigrationRecords RPC method.","properties":{"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse","description":"pagination defines the pagination in the response."},"records":{"description":"records is the list of completed migration records.","items":{"$ref":"#/definitions/lumera.evmigration.MigrationRecord","type":"object"},"type":"array"}},"type":"object"},"lumera.evmigration.QueryMigrationStatsResponse":{"description":"QueryMigrationStatsResponse is the response type for the Query/MigrationStats RPC method.\nIt provides aggregate counters for the migration dashboard.","properties":{"total_legacy":{"description":"total_legacy is the number of accounts with secp256k1 pubkey and non-zero balance.","format":"uint64","type":"string"},"total_legacy_staked":{"description":"total_legacy_staked is the subset of total_legacy with active delegations.","format":"uint64","type":"string"},"total_migrated":{"description":"total_migrated is the number of accounts that completed migration (O(1) from state counter).","format":"uint64","type":"string"},"total_validators_legacy":{"description":"total_validators_legacy is the number of validators with legacy operator address.","format":"uint64","type":"string"},"total_validators_migrated":{"description":"total_validators_migrated is the number of validators that completed migration.","format":"uint64","type":"string"}},"type":"object"},"lumera.evmigration.QueryParamsResponse":{"description":"QueryParamsResponse is the response type for the Query/Params RPC method.","properties":{"params":{"$ref":"#/definitions/lumera.evmigration.Params","description":"params holds all the parameters of this module."}},"type":"object"},"lumera.evmigration.SigFormat":{"default":"SIG_FORMAT_UNSPECIFIED","description":"SigFormat enumerates accepted signing envelopes for migration proofs.\n\n - SIG_FORMAT_CLI: Sign(SHA256(payload)) via Cosmos keyring; Sign(payload → Keccak256) for eth keyring\n - SIG_FORMAT_ADR036: ADR-036 signArbitrary canonical JSON\n - SIG_FORMAT_EIP191: Eth \"\\x19Ethereum Signed Message:\\n…\" envelope — new-side single-key proofs only","enum":["SIG_FORMAT_UNSPECIFIED","SIG_FORMAT_CLI","SIG_FORMAT_ADR036","SIG_FORMAT_EIP191"],"type":"string"},"lumera.evmigration.SingleKeyProof":{"properties":{"pub_key":{"format":"byte","type":"string"},"sig_format":{"$ref":"#/definitions/lumera.evmigration.SigFormat"},"signature":{"format":"byte","type":"string"}},"type":"object"},"lumera.lumeraid.MsgUpdateParams":{"description":"MsgUpdateParams is the Msg/UpdateParams request type.","properties":{"authority":{"description":"authority is the address that controls the module (defaults to x/gov unless overwritten).","type":"string"},"params":{"$ref":"#/definitions/lumera.lumeraid.Params","description":"NOTE: All parameters must be supplied."}},"type":"object"},"lumera.lumeraid.MsgUpdateParamsResponse":{"description":"MsgUpdateParamsResponse defines the response structure for executing a\nMsgUpdateParams message.","type":"object"},"lumera.lumeraid.Params":{"description":"Params defines the parameters for the module.","type":"object"},"lumera.lumeraid.QueryParamsResponse":{"description":"QueryParamsResponse is response type for the Query/Params RPC method.","properties":{"params":{"$ref":"#/definitions/lumera.lumeraid.Params","description":"params holds all the parameters of this module."}},"type":"object"},"lumera.supernode.v1.Evidence":{"description":"Evidence defines the evidence structure for the supernode module.","properties":{"action_id":{"type":"string"},"description":{"type":"string"},"evidence_type":{"type":"string"},"height":{"format":"int32","type":"integer"},"reporter_address":{"type":"string"},"severity":{"format":"uint64","type":"string"},"validator_address":{"type":"string"}},"type":"object"},"lumera.supernode.v1.IPAddressHistory":{"properties":{"address":{"type":"string"},"height":{"format":"int64","type":"string"}},"type":"object"},"lumera.supernode.v1.MetricValue":{"properties":{"name":{"type":"string"},"value":{"format":"double","type":"number"}},"type":"object"},"lumera.supernode.v1.MetricsAggregate":{"properties":{"height":{"format":"int64","type":"string"},"metrics":{"items":{"$ref":"#/definitions/lumera.supernode.v1.MetricValue","type":"object"},"type":"array"},"report_count":{"format":"uint64","type":"string"}},"type":"object"},"lumera.supernode.v1.MsgDeregisterSupernode":{"properties":{"creator":{"type":"string"},"validatorAddress":{"type":"string"}},"type":"object"},"lumera.supernode.v1.MsgDeregisterSupernodeResponse":{"type":"object"},"lumera.supernode.v1.MsgRegisterSupernode":{"properties":{"creator":{"type":"string"},"ipAddress":{"type":"string"},"p2p_port":{"type":"string"},"supernodeAccount":{"type":"string"},"validatorAddress":{"type":"string"}},"type":"object"},"lumera.supernode.v1.MsgRegisterSupernodeResponse":{"type":"object"},"lumera.supernode.v1.MsgReportSupernodeMetrics":{"properties":{"metrics":{"$ref":"#/definitions/lumera.supernode.v1.SupernodeMetrics"},"supernode_account":{"type":"string"},"validator_address":{"type":"string"}},"type":"object"},"lumera.supernode.v1.MsgReportSupernodeMetricsResponse":{"properties":{"compliant":{"type":"boolean"},"issues":{"items":{"type":"string"},"type":"array"}},"type":"object"},"lumera.supernode.v1.MsgStartSupernode":{"properties":{"creator":{"type":"string"},"validatorAddress":{"type":"string"}},"type":"object"},"lumera.supernode.v1.MsgStartSupernodeResponse":{"type":"object"},"lumera.supernode.v1.MsgStopSupernode":{"properties":{"creator":{"type":"string"},"reason":{"type":"string"},"validatorAddress":{"type":"string"}},"type":"object"},"lumera.supernode.v1.MsgStopSupernodeResponse":{"type":"object"},"lumera.supernode.v1.MsgUpdateParams":{"description":"MsgUpdateParams is the Msg/UpdateParams request type.","properties":{"authority":{"description":"authority is the address that controls the module (defaults to x/gov unless overwritten).","type":"string"},"params":{"$ref":"#/definitions/lumera.supernode.v1.Params","description":"NOTE: All parameters must be supplied."}},"type":"object"},"lumera.supernode.v1.MsgUpdateParamsResponse":{"description":"MsgUpdateParamsResponse defines the response structure for executing a\nMsgUpdateParams message.","type":"object"},"lumera.supernode.v1.MsgUpdateSupernode":{"properties":{"creator":{"type":"string"},"ipAddress":{"type":"string"},"note":{"type":"string"},"p2p_port":{"type":"string"},"supernodeAccount":{"type":"string"},"validatorAddress":{"type":"string"}},"type":"object"},"lumera.supernode.v1.MsgUpdateSupernodeResponse":{"type":"object"},"lumera.supernode.v1.Params":{"description":"Params defines the parameters for the module.","properties":{"evidence_retention_period":{"type":"string"},"inactivity_penalty_period":{"type":"string"},"max_cpu_usage_percent":{"format":"uint64","type":"string"},"max_mem_usage_percent":{"format":"uint64","type":"string"},"max_storage_usage_percent":{"format":"uint64","type":"string"},"metrics_freshness_max_blocks":{"description":"Maximum acceptable staleness (in blocks) for a metrics report when\nvalidating freshness.","format":"uint64","type":"string"},"metrics_grace_period_blocks":{"description":"Additional grace (in blocks) before marking metrics overdue/stale.","format":"uint64","type":"string"},"metrics_thresholds":{"type":"string"},"metrics_update_interval_blocks":{"description":"Expected cadence (in blocks) between supernode metrics reports. The daemon\ncan run on a timer using expected block time, but the chain enforces\nheight-based staleness strictly in blocks.","format":"uint64","type":"string"},"min_cpu_cores":{"format":"uint64","type":"string"},"min_mem_gb":{"format":"uint64","type":"string"},"min_storage_gb":{"format":"uint64","type":"string"},"min_supernode_version":{"type":"string"},"minimum_stake_for_sn":{"$ref":"#/definitions/cosmos.base.v1beta1.Coin"},"reporting_threshold":{"format":"uint64","type":"string"},"required_open_ports":{"items":{"format":"int64","type":"integer"},"type":"array"},"reward_distribution":{"$ref":"#/definitions/lumera.supernode.v1.RewardDistribution"},"slashing_fraction":{"type":"string"},"slashing_threshold":{"format":"uint64","type":"string"}},"type":"object"},"lumera.supernode.v1.PayoutHistoryEntry":{"properties":{"amount":{"items":{"$ref":"#/definitions/cosmos.base.v1beta1.Coin","type":"object"},"type":"array"},"effective_weight":{"format":"double","type":"number"},"height":{"format":"int64","type":"string"},"ramp_weight":{"format":"double","type":"number"},"raw_bytes":{"format":"double","type":"number"},"smoothed_bytes":{"format":"double","type":"number"},"supernode_account":{"type":"string"},"validator_address":{"type":"string"}},"type":"object"},"lumera.supernode.v1.PortState":{"default":"PORT_STATE_UNKNOWN","description":"PortState defines tri-state port reporting. UNKNOWN is the default for proto3\nand is treated as \"not reported / not measured\".","enum":["PORT_STATE_UNKNOWN","PORT_STATE_OPEN","PORT_STATE_CLOSED"],"type":"string"},"lumera.supernode.v1.PortStatus":{"description":"PortStatus reports the state of a specific TCP port.","properties":{"port":{"format":"int64","type":"integer"},"state":{"$ref":"#/definitions/lumera.supernode.v1.PortState"}},"type":"object"},"lumera.supernode.v1.QueryGetMetricsResponse":{"description":"QueryGetMetricsResponse is response type for the Query/GetMetrics RPC method.","properties":{"metrics_state":{"$ref":"#/definitions/lumera.supernode.v1.SupernodeMetricsState"}},"type":"object"},"lumera.supernode.v1.QueryGetSuperNodeBySuperNodeAddressResponse":{"description":"QueryGetSuperNodeBySuperNodeAddressResponse is response type for the Query/GetSuperNodeBySuperNodeAddress RPC method.","properties":{"supernode":{"$ref":"#/definitions/lumera.supernode.v1.SuperNode"}},"type":"object"},"lumera.supernode.v1.QueryGetSuperNodeResponse":{"description":"QueryGetSuperNodeResponse is response type for the Query/GetSuperNode RPC method.","properties":{"supernode":{"$ref":"#/definitions/lumera.supernode.v1.SuperNode"}},"type":"object"},"lumera.supernode.v1.QueryGetTopSuperNodesForBlockResponse":{"description":"QueryGetTopSuperNodesForBlockResponse is response type for the Query/GetTopSuperNodesForBlock RPC method.","properties":{"supernodes":{"items":{"$ref":"#/definitions/lumera.supernode.v1.SuperNode","type":"object"},"type":"array"}},"type":"object"},"lumera.supernode.v1.QueryListSuperNodesResponse":{"description":"QueryListSuperNodesResponse is response type for the Query/ListSuperNodes RPC method.","properties":{"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"},"supernodes":{"items":{"$ref":"#/definitions/lumera.supernode.v1.SuperNode","type":"object"},"type":"array"}},"type":"object"},"lumera.supernode.v1.QueryParamsResponse":{"description":"QueryParamsResponse is response type for the Query/Params RPC method.","properties":{"params":{"$ref":"#/definitions/lumera.supernode.v1.Params","description":"params holds all the parameters of this module."}},"type":"object"},"lumera.supernode.v1.QueryPayoutHistoryResponse":{"properties":{"entries":{"items":{"$ref":"#/definitions/lumera.supernode.v1.PayoutHistoryEntry","type":"object"},"type":"array"},"pagination":{"$ref":"#/definitions/cosmos.base.query.v1beta1.PageResponse"}},"type":"object"},"lumera.supernode.v1.QueryPoolStateResponse":{"description":"QueryPoolStateResponse is response type for the Query/PoolState RPC method.","properties":{"balance":{"description":"balance is the current undistributed pool balance.","items":{"$ref":"#/definitions/cosmos.base.v1beta1.Coin","type":"object"},"type":"array"},"eligible_sn_count":{"description":"eligible_sn_count is the number of SuperNodes currently eligible for payouts.","format":"uint64","type":"string"},"last_distribution_height":{"description":"last_distribution_height is the block height of the last distribution.","format":"int64","type":"string"},"total_distributed":{"description":"total_distributed is the cumulative amount distributed.","items":{"$ref":"#/definitions/cosmos.base.v1beta1.Coin","type":"object"},"type":"array"}},"type":"object"},"lumera.supernode.v1.QuerySNEligibilityResponse":{"description":"QuerySNEligibilityResponse is response type for the Query/SNEligibility RPC method.","properties":{"cascade_kademlia_db_bytes":{"format":"double","type":"number"},"eligible":{"type":"boolean"},"reason":{"type":"string"},"smoothed_weight":{"format":"double","type":"number"}},"type":"object"},"lumera.supernode.v1.RewardDistribution":{"description":"RewardDistribution governs the Everlight reward pool's payout cadence,\neligibility floor, ramp-up, smoothing window and growth cap. All fields\nare governance-mutable via supernode MsgUpdateParams.","properties":{"measurement_smoothing_periods":{"description":"Rolling average window (in payment periods) for weight smoothing.","format":"uint64","type":"string"},"min_cascade_bytes_for_payment":{"description":"Minimum cascade_kademlia_db_bytes for a SuperNode to qualify for payouts.","format":"uint64","type":"string"},"new_sn_ramp_up_periods":{"description":"Number of payment periods for new SuperNode payout ramp-up.","format":"uint64","type":"string"},"payment_period_blocks":{"description":"Distribution period in blocks. Pool balance distributed every this many blocks.","format":"uint64","type":"string"},"registration_fee_share_bps":{"description":"Share of action registration fees routed to Everlight pool, in basis points.","format":"uint64","type":"string"},"usage_growth_cap_bps_per_period":{"description":"Maximum rate of reported cascade bytes increase per period, in basis points.","format":"uint64","type":"string"}},"type":"object"},"lumera.supernode.v1.SuperNode":{"properties":{"evidence":{"items":{"$ref":"#/definitions/lumera.supernode.v1.Evidence","type":"object"},"type":"array"},"metrics":{"$ref":"#/definitions/lumera.supernode.v1.MetricsAggregate"},"note":{"type":"string"},"p2p_port":{"type":"string"},"prev_ip_addresses":{"items":{"$ref":"#/definitions/lumera.supernode.v1.IPAddressHistory","type":"object"},"type":"array"},"prev_supernode_accounts":{"items":{"$ref":"#/definitions/lumera.supernode.v1.SupernodeAccountHistory","type":"object"},"type":"array"},"states":{"items":{"$ref":"#/definitions/lumera.supernode.v1.SuperNodeStateRecord","type":"object"},"type":"array"},"supernode_account":{"type":"string"},"validator_address":{"type":"string"}},"type":"object"},"lumera.supernode.v1.SuperNodeState":{"default":"SUPERNODE_STATE_UNSPECIFIED","description":"SuperNodeState is the lifecycle state of a SuperNode. Transitions are\ngoverned by the supernode and audit modules; see x/supernode/v1/keeper\nand x/audit/v1/keeper for the authoritative state machine.\n\n - SUPERNODE_STATE_UNSPECIFIED: SUPERNODE_STATE_UNSPECIFIED is the proto3 zero value; never persisted.\n - SUPERNODE_STATE_ACTIVE: SUPERNODE_STATE_ACTIVE: SuperNode is healthy and eligible for all duties.\n - SUPERNODE_STATE_DISABLED: SUPERNODE_STATE_DISABLED: operator-disabled (deregistered) SuperNode.\n - SUPERNODE_STATE_STOPPED: SUPERNODE_STATE_STOPPED: operator-stopped SuperNode (recoverable).\n - SUPERNODE_STATE_PENALIZED: SUPERNODE_STATE_PENALIZED: penalized by chain enforcement (e.g. slashing).\n - SUPERNODE_STATE_POSTPONED: SUPERNODE_STATE_POSTPONED: temporarily ineligible due to missing/overdue\nmetrics or compliance violations; recovers on the next healthy report.\n - SUPERNODE_STATE_STORAGE_FULL: SUPERNODE_STATE_STORAGE_FULL: storage usage above max threshold;\nexcluded from Cascade duties but still eligible for Sense/Agents.","enum":["SUPERNODE_STATE_UNSPECIFIED","SUPERNODE_STATE_ACTIVE","SUPERNODE_STATE_DISABLED","SUPERNODE_STATE_STOPPED","SUPERNODE_STATE_PENALIZED","SUPERNODE_STATE_POSTPONED","SUPERNODE_STATE_STORAGE_FULL"],"type":"string"},"lumera.supernode.v1.SuperNodeStateRecord":{"description":"SuperNodeStateRecord is one entry in the append-only state history of a\nSuperNode. The latest entry is the current state.","properties":{"height":{"format":"int64","type":"string"},"reason":{"description":"reason is an optional string describing why the state transition occurred.\nIt is currently set only for transitions into POSTPONED.","type":"string"},"state":{"$ref":"#/definitions/lumera.supernode.v1.SuperNodeState"}},"type":"object"},"lumera.supernode.v1.SupernodeAccountHistory":{"properties":{"account":{"type":"string"},"height":{"format":"int64","type":"string"}},"type":"object"},"lumera.supernode.v1.SupernodeMetrics":{"description":"SupernodeMetrics defines the structured metrics reported by a supernode.","properties":{"cascade_kademlia_db_bytes":{"description":"Cascade Kademlia DB size in bytes (LEP-4 metric for Everlight payouts).","format":"double","type":"number"},"cpu_cores_total":{"description":"CPU metrics.","format":"double","type":"number"},"cpu_usage_percent":{"format":"double","type":"number"},"disk_free_gb":{"format":"double","type":"number"},"disk_total_gb":{"description":"Storage metrics (GB).","format":"double","type":"number"},"disk_usage_percent":{"format":"double","type":"number"},"mem_free_gb":{"format":"double","type":"number"},"mem_total_gb":{"description":"Memory metrics (GB).","format":"double","type":"number"},"mem_usage_percent":{"format":"double","type":"number"},"open_ports":{"description":"Tri-state port reporting for required ports.","items":{"$ref":"#/definitions/lumera.supernode.v1.PortStatus","type":"object"},"type":"array"},"peers_count":{"format":"int64","type":"integer"},"uptime_seconds":{"description":"Uptime and connectivity.","format":"double","type":"number"},"version_major":{"description":"Semantic version of the supernode software.","format":"int64","type":"integer"},"version_minor":{"format":"int64","type":"integer"},"version_patch":{"format":"int64","type":"integer"}},"type":"object"},"lumera.supernode.v1.SupernodeMetricsState":{"description":"SupernodeMetricsState stores the latest metrics state for a validator.","properties":{"height":{"format":"int64","type":"string"},"metrics":{"$ref":"#/definitions/lumera.supernode.v1.SupernodeMetrics"},"report_count":{"format":"uint64","type":"string"},"validator_address":{"type":"string"}},"type":"object"}}} \ No newline at end of file diff --git a/proto/lumera/audit/v1/audit.proto b/proto/lumera/audit/v1/audit.proto index 9eb2e9fb..814291e5 100644 --- a/proto/lumera/audit/v1/audit.proto +++ b/proto/lumera/audit/v1/audit.proto @@ -22,6 +22,15 @@ message HostReport { repeated PortState inbound_port_states = 4; uint32 failed_actions_count = 5; + + // Cascade Kademlia DB size in bytes, self-reported by the SuperNode. + // Carried on HostReport purely as a metric-courier on the audit epoch report + // channel — the audit module does NOT consume this value for its own + // consensus logic (LEP-6 §12). On successful epoch-report acceptance the + // audit handler bridges this value into x/supernode SupernodeMetricsState, + // which is the sole source consulted by Everlight payout / eligibility. + // MUST be finite and non-negative; zero is valid (empty Kademlia store). + double cascade_kademlia_db_bytes = 6; } // StorageChallengeObservation is a prober's reachability observation about an assigned target. diff --git a/x/audit/v1/keeper/msg_submit_epoch_report.go b/x/audit/v1/keeper/msg_submit_epoch_report.go index 144b8088..9af5083f 100644 --- a/x/audit/v1/keeper/msg_submit_epoch_report.go +++ b/x/audit/v1/keeper/msg_submit_epoch_report.go @@ -2,12 +2,14 @@ package keeper import ( "context" + "math" "strconv" errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/LumeraProtocol/lumera/x/audit/v1/types" + sntypes "github.com/LumeraProtocol/lumera/x/supernode/v1/types" ) const ( @@ -38,7 +40,7 @@ func (m msgServer) SubmitEpochReport(ctx context.Context, req *types.MsgSubmitEp return nil, errorsmod.Wrapf(types.ErrInvalidEpochID, "epoch_id not accepted at height %d", sdkCtx.BlockHeight()) } - _, found, err := m.supernodeKeeper.GetSuperNodeByAccount(sdkCtx, req.Creator) + sn, found, err := m.supernodeKeeper.GetSuperNodeByAccount(sdkCtx, req.Creator) if err != nil { return nil, err } @@ -46,6 +48,14 @@ func (m msgServer) SubmitEpochReport(ctx context.Context, req *types.MsgSubmitEp return nil, errorsmod.Wrap(types.ErrReporterNotFound, "creator is not a registered supernode") } + // Validate self-reported HostReport host-metric fields. LEP-6 §12 left this + // field as a metric-courier (no audit-side consensus meaning); the audit + // handler still rejects malformed values defensively before bridging them + // into x/supernode metrics state. + if err := validateHostMetricFields(req.HostReport); err != nil { + return nil, err + } + anchor, found := m.GetEpochAnchor(sdkCtx, req.EpochId) if !found { return nil, errorsmod.Wrapf(types.ErrInvalidEpochID, "epoch anchor not found for epoch_id %d", req.EpochId) @@ -157,6 +167,16 @@ func (m msgServer) SubmitEpochReport(ctx context.Context, req *types.MsgSubmitEp m.SetReportIndex(sdkCtx, req.EpochId, reporterAccount) m.SetHostReportIndex(sdkCtx, req.EpochId, reporterAccount) + // Bridge cascade_kademlia_db_bytes from the audit HostReport into the + // x/supernode SupernodeMetricsState. Post LEP-6 §12, this is the SOLE + // writer of that field for Everlight payout / eligibility reads via + // getLatestCascadeBytesFromAudit. The bridge is read-modify-write so + // fields owned by the (now operationally dead) legacy + // MsgReportSupernodeMetrics handler are preserved if previously present. + if err := m.bridgeCascadeBytesToSupernodeMetrics(sdkCtx, sn, req.HostReport.CascadeKademliaDbBytes); err != nil { + return nil, err + } + seenSupernodes := make(map[string]struct{}, len(req.StorageChallengeObservations)) for _, obs := range req.StorageChallengeObservations { if obs == nil { @@ -217,3 +237,71 @@ func (k Keeper) applyIncompleteReportPenalty(ctx sdk.Context, epochID uint64, re )) return nil } + +// validateHostMetricFields rejects malformed host-metric values that the audit +// handler accepts purely as metric-couriers (no audit-side consensus meaning). +// This is the single enforcement point for HostReport host-metric invariants +// (LEP-6 §12 — see proto/lumera/audit/v1/audit.proto::HostReport). +func validateHostMetricFields(h types.HostReport) error { + if math.IsNaN(h.CascadeKademliaDbBytes) || math.IsInf(h.CascadeKademliaDbBytes, 0) { + return errorsmod.Wrap(types.ErrInvalidHostMetric, "cascade_kademlia_db_bytes must be a finite number") + } + if h.CascadeKademliaDbBytes < 0 { + return errorsmod.Wrapf(types.ErrInvalidHostMetric, "cascade_kademlia_db_bytes must be >= 0, got %v", h.CascadeKademliaDbBytes) + } + return nil +} + +// bridgeCascadeBytesToSupernodeMetrics writes the cascade_kademlia_db_bytes +// metric reported on the audit HostReport into x/supernode SupernodeMetricsState. +// Read-modify-write semantics: any other Metrics fields previously persisted +// (e.g. by the legacy MsgReportSupernodeMetrics handler) are preserved. +// Height is updated to the current block; ReportCount is incremented. +// +// Post LEP-6 §12, this is the SOLE writer of SupernodeMetricsState.Metrics. +// CascadeKademliaDbBytes used by Everlight payout / eligibility reads via +// getLatestCascadeBytesFromAudit. +// +// The bridge is defensively a no-op (with an event for observability) if the +// SuperNode record has an empty/invalid ValidatorAddress. That is a pre-existing +// x/supernode invariant violation (chain registration enforces non-empty), +// outside the audit module's scope; the bridge surfaces it via an event but +// does not fail the epoch report on someone else's data corruption. +func (k Keeper) bridgeCascadeBytesToSupernodeMetrics(ctx sdk.Context, sn sntypes.SuperNode, cascadeBytes float64) error { + if sn.ValidatorAddress == "" { + ctx.EventManager().EmitEvent(sdk.NewEvent( + "audit_cascade_bytes_bridge_skipped", + sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), + sdk.NewAttribute("supernode_account", sn.SupernodeAccount), + sdk.NewAttribute("reason", "empty_validator_address"), + )) + return nil + } + valAddr, err := sdk.ValAddressFromBech32(sn.ValidatorAddress) + if err != nil { + ctx.EventManager().EmitEvent(sdk.NewEvent( + "audit_cascade_bytes_bridge_skipped", + sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), + sdk.NewAttribute("supernode_account", sn.SupernodeAccount), + sdk.NewAttribute("validator_address", sn.ValidatorAddress), + sdk.NewAttribute("reason", "invalid_validator_address"), + sdk.NewAttribute("error", err.Error()), + )) + return nil + } + + state, ok := k.supernodeKeeper.GetMetricsState(ctx, valAddr) + if !ok { + state = sntypes.SupernodeMetricsState{ + ValidatorAddress: sn.ValidatorAddress, + } + } + if state.Metrics == nil { + state.Metrics = &sntypes.SupernodeMetrics{} + } + state.Metrics.CascadeKademliaDbBytes = cascadeBytes + state.Height = ctx.BlockHeight() + state.ReportCount++ + + return k.supernodeKeeper.SetMetricsState(ctx, state) +} diff --git a/x/audit/v1/keeper/msg_submit_epoch_report_cascade_bytes_test.go b/x/audit/v1/keeper/msg_submit_epoch_report_cascade_bytes_test.go new file mode 100644 index 00000000..d2580396 --- /dev/null +++ b/x/audit/v1/keeper/msg_submit_epoch_report_cascade_bytes_test.go @@ -0,0 +1,255 @@ +package keeper_test + +import ( + "math" + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" + "go.uber.org/mock/gomock" + + "github.com/LumeraProtocol/lumera/x/audit/v1/keeper" + "github.com/LumeraProtocol/lumera/x/audit/v1/types" + sntypes "github.com/LumeraProtocol/lumera/x/supernode/v1/types" +) + +// TestSubmitEpochReport_CascadeBytes_HappyPersistedAndBridged covers I1 happy +// path (valid finite value accepted) and I2 bridge happy path (value lands in +// SupernodeMetricsState with the reporter's validator address and current block +// height). +func TestSubmitEpochReport_CascadeBytes_HappyPersistedAndBridged(t *testing.T) { + f := initFixture(t) + f.ctx = f.ctx.WithBlockHeight(123) + + ms := keeper.NewMsgServerImpl(f.keeper) + + reporter := sdk.AccAddress([]byte("reporter_address_20b")).String() + valAddrStr := sdk.ValAddress([]byte("validator_addr__20b")).String() + + reporterSN := sntypes.SuperNode{ + SupernodeAccount: reporter, + ValidatorAddress: valAddrStr, + } + f.supernodeKeeper.EXPECT(). + GetSuperNodeByAccount(gomock.Any(), reporter). + Return(reporterSN, true, nil). + AnyTimes() + f.supernodeKeeper.EXPECT(). + GetMetricsState(gomock.Any(), gomock.Any()). + Return(sntypes.SupernodeMetricsState{}, false). + AnyTimes() + + const cascadeBytes float64 = 2_147_483_648 // 2 GB + + var captured sntypes.SupernodeMetricsState + f.supernodeKeeper.EXPECT(). + SetMetricsState(gomock.Any(), gomock.Any()). + DoAndReturn(func(_ sdk.Context, state sntypes.SupernodeMetricsState) error { + captured = state + return nil + }). + Times(1) + + seedEpochAnchorForReportTest(t, f, 0, []string{reporter}, []string{reporter}) + + _, err := ms.SubmitEpochReport(f.ctx, &types.MsgSubmitEpochReport{ + Creator: reporter, + EpochId: 0, + HostReport: types.HostReport{ + CascadeKademliaDbBytes: cascadeBytes, + }, + }) + require.NoError(t, err) + + require.Equal(t, valAddrStr, captured.ValidatorAddress) + require.NotNil(t, captured.Metrics) + require.Equal(t, cascadeBytes, captured.Metrics.CascadeKademliaDbBytes) + require.EqualValues(t, 123, captured.Height) + require.EqualValues(t, 1, captured.ReportCount) +} + +// TestSubmitEpochReport_CascadeBytes_ZeroAccepted covers I1: zero is a valid +// value (empty Kademlia store) and the bridge persists it. +func TestSubmitEpochReport_CascadeBytes_ZeroAccepted(t *testing.T) { + f := initFixture(t) + f.ctx = f.ctx.WithBlockHeight(1) + ms := keeper.NewMsgServerImpl(f.keeper) + + reporter := sdk.AccAddress([]byte("reporter_address_20b")).String() + valAddrStr := sdk.ValAddress([]byte("validator_addr__20b")).String() + + f.supernodeKeeper.EXPECT(). + GetSuperNodeByAccount(gomock.Any(), reporter). + Return(sntypes.SuperNode{SupernodeAccount: reporter, ValidatorAddress: valAddrStr}, true, nil). + AnyTimes() + f.supernodeKeeper.EXPECT(). + GetMetricsState(gomock.Any(), gomock.Any()). + Return(sntypes.SupernodeMetricsState{}, false). + AnyTimes() + f.supernodeKeeper.EXPECT(). + SetMetricsState(gomock.Any(), gomock.Any()). + DoAndReturn(func(_ sdk.Context, state sntypes.SupernodeMetricsState) error { + require.NotNil(t, state.Metrics) + require.Equal(t, float64(0), state.Metrics.CascadeKademliaDbBytes) + return nil + }). + Times(1) + + seedEpochAnchorForReportTest(t, f, 0, []string{reporter}, []string{reporter}) + + _, err := ms.SubmitEpochReport(f.ctx, &types.MsgSubmitEpochReport{ + Creator: reporter, + EpochId: 0, + HostReport: types.HostReport{CascadeKademliaDbBytes: 0}, + }) + require.NoError(t, err) +} + +// TestSubmitEpochReport_CascadeBytes_InvalidValuesRejected covers I1 violation +// tests: NaN, +Inf, -Inf, and negative values are all rejected, with no bridge +// write attempted. One violation cell per row of the invariant table. +func TestSubmitEpochReport_CascadeBytes_InvalidValuesRejected(t *testing.T) { + cases := []struct { + name string + value float64 + }{ + {"NaN", math.NaN()}, + {"+Inf", math.Inf(1)}, + {"-Inf", math.Inf(-1)}, + {"negative", -1.0}, + } + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + f := initFixture(t) + f.ctx = f.ctx.WithBlockHeight(1) + ms := keeper.NewMsgServerImpl(f.keeper) + + reporter := sdk.AccAddress([]byte("reporter_address_20b")).String() + valAddrStr := sdk.ValAddress([]byte("validator_addr__20b")).String() + + f.supernodeKeeper.EXPECT(). + GetSuperNodeByAccount(gomock.Any(), reporter). + Return(sntypes.SuperNode{SupernodeAccount: reporter, ValidatorAddress: valAddrStr}, true, nil). + AnyTimes() + // Bridge must NOT be invoked for rejected inputs. + f.supernodeKeeper.EXPECT(). + SetMetricsState(gomock.Any(), gomock.Any()). + Times(0) + + seedEpochAnchorForReportTest(t, f, 0, []string{reporter}, []string{reporter}) + + _, err := ms.SubmitEpochReport(f.ctx, &types.MsgSubmitEpochReport{ + Creator: reporter, + EpochId: 0, + HostReport: types.HostReport{CascadeKademliaDbBytes: tc.value}, + }) + require.Error(t, err) + require.ErrorIs(t, err, types.ErrInvalidHostMetric) + }) + } +} + +// TestSubmitEpochReport_Bridge_PreservesPriorNonCascadeMetrics covers I3: the +// bridge is read-modify-write; pre-existing metrics fields owned by other +// writers must not be clobbered to zero by the cascade-bytes write. +func TestSubmitEpochReport_Bridge_PreservesPriorNonCascadeMetrics(t *testing.T) { + f := initFixture(t) + f.ctx = f.ctx.WithBlockHeight(7) + ms := keeper.NewMsgServerImpl(f.keeper) + + reporter := sdk.AccAddress([]byte("reporter_address_20b")).String() + valAddrStr := sdk.ValAddress([]byte("validator_addr__20b")).String() + + priorState := sntypes.SupernodeMetricsState{ + ValidatorAddress: valAddrStr, + Metrics: &sntypes.SupernodeMetrics{ + CpuUsagePercent: 42.0, + DiskUsagePercent: 50.0, + UptimeSeconds: 9999, + CascadeKademliaDbBytes: 100, // will be overwritten + }, + ReportCount: 5, + Height: 6, + } + + f.supernodeKeeper.EXPECT(). + GetSuperNodeByAccount(gomock.Any(), reporter). + Return(sntypes.SuperNode{SupernodeAccount: reporter, ValidatorAddress: valAddrStr}, true, nil). + AnyTimes() + f.supernodeKeeper.EXPECT(). + GetMetricsState(gomock.Any(), gomock.Any()). + Return(priorState, true). + AnyTimes() + + var captured sntypes.SupernodeMetricsState + f.supernodeKeeper.EXPECT(). + SetMetricsState(gomock.Any(), gomock.Any()). + DoAndReturn(func(_ sdk.Context, state sntypes.SupernodeMetricsState) error { + captured = state + return nil + }). + Times(1) + + seedEpochAnchorForReportTest(t, f, 0, []string{reporter}, []string{reporter}) + + const newBytes float64 = 4_294_967_296 // 4 GB + _, err := ms.SubmitEpochReport(f.ctx, &types.MsgSubmitEpochReport{ + Creator: reporter, + EpochId: 0, + HostReport: types.HostReport{CascadeKademliaDbBytes: newBytes}, + }) + require.NoError(t, err) + + // CascadeKademliaDbBytes overwritten with the new value. + require.Equal(t, newBytes, captured.Metrics.CascadeKademliaDbBytes) + // Non-cascade fields preserved (I3). + require.Equal(t, 42.0, captured.Metrics.CpuUsagePercent) + require.Equal(t, 50.0, captured.Metrics.DiskUsagePercent) + require.EqualValues(t, 9999, captured.Metrics.UptimeSeconds) + // Height bumped to current block; ReportCount incremented from prior 5 to 6. + require.EqualValues(t, 7, captured.Height) + require.EqualValues(t, 6, captured.ReportCount) +} + +// TestSubmitEpochReport_Bridge_EmptyValidatorAddressNoOp covers the defensive +// no-op path: a SuperNode record with an empty ValidatorAddress (a x/supernode +// data invariant violation) must NOT fail the epoch report; the bridge skips +// with an event but the report is still accepted. +func TestSubmitEpochReport_Bridge_EmptyValidatorAddressNoOp(t *testing.T) { + f := initFixture(t) + f.ctx = f.ctx.WithBlockHeight(1).WithEventManager(sdk.NewEventManager()) + ms := keeper.NewMsgServerImpl(f.keeper) + + reporter := sdk.AccAddress([]byte("reporter_address_20b")).String() + + f.supernodeKeeper.EXPECT(). + GetSuperNodeByAccount(gomock.Any(), reporter). + Return(sntypes.SuperNode{SupernodeAccount: reporter, ValidatorAddress: ""}, true, nil). + AnyTimes() + // Bridge MUST NOT call GetMetricsState / SetMetricsState when val addr is empty. + f.supernodeKeeper.EXPECT(). + GetMetricsState(gomock.Any(), gomock.Any()). + Times(0) + f.supernodeKeeper.EXPECT(). + SetMetricsState(gomock.Any(), gomock.Any()). + Times(0) + + seedEpochAnchorForReportTest(t, f, 0, []string{reporter}, []string{reporter}) + + _, err := ms.SubmitEpochReport(f.ctx, &types.MsgSubmitEpochReport{ + Creator: reporter, + EpochId: 0, + HostReport: types.HostReport{CascadeKademliaDbBytes: 1024}, + }) + require.NoError(t, err) + + // Skip event emitted for observability. + foundEvent := false + for _, e := range f.ctx.EventManager().Events() { + if e.Type == "audit_cascade_bytes_bridge_skipped" { + foundEvent = true + break + } + } + require.True(t, foundEvent, "expected audit_cascade_bytes_bridge_skipped event") +} diff --git a/x/audit/v1/keeper/msg_submit_epoch_report_storagefull_test.go b/x/audit/v1/keeper/msg_submit_epoch_report_storagefull_test.go index 942d6e61..490eac7c 100644 --- a/x/audit/v1/keeper/msg_submit_epoch_report_storagefull_test.go +++ b/x/audit/v1/keeper/msg_submit_epoch_report_storagefull_test.go @@ -43,6 +43,14 @@ func TestSubmitEpochReport_TransitionsReporterToStorageFullFromHostReport(t *tes return nil }). Times(1) + f.supernodeKeeper.EXPECT(). + GetMetricsState(gomock.Any(), gomock.Any()). + Return(sntypes.SupernodeMetricsState{}, false). + AnyTimes() + f.supernodeKeeper.EXPECT(). + SetMetricsState(gomock.Any(), gomock.Any()). + Return(nil). + AnyTimes() err := f.keeper.SetEpochAnchor(f.ctx, types.EpochAnchor{ EpochId: 0, @@ -96,6 +104,14 @@ func TestSubmitEpochReport_DoesNotTransitionPostponedReporterToStorageFull(t *te f.supernodeKeeper.EXPECT(). SetSuperNode(gomock.Any(), gomock.Any()). Times(0) + f.supernodeKeeper.EXPECT(). + GetMetricsState(gomock.Any(), gomock.Any()). + Return(sntypes.SupernodeMetricsState{}, false). + AnyTimes() + f.supernodeKeeper.EXPECT(). + SetMetricsState(gomock.Any(), gomock.Any()). + Return(nil). + AnyTimes() err := f.keeper.SetEpochAnchor(f.ctx, types.EpochAnchor{ EpochId: 0, diff --git a/x/audit/v1/types/audit.pb.go b/x/audit/v1/types/audit.pb.go index afd91c5f..3e509668 100644 --- a/x/audit/v1/types/audit.pb.go +++ b/x/audit/v1/types/audit.pb.go @@ -240,6 +240,14 @@ type HostReport struct { DiskUsagePercent float64 `protobuf:"fixed64,3,opt,name=disk_usage_percent,json=diskUsagePercent,proto3" json:"disk_usage_percent,omitempty"` InboundPortStates []PortState `protobuf:"varint,4,rep,packed,name=inbound_port_states,json=inboundPortStates,proto3,enum=lumera.audit.v1.PortState" json:"inbound_port_states,omitempty"` FailedActionsCount uint32 `protobuf:"varint,5,opt,name=failed_actions_count,json=failedActionsCount,proto3" json:"failed_actions_count,omitempty"` + // Cascade Kademlia DB size in bytes, self-reported by the SuperNode. + // Carried on HostReport purely as a metric-courier on the audit epoch report + // channel — the audit module does NOT consume this value for its own + // consensus logic (LEP-6 §12). On successful epoch-report acceptance the + // audit handler bridges this value into x/supernode SupernodeMetricsState, + // which is the sole source consulted by Everlight payout / eligibility. + // MUST be finite and non-negative; zero is valid (empty Kademlia store). + CascadeKademliaDbBytes float64 `protobuf:"fixed64,6,opt,name=cascade_kademlia_db_bytes,json=cascadeKademliaDbBytes,proto3" json:"cascade_kademlia_db_bytes,omitempty"` } func (m *HostReport) Reset() { *m = HostReport{} } @@ -310,6 +318,13 @@ func (m *HostReport) GetFailedActionsCount() uint32 { return 0 } +func (m *HostReport) GetCascadeKademliaDbBytes() float64 { + if m != nil { + return m.CascadeKademliaDbBytes + } + return 0 +} + // StorageChallengeObservation is a prober's reachability observation about an assigned target. type StorageChallengeObservation struct { TargetSupernodeAccount string `protobuf:"bytes,1,opt,name=target_supernode_account,json=targetSupernodeAccount,proto3" json:"target_supernode_account,omitempty"` @@ -1259,152 +1274,154 @@ func init() { func init() { proto.RegisterFile("lumera/audit/v1/audit.proto", fileDescriptor_0613fff850c07858) } var fileDescriptor_0613fff850c07858 = []byte{ - // 2306 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x59, 0x4d, 0x6f, 0xdb, 0xc8, - 0xf9, 0xb7, 0x5e, 0xe2, 0x97, 0xc7, 0xb6, 0x4c, 0x8d, 0x5f, 0xa2, 0xd8, 0x8e, 0xe3, 0x28, 0xff, - 0x24, 0x8e, 0x36, 0x89, 0xd7, 0xce, 0x7f, 0xb1, 0x87, 0xc5, 0x16, 0xa0, 0x24, 0x3a, 0x52, 0x23, - 0x8b, 0xda, 0xa1, 0x94, 0x6c, 0x5a, 0xb4, 0x03, 0x4a, 0x9c, 0x58, 0x44, 0x68, 0x52, 0x20, 0x29, - 0xef, 0xfa, 0x43, 0x14, 0x08, 0x7a, 0x2c, 0xd0, 0x43, 0x6f, 0xbd, 0x16, 0xe8, 0xa1, 0x1f, 0x61, - 0x0f, 0x3d, 0x2c, 0x7a, 0xea, 0xa1, 0x28, 0x8a, 0xa4, 0xdf, 0xa0, 0x5f, 0xa0, 0x98, 0x19, 0x92, - 0xa2, 0x28, 0xc9, 0x4e, 0x83, 0xf6, 0x62, 0x88, 0xcf, 0xef, 0xf7, 0xbc, 0xcc, 0x3c, 0x2f, 0x9c, - 0xa1, 0x61, 0xc7, 0x1a, 0x9e, 0x53, 0x57, 0x3f, 0xd4, 0x87, 0x86, 0xe9, 0x1f, 0x5e, 0x1c, 0x89, - 0x1f, 0x4f, 0x07, 0xae, 0xe3, 0x3b, 0x68, 0x4d, 0x80, 0x4f, 0x85, 0xec, 0xe2, 0x68, 0x3b, 0xaf, - 0x9f, 0x9b, 0xb6, 0x73, 0xc8, 0xff, 0x0a, 0xce, 0xf6, 0xad, 0x9e, 0xe3, 0x9d, 0x3b, 0x1e, 0xe1, - 0x4f, 0x87, 0xe2, 0x21, 0x80, 0x36, 0xce, 0x9c, 0x33, 0x47, 0xc8, 0xd9, 0x2f, 0x21, 0x2d, 0xbe, - 0x4b, 0x03, 0xd4, 0x1c, 0xcf, 0xc7, 0x74, 0xe0, 0xb8, 0x3e, 0x2a, 0x41, 0xbe, 0x37, 0x18, 0x92, - 0xa1, 0xa7, 0x9f, 0x51, 0x32, 0xa0, 0x6e, 0x8f, 0xda, 0x7e, 0x21, 0xb5, 0x9f, 0x3a, 0x48, 0xe1, - 0xb5, 0xde, 0x60, 0xd8, 0x61, 0xf2, 0x96, 0x10, 0x33, 0xee, 0x39, 0x3d, 0x4f, 0x70, 0xd3, 0x82, - 0x7b, 0x4e, 0xcf, 0xc7, 0xb8, 0x8f, 0x01, 0x19, 0xa6, 0xf7, 0x36, 0x41, 0xce, 0x70, 0xb2, 0xc4, - 0x90, 0x31, 0xf6, 0x4f, 0x61, 0xdd, 0xb4, 0xbb, 0xce, 0xd0, 0x36, 0x08, 0x8b, 0x8a, 0x78, 0xbe, - 0xee, 0x53, 0xaf, 0x90, 0xdd, 0xcf, 0x1c, 0xe4, 0x8e, 0xb7, 0x9f, 0x26, 0xf6, 0xe1, 0x69, 0xcb, - 0x71, 0x7d, 0x8d, 0x51, 0x70, 0x3e, 0x50, 0x8b, 0x24, 0x1e, 0xfa, 0x1c, 0x36, 0xde, 0xe8, 0xa6, - 0x45, 0x0d, 0xa2, 0xf7, 0x7c, 0xd3, 0xb1, 0x3d, 0xd2, 0x73, 0x86, 0xb6, 0x5f, 0xb8, 0xb1, 0x9f, - 0x3a, 0x58, 0xc5, 0x48, 0x60, 0xb2, 0x80, 0x2a, 0x0c, 0x29, 0xfe, 0x21, 0x05, 0x3b, 0x9a, 0xef, - 0xb8, 0xfa, 0x19, 0xad, 0xf4, 0x75, 0xcb, 0xa2, 0xf6, 0x19, 0x55, 0xbb, 0x1e, 0x75, 0x2f, 0x74, - 0xc6, 0x42, 0x1d, 0x28, 0xf8, 0xba, 0x7b, 0x46, 0x7d, 0xe2, 0x0d, 0x07, 0xd4, 0xb5, 0x1d, 0x83, - 0x12, 0xbd, 0x27, 0xac, 0xb2, 0xad, 0x5a, 0x2a, 0xef, 0xfc, 0xe5, 0x8f, 0x4f, 0x6e, 0x06, 0x9b, - 0x2f, 0xf7, 0x7a, 0xb2, 0x61, 0xb8, 0xd4, 0xf3, 0x34, 0xdf, 0x35, 0xed, 0x33, 0xbc, 0x25, 0x94, - 0xb5, 0x50, 0x57, 0x16, 0xaa, 0xe8, 0x2b, 0x58, 0x8e, 0x2f, 0x36, 0x7d, 0xed, 0x62, 0x61, 0x10, - 0xad, 0xb2, 0xf8, 0xa7, 0x79, 0x40, 0x41, 0xcc, 0x2d, 0xd7, 0x71, 0xde, 0x60, 0xea, 0x0d, 0x2d, - 0xff, 0x7f, 0x15, 0xea, 0x2f, 0x60, 0xb7, 0x17, 0xee, 0x8c, 0x3b, 0xc5, 0x74, 0xfa, 0x7a, 0xd3, - 0xdb, 0x23, 0x03, 0x13, 0xe6, 0x77, 0x60, 0xc9, 0x37, 0x7b, 0x6f, 0xa9, 0x4f, 0x4c, 0x83, 0xd7, - 0xc8, 0x12, 0x5e, 0x14, 0x82, 0xba, 0x81, 0x6a, 0xb0, 0xdc, 0x1d, 0x72, 0xd0, 0xbf, 0x1c, 0xd0, - 0x42, 0x76, 0x3f, 0x75, 0x90, 0x3b, 0x7e, 0x38, 0xb1, 0x4d, 0xf1, 0xcd, 0x28, 0x73, 0x7e, 0xfb, - 0x72, 0x40, 0x31, 0x74, 0xa3, 0xdf, 0xe8, 0x1b, 0xc8, 0xe9, 0xae, 0x6f, 0xbe, 0xd1, 0x7b, 0x3e, - 0xe9, 0x59, 0xba, 0xe7, 0xf1, 0x9a, 0xc8, 0x1d, 0x97, 0xae, 0x34, 0x26, 0x07, 0x2a, 0x15, 0xa6, - 0x81, 0x57, 0xf5, 0xf8, 0x23, 0x7a, 0x04, 0x52, 0x64, 0xd2, 0x71, 0x0d, 0xd3, 0xd6, 0xad, 0xc2, - 0x3c, 0x2f, 0xb4, 0xb5, 0x50, 0xae, 0x0a, 0x31, 0xba, 0x0b, 0x2b, 0x11, 0xf5, 0x2d, 0xbd, 0x2c, - 0x2c, 0xf0, 0x75, 0x2e, 0x87, 0xb2, 0x17, 0xf4, 0x12, 0xbd, 0x80, 0x15, 0x97, 0xe7, 0x31, 0x08, - 0x6f, 0x91, 0x87, 0x77, 0x70, 0x65, 0x78, 0x22, 0xf1, 0x22, 0xb8, 0x65, 0x77, 0xf4, 0x80, 0x1e, - 0xc2, 0x9a, 0xef, 0xea, 0xb6, 0xd7, 0x73, 0xcd, 0x81, 0x4f, 0xfa, 0xba, 0xd7, 0x2f, 0x2c, 0x71, - 0x97, 0xb9, 0x91, 0xb8, 0xa6, 0x7b, 0x7d, 0x54, 0x80, 0x05, 0x83, 0xfa, 0xba, 0x69, 0x79, 0x05, - 0xe0, 0x84, 0xf0, 0x11, 0xdd, 0x8f, 0x6f, 0x18, 0x4f, 0xf4, 0x32, 0x5f, 0xdb, 0x68, 0x13, 0x78, - 0xfa, 0x8e, 0x61, 0xd3, 0xa0, 0xae, 0x29, 0xba, 0x85, 0x98, 0xf6, 0x60, 0x18, 0xf8, 0x5b, 0xe1, - 0xe6, 0xd6, 0x47, 0x60, 0x9d, 0x61, 0xdc, 0xe9, 0x11, 0x6c, 0xc4, 0x2b, 0xca, 0x3c, 0xb3, 0x75, - 0x7f, 0xe8, 0xd2, 0xc2, 0xaa, 0x50, 0x89, 0x15, 0x4b, 0x08, 0xa1, 0x13, 0xb8, 0xe3, 0xf0, 0xae, - 0xa4, 0x2e, 0xd1, 0x7d, 0x9f, 0xb2, 0xbe, 0x61, 0x0e, 0x23, 0x65, 0xaf, 0x90, 0xdb, 0xcf, 0x1c, - 0x2c, 0xe1, 0xdb, 0x21, 0x4d, 0x1e, 0xb1, 0x22, 0x33, 0x5e, 0xf1, 0xd7, 0xf3, 0x80, 0x9a, 0x8e, - 0x41, 0xb5, 0xa1, 0x37, 0x30, 0x7b, 0x0c, 0x63, 0x2d, 0x85, 0x6a, 0x90, 0xff, 0xa4, 0x9e, 0x91, - 0xbc, 0x64, 0x39, 0x3f, 0x84, 0x35, 0x2f, 0xb4, 0x4d, 0xbc, 0x9e, 0xe3, 0x52, 0xde, 0x20, 0x19, - 0x9c, 0x8b, 0xc4, 0x1a, 0x93, 0xb2, 0x21, 0x69, 0xe9, 0x9e, 0x4f, 0x86, 0x03, 0x43, 0xf7, 0xa9, - 0x41, 0xe8, 0xc0, 0xe9, 0xf5, 0x79, 0x03, 0x64, 0xb1, 0xc4, 0x90, 0x8e, 0x00, 0x14, 0x26, 0x47, - 0xcf, 0x60, 0x8b, 0xb3, 0x5d, 0xca, 0x66, 0x26, 0x61, 0x83, 0x2c, 0xd0, 0xc8, 0x72, 0x8d, 0x75, - 0x86, 0x62, 0x0e, 0x9e, 0xe8, 0xa6, 0x25, 0x94, 0x9e, 0x00, 0x17, 0x13, 0xc7, 0x32, 0xe2, 0x1a, - 0x37, 0x46, 0x3e, 0x54, 0xcb, 0x18, 0xd1, 0xbf, 0x86, 0x1d, 0xc3, 0xf4, 0x7c, 0xd3, 0xee, 0xf9, - 0x24, 0x68, 0x49, 0xae, 0xf5, 0x9d, 0x69, 0x1b, 0xce, 0x77, 0x41, 0x69, 0x17, 0x42, 0x4a, 0x9b, - 0x33, 0x98, 0xf6, 0x2b, 0x8e, 0xb3, 0x05, 0x09, 0x26, 0x1b, 0x6a, 0xae, 0x1f, 0x38, 0x5b, 0x10, - 0xce, 0x04, 0xa2, 0x31, 0x40, 0x38, 0x3b, 0x84, 0x0d, 0x5e, 0xe7, 0x44, 0x17, 0xd5, 0x15, 0x7a, - 0x59, 0xe4, 0x5e, 0xf2, 0x1c, 0x93, 0x79, 0x89, 0x05, 0xe6, 0x3f, 0x0b, 0xf6, 0x2b, 0xd4, 0x12, - 0xe6, 0x97, 0xb8, 0xf9, 0x35, 0x86, 0xf0, 0xca, 0x97, 0x13, 0xd6, 0xbb, 0xe3, 0xd6, 0x21, 0x66, - 0xbd, 0x3c, 0xdb, 0x7a, 0x37, 0xb0, 0xbe, 0x9c, 0xb0, 0x5e, 0x16, 0xd6, 0x0f, 0x40, 0xea, 0x59, - 0x54, 0xb7, 0xc9, 0x80, 0x91, 0x45, 0xb1, 0xac, 0x70, 0xcb, 0x39, 0x2e, 0x6f, 0xe9, 0x9e, 0x78, - 0xbb, 0xa0, 0x23, 0xd8, 0x0c, 0xcc, 0x46, 0x74, 0x61, 0x79, 0x95, 0x5b, 0x46, 0xc2, 0x72, 0xa0, - 0x22, 0x8c, 0x87, 0x2a, 0xa6, 0x6d, 0xd0, 0xef, 0xe3, 0x69, 0xcb, 0x8d, 0x54, 0xea, 0x0c, 0x1b, - 0x25, 0xee, 0x27, 0xb0, 0x9b, 0x8c, 0x87, 0xe8, 0x3e, 0x19, 0x38, 0x9e, 0x3f, 0x70, 0x6c, 0x5a, - 0x58, 0x13, 0x99, 0x1b, 0x8f, 0x4d, 0xf6, 0x5b, 0x01, 0x5e, 0x7c, 0x97, 0x85, 0x82, 0x38, 0x12, - 0x50, 0x17, 0x53, 0xcb, 0xd4, 0xbb, 0xa6, 0x65, 0xfa, 0x97, 0xa2, 0x35, 0x5e, 0xc3, 0xb6, 0x1b, - 0x60, 0x9f, 0xf6, 0x5e, 0x29, 0x84, 0xea, 0x13, 0xa3, 0xff, 0x33, 0xc8, 0xbb, 0x23, 0x77, 0x63, - 0xdd, 0x22, 0xc5, 0x80, 0x4f, 0xe9, 0x17, 0x19, 0xc0, 0x77, 0x87, 0x9e, 0x4f, 0xba, 0xba, 0x6d, - 0x04, 0xef, 0x8d, 0xe2, 0xc4, 0x2c, 0x0d, 0x17, 0xdd, 0x66, 0xd4, 0xb2, 0x6e, 0x1b, 0x78, 0xc9, - 0x0f, 0x7f, 0xa2, 0x43, 0x58, 0xef, 0x39, 0xb6, 0xef, 0xea, 0x86, 0xc9, 0x0f, 0x0c, 0xb1, 0xa3, - 0x44, 0x16, 0xa3, 0x31, 0x48, 0x24, 0xfb, 0xff, 0x61, 0xcb, 0xb4, 0xa9, 0x65, 0x9e, 0x99, 0x5d, - 0x8b, 0x92, 0xa1, 0xed, 0x47, 0xa9, 0x9b, 0xe7, 0x3a, 0x1b, 0x23, 0xb4, 0xc3, 0x40, 0x11, 0xe9, - 0x31, 0x6c, 0x06, 0x6d, 0x33, 0x70, 0x3c, 0xd3, 0x37, 0x2f, 0x68, 0xe0, 0x68, 0x81, 0x67, 0x6d, - 0x5d, 0x80, 0xad, 0x00, 0x8b, 0x86, 0x6e, 0xa0, 0x63, 0xd3, 0x33, 0x3d, 0xa6, 0xb3, 0x18, 0xd7, - 0x69, 0x06, 0x98, 0xd0, 0x99, 0xde, 0x9e, 0x4b, 0xd3, 0xdb, 0xb3, 0xf8, 0xaf, 0x05, 0x28, 0x88, - 0x0e, 0xaf, 0x52, 0x9f, 0xba, 0xa6, 0xe3, 0x8a, 0x49, 0xca, 0x4b, 0x62, 0xec, 0x95, 0x9d, 0x4a, - 0xbc, 0xb2, 0x0f, 0x61, 0xdd, 0x88, 0xab, 0x8c, 0xa5, 0x15, 0x8d, 0x41, 0x9f, 0x92, 0xd8, 0x47, - 0x90, 0x67, 0x47, 0xbb, 0x0b, 0x4a, 0xfa, 0x54, 0xb7, 0x88, 0x33, 0x60, 0x31, 0x88, 0x19, 0x98, - 0x13, 0x40, 0x8d, 0xea, 0x96, 0x3a, 0xa8, 0x1b, 0x6c, 0x97, 0x06, 0xae, 0xd3, 0x15, 0x51, 0xc4, - 0xd3, 0x21, 0x52, 0xb8, 0x1e, 0x81, 0xb1, 0x6c, 0x3c, 0x00, 0xde, 0xed, 0xc2, 0x78, 0x3c, 0x79, - 0xab, 0x4c, 0xcc, 0x4c, 0x0b, 0x5e, 0x18, 0x34, 0xeb, 0xcf, 0xa1, 0x4b, 0xc7, 0x87, 0x1d, 0x43, - 0x4e, 0x04, 0x20, 0xd8, 0x5f, 0xb1, 0x1e, 0x8a, 0x06, 0x77, 0xc4, 0x1f, 0x4b, 0xda, 0x4d, 0x37, - 0x9a, 0xde, 0xa1, 0x9e, 0x48, 0xdc, 0x8c, 0x3a, 0x5c, 0x9a, 0x59, 0x87, 0xbf, 0x84, 0xdb, 0x3c, - 0xb6, 0x99, 0x87, 0x41, 0xf8, 0x88, 0x13, 0x1b, 0xb3, 0xd0, 0x9e, 0x7e, 0x20, 0xec, 0xc2, 0x9d, - 0xe0, 0x5d, 0x34, 0x73, 0x2c, 0x2c, 0x5f, 0xef, 0x61, 0x57, 0xbc, 0xb1, 0x66, 0x8c, 0x86, 0x36, - 0xe4, 0x03, 0x1f, 0xb1, 0x23, 0xd1, 0xca, 0x7f, 0x78, 0x24, 0x5a, 0x13, 0x2e, 0x46, 0xc7, 0xa2, - 0xd2, 0xb8, 0xd5, 0xf8, 0x28, 0x8e, 0x71, 0xc3, 0x09, 0x72, 0x3b, 0x7a, 0x1b, 0xf6, 0x1d, 0xcb, - 0xa0, 0x6e, 0x94, 0x3c, 0xb1, 0xc6, 0x1c, 0x4f, 0xdb, 0x76, 0x48, 0xaa, 0x71, 0x4e, 0x90, 0x3e, - 0x91, 0x88, 0x2f, 0xa1, 0x90, 0x18, 0xe5, 0xa3, 0x52, 0x59, 0xe3, 0x5e, 0x37, 0xc7, 0xa6, 0x79, - 0x54, 0x2f, 0x5f, 0xc3, 0x4e, 0x50, 0x2f, 0xc1, 0xe9, 0x77, 0x5c, 0x57, 0xe2, 0xba, 0x05, 0x41, - 0x11, 0xe7, 0xdd, 0x31, 0xf5, 0x2f, 0xa1, 0xc0, 0x5e, 0xf9, 0x53, 0x75, 0xf3, 0xc2, 0xaf, 0x63, - 0x19, 0x93, 0x8a, 0xc5, 0xdf, 0xa6, 0xc2, 0xae, 0x97, 0xe3, 0x87, 0xbc, 0x8f, 0xe8, 0xfa, 0xcf, - 0x61, 0x43, 0xac, 0x32, 0x71, 0x66, 0x4c, 0x8b, 0x8b, 0x17, 0xc7, 0xe4, 0xe4, 0xc1, 0xd1, 0xbb, - 0x3c, 0xef, 0x3a, 0x56, 0x52, 0x25, 0x23, 0x66, 0x98, 0x00, 0xc7, 0x74, 0x8a, 0xbf, 0xca, 0xc2, - 0xbc, 0x68, 0x6f, 0xb4, 0x0b, 0x10, 0x1b, 0x00, 0x29, 0xbe, 0xaa, 0xc5, 0x7e, 0xd8, 0xfa, 0x63, - 0xb1, 0xa6, 0x13, 0xb1, 0x3e, 0x06, 0xe4, 0xf5, 0xfa, 0xd4, 0x18, 0x5a, 0xe1, 0xb4, 0x09, 0xaf, - 0x1e, 0x59, 0x2c, 0x45, 0x08, 0xdf, 0x91, 0xba, 0xc1, 0x6e, 0x55, 0xcc, 0xec, 0xd4, 0x32, 0xcf, - 0x7e, 0xc4, 0xad, 0x4a, 0x28, 0x4f, 0x14, 0xf8, 0xcf, 0x61, 0xe7, 0x82, 0xba, 0xe6, 0x1b, 0x73, - 0x9a, 0x61, 0x76, 0x39, 0xc9, 0x5c, 0x67, 0xf9, 0x56, 0xa8, 0x9f, 0xb4, 0xed, 0xa1, 0x2f, 0x60, - 0x9e, 0x1d, 0x7d, 0x87, 0x1e, 0x1f, 0x5e, 0xb9, 0xe3, 0xdb, 0x13, 0x2d, 0x23, 0x76, 0x51, 0xe3, - 0x24, 0x1c, 0x90, 0xd9, 0x91, 0xbf, 0xe7, 0x52, 0x3e, 0x84, 0xfb, 0xd4, 0x3c, 0xeb, 0xfb, 0xc1, - 0x40, 0x5b, 0x0d, 0xa4, 0x35, 0x2e, 0x64, 0xb4, 0x70, 0x56, 0x07, 0xb4, 0x45, 0x41, 0x0b, 0xa4, - 0x01, 0xad, 0x04, 0x79, 0x83, 0xea, 0x86, 0x65, 0xda, 0x74, 0xb4, 0xcb, 0xc1, 0x79, 0x2d, 0x04, - 0xc2, 0x4d, 0xbe, 0x03, 0xc1, 0xf5, 0x45, 0xdc, 0x1d, 0xc4, 0x55, 0x04, 0x84, 0x88, 0x5f, 0x19, - 0x36, 0xe0, 0x86, 0xed, 0xb0, 0x9b, 0x32, 0x9f, 0x2c, 0x58, 0x3c, 0x14, 0x7f, 0x9f, 0x81, 0x65, - 0x6e, 0x22, 0xf8, 0xa0, 0xf1, 0xdf, 0x3b, 0xc6, 0xdf, 0x82, 0xc5, 0x28, 0xe6, 0x34, 0x8f, 0x79, - 0x81, 0x06, 0xb1, 0xde, 0x83, 0x55, 0x31, 0xf9, 0xc2, 0xd5, 0x67, 0xf8, 0xab, 0x6d, 0x45, 0x08, - 0x83, 0xc5, 0x97, 0x61, 0xb9, 0xef, 0x44, 0x33, 0x92, 0x17, 0xca, 0xf2, 0xf1, 0xce, 0x64, 0x1a, - 0xa2, 0x8f, 0x31, 0xe5, 0xec, 0x0f, 0x7f, 0xbf, 0x33, 0x87, 0xa1, 0x3f, 0xfa, 0x3c, 0xe3, 0xc2, - 0x9e, 0x27, 0x26, 0x1b, 0x89, 0xae, 0x44, 0xc4, 0x19, 0x7d, 0x9b, 0x10, 0x55, 0xb2, 0x7c, 0xfc, - 0x78, 0xd6, 0x40, 0x9c, 0xf6, 0x41, 0x03, 0xef, 0x7a, 0xb3, 0x41, 0x0f, 0xbd, 0x82, 0xcd, 0xd0, - 0xe7, 0x80, 0x8d, 0xd3, 0x60, 0x54, 0xb2, 0x42, 0x62, 0xae, 0xee, 0x7d, 0xc4, 0xec, 0xc5, 0xeb, - 0xde, 0x84, 0xcc, 0x2b, 0xa9, 0xb0, 0x14, 0x7d, 0xcc, 0x40, 0x5b, 0x80, 0x5a, 0x2a, 0x6e, 0x13, - 0xad, 0x2d, 0xb7, 0x15, 0xd2, 0x69, 0xbe, 0x68, 0xaa, 0xaf, 0x9a, 0xd2, 0x1c, 0x5a, 0x87, 0xb5, - 0x98, 0x5c, 0x6d, 0x29, 0x4d, 0x29, 0x85, 0x36, 0x21, 0x1f, 0x13, 0x56, 0x1a, 0xaa, 0xa6, 0x54, - 0xa5, 0x74, 0xe9, 0x6f, 0x29, 0xd8, 0x9a, 0x7e, 0xef, 0x47, 0x8f, 0xe0, 0xbe, 0xd6, 0x56, 0xb1, - 0xfc, 0x5c, 0x21, 0x2d, 0xac, 0xaa, 0x27, 0xa4, 0xdc, 0xa9, 0xbc, 0x50, 0xda, 0xa4, 0xfd, 0xba, - 0xc5, 0xbc, 0x69, 0x2d, 0xa5, 0x52, 0x3f, 0xa9, 0x2b, 0x55, 0x69, 0x0e, 0xfd, 0x1f, 0xec, 0xcf, - 0xa6, 0x62, 0xa5, 0xa2, 0x34, 0xdb, 0x52, 0x0a, 0xdd, 0x85, 0xdb, 0xb3, 0x59, 0x6a, 0xa3, 0x2a, - 0xa5, 0xd1, 0x43, 0xb8, 0x37, 0x9b, 0xd2, 0xc2, 0x6a, 0x59, 0x6e, 0xd7, 0xd5, 0xa6, 0x94, 0x41, - 0xf7, 0xe1, 0xee, 0x95, 0x1e, 0x6b, 0x4a, 0xe5, 0x85, 0x94, 0x2d, 0xfd, 0x26, 0x05, 0xb7, 0x66, - 0x7e, 0x89, 0x40, 0x8f, 0xe1, 0x60, 0xdc, 0x88, 0x8c, 0xdb, 0xf5, 0x13, 0xb9, 0xd2, 0x26, 0x95, - 0x86, 0xac, 0x69, 0x89, 0x45, 0x3e, 0x80, 0xe2, 0x95, 0xec, 0x7a, 0xb3, 0xaa, 0x7c, 0x2b, 0xa5, - 0x26, 0xd7, 0x90, 0xe0, 0x69, 0xaf, 0x4f, 0xcb, 0x6a, 0x43, 0x4a, 0x97, 0x7e, 0x97, 0x81, 0x9b, - 0x33, 0x5e, 0xba, 0xa8, 0x04, 0x0f, 0xc6, 0x8d, 0x60, 0x45, 0xeb, 0x34, 0xa6, 0x07, 0x76, 0x0f, - 0xee, 0x5c, 0xc1, 0x6d, 0xc9, 0x9a, 0x26, 0xa5, 0x26, 0xd7, 0x3a, 0x46, 0xaa, 0xc9, 0x5a, 0x8d, - 0x9c, 0xd6, 0xb5, 0x53, 0xb9, 0x5d, 0xa9, 0x49, 0x69, 0xf4, 0x05, 0x1c, 0x5d, 0xc1, 0x6e, 0xd7, - 0x4f, 0x15, 0xb5, 0xd3, 0x26, 0x2a, 0x26, 0x4d, 0x95, 0x41, 0x2d, 0xb5, 0xa9, 0x29, 0x52, 0x06, - 0x3d, 0x83, 0xc3, 0x2b, 0xd4, 0xd4, 0xb2, 0xa6, 0xe0, 0x97, 0x0a, 0x26, 0xdf, 0x74, 0x54, 0xdc, - 0x39, 0x25, 0x27, 0x72, 0xbd, 0x21, 0x65, 0xd1, 0x11, 0x3c, 0xb9, 0x42, 0xa9, 0xa9, 0x12, 0xa5, - 0x51, 0x7f, 0x5e, 0x2f, 0x37, 0x14, 0xd2, 0xae, 0xb3, 0x1c, 0x4b, 0x37, 0xae, 0x51, 0xa9, 0x37, - 0x5f, 0xca, 0x8d, 0x7a, 0x95, 0xb4, 0xb1, 0xdc, 0xd4, 0x2a, 0xb8, 0xde, 0x6a, 0x4b, 0xf3, 0xd7, - 0xac, 0x28, 0xa8, 0x18, 0x52, 0x51, 0x9b, 0x27, 0x75, 0x7c, 0xaa, 0x54, 0x45, 0x70, 0x0b, 0xa5, - 0x3f, 0xa7, 0x20, 0x3f, 0x71, 0xbf, 0x61, 0x3b, 0x8e, 0x15, 0xd6, 0x4e, 0x0a, 0x26, 0x6d, 0xdc, - 0xd1, 0xda, 0xa4, 0x2c, 0x37, 0xab, 0x89, 0xb4, 0xec, 0xc1, 0xf6, 0x34, 0x52, 0x53, 0xc5, 0xa7, - 0x72, 0x43, 0xb4, 0xc3, 0x34, 0xbc, 0xa1, 0xbe, 0x12, 0x8f, 0x52, 0x1a, 0x3d, 0x81, 0x47, 0xd3, - 0x28, 0x95, 0x9a, 0xdc, 0x68, 0x28, 0xcd, 0xe7, 0x0a, 0x26, 0xf5, 0x66, 0xb8, 0x3b, 0x52, 0x06, - 0xed, 0xc3, 0xee, 0x34, 0x7a, 0x55, 0x79, 0x8e, 0xe5, 0xaa, 0x52, 0x95, 0xb2, 0xa5, 0x7f, 0xa6, - 0x60, 0x25, 0xfe, 0xd2, 0x62, 0x41, 0xd6, 0x14, 0xb9, 0x41, 0xd4, 0x16, 0x9f, 0x0c, 0x9d, 0x64, - 0x6d, 0xed, 0x42, 0x21, 0x81, 0x6b, 0x95, 0x9a, 0x52, 0xed, 0x34, 0x94, 0xaa, 0x94, 0x9a, 0xa2, - 0x5d, 0x6f, 0xb2, 0xed, 0x7d, 0x8e, 0x15, 0x4d, 0x93, 0xd2, 0xa8, 0x08, 0x7b, 0x09, 0x9c, 0x3d, - 0x2a, 0x98, 0x04, 0x61, 0x56, 0xa5, 0x0c, 0xda, 0x81, 0x9b, 0x09, 0xce, 0x4b, 0x05, 0x0b, 0xf7, - 0x59, 0x74, 0x0b, 0x36, 0x13, 0x20, 0xcb, 0x8b, 0x52, 0x95, 0x6e, 0xa0, 0x6d, 0xd8, 0x4a, 0x40, - 0xca, 0xb7, 0xad, 0x3a, 0x56, 0xaa, 0xd2, 0x7c, 0xb9, 0xf4, 0xc3, 0xfb, 0xbd, 0xd4, 0x8f, 0xef, - 0xf7, 0x52, 0xff, 0x78, 0xbf, 0x97, 0x7a, 0xf7, 0x61, 0x6f, 0xee, 0xc7, 0x0f, 0x7b, 0x73, 0x7f, - 0xfd, 0xb0, 0x37, 0xf7, 0x33, 0xe9, 0xfb, 0xd1, 0x3f, 0x0a, 0xfc, 0xcb, 0x01, 0xf5, 0xba, 0xf3, - 0xfc, 0xa3, 0xfe, 0xb3, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x83, 0x8d, 0x0e, 0xce, 0x48, 0x18, - 0x00, 0x00, + // 2341 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x59, 0xdb, 0x6e, 0xdb, 0xc8, + 0xf9, 0xb7, 0x0e, 0xf1, 0xe1, 0xb3, 0x2d, 0x53, 0xe3, 0x43, 0xe4, 0x43, 0x1c, 0xaf, 0xf2, 0xdf, + 0x8d, 0xa3, 0x4d, 0xe2, 0xb5, 0xf7, 0xbf, 0x58, 0x14, 0x8b, 0x2d, 0x40, 0x49, 0x74, 0xa4, 0x5a, + 0x16, 0xb5, 0x43, 0x29, 0xd9, 0xb4, 0x68, 0x07, 0x14, 0x39, 0xb1, 0x88, 0xd0, 0xa4, 0x40, 0x52, + 0xde, 0xf5, 0x43, 0x14, 0x58, 0xf4, 0xb2, 0x40, 0x2f, 0x7a, 0xd7, 0xdb, 0x02, 0xbd, 0xe8, 0x23, + 0x2c, 0xd0, 0x5e, 0x2c, 0x7a, 0xd5, 0x8b, 0xa2, 0x28, 0x92, 0xbe, 0x41, 0x5f, 0xa0, 0x98, 0x19, + 0x92, 0xa2, 0x4e, 0x76, 0x1a, 0xb4, 0x37, 0x86, 0xf8, 0xfd, 0x7e, 0xdf, 0x61, 0xe6, 0x3b, 0x70, + 0x86, 0x86, 0x5d, 0x7b, 0x70, 0x49, 0x3d, 0xfd, 0x48, 0x1f, 0x98, 0x56, 0x70, 0x74, 0x75, 0x2c, + 0x7e, 0x3c, 0xed, 0x7b, 0x6e, 0xe0, 0xa2, 0x35, 0x01, 0x3e, 0x15, 0xb2, 0xab, 0xe3, 0x9d, 0xbc, + 0x7e, 0x69, 0x39, 0xee, 0x11, 0xff, 0x2b, 0x38, 0x3b, 0xdb, 0x86, 0xeb, 0x5f, 0xba, 0x3e, 0xe1, + 0x4f, 0x47, 0xe2, 0x21, 0x84, 0x36, 0x2e, 0xdc, 0x0b, 0x57, 0xc8, 0xd9, 0x2f, 0x21, 0x2d, 0xfe, + 0x29, 0x0d, 0x50, 0x73, 0xfd, 0x00, 0xd3, 0xbe, 0xeb, 0x05, 0xa8, 0x04, 0x79, 0xa3, 0x3f, 0x20, + 0x03, 0x5f, 0xbf, 0xa0, 0xa4, 0x4f, 0x3d, 0x83, 0x3a, 0x41, 0x21, 0x75, 0x90, 0x3a, 0x4c, 0xe1, + 0x35, 0xa3, 0x3f, 0xe8, 0x30, 0x79, 0x4b, 0x88, 0x19, 0xf7, 0x92, 0x5e, 0x8e, 0x71, 0xd3, 0x82, + 0x7b, 0x49, 0x2f, 0x47, 0xb8, 0x8f, 0x01, 0x99, 0x96, 0xff, 0x7a, 0x8c, 0x9c, 0xe1, 0x64, 0x89, + 0x21, 0x23, 0xec, 0x9f, 0xc0, 0xba, 0xe5, 0x74, 0xdd, 0x81, 0x63, 0x12, 0x16, 0x15, 0xf1, 0x03, + 0x3d, 0xa0, 0x7e, 0x21, 0x7b, 0x90, 0x39, 0xcc, 0x9d, 0xec, 0x3c, 0x1d, 0xdb, 0x87, 0xa7, 0x2d, + 0xd7, 0x0b, 0x34, 0x46, 0xc1, 0xf9, 0x50, 0x2d, 0x96, 0xf8, 0xe8, 0x13, 0xd8, 0x78, 0xa5, 0x5b, + 0x36, 0x35, 0x89, 0x6e, 0x04, 0x96, 0xeb, 0xf8, 0xc4, 0x70, 0x07, 0x4e, 0x50, 0xb8, 0x73, 0x90, + 0x3a, 0x5c, 0xc5, 0x48, 0x60, 0xb2, 0x80, 0x2a, 0x0c, 0x41, 0x3f, 0x82, 0x6d, 0x43, 0xf7, 0x0d, + 0xdd, 0xa4, 0xe4, 0xb5, 0x6e, 0xd2, 0x4b, 0xdb, 0xd2, 0x89, 0xd9, 0x25, 0xdd, 0x6b, 0x16, 0xc3, + 0x3c, 0x0f, 0x79, 0x2b, 0x24, 0x9c, 0x85, 0x78, 0xb5, 0x5b, 0x66, 0x68, 0xf1, 0xf7, 0x29, 0xd8, + 0xd5, 0x02, 0xd7, 0xd3, 0x2f, 0x68, 0xa5, 0xa7, 0xdb, 0x36, 0x75, 0x2e, 0xa8, 0xda, 0xf5, 0xa9, + 0x77, 0xa5, 0x33, 0x07, 0xa8, 0x03, 0x85, 0x40, 0xf7, 0x2e, 0x68, 0x40, 0xfc, 0x41, 0x9f, 0x7a, + 0x8e, 0x6b, 0x52, 0xa2, 0x1b, 0x22, 0x20, 0xb6, 0xcb, 0x4b, 0xe5, 0xdd, 0xbf, 0xfc, 0xe1, 0xc9, + 0xdd, 0x30, 0x6f, 0xb2, 0x61, 0xc8, 0xa6, 0xe9, 0x51, 0xdf, 0xd7, 0x02, 0xcf, 0x72, 0x2e, 0xf0, + 0x96, 0x50, 0xd6, 0x22, 0x5d, 0x59, 0xa8, 0xa2, 0x2f, 0x60, 0x39, 0xb9, 0x4f, 0xe9, 0x5b, 0xf7, + 0x09, 0xfa, 0xf1, 0x06, 0x15, 0xff, 0x38, 0x0f, 0x28, 0x8c, 0xb9, 0xe5, 0xb9, 0xee, 0x2b, 0x4c, + 0xfd, 0x81, 0x1d, 0xfc, 0xaf, 0x42, 0xfd, 0x39, 0xec, 0x19, 0xd1, 0xce, 0x78, 0x53, 0x4c, 0xa7, + 0x6f, 0x37, 0xbd, 0x33, 0x34, 0x30, 0x61, 0x7e, 0x17, 0x96, 0x02, 0xcb, 0x78, 0x4d, 0x03, 0x62, + 0x99, 0xbc, 0xbc, 0x96, 0xf0, 0xa2, 0x10, 0xd4, 0x4d, 0x54, 0x83, 0xe5, 0xee, 0x80, 0x83, 0xc1, + 0x75, 0x9f, 0x16, 0xb2, 0x07, 0xa9, 0xc3, 0xdc, 0xc9, 0xc3, 0x89, 0x6d, 0x4a, 0x6e, 0x46, 0x99, + 0xf3, 0xdb, 0xd7, 0x7d, 0x8a, 0xa1, 0x1b, 0xff, 0x46, 0x5f, 0x41, 0x4e, 0xf7, 0x02, 0xeb, 0x95, + 0x6e, 0x04, 0xc4, 0xb0, 0x75, 0xdf, 0xe7, 0xe5, 0x94, 0x3b, 0x29, 0xdd, 0x68, 0x4c, 0x0e, 0x55, + 0x2a, 0x4c, 0x03, 0xaf, 0xea, 0xc9, 0x47, 0xf4, 0x08, 0xa4, 0xd8, 0xa4, 0xeb, 0x99, 0x96, 0xa3, + 0xdb, 0xbc, 0xd8, 0x56, 0xf1, 0x5a, 0x24, 0x57, 0x85, 0x18, 0x7d, 0x00, 0x2b, 0x31, 0xf5, 0x35, + 0xbd, 0x2e, 0x2c, 0xf0, 0x75, 0x2e, 0x47, 0xb2, 0x33, 0x7a, 0x8d, 0xce, 0x60, 0xc5, 0xe3, 0x79, + 0x0c, 0xc3, 0x5b, 0xe4, 0xe1, 0x1d, 0xde, 0x18, 0x9e, 0x48, 0xbc, 0x08, 0x6e, 0xd9, 0x1b, 0x3e, + 0xa0, 0x87, 0xb0, 0x16, 0x78, 0xba, 0xe3, 0x1b, 0x9e, 0xd5, 0x0f, 0x48, 0x4f, 0xf7, 0x7b, 0x85, + 0x25, 0xee, 0x32, 0x37, 0x14, 0xd7, 0x74, 0xbf, 0x87, 0x0a, 0xb0, 0x60, 0xd2, 0x40, 0xb7, 0x6c, + 0xbf, 0x00, 0x9c, 0x10, 0x3d, 0xa2, 0x0f, 0x93, 0x1b, 0xc6, 0x13, 0xbd, 0xcc, 0xd7, 0x36, 0xdc, + 0x04, 0x9e, 0xbe, 0x13, 0xd8, 0x34, 0xa9, 0x67, 0x89, 0x6e, 0x21, 0x96, 0xd3, 0x1f, 0x84, 0xfe, + 0x56, 0xb8, 0xb9, 0xf5, 0x21, 0x58, 0x67, 0x18, 0x77, 0x7a, 0x0c, 0x1b, 0xc9, 0x8a, 0xb2, 0x2e, + 0x1c, 0x3d, 0x18, 0x78, 0xb4, 0xb0, 0x2a, 0x54, 0x12, 0xc5, 0x12, 0x41, 0xe8, 0x14, 0xee, 0xbb, + 0xbc, 0x2b, 0xa9, 0x47, 0xf4, 0x20, 0xa0, 0xac, 0x6f, 0x98, 0xc3, 0x58, 0xd9, 0x2f, 0xe4, 0x0e, + 0x32, 0x87, 0x4b, 0xf8, 0x5e, 0x44, 0x93, 0x87, 0xac, 0xd8, 0x8c, 0x5f, 0xfc, 0xd5, 0x3c, 0xa0, + 0xa6, 0x6b, 0x52, 0x6d, 0xe0, 0xf7, 0x2d, 0x83, 0x61, 0xac, 0xa5, 0x50, 0x0d, 0xf2, 0xef, 0xd5, + 0x33, 0x92, 0x3f, 0x5e, 0xce, 0x0f, 0x61, 0xcd, 0x8f, 0x6c, 0x13, 0xdf, 0x70, 0x3d, 0xca, 0x1b, + 0x24, 0x83, 0x73, 0xb1, 0x58, 0x63, 0x52, 0x36, 0x5f, 0x6d, 0xdd, 0x0f, 0xc8, 0xa0, 0x6f, 0xea, + 0x01, 0x35, 0x09, 0xed, 0xbb, 0x46, 0x8f, 0x37, 0x40, 0x16, 0x4b, 0x0c, 0xe9, 0x08, 0x40, 0x61, + 0x72, 0xf4, 0x29, 0x6c, 0x71, 0xb6, 0x47, 0xd9, 0xb8, 0x25, 0x6c, 0x06, 0x86, 0x1a, 0x59, 0xae, + 0xb1, 0xce, 0x50, 0xcc, 0xc1, 0x53, 0xdd, 0xb2, 0x85, 0xd2, 0x13, 0xe0, 0x62, 0xe2, 0xda, 0x66, + 0x52, 0xe3, 0xce, 0xd0, 0x87, 0x6a, 0x9b, 0x43, 0xfa, 0x97, 0xb0, 0x6b, 0x5a, 0x7e, 0x60, 0x39, + 0x46, 0x40, 0xc2, 0x96, 0xe4, 0x5a, 0xdf, 0x58, 0x8e, 0xe9, 0x7e, 0x13, 0x96, 0x76, 0x21, 0xa2, + 0xb4, 0x39, 0x83, 0x69, 0xbf, 0xe0, 0x38, 0x5b, 0x90, 0x60, 0xb2, 0xa1, 0xe6, 0x05, 0xa1, 0xb3, + 0x05, 0xe1, 0x4c, 0x20, 0x1a, 0x03, 0x84, 0xb3, 0x23, 0xd8, 0xe0, 0x75, 0x4e, 0x74, 0x51, 0x5d, + 0x91, 0x97, 0x45, 0xee, 0x25, 0xcf, 0x31, 0x99, 0x97, 0x58, 0x68, 0xfe, 0xe3, 0x70, 0xbf, 0x22, + 0x2d, 0x61, 0x7e, 0x89, 0x9b, 0x5f, 0x63, 0x08, 0xaf, 0x7c, 0x79, 0xcc, 0x7a, 0x77, 0xd4, 0x3a, + 0x24, 0xac, 0x97, 0x67, 0x5b, 0xef, 0x86, 0xd6, 0x97, 0xc7, 0xac, 0x97, 0x85, 0xf5, 0x43, 0x90, + 0x0c, 0x9b, 0xea, 0x0e, 0xe9, 0x33, 0xb2, 0x28, 0x96, 0x15, 0x6e, 0x39, 0xc7, 0xe5, 0x2d, 0xdd, + 0x0f, 0x5f, 0x4c, 0xc7, 0xb0, 0x19, 0x9a, 0x8d, 0xe9, 0xc2, 0xf2, 0x2a, 0xb7, 0x8c, 0x84, 0xe5, + 0x50, 0x45, 0x18, 0x8f, 0x54, 0x2c, 0xc7, 0xa4, 0xdf, 0x26, 0xd3, 0x96, 0x1b, 0xaa, 0xd4, 0x19, + 0x36, 0x4c, 0xdc, 0x8f, 0x61, 0x6f, 0x3c, 0x1e, 0xa2, 0x07, 0xa4, 0xef, 0xfa, 0x41, 0xdf, 0x75, + 0x68, 0x61, 0x4d, 0x64, 0x6e, 0x34, 0x36, 0x39, 0x68, 0x85, 0x78, 0xf1, 0xbb, 0x2c, 0x14, 0xc4, + 0x69, 0x82, 0x7a, 0x98, 0xda, 0x96, 0xde, 0xb5, 0x6c, 0x2b, 0xb8, 0x16, 0xad, 0xf1, 0x12, 0x76, + 0xbc, 0x10, 0x7b, 0xbf, 0xf7, 0x4a, 0x21, 0x52, 0x9f, 0x18, 0xfd, 0x1f, 0x43, 0xde, 0x1b, 0xba, + 0x1b, 0xe9, 0x16, 0x29, 0x01, 0xbc, 0x4f, 0xbf, 0xc8, 0x00, 0x81, 0x37, 0xf0, 0x03, 0xd2, 0xd5, + 0x1d, 0x33, 0x7c, 0x6f, 0x14, 0x27, 0x66, 0x69, 0xb4, 0xe8, 0x36, 0xa3, 0x96, 0x75, 0xc7, 0xc4, + 0x4b, 0x41, 0xf4, 0x13, 0x1d, 0xc1, 0xba, 0xe1, 0x3a, 0x81, 0xa7, 0x9b, 0x16, 0x3f, 0x6b, 0x24, + 0x4e, 0x21, 0x59, 0x8c, 0x46, 0x20, 0x91, 0xec, 0xff, 0x87, 0x2d, 0xcb, 0xa1, 0xb6, 0x75, 0x61, + 0x75, 0x6d, 0x4a, 0x06, 0x4e, 0x10, 0xa7, 0x6e, 0x9e, 0xeb, 0x6c, 0x0c, 0xd1, 0x0e, 0x03, 0x45, + 0xa4, 0x27, 0xb0, 0x19, 0xb6, 0x4d, 0xdf, 0xf5, 0xad, 0xc0, 0xba, 0xa2, 0xa1, 0xa3, 0x05, 0x9e, + 0xb5, 0x75, 0x01, 0xb6, 0x42, 0x2c, 0x1e, 0xba, 0xa1, 0x8e, 0x43, 0x2f, 0xf4, 0x84, 0xce, 0x62, + 0x52, 0xa7, 0x19, 0x62, 0x42, 0x67, 0x7a, 0x7b, 0x2e, 0x4d, 0x6f, 0xcf, 0xe2, 0xbf, 0x16, 0xa0, + 0x20, 0x3a, 0xbc, 0x4a, 0x03, 0xea, 0x59, 0xae, 0x27, 0x26, 0x29, 0x2f, 0x89, 0x91, 0x57, 0x76, + 0x6a, 0xec, 0x95, 0x7d, 0x04, 0xeb, 0x66, 0x52, 0x65, 0x24, 0xad, 0x68, 0x04, 0x7a, 0x9f, 0xc4, + 0x3e, 0x82, 0x3c, 0x3b, 0x15, 0x5e, 0x51, 0xd2, 0xa3, 0xba, 0x4d, 0xdc, 0x3e, 0x8b, 0x41, 0xcc, + 0xc0, 0x9c, 0x00, 0x6a, 0x54, 0xb7, 0xd5, 0x7e, 0xdd, 0x64, 0xbb, 0xd4, 0xf7, 0xdc, 0xae, 0x88, + 0x22, 0x99, 0x0e, 0x91, 0xc2, 0xf5, 0x18, 0x4c, 0x64, 0xe3, 0x23, 0xe0, 0xdd, 0x2e, 0x8c, 0x27, + 0x93, 0xb7, 0xca, 0xc4, 0xcc, 0xb4, 0xe0, 0x45, 0x41, 0xb3, 0xfe, 0x1c, 0x78, 0x74, 0x74, 0xd8, + 0x31, 0xe4, 0x54, 0x00, 0x82, 0xfd, 0x05, 0xeb, 0xa1, 0x78, 0x70, 0xc7, 0xfc, 0x91, 0xa4, 0xdd, + 0xf5, 0xe2, 0xe9, 0x1d, 0xe9, 0x89, 0xc4, 0xcd, 0xa8, 0xc3, 0xa5, 0x99, 0x75, 0xf8, 0x0b, 0xb8, + 0xc7, 0x63, 0x9b, 0x79, 0x18, 0x84, 0x77, 0x38, 0xb1, 0x31, 0x0b, 0xed, 0xe9, 0x07, 0xc2, 0x2e, + 0xdc, 0x0f, 0xdf, 0x45, 0x33, 0xc7, 0xc2, 0xf2, 0xed, 0x1e, 0xf6, 0xc4, 0x1b, 0x6b, 0xc6, 0x68, + 0x68, 0x43, 0x3e, 0xf4, 0x91, 0x38, 0x12, 0xad, 0xfc, 0x87, 0x47, 0xa2, 0x35, 0xe1, 0x62, 0x78, + 0x2c, 0x2a, 0x8d, 0x5a, 0x4d, 0x8e, 0xe2, 0x04, 0x37, 0x9a, 0x20, 0xf7, 0xe2, 0xb7, 0x61, 0xcf, + 0xb5, 0x4d, 0xea, 0xc5, 0xc9, 0x13, 0x6b, 0xcc, 0xf1, 0xb4, 0xed, 0x44, 0xa4, 0x1a, 0xe7, 0x84, + 0xe9, 0x13, 0x89, 0xf8, 0x1c, 0x0a, 0x63, 0xa3, 0x7c, 0x58, 0x2a, 0x6b, 0xdc, 0xeb, 0xe6, 0xc8, + 0x34, 0x8f, 0xeb, 0xe5, 0x4b, 0xd8, 0x0d, 0xeb, 0x25, 0x3c, 0xfd, 0x8e, 0xea, 0x4a, 0x5c, 0xb7, + 0x20, 0x28, 0xe2, 0xbc, 0x3b, 0xa2, 0xfe, 0x39, 0x14, 0xd8, 0x2b, 0x7f, 0xaa, 0x6e, 0x5e, 0xf8, + 0x75, 0x6d, 0x73, 0x52, 0xb1, 0xf8, 0x9b, 0x54, 0xd4, 0xf5, 0x72, 0xf2, 0x90, 0xf7, 0x0e, 0x5d, + 0xff, 0x09, 0x6c, 0x88, 0x55, 0x8e, 0x9d, 0x19, 0xd3, 0xe2, 0xce, 0xc6, 0x31, 0x79, 0xfc, 0xe0, + 0xe8, 0x5f, 0x5f, 0x76, 0x5d, 0x7b, 0x5c, 0x25, 0x23, 0x66, 0x98, 0x00, 0x47, 0x74, 0x8a, 0xbf, + 0xcc, 0xc2, 0xbc, 0x68, 0x6f, 0xb4, 0x07, 0x90, 0x18, 0x00, 0x29, 0xbe, 0xaa, 0xc5, 0x5e, 0xd4, + 0xfa, 0x23, 0xb1, 0xa6, 0xc7, 0x62, 0x7d, 0x0c, 0xc8, 0x37, 0x7a, 0xd4, 0x1c, 0xd8, 0xd1, 0xb4, + 0x89, 0xae, 0x1e, 0x59, 0x2c, 0xc5, 0x08, 0xdf, 0x91, 0xba, 0xc9, 0x6e, 0x55, 0xcc, 0xec, 0xd4, + 0x32, 0xcf, 0xbe, 0xc3, 0xad, 0x4a, 0x28, 0x4f, 0x14, 0xf8, 0xcf, 0x60, 0xf7, 0x8a, 0x7a, 0xd6, + 0x2b, 0x6b, 0x9a, 0x61, 0x76, 0x39, 0xc9, 0xdc, 0x66, 0x79, 0x3b, 0xd2, 0x1f, 0xb7, 0xed, 0xa3, + 0xcf, 0x60, 0x9e, 0x1d, 0x7d, 0x07, 0xe2, 0xf2, 0x9b, 0x3b, 0xb9, 0x37, 0xd1, 0x32, 0x62, 0x17, + 0x35, 0x4e, 0xc2, 0x21, 0x99, 0x1d, 0xf9, 0x0d, 0x8f, 0xf2, 0x21, 0xdc, 0xa3, 0xd6, 0x45, 0x2f, + 0x08, 0x07, 0xda, 0x6a, 0x28, 0xad, 0x71, 0x21, 0xa3, 0x45, 0xb3, 0x3a, 0xa4, 0x2d, 0x0a, 0x5a, + 0x28, 0x0d, 0x69, 0x25, 0xc8, 0x9b, 0x54, 0x37, 0x6d, 0xcb, 0xa1, 0xc3, 0x5d, 0x0e, 0xcf, 0x6b, + 0x11, 0x10, 0x6d, 0xf2, 0x7d, 0x08, 0xaf, 0x2f, 0xe2, 0xee, 0x20, 0xae, 0x22, 0x20, 0x44, 0xfc, + 0xca, 0xb0, 0x01, 0x77, 0x1c, 0x97, 0xdd, 0x94, 0xf9, 0x64, 0xc1, 0xe2, 0xa1, 0xf8, 0xbb, 0x0c, + 0x2c, 0x73, 0x13, 0xe1, 0xb7, 0x90, 0xff, 0xde, 0x31, 0x7e, 0x1b, 0x16, 0xe3, 0x98, 0xd3, 0x3c, + 0xe6, 0x05, 0x1a, 0xc6, 0xfa, 0x00, 0x56, 0xc5, 0xe4, 0x8b, 0x56, 0x9f, 0xe1, 0xaf, 0xb6, 0x15, + 0x21, 0x0c, 0x17, 0x5f, 0x86, 0xe5, 0x9e, 0x1b, 0xcf, 0x48, 0x5e, 0x28, 0xcb, 0x27, 0xbb, 0x93, + 0x69, 0x88, 0xbf, 0xe3, 0x94, 0xb3, 0xdf, 0xff, 0xfd, 0xfe, 0x1c, 0x86, 0xde, 0xf0, 0xcb, 0x8e, + 0x07, 0xfb, 0xbe, 0x98, 0x6c, 0x24, 0xbe, 0x12, 0x11, 0x77, 0xf8, 0x6d, 0x42, 0x54, 0xc9, 0xf2, + 0xc9, 0xe3, 0x59, 0x03, 0x71, 0xda, 0x07, 0x0d, 0xbc, 0xe7, 0xcf, 0x06, 0x7d, 0xf4, 0x02, 0x36, + 0x23, 0x9f, 0x7d, 0x36, 0x4e, 0xc3, 0x51, 0xc9, 0x0a, 0x89, 0xb9, 0x7a, 0xf0, 0x0e, 0xb3, 0x17, + 0xaf, 0xfb, 0x13, 0x32, 0xbf, 0xa4, 0xc2, 0x52, 0xfc, 0x31, 0x03, 0x6d, 0x01, 0x6a, 0xa9, 0xb8, + 0x4d, 0xb4, 0xb6, 0xdc, 0x56, 0x48, 0xa7, 0x79, 0xd6, 0x54, 0x5f, 0x34, 0xa5, 0x39, 0xb4, 0x0e, + 0x6b, 0x09, 0xb9, 0xda, 0x52, 0x9a, 0x52, 0x0a, 0x6d, 0x42, 0x3e, 0x21, 0xac, 0x34, 0x54, 0x4d, + 0xa9, 0x4a, 0xe9, 0xd2, 0xdf, 0x52, 0xb0, 0x35, 0xfd, 0xde, 0x8f, 0x1e, 0xc1, 0x87, 0x5a, 0x5b, + 0xc5, 0xf2, 0x33, 0x85, 0xb4, 0xb0, 0xaa, 0x9e, 0x92, 0x72, 0xa7, 0x72, 0xa6, 0xb4, 0x49, 0xfb, + 0x65, 0x8b, 0x79, 0xd3, 0x5a, 0x4a, 0xa5, 0x7e, 0x5a, 0x57, 0xaa, 0xd2, 0x1c, 0xfa, 0x3f, 0x38, + 0x98, 0x4d, 0xc5, 0x4a, 0x45, 0x69, 0xb6, 0xa5, 0x14, 0xfa, 0x00, 0xee, 0xcd, 0x66, 0xa9, 0x8d, + 0xaa, 0x94, 0x46, 0x0f, 0xe1, 0xc1, 0x6c, 0x4a, 0x0b, 0xab, 0x65, 0xb9, 0x5d, 0x57, 0x9b, 0x52, + 0x06, 0x7d, 0x08, 0x1f, 0xdc, 0xe8, 0xb1, 0xa6, 0x54, 0xce, 0xa4, 0x6c, 0xe9, 0xd7, 0x29, 0xd8, + 0x9e, 0xf9, 0x25, 0x02, 0x3d, 0x86, 0xc3, 0x51, 0x23, 0x32, 0x6e, 0xd7, 0x4f, 0xe5, 0x4a, 0x9b, + 0x54, 0x1a, 0xb2, 0xa6, 0x8d, 0x2d, 0xf2, 0x23, 0x28, 0xde, 0xc8, 0xae, 0x37, 0xab, 0xca, 0xd7, + 0x52, 0x6a, 0x72, 0x0d, 0x63, 0x3c, 0xed, 0xe5, 0x79, 0x59, 0x6d, 0x48, 0xe9, 0xd2, 0x6f, 0x33, + 0x70, 0x77, 0xc6, 0x4b, 0x17, 0x95, 0xe0, 0xa3, 0x51, 0x23, 0x58, 0xd1, 0x3a, 0x8d, 0xe9, 0x81, + 0x3d, 0x80, 0xfb, 0x37, 0x70, 0x5b, 0xb2, 0xa6, 0x49, 0xa9, 0xc9, 0xb5, 0x8e, 0x90, 0x6a, 0xb2, + 0x56, 0x23, 0xe7, 0x75, 0xed, 0x5c, 0x6e, 0x57, 0x6a, 0x52, 0x1a, 0x7d, 0x06, 0xc7, 0x37, 0xb0, + 0xdb, 0xf5, 0x73, 0x45, 0xed, 0xb4, 0x89, 0x8a, 0x49, 0x53, 0x65, 0x50, 0x4b, 0x6d, 0x6a, 0x8a, + 0x94, 0x41, 0x9f, 0xc2, 0xd1, 0x0d, 0x6a, 0x6a, 0x59, 0x53, 0xf0, 0x73, 0x05, 0x93, 0xaf, 0x3a, + 0x2a, 0xee, 0x9c, 0x93, 0x53, 0xb9, 0xde, 0x90, 0xb2, 0xe8, 0x18, 0x9e, 0xdc, 0xa0, 0xd4, 0x54, + 0x89, 0xd2, 0xa8, 0x3f, 0xab, 0x97, 0x1b, 0x0a, 0x69, 0xd7, 0x59, 0x8e, 0xa5, 0x3b, 0xb7, 0xa8, + 0xd4, 0x9b, 0xcf, 0xe5, 0x46, 0xbd, 0x4a, 0xda, 0x58, 0x6e, 0x6a, 0x15, 0x5c, 0x6f, 0xb5, 0xa5, + 0xf9, 0x5b, 0x56, 0x14, 0x56, 0x0c, 0xa9, 0xa8, 0xcd, 0xd3, 0x3a, 0x3e, 0x57, 0xaa, 0x22, 0xb8, + 0x85, 0xd2, 0x9f, 0x53, 0x90, 0x9f, 0xb8, 0xdf, 0xb0, 0x1d, 0xc7, 0x0a, 0x6b, 0x27, 0x05, 0x93, + 0x36, 0xee, 0x68, 0x6d, 0x52, 0x96, 0x9b, 0xd5, 0xb1, 0xb4, 0xec, 0xc3, 0xce, 0x34, 0x52, 0x53, + 0xc5, 0xe7, 0x72, 0x43, 0xb4, 0xc3, 0x34, 0xbc, 0xa1, 0xbe, 0x10, 0x8f, 0x52, 0x1a, 0x3d, 0x81, + 0x47, 0xd3, 0x28, 0x95, 0x9a, 0xdc, 0x68, 0x28, 0xcd, 0x67, 0x0a, 0x26, 0xf5, 0x66, 0xb4, 0x3b, + 0x52, 0x06, 0x1d, 0xc0, 0xde, 0x34, 0x7a, 0x55, 0x79, 0x86, 0xe5, 0xaa, 0x52, 0x95, 0xb2, 0xa5, + 0x7f, 0xa6, 0x60, 0x25, 0xf9, 0xd2, 0x62, 0x41, 0xd6, 0x14, 0xb9, 0x41, 0xd4, 0x16, 0x9f, 0x0c, + 0x9d, 0xf1, 0xda, 0xda, 0x83, 0xc2, 0x18, 0xae, 0x55, 0x6a, 0x4a, 0xb5, 0xd3, 0x50, 0xaa, 0x52, + 0x6a, 0x8a, 0x76, 0xbd, 0xc9, 0xb6, 0xf7, 0x19, 0x56, 0x34, 0x4d, 0x4a, 0xa3, 0x22, 0xec, 0x8f, + 0xe1, 0xec, 0x51, 0xc1, 0x24, 0x0c, 0xb3, 0x2a, 0x65, 0xd0, 0x2e, 0xdc, 0x1d, 0xe3, 0x3c, 0x57, + 0xb0, 0x70, 0x9f, 0x45, 0xdb, 0xb0, 0x39, 0x06, 0xb2, 0xbc, 0x28, 0x55, 0xe9, 0x0e, 0xda, 0x81, + 0xad, 0x31, 0x48, 0xf9, 0xba, 0x55, 0xc7, 0x4a, 0x55, 0x9a, 0x2f, 0x97, 0xbe, 0x7f, 0xb3, 0x9f, + 0xfa, 0xe1, 0xcd, 0x7e, 0xea, 0x1f, 0x6f, 0xf6, 0x53, 0xdf, 0xbd, 0xdd, 0x9f, 0xfb, 0xe1, 0xed, + 0xfe, 0xdc, 0x5f, 0xdf, 0xee, 0xcf, 0xfd, 0x54, 0xfa, 0x76, 0xf8, 0x3f, 0x86, 0xe0, 0xba, 0x4f, + 0xfd, 0xee, 0x3c, 0xff, 0x7f, 0xc0, 0xa7, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xc6, 0x0d, 0x4d, + 0x25, 0x83, 0x18, 0x00, 0x00, } func (m *HostReport) Marshal() (dAtA []byte, err error) { @@ -1427,6 +1444,12 @@ func (m *HostReport) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.CascadeKademliaDbBytes != 0 { + i -= 8 + encoding_binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.CascadeKademliaDbBytes)))) + i-- + dAtA[i] = 0x31 + } if m.FailedActionsCount != 0 { i = encodeVarintAudit(dAtA, i, uint64(m.FailedActionsCount)) i-- @@ -2164,6 +2187,9 @@ func (m *HostReport) Size() (n int) { if m.FailedActionsCount != 0 { n += 1 + sovAudit(uint64(m.FailedActionsCount)) } + if m.CascadeKademliaDbBytes != 0 { + n += 9 + } return n } @@ -2661,6 +2687,17 @@ func (m *HostReport) Unmarshal(dAtA []byte) error { break } } + case 6: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field CascadeKademliaDbBytes", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + v = uint64(encoding_binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + m.CascadeKademliaDbBytes = float64(math.Float64frombits(v)) default: iNdEx = preIndex skippy, err := skipAudit(dAtA[iNdEx:]) diff --git a/x/audit/v1/types/errors.go b/x/audit/v1/types/errors.go index d19b61ad..9c83f98d 100644 --- a/x/audit/v1/types/errors.go +++ b/x/audit/v1/types/errors.go @@ -21,6 +21,7 @@ var ( ErrHealVerificationExists = errorsmod.Register(ModuleName, 15, "heal verification already submitted") ErrTicketArtifactMismatch = errorsmod.Register(ModuleName, 16, "ticket artifact count mismatch") ErrInvalidHealVerification = errorsmod.Register(ModuleName, 17, "invalid heal verification") + ErrInvalidHostMetric = errorsmod.Register(ModuleName, 18, "invalid host metric") ErrInvalidEvidenceType = errorsmod.Register(ModuleName, 1101, "invalid evidence type") ErrInvalidMetadata = errorsmod.Register(ModuleName, 1102, "invalid evidence metadata") From a76ea1f8ef1f4c3fbce6d11a543f3e6a003c8c69 Mon Sep 17 00:00:00 2001 From: Matee ullah Malik Date: Tue, 12 May 2026 21:34:38 +0000 Subject: [PATCH 2/2] test(systemtests): update Everlight storage-full eligibility reason MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After the audit→supernode metrics bridge added in this PR, the SupernodeMetricsState is written on every accepted epoch report. The sn-eligibility query now reaches the threshold gate (rawBytes=0) and returns 'cascade bytes below minimum threshold' instead of the pre-bridge 'no audit epoch report found' (which was a symptom of no writer existing). Substantive outcome — SN ineligible, no payout while storage-full — is unchanged. Only the rejection reason advances by one step. Fixes: failing system test TestEverlightSystem_PayoutAndHistoryWhileStorageFull on PR #140 CI. --- tests/systemtests/everlight_system_test.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/systemtests/everlight_system_test.go b/tests/systemtests/everlight_system_test.go index a5139a3e..a60d14a0 100644 --- a/tests/systemtests/everlight_system_test.go +++ b/tests/systemtests/everlight_system_test.go @@ -194,6 +194,12 @@ func TestEverlightSystem_PayoutAndHistoryWhileStorageFull(t *testing.T) { elig := cli.CustomQuery("q", "supernode", "sn-eligibility", n0.valAddr) require.False(t, gjson.Get(elig, "eligible").Bool()) - // Per CP3 rebase — supernode keeper returns "no audit epoch report found" earlier in the path. - require.Equal(t, "no audit epoch report found", gjson.Get(elig, "reason").String()) + // With the audit→supernode metrics bridge live, every accepted epoch report + // writes SupernodeMetricsState.CascadeKademliaDbBytes (0 here, since the + // host_report payload above carries no cascade_kademlia_db_bytes field). + // Eligibility therefore reaches the threshold check and rejects with + // "cascade bytes below minimum threshold" instead of the pre-bridge + // "no audit epoch report found". Substantive outcome (ineligible, no + // payout) is unchanged — only the rejection reason advances by one step. + require.Equal(t, "cascade bytes below minimum threshold", gjson.Get(elig, "reason").String()) }