diff --git a/near-sdk-macros/Cargo.toml b/near-sdk-macros/Cargo.toml index f09bcec78..2a3a5ec9a 100644 --- a/near-sdk-macros/Cargo.toml +++ b/near-sdk-macros/Cargo.toml @@ -15,14 +15,14 @@ Main macro of the library for writing NEAR smart contracts. proc-macro = true [dependencies] -proc-macro2 = { version = "1", default-features = false } +proc-macro2 = { version = "1", default-features = false } syn = { version = "2", default-features = false } -strum = { version = "0.26", default-features = false } +strum = { version = "0.26", default-features = false } strum_macros = "0.26" -quote = { version = "1.0", default-features = false } +quote = { version = "1.0", default-features = false } Inflector = { version = "0.11.4", default-features = false, features = [] } darling = { version = "0.20.3", default-features = false } -serde = { version = "1", default-features = false, features = ["serde_derive"] } +serde = { version = "1", default-features = false, features = ["serde_derive"] } serde_json = "1" [dev-dependencies] diff --git a/near-sdk-macros/src/core_impl/code_generator/attr_sig_info.rs b/near-sdk-macros/src/core_impl/code_generator/attr_sig_info.rs index c6bbf4215..24afbb26e 100644 --- a/near-sdk-macros/src/core_impl/code_generator/attr_sig_info.rs +++ b/near-sdk-macros/src/core_impl/code_generator/attr_sig_info.rs @@ -310,10 +310,16 @@ impl AttrSigInfo { fn deserialize_data(ty: &SerializerType) -> TokenStream2 { match ty { SerializerType::JSON => quote! { - ::near_sdk::serde_json::from_slice(&data).expect("Failed to deserialize callback using JSON") + match ::near_sdk::serde_json::from_slice(&data) { + Ok(deserialized) => deserialized, + Err(_) => ::near_sdk::env::panic_str("Failed to deserialize callback using JSON"), + } }, SerializerType::Borsh => quote! { - ::near_sdk::borsh::BorshDeserialize::try_from_slice(&data).expect("Failed to deserialize callback using Borsh") + match ::near_sdk::borsh::BorshDeserialize::try_from_slice(&data) { + Ok(deserialized) => deserialized, + Err(_) => ::near_sdk::env::panic_str("Failed to deserialize callback using Borsh"), + } }, } } diff --git a/near-sdk-macros/src/core_impl/code_generator/impl_item_method_info.rs b/near-sdk-macros/src/core_impl/code_generator/impl_item_method_info.rs index 278197950..dae5c15f4 100644 --- a/near-sdk-macros/src/core_impl/code_generator/impl_item_method_info.rs +++ b/near-sdk-macros/src/core_impl/code_generator/impl_item_method_info.rs @@ -118,14 +118,22 @@ impl ImplItemMethodInfo { let decomposition = self.attr_signature_info.decomposition_pattern(); let serializer_invocation = match self.attr_signature_info.input_serializer { SerializerType::JSON => quote! { - ::near_sdk::serde_json::from_slice( - &::near_sdk::env::input().expect("Expected input since method has arguments.") - ).expect("Failed to deserialize input from JSON.") + match ::near_sdk::env::input() { + Some(input) => match ::near_sdk::serde_json::from_slice(&input) { + Ok(deserialized) => deserialized, + Err(_) => ::near_sdk::env::panic_str("Failed to deserialize input from JSON.") + }, + None => ::near_sdk::env::panic_str("Expected input since method has arguments.") + }; }, SerializerType::Borsh => quote! { - ::near_sdk::borsh::BorshDeserialize::try_from_slice( - &::near_sdk::env::input().expect("Expected input since method has arguments.") - ).expect("Failed to deserialize input from Borsh.") + match ::near_sdk::env::input() { + Some(input) => match ::near_sdk::borsh::BorshDeserialize::try_from_slice(&input) { + Ok(deserialized) => deserialized, + Err(_) => ::near_sdk::env::panic_str("Failed to deserialize input from Borsh.") + }, + None => ::near_sdk::env::panic_str("Expected input since method has arguments.") + }; }, }; quote! { @@ -354,10 +362,16 @@ impl ImplItemMethodInfo { let value_ser = |result_serializer: &SerializerType| match result_serializer { SerializerType::JSON => quote! { - let result = ::near_sdk::serde_json::to_vec(&result).expect("Failed to serialize the return value using JSON."); + let result = match near_sdk::serde_json::to_vec(&result) { + Ok(v) => v, + Err(_) => ::near_sdk::env::panic_str("Failed to serialize the return value using JSON."), + }; }, SerializerType::Borsh => quote! { - let result = ::near_sdk::borsh::to_vec(&result).expect("Failed to serialize the return value using Borsh."); + let result = match near_sdk::borsh::to_vec(&result) { + Ok(v) => v, + Err(_) => ::near_sdk::env::panic_str("Failed to serialize the return value using Borsh."), + }; }, }; diff --git a/near-sdk-macros/src/core_impl/code_generator/serializer.rs b/near-sdk-macros/src/core_impl/code_generator/serializer.rs index 702931ed5..928d4cf9e 100644 --- a/near-sdk-macros/src/core_impl/code_generator/serializer.rs +++ b/near-sdk-macros/src/core_impl/code_generator/serializer.rs @@ -15,10 +15,16 @@ pub fn generate_serializer( let constructor = quote! { let __args = #constructor_call; }; let value_ser = match serializer { SerializerType::JSON => quote! { - ::near_sdk::serde_json::to_vec(&__args).expect("Failed to serialize the cross contract args using JSON.") + match near_sdk::serde_json::to_vec(&__args) { + Ok(serialized) => serialized, + Err(_) => ::near_sdk::env::panic_str("Failed to serialize the cross contract args using JSON."), + } }, SerializerType::Borsh => quote! { - ::near_sdk::borsh::to_vec(&__args).expect("Failed to serialize the cross contract args using Borsh.") + match near_sdk::borsh::to_vec(&__args) { + Ok(serialized) => serialized, + Err(_) => ::near_sdk::env::panic_str("Failed to serialize the cross contract args using Borsh."), + } }, }; diff --git a/near-sdk-macros/src/core_impl/code_generator/snapshots/arg_mut_ref.snap b/near-sdk-macros/src/core_impl/code_generator/snapshots/arg_mut_ref.snap index 6f7831661..fbb4ab80a 100644 --- a/near-sdk-macros/src/core_impl/code_generator/snapshots/arg_mut_ref.snap +++ b/near-sdk-macros/src/core_impl/code_generator/snapshots/arg_mut_ref.snap @@ -11,12 +11,17 @@ pub extern "C" fn method() { struct Input { k: u64, } - let Input { mut k }: Input = ::near_sdk::serde_json::from_slice( - &::near_sdk::env::input() - .expect("Expected input since method has arguments."), - ) - .expect("Failed to deserialize input from JSON."); + let Input { mut k }: Input = match ::near_sdk::env::input() { + Some(input) => { + match ::near_sdk::serde_json::from_slice(&input) { + Ok(deserialized) => deserialized, + Err(_) => { + ::near_sdk::env::panic_str("Failed to deserialize input from JSON.") + } + } + } + None => ::near_sdk::env::panic_str("Expected input since method has arguments."), + }; let contract: Hello = ::near_sdk::env::state_read().unwrap_or_default(); Hello::method(&contract, &mut k); } - diff --git a/near-sdk-macros/src/core_impl/code_generator/snapshots/arg_no_return_no_mut.snap b/near-sdk-macros/src/core_impl/code_generator/snapshots/arg_no_return_no_mut.snap index 0ed5326b2..9b290b4d2 100644 --- a/near-sdk-macros/src/core_impl/code_generator/snapshots/arg_no_return_no_mut.snap +++ b/near-sdk-macros/src/core_impl/code_generator/snapshots/arg_no_return_no_mut.snap @@ -11,12 +11,17 @@ pub extern "C" fn method() { struct Input { k: u64, } - let Input { k }: Input = ::near_sdk::serde_json::from_slice( - &::near_sdk::env::input() - .expect("Expected input since method has arguments."), - ) - .expect("Failed to deserialize input from JSON."); + let Input { k }: Input = match ::near_sdk::env::input() { + Some(input) => { + match ::near_sdk::serde_json::from_slice(&input) { + Ok(deserialized) => deserialized, + Err(_) => { + ::near_sdk::env::panic_str("Failed to deserialize input from JSON.") + } + } + } + None => ::near_sdk::env::panic_str("Expected input since method has arguments."), + }; let contract: Hello = ::near_sdk::env::state_read().unwrap_or_default(); Hello::method(&contract, k); } - diff --git a/near-sdk-macros/src/core_impl/code_generator/snapshots/arg_ref.snap b/near-sdk-macros/src/core_impl/code_generator/snapshots/arg_ref.snap index 0b4bc4a24..0386ded54 100644 --- a/near-sdk-macros/src/core_impl/code_generator/snapshots/arg_ref.snap +++ b/near-sdk-macros/src/core_impl/code_generator/snapshots/arg_ref.snap @@ -11,12 +11,17 @@ pub extern "C" fn method() { struct Input { k: u64, } - let Input { k }: Input = ::near_sdk::serde_json::from_slice( - &::near_sdk::env::input() - .expect("Expected input since method has arguments."), - ) - .expect("Failed to deserialize input from JSON."); + let Input { k }: Input = match ::near_sdk::env::input() { + Some(input) => { + match ::near_sdk::serde_json::from_slice(&input) { + Ok(deserialized) => deserialized, + Err(_) => { + ::near_sdk::env::panic_str("Failed to deserialize input from JSON.") + } + } + } + None => ::near_sdk::env::panic_str("Expected input since method has arguments."), + }; let contract: Hello = ::near_sdk::env::state_read().unwrap_or_default(); Hello::method(&contract, &k); } - diff --git a/near-sdk-macros/src/core_impl/code_generator/snapshots/args_no_return_mut.snap b/near-sdk-macros/src/core_impl/code_generator/snapshots/args_no_return_mut.snap index 21469c972..e4fa5416d 100644 --- a/near-sdk-macros/src/core_impl/code_generator/snapshots/args_no_return_mut.snap +++ b/near-sdk-macros/src/core_impl/code_generator/snapshots/args_no_return_mut.snap @@ -15,13 +15,18 @@ pub extern "C" fn method() { k: u64, m: Bar, } - let Input { k, m }: Input = ::near_sdk::serde_json::from_slice( - &::near_sdk::env::input() - .expect("Expected input since method has arguments."), - ) - .expect("Failed to deserialize input from JSON."); + let Input { k, m }: Input = match ::near_sdk::env::input() { + Some(input) => { + match ::near_sdk::serde_json::from_slice(&input) { + Ok(deserialized) => deserialized, + Err(_) => { + ::near_sdk::env::panic_str("Failed to deserialize input from JSON.") + } + } + } + None => ::near_sdk::env::panic_str("Expected input since method has arguments."), + }; let mut contract: Hello = ::near_sdk::env::state_read().unwrap_or_default(); Hello::method(&mut contract, k, m); ::near_sdk::env::state_write(&contract); } - diff --git a/near-sdk-macros/src/core_impl/code_generator/snapshots/args_return_mut.snap b/near-sdk-macros/src/core_impl/code_generator/snapshots/args_return_mut.snap index 0976b3883..85bccde65 100644 --- a/near-sdk-macros/src/core_impl/code_generator/snapshots/args_return_mut.snap +++ b/near-sdk-macros/src/core_impl/code_generator/snapshots/args_return_mut.snap @@ -15,16 +15,27 @@ pub extern "C" fn method() { k: u64, m: Bar, } - let Input { k, m }: Input = ::near_sdk::serde_json::from_slice( - &::near_sdk::env::input() - .expect("Expected input since method has arguments."), - ) - .expect("Failed to deserialize input from JSON."); + let Input { k, m }: Input = match ::near_sdk::env::input() { + Some(input) => { + match ::near_sdk::serde_json::from_slice(&input) { + Ok(deserialized) => deserialized, + Err(_) => { + ::near_sdk::env::panic_str("Failed to deserialize input from JSON.") + } + } + } + None => ::near_sdk::env::panic_str("Expected input since method has arguments."), + }; let mut contract: Hello = ::near_sdk::env::state_read().unwrap_or_default(); let result = Hello::method(&mut contract, k, m); - let result = ::near_sdk::serde_json::to_vec(&result) - .expect("Failed to serialize the return value using JSON."); + let result = match near_sdk::serde_json::to_vec(&result) { + Ok(v) => v, + Err(_) => { + ::near_sdk::env::panic_str( + "Failed to serialize the return value using JSON.", + ) + } + }; ::near_sdk::env::value_return(&result); ::near_sdk::env::state_write(&contract); } - diff --git a/near-sdk-macros/src/core_impl/code_generator/snapshots/args_return_mut_borsh.snap b/near-sdk-macros/src/core_impl/code_generator/snapshots/args_return_mut_borsh.snap index 9097e6e32..1861183ba 100644 --- a/near-sdk-macros/src/core_impl/code_generator/snapshots/args_return_mut_borsh.snap +++ b/near-sdk-macros/src/core_impl/code_generator/snapshots/args_return_mut_borsh.snap @@ -15,16 +15,27 @@ pub extern "C" fn method() { k: u64, m: Bar, } - let Input { k, m }: Input = ::near_sdk::borsh::BorshDeserialize::try_from_slice( - &::near_sdk::env::input() - .expect("Expected input since method has arguments."), - ) - .expect("Failed to deserialize input from Borsh."); + let Input { k, m }: Input = match ::near_sdk::env::input() { + Some(input) => { + match ::near_sdk::borsh::BorshDeserialize::try_from_slice(&input) { + Ok(deserialized) => deserialized, + Err(_) => { + ::near_sdk::env::panic_str("Failed to deserialize input from Borsh.") + } + } + } + None => ::near_sdk::env::panic_str("Expected input since method has arguments."), + }; let mut contract: Hello = ::near_sdk::env::state_read().unwrap_or_default(); let result = Hello::method(&mut contract, k, m); - let result = ::near_sdk::borsh::to_vec(&result) - .expect("Failed to serialize the return value using Borsh."); + let result = match near_sdk::borsh::to_vec(&result) { + Ok(v) => v, + Err(_) => { + ::near_sdk::env::panic_str( + "Failed to serialize the return value using Borsh.", + ) + } + }; ::near_sdk::env::value_return(&result); ::near_sdk::env::state_write(&contract); } - diff --git a/near-sdk-macros/src/core_impl/code_generator/snapshots/args_return_ref.snap b/near-sdk-macros/src/core_impl/code_generator/snapshots/args_return_ref.snap index afabf1106..8f66586e2 100644 --- a/near-sdk-macros/src/core_impl/code_generator/snapshots/args_return_ref.snap +++ b/near-sdk-macros/src/core_impl/code_generator/snapshots/args_return_ref.snap @@ -8,8 +8,13 @@ pub extern "C" fn method() { ::near_sdk::env::setup_panic_hook(); let contract: Hello = ::near_sdk::env::state_read().unwrap_or_default(); let result = Hello::method(&contract); - let result = ::near_sdk::serde_json::to_vec(&result) - .expect("Failed to serialize the return value using JSON."); + let result = match near_sdk::serde_json::to_vec(&result) { + Ok(v) => v, + Err(_) => { + ::near_sdk::env::panic_str( + "Failed to serialize the return value using JSON.", + ) + } + }; ::near_sdk::env::value_return(&result); } - diff --git a/near-sdk-macros/src/core_impl/code_generator/snapshots/callback_args.snap b/near-sdk-macros/src/core_impl/code_generator/snapshots/callback_args.snap index 14646d110..c61788eb0 100644 --- a/near-sdk-macros/src/core_impl/code_generator/snapshots/callback_args.snap +++ b/near-sdk-macros/src/core_impl/code_generator/snapshots/callback_args.snap @@ -15,24 +15,33 @@ pub extern "C" fn method() { struct Input { y: ::std::string::String, } - let Input { y }: Input = ::near_sdk::serde_json::from_slice( - &::near_sdk::env::input() - .expect("Expected input since method has arguments."), - ) - .expect("Failed to deserialize input from JSON."); + let Input { y }: Input = match ::near_sdk::env::input() { + Some(input) => { + match ::near_sdk::serde_json::from_slice(&input) { + Ok(deserialized) => deserialized, + Err(_) => { + ::near_sdk::env::panic_str("Failed to deserialize input from JSON.") + } + } + } + None => ::near_sdk::env::panic_str("Expected input since method has arguments."), + }; let data: ::std::vec::Vec = match ::near_sdk::env::promise_result(0u64) { ::near_sdk::PromiseResult::Successful(x) => x, _ => ::near_sdk::env::panic_str("Callback computation 0 was not successful"), }; - let mut x: u64 = ::near_sdk::serde_json::from_slice(&data) - .expect("Failed to deserialize callback using JSON"); + let mut x: u64 = match ::near_sdk::serde_json::from_slice(&data) { + Ok(deserialized) => deserialized, + Err(_) => ::near_sdk::env::panic_str("Failed to deserialize callback using JSON"), + }; let data: ::std::vec::Vec = match ::near_sdk::env::promise_result(1u64) { ::near_sdk::PromiseResult::Successful(x) => x, _ => ::near_sdk::env::panic_str("Callback computation 1 was not successful"), }; - let z: ::std::vec::Vec = ::near_sdk::serde_json::from_slice(&data) - .expect("Failed to deserialize callback using JSON"); + let z: ::std::vec::Vec = match ::near_sdk::serde_json::from_slice(&data) { + Ok(deserialized) => deserialized, + Err(_) => ::near_sdk::env::panic_str("Failed to deserialize callback using JSON"), + }; let contract: Hello = ::near_sdk::env::state_read().unwrap_or_default(); Hello::method(&contract, &mut x, y, z); } - diff --git a/near-sdk-macros/src/core_impl/code_generator/snapshots/callback_args_mixed_serialization.snap b/near-sdk-macros/src/core_impl/code_generator/snapshots/callback_args_mixed_serialization.snap index f920539a1..2c51d288f 100644 --- a/near-sdk-macros/src/core_impl/code_generator/snapshots/callback_args_mixed_serialization.snap +++ b/near-sdk-macros/src/core_impl/code_generator/snapshots/callback_args_mixed_serialization.snap @@ -15,24 +15,35 @@ pub extern "C" fn method() { struct Input { y: ::std::string::String, } - let Input { y }: Input = ::near_sdk::borsh::BorshDeserialize::try_from_slice( - &::near_sdk::env::input() - .expect("Expected input since method has arguments."), - ) - .expect("Failed to deserialize input from Borsh."); + let Input { y }: Input = match ::near_sdk::env::input() { + Some(input) => { + match ::near_sdk::borsh::BorshDeserialize::try_from_slice(&input) { + Ok(deserialized) => deserialized, + Err(_) => { + ::near_sdk::env::panic_str("Failed to deserialize input from Borsh.") + } + } + } + None => ::near_sdk::env::panic_str("Expected input since method has arguments."), + }; let data: ::std::vec::Vec = match ::near_sdk::env::promise_result(0u64) { ::near_sdk::PromiseResult::Successful(x) => x, _ => ::near_sdk::env::panic_str("Callback computation 0 was not successful"), }; - let mut x: u64 = ::near_sdk::borsh::BorshDeserialize::try_from_slice(&data) - .expect("Failed to deserialize callback using Borsh"); + let mut x: u64 = match ::near_sdk::borsh::BorshDeserialize::try_from_slice(&data) { + Ok(deserialized) => deserialized, + Err(_) => { + ::near_sdk::env::panic_str("Failed to deserialize callback using Borsh") + } + }; let data: ::std::vec::Vec = match ::near_sdk::env::promise_result(1u64) { ::near_sdk::PromiseResult::Successful(x) => x, _ => ::near_sdk::env::panic_str("Callback computation 1 was not successful"), }; - let z: ::std::vec::Vec = ::near_sdk::serde_json::from_slice(&data) - .expect("Failed to deserialize callback using JSON"); + let z: ::std::vec::Vec = match ::near_sdk::serde_json::from_slice(&data) { + Ok(deserialized) => deserialized, + Err(_) => ::near_sdk::env::panic_str("Failed to deserialize callback using JSON"), + }; let contract: Hello = ::near_sdk::env::state_read().unwrap_or_default(); Hello::method(&contract, &mut x, y, z); } - diff --git a/near-sdk-macros/src/core_impl/code_generator/snapshots/callback_args_only.snap b/near-sdk-macros/src/core_impl/code_generator/snapshots/callback_args_only.snap index 6e98de7cc..71625bf17 100644 --- a/near-sdk-macros/src/core_impl/code_generator/snapshots/callback_args_only.snap +++ b/near-sdk-macros/src/core_impl/code_generator/snapshots/callback_args_only.snap @@ -14,15 +14,18 @@ pub extern "C" fn method() { ::near_sdk::PromiseResult::Successful(x) => x, _ => ::near_sdk::env::panic_str("Callback computation 0 was not successful"), }; - let mut x: u64 = ::near_sdk::serde_json::from_slice(&data) - .expect("Failed to deserialize callback using JSON"); + let mut x: u64 = match ::near_sdk::serde_json::from_slice(&data) { + Ok(deserialized) => deserialized, + Err(_) => ::near_sdk::env::panic_str("Failed to deserialize callback using JSON"), + }; let data: ::std::vec::Vec = match ::near_sdk::env::promise_result(1u64) { ::near_sdk::PromiseResult::Successful(x) => x, _ => ::near_sdk::env::panic_str("Callback computation 1 was not successful"), }; - let y: ::std::string::String = ::near_sdk::serde_json::from_slice(&data) - .expect("Failed to deserialize callback using JSON"); + let y: ::std::string::String = match ::near_sdk::serde_json::from_slice(&data) { + Ok(deserialized) => deserialized, + Err(_) => ::near_sdk::env::panic_str("Failed to deserialize callback using JSON"), + }; let contract: Hello = ::near_sdk::env::state_read().unwrap_or_default(); Hello::method(&contract, &mut x, y); } - diff --git a/near-sdk-macros/src/core_impl/code_generator/snapshots/callback_args_results.snap b/near-sdk-macros/src/core_impl/code_generator/snapshots/callback_args_results.snap index b92b60419..32364f946 100644 --- a/near-sdk-macros/src/core_impl/code_generator/snapshots/callback_args_results.snap +++ b/near-sdk-macros/src/core_impl/code_generator/snapshots/callback_args_results.snap @@ -13,8 +13,14 @@ pub extern "C" fn method() { let mut x: Result = match ::near_sdk::env::promise_result(0u64) { ::near_sdk::PromiseResult::Successful(data) => { ::std::result::Result::Ok( - ::near_sdk::serde_json::from_slice(&data) - .expect("Failed to deserialize callback using JSON"), + match ::near_sdk::serde_json::from_slice(&data) { + Ok(deserialized) => deserialized, + Err(_) => { + ::near_sdk::env::panic_str( + "Failed to deserialize callback using JSON", + ) + } + }, ) } ::near_sdk::PromiseResult::Failed => { @@ -26,8 +32,14 @@ pub extern "C" fn method() { ) { ::near_sdk::PromiseResult::Successful(data) => { ::std::result::Result::Ok( - ::near_sdk::serde_json::from_slice(&data) - .expect("Failed to deserialize callback using JSON"), + match ::near_sdk::serde_json::from_slice(&data) { + Ok(deserialized) => deserialized, + Err(_) => { + ::near_sdk::env::panic_str( + "Failed to deserialize callback using JSON", + ) + } + }, ) } ::near_sdk::PromiseResult::Failed => { @@ -37,4 +49,3 @@ pub extern "C" fn method() { let contract: Hello = ::near_sdk::env::state_read().unwrap_or_default(); Hello::method(&contract, &mut x, y); } - diff --git a/near-sdk-macros/src/core_impl/code_generator/snapshots/callback_args_vec.snap b/near-sdk-macros/src/core_impl/code_generator/snapshots/callback_args_vec.snap index 1d54bf320..d1b672a0f 100644 --- a/near-sdk-macros/src/core_impl/code_generator/snapshots/callback_args_vec.snap +++ b/near-sdk-macros/src/core_impl/code_generator/snapshots/callback_args_vec.snap @@ -15,11 +15,17 @@ pub extern "C" fn method() { struct Input { y: String, } - let Input { y }: Input = ::near_sdk::serde_json::from_slice( - &::near_sdk::env::input() - .expect("Expected input since method has arguments."), - ) - .expect("Failed to deserialize input from JSON."); + let Input { y }: Input = match ::near_sdk::env::input() { + Some(input) => { + match ::near_sdk::serde_json::from_slice(&input) { + Ok(deserialized) => deserialized, + Err(_) => { + ::near_sdk::env::panic_str("Failed to deserialize input from JSON.") + } + } + } + None => ::near_sdk::env::panic_str("Expected input since method has arguments."), + }; let x: Vec = ::std::iter::Iterator::collect( ::std::iter::Iterator::map( 0..::near_sdk::env::promise_results_count(), @@ -36,12 +42,17 @@ pub extern "C" fn method() { ) } }; - ::near_sdk::serde_json::from_slice(&data) - .expect("Failed to deserialize callback using JSON") + match ::near_sdk::serde_json::from_slice(&data) { + Ok(deserialized) => deserialized, + Err(_) => { + ::near_sdk::env::panic_str( + "Failed to deserialize callback using JSON", + ) + } + } }, ), ); let contract: Hello = ::near_sdk::env::state_read().unwrap_or_default(); Hello::method(&contract, x, y); } - diff --git a/near-sdk-macros/src/core_impl/code_generator/snapshots/ext_basic.snap b/near-sdk-macros/src/core_impl/code_generator/snapshots/ext_basic.snap index 3195425e2..ada9cde63 100644 --- a/near-sdk-macros/src/core_impl/code_generator/snapshots/ext_basic.snap +++ b/near-sdk-macros/src/core_impl/code_generator/snapshots/ext_basic.snap @@ -43,8 +43,14 @@ pub mod external_cross_contract { arr: &'nearinput Vec, } let __args = Input { arr: &arr }; - ::near_sdk::serde_json::to_vec(&__args) - .expect("Failed to serialize the cross contract args using JSON.") + match near_sdk::serde_json::to_vec(&__args) { + Ok(serialized) => serialized, + Err(_) => { + ::near_sdk::env::panic_str( + "Failed to serialize the cross contract args using JSON.", + ) + } + } }; ::near_sdk::Promise::new(self.account_id) .function_call_weight( @@ -68,4 +74,3 @@ pub mod external_cross_contract { } } } - diff --git a/near-sdk-macros/src/core_impl/code_generator/snapshots/ext_basic_borsh.snap b/near-sdk-macros/src/core_impl/code_generator/snapshots/ext_basic_borsh.snap index fad23ded4..3eae30f8c 100644 --- a/near-sdk-macros/src/core_impl/code_generator/snapshots/ext_basic_borsh.snap +++ b/near-sdk-macros/src/core_impl/code_generator/snapshots/ext_basic_borsh.snap @@ -10,8 +10,14 @@ pub fn borsh_test(self, a: String) -> ::near_sdk::Promise { a: &'nearinput String, } let __args = Input { a: &a }; - ::near_sdk::borsh::to_vec(&__args) - .expect("Failed to serialize the cross contract args using Borsh.") + match near_sdk::borsh::to_vec(&__args) { + Ok(serialized) => serialized, + Err(_) => { + ::near_sdk::env::panic_str( + "Failed to serialize the cross contract args using Borsh.", + ) + } + } }; ::near_sdk::Promise::new(self.account_id) .function_call_weight( @@ -22,4 +28,3 @@ pub fn borsh_test(self, a: String) -> ::near_sdk::Promise { self.gas_weight, ) } - diff --git a/near-sdk-macros/src/core_impl/code_generator/snapshots/ext_basic_json.snap b/near-sdk-macros/src/core_impl/code_generator/snapshots/ext_basic_json.snap index dd053c66a..0c95ac33f 100644 --- a/near-sdk-macros/src/core_impl/code_generator/snapshots/ext_basic_json.snap +++ b/near-sdk-macros/src/core_impl/code_generator/snapshots/ext_basic_json.snap @@ -10,8 +10,14 @@ pub fn method(self, k: &String) -> ::near_sdk::Promise { k: &'nearinput String, } let __args = Input { k: &k }; - ::near_sdk::serde_json::to_vec(&__args) - .expect("Failed to serialize the cross contract args using JSON.") + match near_sdk::serde_json::to_vec(&__args) { + Ok(serialized) => serialized, + Err(_) => { + ::near_sdk::env::panic_str( + "Failed to serialize the cross contract args using JSON.", + ) + } + } }; ::near_sdk::Promise::new(self.account_id) .function_call_weight( @@ -22,4 +28,3 @@ pub fn method(self, k: &String) -> ::near_sdk::Promise { self.gas_weight, ) } - diff --git a/near-sdk-macros/src/core_impl/code_generator/snapshots/handle_result_borsh.snap b/near-sdk-macros/src/core_impl/code_generator/snapshots/handle_result_borsh.snap index 99d4c99b9..cf53748e9 100644 --- a/near-sdk-macros/src/core_impl/code_generator/snapshots/handle_result_borsh.snap +++ b/near-sdk-macros/src/core_impl/code_generator/snapshots/handle_result_borsh.snap @@ -10,11 +10,16 @@ pub extern "C" fn method() { let result = Hello::method(&contract); match result { ::std::result::Result::Ok(result) => { - let result = ::near_sdk::borsh::to_vec(&result) - .expect("Failed to serialize the return value using Borsh."); + let result = match near_sdk::borsh::to_vec(&result) { + Ok(v) => v, + Err(_) => { + ::near_sdk::env::panic_str( + "Failed to serialize the return value using Borsh.", + ) + } + }; ::near_sdk::env::value_return(&result); } ::std::result::Result::Err(err) => ::near_sdk::FunctionError::panic(&err), } } - diff --git a/near-sdk-macros/src/core_impl/code_generator/snapshots/handle_result_json.snap b/near-sdk-macros/src/core_impl/code_generator/snapshots/handle_result_json.snap index 3c3f6dec8..4a71dcdaa 100644 --- a/near-sdk-macros/src/core_impl/code_generator/snapshots/handle_result_json.snap +++ b/near-sdk-macros/src/core_impl/code_generator/snapshots/handle_result_json.snap @@ -10,11 +10,16 @@ pub extern "C" fn method() { let result = Hello::method(&contract); match result { ::std::result::Result::Ok(result) => { - let result = ::near_sdk::serde_json::to_vec(&result) - .expect("Failed to serialize the return value using JSON."); + let result = match near_sdk::serde_json::to_vec(&result) { + Ok(v) => v, + Err(_) => { + ::near_sdk::env::panic_str( + "Failed to serialize the return value using JSON.", + ) + } + }; ::near_sdk::env::value_return(&result); } ::std::result::Result::Err(err) => ::near_sdk::FunctionError::panic(&err), } } - diff --git a/near-sdk-macros/src/core_impl/code_generator/snapshots/handle_result_mut.snap b/near-sdk-macros/src/core_impl/code_generator/snapshots/handle_result_mut.snap index c31df766e..a923f8c84 100644 --- a/near-sdk-macros/src/core_impl/code_generator/snapshots/handle_result_mut.snap +++ b/near-sdk-macros/src/core_impl/code_generator/snapshots/handle_result_mut.snap @@ -13,12 +13,17 @@ pub extern "C" fn method() { let result = Hello::method(&mut contract); match result { ::std::result::Result::Ok(result) => { - let result = ::near_sdk::serde_json::to_vec(&result) - .expect("Failed to serialize the return value using JSON."); + let result = match near_sdk::serde_json::to_vec(&result) { + Ok(v) => v, + Err(_) => { + ::near_sdk::env::panic_str( + "Failed to serialize the return value using JSON.", + ) + } + }; ::near_sdk::env::value_return(&result); ::near_sdk::env::state_write(&contract); } ::std::result::Result::Err(err) => ::near_sdk::FunctionError::panic(&err), } } - diff --git a/near-sdk-macros/src/core_impl/code_generator/snapshots/init_ignore_state.snap b/near-sdk-macros/src/core_impl/code_generator/snapshots/init_ignore_state.snap index ce2b5a991..76fdcec30 100644 --- a/near-sdk-macros/src/core_impl/code_generator/snapshots/init_ignore_state.snap +++ b/near-sdk-macros/src/core_impl/code_generator/snapshots/init_ignore_state.snap @@ -14,12 +14,17 @@ pub extern "C" fn method() { struct Input { k: u64, } - let Input { mut k }: Input = ::near_sdk::serde_json::from_slice( - &::near_sdk::env::input() - .expect("Expected input since method has arguments."), - ) - .expect("Failed to deserialize input from JSON."); + let Input { mut k }: Input = match ::near_sdk::env::input() { + Some(input) => { + match ::near_sdk::serde_json::from_slice(&input) { + Ok(deserialized) => deserialized, + Err(_) => { + ::near_sdk::env::panic_str("Failed to deserialize input from JSON.") + } + } + } + None => ::near_sdk::env::panic_str("Expected input since method has arguments."), + }; let contract = Hello::method(&mut k); ::near_sdk::env::state_write(&contract); } - diff --git a/near-sdk-macros/src/core_impl/code_generator/snapshots/init_payable.snap b/near-sdk-macros/src/core_impl/code_generator/snapshots/init_payable.snap index e68d08b88..6afcddbc5 100644 --- a/near-sdk-macros/src/core_impl/code_generator/snapshots/init_payable.snap +++ b/near-sdk-macros/src/core_impl/code_generator/snapshots/init_payable.snap @@ -11,15 +11,20 @@ pub extern "C" fn method() { struct Input { k: u64, } - let Input { mut k }: Input = ::near_sdk::serde_json::from_slice( - &::near_sdk::env::input() - .expect("Expected input since method has arguments."), - ) - .expect("Failed to deserialize input from JSON."); + let Input { mut k }: Input = match ::near_sdk::env::input() { + Some(input) => { + match ::near_sdk::serde_json::from_slice(&input) { + Ok(deserialized) => deserialized, + Err(_) => { + ::near_sdk::env::panic_str("Failed to deserialize input from JSON.") + } + } + } + None => ::near_sdk::env::panic_str("Expected input since method has arguments."), + }; if ::near_sdk::env::state_exists() { ::near_sdk::env::panic_str("The contract has already been initialized"); } let contract = Hello::method(&mut k); ::near_sdk::env::state_write(&contract); } - diff --git a/near-sdk-macros/src/core_impl/code_generator/snapshots/serialize_with_borsh.snap b/near-sdk-macros/src/core_impl/code_generator/snapshots/serialize_with_borsh.snap index 6f7f9f5b1..a8b4f748e 100644 --- a/near-sdk-macros/src/core_impl/code_generator/snapshots/serialize_with_borsh.snap +++ b/near-sdk-macros/src/core_impl/code_generator/snapshots/serialize_with_borsh.snap @@ -43,8 +43,14 @@ pub mod test { v: &'nearinput Vec, } let __args = Input { v: &v }; - ::near_sdk::borsh::to_vec(&__args) - .expect("Failed to serialize the cross contract args using Borsh.") + match near_sdk::borsh::to_vec(&__args) { + Ok(serialized) => serialized, + Err(_) => { + ::near_sdk::env::panic_str( + "Failed to serialize the cross contract args using Borsh.", + ) + } + } }; ::near_sdk::Promise::new(self.account_id) .function_call_weight( @@ -57,4 +63,3 @@ pub mod test { } } } - diff --git a/near-sdk-macros/src/core_impl/code_generator/snapshots/simple_init.snap b/near-sdk-macros/src/core_impl/code_generator/snapshots/simple_init.snap index d0d52935a..7ae3c0965 100644 --- a/near-sdk-macros/src/core_impl/code_generator/snapshots/simple_init.snap +++ b/near-sdk-macros/src/core_impl/code_generator/snapshots/simple_init.snap @@ -14,15 +14,20 @@ pub extern "C" fn method() { struct Input { k: u64, } - let Input { mut k }: Input = ::near_sdk::serde_json::from_slice( - &::near_sdk::env::input() - .expect("Expected input since method has arguments."), - ) - .expect("Failed to deserialize input from JSON."); + let Input { mut k }: Input = match ::near_sdk::env::input() { + Some(input) => { + match ::near_sdk::serde_json::from_slice(&input) { + Ok(deserialized) => deserialized, + Err(_) => { + ::near_sdk::env::panic_str("Failed to deserialize input from JSON.") + } + } + } + None => ::near_sdk::env::panic_str("Expected input since method has arguments."), + }; if ::near_sdk::env::state_exists() { ::near_sdk::env::panic_str("The contract has already been initialized"); } let contract = Hello::method(&mut k); ::near_sdk::env::state_write(&contract); } - diff --git a/near-sdk-macros/src/lib.rs b/near-sdk-macros/src/lib.rs index a47a65bf7..2a9ffaa97 100644 --- a/near-sdk-macros/src/lib.rs +++ b/near-sdk-macros/src/lib.rs @@ -342,6 +342,7 @@ pub fn near_bindgen(attr: TokenStream, item: TokenStream) -> TokenStream { generics: &syn::Generics| -> Result { let metadata_impl_gen = generate_contract_metadata_method(ident, generics).into(); + let metadata_impl_gen = syn::parse::(metadata_impl_gen) .expect("failed to generate contract metadata"); process_impl_block(metadata_impl_gen) diff --git a/near-sdk/src/collections/vector.rs b/near-sdk/src/collections/vector.rs index 630d8250f..34ab6de6e 100644 --- a/near-sdk/src/collections/vector.rs +++ b/near-sdk/src/collections/vector.rs @@ -100,7 +100,10 @@ impl Vector { expect_consistent_state(self.pop_raw()) } else { let lookup_key = self.index_to_lookup_key(index); - let raw_last_value = self.pop_raw().expect("checked `index < len` above, so `len > 0`"); + let raw_last_value = match self.pop_raw() { + Some(value) => value, + None => env::panic_str("checked `index < len` above, so `len > 0`"), + }; if env::storage_write(&lookup_key, &raw_last_value) { expect_consistent_state(env::storage_get_evicted()) } else { diff --git a/near-sdk/src/environment/env.rs b/near-sdk/src/environment/env.rs index 31541fe61..873dd5454 100644 --- a/near-sdk/src/environment/env.rs +++ b/near-sdk/src/environment/env.rs @@ -462,7 +462,10 @@ pub fn alt_bn128_g1_multiexp(value: &[u8]) -> Vec { unsafe { sys::alt_bn128_g1_multiexp(value.len() as _, value.as_ptr() as _, ATOMIC_OP_REGISTER); }; - read_register(ATOMIC_OP_REGISTER).expect(REGISTER_EXPECTED_ERR) + match read_register(ATOMIC_OP_REGISTER) { + Some(result) => result, + None => panic_str(REGISTER_EXPECTED_ERR), + } } /// Compute alt_bn128 g1 sum. @@ -475,9 +478,11 @@ pub fn alt_bn128_g1_sum(value: &[u8]) -> Vec { unsafe { sys::alt_bn128_g1_sum(value.len() as _, value.as_ptr() as _, ATOMIC_OP_REGISTER); }; - read_register(ATOMIC_OP_REGISTER).expect(REGISTER_EXPECTED_ERR) + match read_register(ATOMIC_OP_REGISTER) { + Some(result) => result, + None => panic_str(REGISTER_EXPECTED_ERR), + } } - /// Compute pairing check /// /// `alt_bn128` is a specific curve from the Barreto-Naehrig(BN) family. It is particularly @@ -966,15 +971,18 @@ pub fn storage_has_key(key: &[u8]) -> bool { // ############################################ /// Load the state of the given object. pub fn state_read() -> Option { - storage_read(STATE_KEY) - .map(|data| T::try_from_slice(&data).expect("Cannot deserialize the contract state.")) + storage_read(STATE_KEY).map(|data| { + T::try_from_slice(&data) + .unwrap_or_else(|_| panic_str("Cannot deserialize the contract state.")) + }) } - pub fn state_write(state: &T) { - let data = borsh::to_vec(state).expect("Cannot serialize the contract state."); + let data = match borsh::to_vec(state) { + Ok(serialized) => serialized, + Err(_) => panic_str("Cannot serialize the contract state."), + }; storage_write(STATE_KEY, &data); } - /// Returns `true` if the contract state exists and `false` otherwise. pub fn state_exists() -> bool { storage_has_key(STATE_KEY)