From 9095c1e97374e02cfa1a35dcbf41ac0d4e3c6986 Mon Sep 17 00:00:00 2001 From: hal3e Date: Mon, 30 Oct 2023 13:52:54 +0100 Subject: [PATCH 01/13] fix: encode contract arguments with `gas_forwarded` (#1173) --- packages/fuels-programs/src/call_utils.rs | 51 ++++++++---------- packages/fuels/tests/contracts.rs | 64 +++++++++++++++++++++++ 2 files changed, 86 insertions(+), 29 deletions(-) diff --git a/packages/fuels-programs/src/call_utils.rs b/packages/fuels-programs/src/call_utils.rs index 5c358c8a6f..de842ea3ec 100644 --- a/packages/fuels-programs/src/call_utils.rs +++ b/packages/fuels-programs/src/call_utils.rs @@ -228,9 +228,9 @@ pub(crate) fn get_instructions( /// Returns script data, consisting of the following items in the given order: /// 1. Amount to be forwarded `(1 * `[`WORD_SIZE`]`)` /// 2. Asset ID to be forwarded ([`AssetId::LEN`]) -/// 3. Contract ID ([`ContractId::LEN`]); -/// 4. Function selector `(1 * `[`WORD_SIZE`]`)` -/// 5. Gas to be forwarded `(1 * `[`WORD_SIZE`]`)` +/// 3. Gas to be forwarded `(1 * `[`WORD_SIZE`]`)` - Optional +/// 4. Contract ID ([`ContractId::LEN`]); +/// 5. Function selector `(1 * `[`WORD_SIZE`]`)` /// 6. Calldata offset (optional) `(1 * `[`WORD_SIZE`]`)` /// 7. Encoded arguments (optional) (variable length) pub(crate) fn build_script_data_from_contract_calls( @@ -246,28 +246,28 @@ pub(crate) fn build_script_data_from_contract_calls( for call in calls { let gas_forwarded = call.call_parameters.gas_forwarded(); - let call_param_offsets = CallOpcodeParamsOffset { - amount_offset: segment_offset, - asset_id_offset: segment_offset + WORD_SIZE, - call_data_offset: segment_offset + WORD_SIZE + AssetId::LEN, - gas_forwarded_offset: gas_forwarded - .map(|_| segment_offset + WORD_SIZE + AssetId::LEN + ContractId::LEN + WORD_SIZE), - }; - param_offsets.push(call_param_offsets); - script_data.extend(call.call_parameters.amount().to_be_bytes()); script_data.extend(call.call_parameters.asset_id().iter()); - script_data.extend(call.contract_id.hash().as_ref()); - script_data.extend(call.encoded_selector); let gas_forwarded_size = gas_forwarded .map(|gf| { - script_data.extend(gf.to_be_bytes()); + script_data.extend((gf as Word).to_be_bytes()); WORD_SIZE }) .unwrap_or_default(); + script_data.extend(call.contract_id.hash().as_ref()); + script_data.extend(call.encoded_selector); + + let call_param_offsets = CallOpcodeParamsOffset { + amount_offset: segment_offset, + asset_id_offset: segment_offset + WORD_SIZE, + gas_forwarded_offset: gas_forwarded.map(|_| segment_offset + WORD_SIZE + AssetId::LEN), + call_data_offset: segment_offset + WORD_SIZE + AssetId::LEN + gas_forwarded_size, + }; + param_offsets.push(call_param_offsets); + // If the method call takes custom inputs or has more than // one argument, we need to calculate the `call_data_offset`, // which points to where the data for the custom types start in the @@ -278,9 +278,9 @@ pub(crate) fn build_script_data_from_contract_calls( let custom_input_offset = segment_offset + WORD_SIZE // amount size + AssetId::LEN + + gas_forwarded_size + ContractId::LEN + WORD_SIZE // encoded_selector size - + gas_forwarded_size + WORD_SIZE; // custom_input_offset size script_data.extend((custom_input_offset as Word).to_be_bytes()); @@ -289,7 +289,7 @@ pub(crate) fn build_script_data_from_contract_calls( segment_offset }; - let bytes = call.encoded_args.resolve(encoded_args_start_offset as u64); + let bytes = call.encoded_args.resolve(encoded_args_start_offset as Word); script_data.extend(bytes); // the data segment that holds the parameters for the next call @@ -609,7 +609,6 @@ mod test { async fn test_script_data() { // Arrange const SELECTOR_LEN: usize = WORD_SIZE; - const GAS_FORWARDED_SIZE: usize = WORD_SIZE; const NUM_CALLS: usize = 3; let contract_ids = vec![ @@ -678,19 +677,16 @@ mod test { } // Calls 1 and 3 have their input arguments after the selector - let call_1_arg_offset = - param_offsets[0].call_data_offset + ContractId::LEN + SELECTOR_LEN + GAS_FORWARDED_SIZE; + let call_1_arg_offset = param_offsets[0].call_data_offset + ContractId::LEN + SELECTOR_LEN; let call_1_arg = script_data[call_1_arg_offset..call_1_arg_offset + WORD_SIZE].to_vec(); assert_eq!(call_1_arg, args[0].resolve(0)); - let call_3_arg_offset = - param_offsets[2].call_data_offset + ContractId::LEN + SELECTOR_LEN + GAS_FORWARDED_SIZE; + let call_3_arg_offset = param_offsets[2].call_data_offset + ContractId::LEN + SELECTOR_LEN; let call_3_arg = script_data[call_3_arg_offset..call_3_arg_offset + WORD_SIZE].to_vec(); assert_eq!(call_3_arg, args[2].resolve(0)); // Call 2 has custom inputs and custom_input_offset - let call_2_arg_offset = - param_offsets[1].call_data_offset + ContractId::LEN + SELECTOR_LEN + GAS_FORWARDED_SIZE; + let call_2_arg_offset = param_offsets[1].call_data_offset + ContractId::LEN + SELECTOR_LEN; let custom_input_offset = script_data[call_2_arg_offset..call_2_arg_offset + WORD_SIZE].to_vec(); assert_eq!( @@ -698,11 +694,8 @@ mod test { (call_2_arg_offset + WORD_SIZE).to_be_bytes() ); - let custom_input_offset = param_offsets[1].call_data_offset - + ContractId::LEN - + SELECTOR_LEN - + GAS_FORWARDED_SIZE - + WORD_SIZE; + let custom_input_offset = + param_offsets[1].call_data_offset + ContractId::LEN + SELECTOR_LEN + WORD_SIZE; let custom_input = script_data[custom_input_offset..custom_input_offset + WORD_SIZE].to_vec(); assert_eq!(custom_input, args[1].resolve(0)); diff --git a/packages/fuels/tests/contracts.rs b/packages/fuels/tests/contracts.rs index 97db715242..4bec9fb5dd 100644 --- a/packages/fuels/tests/contracts.rs +++ b/packages/fuels/tests/contracts.rs @@ -1666,3 +1666,67 @@ async fn heap_types_correctly_offset_in_create_transactions_w_storage_slots() -> Ok(()) } + +#[tokio::test] +async fn test_arguments_with_gas_forwarded() -> Result<()> { + setup_program_test!( + Wallets("wallet"), + Abigen( + Contract( + name = "TestContract", + project = "packages/fuels/tests/contracts/contract_test" + ), + Contract( + name = "VectorOutputContract", + project = "packages/fuels/tests/types/contracts/vectors" + ) + ), + Deploy( + name = "contract_instance", + contract = "TestContract", + wallet = "wallet" + ), + Deploy( + name = "contract_instance_2", + contract = "VectorOutputContract", + wallet = "wallet" + ), + ); + + let x = 128; + let vec_input = vec![0, 1, 2]; + { + let response = contract_instance + .methods() + .get_single(x) + .call_params(CallParameters::default().with_gas_forwarded(1024))? + .call() + .await?; + + assert_eq!(response.value, x); + } + { + contract_instance_2 + .methods() + .u32_vec(vec_input.clone()) + .call_params(CallParameters::default().with_gas_forwarded(1024))? + .call() + .await?; + } + { + let call_handler_1 = contract_instance.methods().get_single(x); + let call_handler_2 = contract_instance_2.methods().u32_vec(vec_input); + + let mut multi_call_handler = MultiContractCallHandler::new(wallet.clone()); + + multi_call_handler + .add_call(call_handler_1) + .add_call(call_handler_2); + + let (value, _): (u64, ()) = multi_call_handler.call().await?.value; + + assert_eq!(value, x); + } + + Ok(()) +} From 10fe3bb510c55bc559e3d0e06f2e7e7bdeb42b1e Mon Sep 17 00:00:00 2001 From: Oleksii Filonenko <12615679+Br1ght0ne@users.noreply.github.com> Date: Mon, 30 Oct 2023 15:55:14 +0200 Subject: [PATCH 02/13] Revert "fix(ci): ignore testnet_hello_world test" (#1175) Reverts FuelLabs/fuels-rs#1143. Closes #1144. Co-authored-by: hal3e --- packages/fuels/tests/providers.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/fuels/tests/providers.rs b/packages/fuels/tests/providers.rs index e1f41b01c7..5645b49e80 100644 --- a/packages/fuels/tests/providers.rs +++ b/packages/fuels/tests/providers.rs @@ -619,7 +619,6 @@ async fn test_get_gas_used() -> Result<()> { } #[tokio::test] -#[ignore] async fn testnet_hello_world() -> Result<()> { // Note that this test might become flaky. // This test depends on: From 51a4cc4a01b42137f9de50c1d07bd6fb52fa140f Mon Sep 17 00:00:00 2001 From: MujkicA <32431923+MujkicA@users.noreply.github.com> Date: Mon, 30 Oct 2023 16:31:11 +0100 Subject: [PATCH 03/13] Move health check after error collection (#1176) #1132 Moves the server health check to take place after the thread for collecting command output is spawned. --- packages/fuels-test-helpers/src/fuel_bin_service.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/fuels-test-helpers/src/fuel_bin_service.rs b/packages/fuels-test-helpers/src/fuel_bin_service.rs index 03c1bdd483..b33f979bc7 100644 --- a/packages/fuels-test-helpers/src/fuel_bin_service.rs +++ b/packages/fuels-test-helpers/src/fuel_bin_service.rs @@ -136,7 +136,9 @@ impl FuelService { config_file: NamedTempFile::new()?, }; + let addr = extended_config.config.addr; let handle = run_node(extended_config).await?; + server_health_check(addr).await?; Ok(FuelService { bound_address, @@ -150,7 +152,9 @@ impl FuelService { } } -async fn server_health_check(client: &FuelClient) -> FuelResult<()> { +async fn server_health_check(address: SocketAddr) -> FuelResult<()> { + let client = FuelClient::from(address); + let mut attempts = 5; let mut healthy = client.health().await.unwrap_or(false); let between_attempts = Duration::from_millis(300); @@ -205,11 +209,9 @@ async fn run_node(mut extended_config: ExtendedConfig) -> FuelResult Date: Sat, 28 Oct 2023 11:09:52 +0000 Subject: [PATCH 04/13] "re-run CI after c648e41aacf6ee3ac8e3f7a8ce0a34281628613f commit merged to FuelLabs/fuel-core" From a18befa7964aeba38a44cb0f24c1a3895dec13da Mon Sep 17 00:00:00 2001 From: Kaya Gokalp Date: Sat, 28 Oct 2023 13:11:24 -0700 Subject: [PATCH 05/13] add patch table to patch fuel-core dependencies to master --- Cargo.toml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index 85ab7a5fc6..05b37a89b6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -94,3 +94,9 @@ fuels-core = { version = "0.49.0", path = "./packages/fuels-core", default-featu fuels-macros = { version = "0.49.0", path = "./packages/fuels-macros", default-features = false } fuels-programs = { version = "0.49.0", path = "./packages/fuels-programs", default-features = false } fuels-test-helpers = { version = "0.49.0", path = "./packages/fuels-test-helpers", default-features = false } + +[patch.crates-io] +fuel-core = { git = "https://github.com/FuelLabs/fuel-core", branch = "master" } +fuel-core-chain-config = { git = "https://github.com/FuelLabs/fuel-core", branch = "master" } +fuel-core-client = { git = "https://github.com/FuelLabs/fuel-core", branch = "master" } +fuel-core-types = { git = "https://github.com/FuelLabs/fuel-core", branch = "master" } From ccfecd85217d27dac98676b88cc72eaa7490c066 Mon Sep 17 00:00:00 2001 From: releasy Date: Sun, 29 Oct 2023 20:19:00 +0000 Subject: [PATCH 06/13] "re-run CI after 0ecc88b2aad32a92672fcbb89d5e4cee46d79fa5 commit merged to FuelLabs/fuel-core" From ab8508ecdd726c13a8ff80c5e60935bb1e5f50fe Mon Sep 17 00:00:00 2001 From: releasy Date: Mon, 30 Oct 2023 12:54:53 +0000 Subject: [PATCH 07/13] "re-run CI after 9095c1e97374e02cfa1a35dcbf41ac0d4e3c6986 commit merged to this repo" From 2f16b6be7a891684ef8304bf136f61f91f8eac56 Mon Sep 17 00:00:00 2001 From: releasy Date: Mon, 30 Oct 2023 13:56:54 +0000 Subject: [PATCH 08/13] "re-run CI after 10fe3bb510c55bc559e3d0e06f2e7e7bdeb42b1e commit merged to this repo" From 7bf98a9a83af69c537cfdf675418a713fb750721 Mon Sep 17 00:00:00 2001 From: releasy Date: Mon, 30 Oct 2023 15:32:55 +0000 Subject: [PATCH 09/13] "re-run CI after 51a4cc4a01b42137f9de50c1d07bd6fb52fa140f commit merged to this repo" From 10f56508407ed1a9dcbcef96117e4d870ab27267 Mon Sep 17 00:00:00 2001 From: releasy Date: Mon, 30 Oct 2023 23:19:06 +0000 Subject: [PATCH 10/13] "re-run CI after b02f16f5a0834af1dcf564bed997b2e49881b681 commit merged to FuelLabs/fuel-core" From a23f5c6eceea1c7f93f3b15bf172424395c9acb4 Mon Sep 17 00:00:00 2001 From: releasy Date: Tue, 31 Oct 2023 18:05:30 +0000 Subject: [PATCH 11/13] "re-run CI after 5971c834d5a666e45ca56cfd02c3d02578184920 commit merged to FuelLabs/fuel-core" From 3921756ba7c4eaf27a1d41be20dd7946a5b08e6f Mon Sep 17 00:00:00 2001 From: releasy Date: Wed, 1 Nov 2023 00:58:54 +0000 Subject: [PATCH 12/13] "re-run CI after 3c8ab9d02a6b7e4fa4ab83f207fab4afd9d4cfc7 commit merged to FuelLabs/fuel-core" From 673919bb4d11ba5d0c43fd67e893118b99f16481 Mon Sep 17 00:00:00 2001 From: releasy Date: Wed, 1 Nov 2023 05:19:32 +0000 Subject: [PATCH 13/13] "re-run CI after 8a323ad75ea021b2bf09125f5ad452acf1e7e6b6 commit merged to FuelLabs/fuel-core"