Skip to content

Commit 99efc7c

Browse files
committed
Handle redeclaration in estimate fee, closes #3253
commit-id:f3897b34
1 parent 45b75a3 commit 99efc7c

File tree

2 files changed

+58
-2
lines changed

2 files changed

+58
-2
lines changed

crates/sncast/src/starknet_commands/declare.rs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@ use sncast::helpers::rpc::RpcArgs;
99
use sncast::response::declare::{
1010
AlreadyDeclaredResponse, DeclareResponse, DeclareTransactionResponse,
1111
};
12-
use sncast::response::errors::StarknetCommandError;
12+
use sncast::response::errors::{SNCastProviderError, SNCastStarknetError, StarknetCommandError};
1313
use sncast::{ErrorData, WaitForTx, apply_optional_fields, handle_wait_for_tx};
1414
use starknet::accounts::AccountError::Provider;
1515
use starknet::accounts::{ConnectedAccount, DeclarationV3};
16-
use starknet::core::types::{DeclareTransactionResult, StarknetError};
16+
use starknet::core::types::{
17+
ContractExecutionError, DeclareTransactionResult, StarknetError, TransactionExecutionErrorData,
18+
};
1719
use starknet::providers::ProviderError;
1820
use starknet::{
1921
accounts::{Account, SingleOwnerAccount},
@@ -156,6 +158,21 @@ pub(crate) async fn declare_with_artifacts(
156158
class_hash: class_hash.into_(),
157159
}))
158160
}
161+
Err(Provider(ProviderError::StarknetError(StarknetError::TransactionExecutionError(
162+
TransactionExecutionErrorData {
163+
execution_error: ContractExecutionError::Message(message),
164+
..
165+
},
166+
)))) if message.contains("is already declared") && skip_on_already_declared => {
167+
Ok(DeclareResponse::AlreadyDeclared(AlreadyDeclaredResponse {
168+
class_hash: class_hash.into_(),
169+
}))
170+
}
171+
Err(Provider(ProviderError::StarknetError(StarknetError::TransactionExecutionError(
172+
TransactionExecutionErrorData { .. },
173+
)))) => Err(StarknetCommandError::ProviderError(
174+
SNCastProviderError::StarknetError(SNCastStarknetError::ClassAlreadyDeclared),
175+
)),
159176
Err(Provider(error)) => Err(StarknetCommandError::ProviderError(error.into())),
160177
Err(error) => Err(anyhow!(format!("Unexpected error occurred: {error}")).into()),
161178
}

crates/sncast/tests/e2e/declare.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,45 @@ async fn test_contract_already_declared() {
266266
);
267267
}
268268

269+
#[tokio::test]
270+
async fn test_contract_already_declared_estimate_fee() {
271+
let tempdir = duplicate_contract_directory_with_salt(
272+
CONTRACTS_DIR.to_string() + "/map",
273+
"put",
274+
"74362345",
275+
);
276+
let accounts_json_path = get_accounts_path("tests/data/accounts/accounts.json");
277+
278+
let args = vec![
279+
"--accounts-file",
280+
accounts_json_path.as_str(),
281+
"--account",
282+
"user1",
283+
"declare",
284+
"--url",
285+
URL,
286+
"--contract-name",
287+
"Map",
288+
];
289+
// Commented out because we explicitly do not want to set any resource bounds.
290+
// Transaction has to go through estimate fee endpoint first because it throws different errors
291+
// than the normal declare endpoint and we want to test them.
292+
// let args = apply_test_resource_bounds_flags(args);
293+
294+
runner(&args).current_dir(tempdir.path()).assert().success();
295+
296+
let snapbox = runner(&args).current_dir(tempdir.path());
297+
let output = snapbox.assert().success();
298+
299+
assert_stderr_contains(
300+
output,
301+
indoc! {r"
302+
Command: declare
303+
Error: Contract with the same class hash is already declared
304+
"},
305+
);
306+
}
307+
269308
#[tokio::test]
270309
async fn test_invalid_nonce() {
271310
let contract_path =

0 commit comments

Comments
 (0)