From 9d12359d1835e6dcd140022da666fe37f3abb2f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20Beglerovi=C4=87?= Date: Tue, 11 Jul 2023 16:23:03 +0200 Subject: [PATCH 1/3] feat: add `LogDecoder` getter for script instances (#1036) --- .../src/program_bindings/abigen/bindings/contract.rs | 1 + .../src/program_bindings/abigen/bindings/script.rs | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/packages/fuels-code-gen/src/program_bindings/abigen/bindings/contract.rs b/packages/fuels-code-gen/src/program_bindings/abigen/bindings/contract.rs index d99204c50..4e8996bde 100644 --- a/packages/fuels-code-gen/src/program_bindings/abigen/bindings/contract.rs +++ b/packages/fuels-code-gen/src/program_bindings/abigen/bindings/contract.rs @@ -100,6 +100,7 @@ pub(crate) fn contract_bindings( fn id(&self) -> ::fuels::types::bech32::Bech32ContractId { self.contract_id.clone() } + fn log_decoder(&self) -> ::fuels::programs::logs::LogDecoder { self.log_decoder.clone() } diff --git a/packages/fuels-code-gen/src/program_bindings/abigen/bindings/script.rs b/packages/fuels-code-gen/src/program_bindings/abigen/bindings/script.rs index 14f3f9e82..e4d36aaff 100644 --- a/packages/fuels-code-gen/src/program_bindings/abigen/bindings/script.rs +++ b/packages/fuels-code-gen/src/program_bindings/abigen/bindings/script.rs @@ -68,6 +68,10 @@ pub(crate) fn script_bindings( self } + pub fn log_decoder(&self) -> ::fuels::programs::logs::LogDecoder { + self.log_decoder.clone() + } + #main_function } From 5d97809ee9dbb08dcf02f753eb992d7afdbc6726 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20Beglerovi=C4=87?= Date: Tue, 11 Jul 2023 16:57:37 +0200 Subject: [PATCH 2/3] feat: improve transaction builder error (#1037) --- packages/fuels-core/src/types/errors.rs | 6 +++--- packages/fuels-core/src/types/transaction_builders.rs | 10 ++++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/fuels-core/src/types/errors.rs b/packages/fuels-core/src/types/errors.rs index 21819dc22..e6e5c6f1c 100644 --- a/packages/fuels-core/src/types/errors.rs +++ b/packages/fuels-core/src/types/errors.rs @@ -35,15 +35,15 @@ pub enum Error { revert_id: u64, receipts: Vec, }, - #[error("Transaction is using predicates. Provide consensus parameters by using .set_consensus_parameters().")] - TransactionBuildError, + #[error("Transaction build error: {0}")] + TransactionBuildError(String), } pub type Result = std::result::Result; /// This macro can only be used for `Error` variants that have a `String` field. /// Those are: `InvalidData`, `InvalidType`, `InfrastructureError`, -/// `InstantiationError`, `WalletError`, `ProviderError` +/// `InstantiationError`, `WalletError`, `ProviderError`, `TransactionBuildError` #[macro_export] macro_rules! error { ($err_variant:ident, $fmt_str: literal $(,$arg: expr)*) => { diff --git a/packages/fuels-core/src/types/transaction_builders.rs b/packages/fuels-core/src/types/transaction_builders.rs index 1892f2320..89a22d64d 100644 --- a/packages/fuels-core/src/types/transaction_builders.rs +++ b/packages/fuels-core/src/types/transaction_builders.rs @@ -13,7 +13,7 @@ use crate::{ types::{ coin::Coin, coin_type::CoinType, - errors::{Error, Result}, + errors::{error, Error, Result}, input::Input, message::Message, transaction::{CreateTransaction, ScriptTransaction, Transaction, TxParameters}, @@ -57,7 +57,9 @@ macro_rules! impl_tx_trait { let base_offset = if self.is_using_predicates() { let params = self .consensus_parameters - .ok_or(Error::TransactionBuildError)?; + .ok_or(error!( + TransactionBuildError, + "predicate inputs require consensus parameters. Use `.set_consensus_parameters()`."))?; self.base_offset(¶ms) } else { 0 @@ -67,7 +69,7 @@ macro_rules! impl_tx_trait { } fn fee_checked_from_tx(&self, params: &ConsensusParameters) -> Option { - let tx = &self.clone().build().expect("Error in build").tx; + let tx = &self.clone().build().expect("error in build").tx; TransactionFee::checked_from_tx(params, tx) } @@ -79,7 +81,7 @@ macro_rules! impl_tx_trait { Ok(self .clone() .build() - .expect("Error in build") + .expect("error in build") .tx .check_without_signatures(block_height.into(), parameters)?) } From ea4687d88a91d86e08241e19ba0ff010865fb93a Mon Sep 17 00:00:00 2001 From: iqdecay Date: Wed, 12 Jul 2023 09:11:17 +0200 Subject: [PATCH 3/3] test: implement missing codec tests over `Bytes` type (#1041) --- .../src/program_bindings/resolved_type.rs | 63 +++++++++++++++++++ packages/fuels-core/src/codec/abi_decoder.rs | 11 ++++ .../fuels-core/src/codec/function_selector.rs | 9 +++ 3 files changed, 83 insertions(+) diff --git a/packages/fuels-code-gen/src/program_bindings/resolved_type.rs b/packages/fuels-code-gen/src/program_bindings/resolved_type.rs index 1614bcd5e..b3b01b986 100644 --- a/packages/fuels-code-gen/src/program_bindings/resolved_type.rs +++ b/packages/fuels-code-gen/src/program_bindings/resolved_type.rs @@ -418,6 +418,69 @@ mod tests { ) } + #[test] + fn test_resolve_bytes() -> Result<()> { + test_resolve_first_type( + ":: fuels :: types :: Bytes", + &[ + TypeDeclaration { + type_id: 0, + type_field: "struct String".to_string(), + components: Some(vec![TypeApplication { + name: "bytes".to_string(), + type_id: 1, + ..Default::default() + }]), + ..Default::default() + }, + TypeDeclaration { + type_id: 0, + type_field: "struct std::bytes::Bytes".to_string(), + components: Some(vec![ + TypeApplication { + name: "buf".to_string(), + type_id: 1, + ..Default::default() + }, + TypeApplication { + name: "len".to_string(), + type_id: 3, + ..Default::default() + }, + ]), + ..Default::default() + }, + TypeDeclaration { + type_id: 1, + type_field: "struct std::bytes::RawBytes".to_string(), + components: Some(vec![ + TypeApplication { + name: "ptr".to_string(), + type_id: 2, + ..Default::default() + }, + TypeApplication { + name: "cap".to_string(), + type_id: 3, + ..Default::default() + }, + ]), + ..Default::default() + }, + TypeDeclaration { + type_id: 2, + type_field: "raw untyped ptr".to_string(), + ..Default::default() + }, + TypeDeclaration { + type_id: 3, + type_field: "u64".to_string(), + ..Default::default() + }, + ], + ) + } + #[test] fn test_resolve_string() -> Result<()> { test_resolve_primitive_type("str[3]", ":: fuels :: types :: SizedAsciiString < 3usize >") diff --git a/packages/fuels-core/src/codec/abi_decoder.rs b/packages/fuels-core/src/codec/abi_decoder.rs index 708fa104c..11e813e69 100644 --- a/packages/fuels-core/src/codec/abi_decoder.rs +++ b/packages/fuels-core/src/codec/abi_decoder.rs @@ -494,6 +494,17 @@ mod tests { Ok(()) } + #[test] + fn decode_bytes() -> Result<()> { + let data = [0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05]; + let decoded = ABIDecoder::decode_single(&ParamType::Bytes, &data)?; + + let expected = Token::Bytes(data.to_vec()); + + assert_eq!(decoded, expected); + Ok(()) + } + #[test] fn decode_enum() -> Result<()> { // enum MyEnum { diff --git a/packages/fuels-core/src/codec/function_selector.rs b/packages/fuels-core/src/codec/function_selector.rs index 7fad45915..ac59b1832 100644 --- a/packages/fuels-core/src/codec/function_selector.rs +++ b/packages/fuels-core/src/codec/function_selector.rs @@ -177,6 +177,15 @@ mod tests { assert_eq!(selector, "some_fun(s(s(rawptr,u64),u64))") } + #[test] + fn handles_bytes() { + let inputs = [ParamType::Bytes]; + + let selector = resolve_fn_signature("some_fun", &inputs); + + assert_eq!(selector, "some_fun(s(s(rawptr,u64),u64))") + } + #[test] fn handles_enums() { let types = vec![ParamType::U64, ParamType::U32];