Skip to content

Commit 48005c7

Browse files
feat: Add error code to certified rejects (#620)
1 parent f1caf8a commit 48005c7

File tree

4 files changed

+27
-8
lines changed

4 files changed

+27
-8
lines changed

.github/workflows/ic-ref.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ jobs:
2929
- name: Install dfx
3030
uses: dfinity/setup-dfx@main
3131
with:
32-
dfx-version: "0.24.2"
32+
dfx-version: "0.24.3"
3333

3434
- name: Cargo cache
3535
uses: actions/cache@v4

ic-agent/src/agent/response_authentication.rs

+19-1
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,12 @@ pub(crate) fn lookup_rejection<Storage: AsRef<[u8]>>(
108108
) -> Result<RequestStatusResponse, AgentError> {
109109
let reject_code = lookup_reject_code(certificate, request_id)?;
110110
let reject_message = lookup_reject_message(certificate, request_id)?;
111+
let error_code = lookup_error_code(certificate, request_id)?;
111112

112113
Ok(RequestStatusResponse::Rejected(RejectResponse {
113114
reject_code,
114115
reject_message,
115-
error_code: None,
116+
error_code,
116117
}))
117118
}
118119

@@ -144,6 +145,23 @@ pub(crate) fn lookup_reject_message<Storage: AsRef<[u8]>>(
144145
Ok(from_utf8(msg)?.to_string())
145146
}
146147

148+
pub(crate) fn lookup_error_code<Storage: AsRef<[u8]>>(
149+
certificate: &Certificate<Storage>,
150+
request_id: &RequestId,
151+
) -> Result<Option<String>, AgentError> {
152+
let path = [
153+
"request_status".as_bytes(),
154+
request_id.as_slice(),
155+
"error_code".as_bytes(),
156+
];
157+
let msg = lookup_value(&certificate.tree, path);
158+
match msg {
159+
Ok(val) => Ok(Some(from_utf8(val)?.to_string())),
160+
Err(AgentError::LookupPathAbsent(_)) => Ok(None),
161+
Err(e) => Err(e),
162+
}
163+
}
164+
147165
pub(crate) fn lookup_reply<Storage: AsRef<[u8]>>(
148166
certificate: &Certificate<Storage>,
149167
request_id: &RequestId,

ref-tests/tests/ic-ref.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -515,8 +515,9 @@ mod management_canister {
515515
Err(AgentError::CertifiedReject(RejectResponse {
516516
reject_code: RejectCode::CanisterError,
517517
reject_message,
518-
error_code: None,
518+
error_code: Some(error_code),
519519
})) if reject_message.contains(&format!("Canister {canister_id}: Canister has no update method 'update'"))
520+
&& error_code == "IC0536"
520521
),
521522
"wrong error: {result:?}"
522523
);
@@ -739,7 +740,7 @@ mod management_canister {
739740

740741
let args = Argument::from_candid((create_args,));
741742

742-
let creation_fee = 100_000_000_000;
743+
let creation_fee = 500_000_000_000;
743744
let canister_initial_balance = 4_000_000_000;
744745
let (create_result,): (CreateResult,) = wallet
745746
.call(
@@ -1247,8 +1248,8 @@ mod extras {
12471248
Err(AgentError::CertifiedReject(RejectResponse {
12481249
reject_code: RejectCode::CanisterError,
12491250
reject_message,
1250-
error_code: None,
1251-
})) if reject_message.contains("Canister iimsn-6yaaa-aaaaa-afiaa-cai is already installed")
1251+
error_code: Some(code),
1252+
})) if reject_message.contains("Canister iimsn-6yaaa-aaaaa-afiaa-cai is already installed") && code == "IC0538"
12521253
),
12531254
"wrong error: {result:?}"
12541255
);

ref-tests/tests/integration.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -191,12 +191,12 @@ fn canister_reject_call() {
191191
Err(AgentError::CertifiedReject(RejectResponse {
192192
reject_code: RejectCode::CanisterError,
193193
reject_message,
194-
error_code: None,
194+
error_code: Some(error_code),
195195
..
196196
})) if reject_message.contains(&format!(
197197
"Canister {}: Canister has no update method 'wallet_send'",
198198
alice.canister_id()
199-
))
199+
)) && error_code == "IC0536"
200200
),
201201
"wrong error: {result:?}"
202202
);

0 commit comments

Comments
 (0)