mirror of
https://github.com/fluencelabs/marine.git
synced 2024-12-12 14:55:32 +00:00
adjust AquamarineVM error mapping
This commit is contained in:
parent
d52eb4432f
commit
f4680075f4
62
Cargo.lock
generated
62
Cargo.lock
generated
@ -2,11 +2,11 @@
|
|||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "addr2line"
|
name = "addr2line"
|
||||||
version = "0.13.0"
|
version = "0.14.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1b6a2d3371669ab3ca9797670853d61402b03d0b4b9ebf33d677dfa720203072"
|
checksum = "7c0929d69e78dd9bf5408269919fcbcaeb2e35e5d43e5815517cdc6a8e11a423"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"gimli 0.22.0",
|
"gimli 0.23.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -96,9 +96,9 @@ checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "backtrace"
|
name = "backtrace"
|
||||||
version = "0.3.53"
|
version = "0.3.54"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "707b586e0e2f247cbde68cdd2c3ce69ea7b7be43e1c5b426e37c9319c4b9838e"
|
checksum = "2baad346b2d4e94a24347adeee9c7a93f412ee94b9cc26e5b59dea23848e9f28"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"addr2line",
|
"addr2line",
|
||||||
"cfg-if 1.0.0",
|
"cfg-if 1.0.0",
|
||||||
@ -727,20 +727,20 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "fluence"
|
name = "fluence"
|
||||||
version = "0.2.8"
|
version = "0.2.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "git+https://github.com/fluencelabs/rust-sdk#a6c587db0b6f22c3d3af81f10b187f148f8e9d30"
|
||||||
checksum = "12efe44782ef6842b824dd281f79f808597a2c280d1facc06bb62b9cf8fbc2ef"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"fluence-sdk-macro 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"fluence-sdk-macro 0.2.8 (git+https://github.com/fluencelabs/rust-sdk)",
|
||||||
"fluence-sdk-main 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"fluence-sdk-main 0.2.8 (git+https://github.com/fluencelabs/rust-sdk)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fluence"
|
name = "fluence"
|
||||||
version = "0.2.8"
|
version = "0.2.8"
|
||||||
source = "git+https://github.com/fluencelabs/rust-sdk#a6c587db0b6f22c3d3af81f10b187f148f8e9d30"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "12efe44782ef6842b824dd281f79f808597a2c280d1facc06bb62b9cf8fbc2ef"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"fluence-sdk-macro 0.2.8 (git+https://github.com/fluencelabs/rust-sdk)",
|
"fluence-sdk-macro 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"fluence-sdk-main 0.2.8 (git+https://github.com/fluencelabs/rust-sdk)",
|
"fluence-sdk-main 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -780,6 +780,14 @@ dependencies = [
|
|||||||
"wasmer-wasi-fl",
|
"wasmer-wasi-fl",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fluence-sdk-macro"
|
||||||
|
version = "0.2.8"
|
||||||
|
source = "git+https://github.com/fluencelabs/rust-sdk#a6c587db0b6f22c3d3af81f10b187f148f8e9d30"
|
||||||
|
dependencies = [
|
||||||
|
"fluence-sdk-wit 0.2.8 (git+https://github.com/fluencelabs/rust-sdk)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fluence-sdk-macro"
|
name = "fluence-sdk-macro"
|
||||||
version = "0.2.8"
|
version = "0.2.8"
|
||||||
@ -790,11 +798,13 @@ dependencies = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fluence-sdk-macro"
|
name = "fluence-sdk-main"
|
||||||
version = "0.2.8"
|
version = "0.2.8"
|
||||||
source = "git+https://github.com/fluencelabs/rust-sdk#a6c587db0b6f22c3d3af81f10b187f148f8e9d30"
|
source = "git+https://github.com/fluencelabs/rust-sdk#a6c587db0b6f22c3d3af81f10b187f148f8e9d30"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"fluence-sdk-wit 0.2.8 (git+https://github.com/fluencelabs/rust-sdk)",
|
"fluence-sdk-macro 0.2.8 (git+https://github.com/fluencelabs/rust-sdk)",
|
||||||
|
"log",
|
||||||
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -808,21 +818,10 @@ dependencies = [
|
|||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "fluence-sdk-main"
|
|
||||||
version = "0.2.8"
|
|
||||||
source = "git+https://github.com/fluencelabs/rust-sdk#a6c587db0b6f22c3d3af81f10b187f148f8e9d30"
|
|
||||||
dependencies = [
|
|
||||||
"fluence-sdk-macro 0.2.8 (git+https://github.com/fluencelabs/rust-sdk)",
|
|
||||||
"log",
|
|
||||||
"serde",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fluence-sdk-wit"
|
name = "fluence-sdk-wit"
|
||||||
version = "0.2.8"
|
version = "0.2.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "git+https://github.com/fluencelabs/rust-sdk#a6c587db0b6f22c3d3af81f10b187f148f8e9d30"
|
||||||
checksum = "560baf91197ded38a99a5c94ff366a3dd971ebf33f5d987ecce31d3dedf86d17"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@ -835,7 +834,8 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "fluence-sdk-wit"
|
name = "fluence-sdk-wit"
|
||||||
version = "0.2.8"
|
version = "0.2.8"
|
||||||
source = "git+https://github.com/fluencelabs/rust-sdk#a6c587db0b6f22c3d3af81f10b187f148f8e9d30"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "560baf91197ded38a99a5c94ff366a3dd971ebf33f5d987ecce31d3dedf86d17"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@ -1016,9 +1016,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "gimli"
|
name = "gimli"
|
||||||
version = "0.22.0"
|
version = "0.23.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724"
|
checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "h2"
|
name = "h2"
|
||||||
@ -1553,9 +1553,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "object"
|
name = "object"
|
||||||
version = "0.21.1"
|
version = "0.22.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "37fd5004feb2ce328a52b0b3d01dbf4ffff72583493900ed15f22d4111c51693"
|
checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "once_cell"
|
name = "once_cell"
|
||||||
|
@ -25,86 +25,77 @@ use std::error::Error;
|
|||||||
#[derive(Debug, Default, Clone, PartialEq, Eq)]
|
#[derive(Debug, Default, Clone, PartialEq, Eq)]
|
||||||
pub(crate) struct RawStepperOutcome {
|
pub(crate) struct RawStepperOutcome {
|
||||||
pub ret_code: i32,
|
pub ret_code: i32,
|
||||||
pub data: String,
|
pub data: err_msg,
|
||||||
pub next_peer_pks: Vec<String>,
|
pub next_peer_pks: Vec<err_msg>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Default, Clone, PartialEq, Eq)]
|
#[derive(Debug, Default, Clone, PartialEq, Eq)]
|
||||||
pub struct StepperOutcome {
|
pub struct StepperOutcome {
|
||||||
pub data: String,
|
pub data: err_msg,
|
||||||
pub next_peer_pks: Vec<String>,
|
pub next_peer_pks: Vec<err_msg>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub enum StepperError {
|
pub enum StepperError {
|
||||||
/// Errors occurred while parsing aqua script in the form of S expressions.
|
/// Errors occurred while parsing aqua script in the form of S expressions.
|
||||||
SExprParseError(String),
|
SExprParseError(err_msg),
|
||||||
|
|
||||||
/// Errors occurred on aqua data deserialization.
|
|
||||||
DataDeserializationError(String),
|
|
||||||
|
|
||||||
/// Errors occurred on aqua data serialization.
|
|
||||||
DataSerializationError(String),
|
|
||||||
|
|
||||||
/// Errors occurred while parsing function arguments of an expression.
|
/// Errors occurred while parsing function arguments of an expression.
|
||||||
FuncArgsSerdeError(String),
|
FuncArgsSerializationError(err_msg),
|
||||||
|
|
||||||
/// Errors occurred while parsing returned by call_service value.
|
/// Errors occurred while parsing returned by call_service value.
|
||||||
CallServiceSerdeError(String),
|
CallServiceResultDeserializationError(err_msg),
|
||||||
|
|
||||||
/// Indicates that environment variable with name CURRENT_PEER_ID isn't set.
|
/// Indicates that environment variable with name CURRENT_PEER_ID isn't set.
|
||||||
CurrentPeerIdEnvError(String),
|
CurrentPeerIdEnvError(err_msg),
|
||||||
|
|
||||||
/// Semantic errors in instructions.
|
/// Semantic errors in instructions.
|
||||||
InstructionError(String),
|
InstructionError(err_msg),
|
||||||
|
|
||||||
/// An error is occurred while calling local service via call_service.
|
/// An error is occurred while calling local service via call_service.
|
||||||
LocalServiceError(String),
|
LocalServiceError(err_msg),
|
||||||
|
|
||||||
/// Value for such name isn't presence in data.
|
/// Value for such name isn't presence in data.
|
||||||
VariableNotFound(String),
|
VariableNotFound(err_msg),
|
||||||
|
|
||||||
/// Multiple values for such name found.
|
/// Multiple values for such name found.
|
||||||
MultipleVariablesFound(String),
|
MultipleVariablesFound(err_msg),
|
||||||
|
|
||||||
/// Value with such path wasn't found in data with such error.
|
/// Value with such path wasn't found in data with such error.
|
||||||
VariableNotInJsonPath(String),
|
VariableNotInJsonPath(err_msg),
|
||||||
|
|
||||||
/// Value for such name isn't presence in data.
|
/// Provided JValue has incompatible with target type.
|
||||||
IncompatibleJValueType(String),
|
IncompatibleJValueType(err_msg),
|
||||||
|
|
||||||
|
/// Provided AValue has incompatible with target type.
|
||||||
|
IncompatibleAValueType(err_msg),
|
||||||
|
|
||||||
/// Multiple values found for such json path.
|
/// Multiple values found for such json path.
|
||||||
MultipleValuesInJsonPath(String),
|
MultipleValuesInJsonPath(err_msg),
|
||||||
|
|
||||||
/// Fold state wasn't found for such iterator name.
|
/// Fold state wasn't found for such iterator name.
|
||||||
FoldStateNotFound(String),
|
FoldStateNotFound(err_msg),
|
||||||
|
|
||||||
/// Multiple fold states found for such iterator name.
|
/// Multiple fold states found for such iterator name.
|
||||||
MultipleFoldStates(String),
|
MultipleFoldStates(err_msg),
|
||||||
|
|
||||||
/// Expected evidence state of different type.
|
/// Expected evidence state of different type.
|
||||||
InvalidEvidenceState(String),
|
InvalidEvidenceState(err_msg),
|
||||||
|
|
||||||
/// Related to such ret_code that doesn't have match with current StepperError.
|
|
||||||
UnknownError(String),
|
|
||||||
|
|
||||||
/// Errors occurred on call evidence deserialization.
|
/// Errors occurred on call evidence deserialization.
|
||||||
CallEvidenceDeserializationError(String),
|
CallEvidenceDeserializationError(err_msg),
|
||||||
|
|
||||||
/// Errors occurred on call evidence serialization.
|
/// Errors occurred on call evidence serialization.
|
||||||
CallEvidenceSerializationError(String),
|
CallEvidenceSerializationError(err_msg),
|
||||||
|
|
||||||
/// Errors occurred when reserved keyword is used for variable name.
|
|
||||||
ReservedKeywordError(String),
|
|
||||||
|
|
||||||
/// Errors occurred when previous and current evidence states are incompatible.
|
/// Errors occurred when previous and current evidence states are incompatible.
|
||||||
IncompatibleEvidenceStates(String),
|
IncompatibleEvidenceStates(err_msg),
|
||||||
|
|
||||||
/// Errors occurred when previous and current call results are incompatible.
|
/// Errors occurred when previous and current call results are incompatible.
|
||||||
IncompatibleCallResults(String),
|
IncompatibleCallResults(err_msg),
|
||||||
|
|
||||||
/// Errors occurred when evidence path contains less elements then corresponding Par has.
|
/// Errors occurred when evidence path contains less elements then corresponding Par has.
|
||||||
EvidencePathTooSmall(String),
|
EvidencePathTooSmall(err_msg),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Error for StepperError {}
|
impl Error for StepperError {}
|
||||||
@ -112,29 +103,28 @@ impl Error for StepperError {}
|
|||||||
impl std::fmt::Display for StepperError {
|
impl std::fmt::Display for StepperError {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
|
||||||
match self {
|
match self {
|
||||||
StepperError::SExprParseError(err_msg) => write!(f, "{}", err_msg),
|
StepperError::SExprParseError(err_msg) => writeln!(f, "{}", err_msg),
|
||||||
StepperError::DataDeserializationError(err_msg) => write!(f, "{}", err_msg),
|
StepperError::FuncArgsSerializationError(err_msg) => writeln!(f, "{}", err_msg),
|
||||||
StepperError::DataSerializationError(err_msg) => write!(f, "{}", err_msg),
|
StepperError::CallServiceResultDeserializationError(err_msg) => {
|
||||||
StepperError::FuncArgsSerdeError(err_msg) => write!(f, "{}", err_msg),
|
writeln!(f, "{}", err_msg)
|
||||||
StepperError::CallServiceSerdeError(err_msg) => write!(f, "{}", err_msg),
|
}
|
||||||
StepperError::CurrentPeerIdEnvError(err_msg) => write!(f, "{}", err_msg),
|
StepperError::CurrentPeerIdEnvError(err_msg) => writeln!(f, "{}", err_msg),
|
||||||
StepperError::InstructionError(err_msg) => write!(f, "{}", err_msg),
|
StepperError::InstructionError(err_msg) => writeln!(f, "{}", err_msg),
|
||||||
StepperError::LocalServiceError(err_msg) => write!(f, "{}", err_msg),
|
StepperError::LocalServiceError(err_msg) => writeln!(f, "{}", err_msg),
|
||||||
StepperError::VariableNotFound(err_msg) => write!(f, "{}", err_msg),
|
StepperError::VariableNotFound(err_msg) => writeln!(f, "{}", err_msg),
|
||||||
StepperError::MultipleVariablesFound(err_msg) => write!(f, "{}", err_msg),
|
StepperError::MultipleVariablesFound(err_msg) => writeln!(f, "{}", err_msg),
|
||||||
StepperError::VariableNotInJsonPath(err_msg) => write!(f, "{}", err_msg),
|
StepperError::VariableNotInJsonPath(err_msg) => writeln!(f, "{}", err_msg),
|
||||||
StepperError::IncompatibleJValueType(err_msg) => write!(f, "{}", err_msg),
|
StepperError::IncompatibleJValueType(err_msg) => writeln!(f, "{}", err_msg),
|
||||||
StepperError::MultipleValuesInJsonPath(err_msg) => write!(f, "{}", err_msg),
|
StepperError::IncompatibleAValueType(err_msg) => writeln!(f, "{}", err_msg),
|
||||||
StepperError::FoldStateNotFound(err_msg) => write!(f, "{}", err_msg),
|
StepperError::MultipleValuesInJsonPath(err_msg) => writeln!(f, "{}", err_msg),
|
||||||
StepperError::MultipleFoldStates(err_msg) => write!(f, "{}", err_msg),
|
StepperError::FoldStateNotFound(err_msg) => writeln!(f, "{}", err_msg),
|
||||||
StepperError::InvalidEvidenceState(err_msg) => write!(f, "{}", err_msg),
|
StepperError::MultipleFoldStates(err_msg) => writeln!(f, "{}", err_msg),
|
||||||
StepperError::CallEvidenceDeserializationError(err_msg) => write!(f, "{}", err_msg),
|
StepperError::InvalidEvidenceState(err_msg) => writeln!(f, "{}", err_msg),
|
||||||
StepperError::CallEvidenceSerializationError(err_msg) => write!(f, "{}", err_msg),
|
StepperError::CallEvidenceDeserializationError(err_msg) => writeln!(f, "{}", err_msg),
|
||||||
StepperError::ReservedKeywordError(err_msg) => write!(f, "{}", err_msg),
|
StepperError::CallEvidenceSerializationError(err_msg) => writeln!(f, "{}", err_msg),
|
||||||
StepperError::IncompatibleEvidenceStates(err_msg) => write!(f, "{}", err_msg),
|
StepperError::IncompatibleEvidenceStates(err_msg) => writeln!(f, "{}", err_msg),
|
||||||
StepperError::IncompatibleCallResults(err_msg) => write!(f, "{}", err_msg),
|
StepperError::IncompatibleCallResults(err_msg) => writeln!(f, "{}", err_msg),
|
||||||
StepperError::EvidencePathTooSmall(err_msg) => write!(f, "{}", err_msg),
|
StepperError::EvidencePathTooSmall(err_msg) => writeln!(f, "{}", err_msg),
|
||||||
StepperError::UnknownError(err_msg) => write!(f, "{}", err_msg),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -157,26 +147,25 @@ impl TryFrom<RawStepperOutcome> for StepperOutcome {
|
|||||||
next_peer_pks: raw_outcome.next_peer_pks,
|
next_peer_pks: raw_outcome.next_peer_pks,
|
||||||
}),
|
}),
|
||||||
1 => to_vm_error!(SExprParseError),
|
1 => to_vm_error!(SExprParseError),
|
||||||
2 => to_vm_error!(DataDeserializationError),
|
2 => to_vm_error!(FuncArgsSerializationError),
|
||||||
3 => to_vm_error!(DataSerializationError),
|
3 => to_vm_error!(CallServiceResultDeserializationError),
|
||||||
4 => to_vm_error!(FuncArgsSerdeError),
|
4 => to_vm_error!(CurrentPeerIdEnvError),
|
||||||
5 => to_vm_error!(CallServiceSerdeError),
|
5 => to_vm_error!(InstructionError),
|
||||||
6 => to_vm_error!(CurrentPeerIdEnvError),
|
6 => to_vm_error!(LocalServiceError),
|
||||||
7 => to_vm_error!(InstructionError),
|
7 => to_vm_error!(VariableNotFound),
|
||||||
8 => to_vm_error!(LocalServiceError),
|
8 => to_vm_error!(MultipleVariablesFound),
|
||||||
9 => to_vm_error!(VariableNotFound),
|
9 => to_vm_error!(VariableNotInJsonPath),
|
||||||
10 => to_vm_error!(MultipleVariablesFound),
|
10 => to_vm_error!(IncompatibleJValueType),
|
||||||
11 => to_vm_error!(VariableNotInJsonPath),
|
11 => to_vm_error!(IncompatibleAValueType),
|
||||||
12 => to_vm_error!(IncompatibleJValueType),
|
12 => to_vm_error!(MultipleValuesInJsonPath),
|
||||||
13 => to_vm_error!(MultipleValuesInJsonPath),
|
13 => to_vm_error!(FoldStateNotFound),
|
||||||
14 => to_vm_error!(FoldStateNotFound),
|
14 => to_vm_error!(MultipleFoldStates),
|
||||||
15 => to_vm_error!(MultipleFoldStates),
|
15 => to_vm_error!(InvalidEvidenceState),
|
||||||
16 => to_vm_error!(CallEvidenceDeserializationError),
|
16 => to_vm_error!(CallEvidenceDeserializationError),
|
||||||
17 => to_vm_error!(CallEvidenceSerializationError),
|
17 => to_vm_error!(CallEvidenceSerializationError),
|
||||||
18 => to_vm_error!(ReservedKeywordError),
|
18 => to_vm_error!(IncompatibleEvidenceStates),
|
||||||
19 => to_vm_error!(IncompatibleEvidenceStates),
|
19 => to_vm_error!(IncompatibleCallResults),
|
||||||
20 => to_vm_error!(IncompatibleCallResults),
|
20 => to_vm_error!(EvidencePathTooSmall),
|
||||||
21 => to_vm_error!(EvidencePathTooSmall),
|
|
||||||
_ => to_vm_error!(UnknownError),
|
_ => to_vm_error!(UnknownError),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user