diff --git a/common/cosmwasm-smart-contracts/coconut-dkg/src/msg.rs b/common/cosmwasm-smart-contracts/coconut-dkg/src/msg.rs index 4e2a155c3f..0b3da8a552 100644 --- a/common/cosmwasm-smart-contracts/coconut-dkg/src/msg.rs +++ b/common/cosmwasm-smart-contracts/coconut-dkg/src/msg.rs @@ -13,13 +13,13 @@ use cosmwasm_schema::cw_serde; use crate::{ dealer::{ DealerDetailsResponse, PagedDealerIndexResponse, PagedDealerResponse, - RegisteredDealerDetails, StateAdvanceResponse, + RegisteredDealerDetails, }, dealing::{ DealerDealingsStatusResponse, DealingChunkResponse, DealingChunkStatusResponse, DealingMetadataResponse, DealingStatusResponse, }, - types::{Epoch, State}, + types::{Epoch, State, StateAdvanceResponse}, verification_key::{PagedVKSharesResponse, VkShareResponse}, }; #[cfg(feature = "schema")] diff --git a/contracts/coconut-dkg/schema/nym-coconut-dkg.json b/contracts/coconut-dkg/schema/nym-coconut-dkg.json index 7ac69ca8c5..43f3a69975 100644 --- a/contracts/coconut-dkg/schema/nym-coconut-dkg.json +++ b/contracts/coconut-dkg/schema/nym-coconut-dkg.json @@ -374,6 +374,19 @@ }, "additionalProperties": false }, + { + "type": "object", + "required": [ + "can_advance_state" + ], + "properties": { + "can_advance_state": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, { "type": "object", "required": [ @@ -741,6 +754,215 @@ }, "sudo": null, "responses": { + "can_advance_state": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "StateAdvanceResponse", + "type": "object", + "required": [ + "current_state", + "is_complete", + "progress", + "reached_deadline" + ], + "properties": { + "current_state": { + "$ref": "#/definitions/EpochState" + }, + "deadline": { + "anyOf": [ + { + "$ref": "#/definitions/Timestamp" + }, + { + "type": "null" + } + ] + }, + "is_complete": { + "type": "boolean" + }, + "progress": { + "$ref": "#/definitions/StateProgress" + }, + "reached_deadline": { + "type": "boolean" + } + }, + "additionalProperties": false, + "definitions": { + "EpochState": { + "oneOf": [ + { + "type": "string", + "enum": [ + "waiting_initialisation", + "in_progress" + ] + }, + { + "type": "object", + "required": [ + "public_key_submission" + ], + "properties": { + "public_key_submission": { + "type": "object", + "required": [ + "resharing" + ], + "properties": { + "resharing": { + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "dealing_exchange" + ], + "properties": { + "dealing_exchange": { + "type": "object", + "required": [ + "resharing" + ], + "properties": { + "resharing": { + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "verification_key_submission" + ], + "properties": { + "verification_key_submission": { + "type": "object", + "required": [ + "resharing" + ], + "properties": { + "resharing": { + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "verification_key_validation" + ], + "properties": { + "verification_key_validation": { + "type": "object", + "required": [ + "resharing" + ], + "properties": { + "resharing": { + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "verification_key_finalization" + ], + "properties": { + "verification_key_finalization": { + "type": "object", + "required": [ + "resharing" + ], + "properties": { + "resharing": { + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + "StateProgress": { + "type": "object", + "required": [ + "registered_dealers", + "registered_resharing_dealers", + "submitted_dealings", + "submitted_key_shares", + "verified_keys" + ], + "properties": { + "registered_dealers": { + "description": "Counts the number of dealers that have registered in this epoch.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "registered_resharing_dealers": { + "description": "Counts the number of resharing dealers that have registered in this epoch. This field is only populated during a resharing exchange. It is always <= registered_dealers.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "submitted_dealings": { + "description": "Counts the number of fully received dealings (i.e. full chunks) from all the allowed dealers.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "submitted_key_shares": { + "description": "Counts the number of submitted verification key shared from the dealers.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "verified_keys": { + "description": "Counts the number of verified key shares.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + }, + "Timestamp": { + "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", + "allOf": [ + { + "$ref": "#/definitions/Uint64" + } + ] + }, + "Uint64": { + "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", + "type": "string" + } + } + }, "get_c_w2_contract_version": { "$schema": "http://json-schema.org/draft-07/schema#", "title": "ContractVersion", diff --git a/contracts/coconut-dkg/schema/raw/query.json b/contracts/coconut-dkg/schema/raw/query.json index 714003786d..72e1e095cd 100644 --- a/contracts/coconut-dkg/schema/raw/query.json +++ b/contracts/coconut-dkg/schema/raw/query.json @@ -41,6 +41,19 @@ }, "additionalProperties": false }, + { + "type": "object", + "required": [ + "can_advance_state" + ], + "properties": { + "can_advance_state": { + "type": "object", + "additionalProperties": false + } + }, + "additionalProperties": false + }, { "type": "object", "required": [ diff --git a/contracts/coconut-dkg/schema/raw/response_to_can_advance_state.json b/contracts/coconut-dkg/schema/raw/response_to_can_advance_state.json new file mode 100644 index 0000000000..80f27e02ba --- /dev/null +++ b/contracts/coconut-dkg/schema/raw/response_to_can_advance_state.json @@ -0,0 +1,209 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "StateAdvanceResponse", + "type": "object", + "required": [ + "current_state", + "is_complete", + "progress", + "reached_deadline" + ], + "properties": { + "current_state": { + "$ref": "#/definitions/EpochState" + }, + "deadline": { + "anyOf": [ + { + "$ref": "#/definitions/Timestamp" + }, + { + "type": "null" + } + ] + }, + "is_complete": { + "type": "boolean" + }, + "progress": { + "$ref": "#/definitions/StateProgress" + }, + "reached_deadline": { + "type": "boolean" + } + }, + "additionalProperties": false, + "definitions": { + "EpochState": { + "oneOf": [ + { + "type": "string", + "enum": [ + "waiting_initialisation", + "in_progress" + ] + }, + { + "type": "object", + "required": [ + "public_key_submission" + ], + "properties": { + "public_key_submission": { + "type": "object", + "required": [ + "resharing" + ], + "properties": { + "resharing": { + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "dealing_exchange" + ], + "properties": { + "dealing_exchange": { + "type": "object", + "required": [ + "resharing" + ], + "properties": { + "resharing": { + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "verification_key_submission" + ], + "properties": { + "verification_key_submission": { + "type": "object", + "required": [ + "resharing" + ], + "properties": { + "resharing": { + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "verification_key_validation" + ], + "properties": { + "verification_key_validation": { + "type": "object", + "required": [ + "resharing" + ], + "properties": { + "resharing": { + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "verification_key_finalization" + ], + "properties": { + "verification_key_finalization": { + "type": "object", + "required": [ + "resharing" + ], + "properties": { + "resharing": { + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + "StateProgress": { + "type": "object", + "required": [ + "registered_dealers", + "registered_resharing_dealers", + "submitted_dealings", + "submitted_key_shares", + "verified_keys" + ], + "properties": { + "registered_dealers": { + "description": "Counts the number of dealers that have registered in this epoch.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "registered_resharing_dealers": { + "description": "Counts the number of resharing dealers that have registered in this epoch. This field is only populated during a resharing exchange. It is always <= registered_dealers.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "submitted_dealings": { + "description": "Counts the number of fully received dealings (i.e. full chunks) from all the allowed dealers.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "submitted_key_shares": { + "description": "Counts the number of submitted verification key shared from the dealers.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "verified_keys": { + "description": "Counts the number of verified key shares.", + "type": "integer", + "format": "uint32", + "minimum": 0.0 + } + }, + "additionalProperties": false + }, + "Timestamp": { + "description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```", + "allOf": [ + { + "$ref": "#/definitions/Uint64" + } + ] + }, + "Uint64": { + "description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```", + "type": "string" + } + } +} diff --git a/contracts/coconut-dkg/src/epoch_state/queries.rs b/contracts/coconut-dkg/src/epoch_state/queries.rs index 76ea8ac9d7..45eb3bcaf5 100644 --- a/contracts/coconut-dkg/src/epoch_state/queries.rs +++ b/contracts/coconut-dkg/src/epoch_state/queries.rs @@ -4,7 +4,7 @@ use crate::epoch_state::storage::{CURRENT_EPOCH, THRESHOLD}; use crate::epoch_state::utils::check_state_completion; use crate::error::ContractError; -use cosmwasm_std::{Env, StdResult, Storage}; +use cosmwasm_std::{Env, Storage}; use nym_coconut_dkg_common::types::{Epoch, EpochState, StateAdvanceResponse}; pub(crate) fn query_can_advance_state(