From 002f05650f4e0c4e46b9b26a6dce03c2d87cc4ff Mon Sep 17 00:00:00 2001 From: MujkicA Date: Thu, 13 Jun 2024 20:09:09 +0200 Subject: [PATCH 1/8] include witness data --- e2e/Cargo.toml | 1 + e2e/tests/providers.rs | 56 +++++++++++++++++++ .../src/types/transaction_builders.rs | 14 +++-- .../transaction_builders/script_dry_runner.rs | 20 +++++-- 4 files changed, 81 insertions(+), 10 deletions(-) diff --git a/e2e/Cargo.toml b/e2e/Cargo.toml index 88376aaabf..3ba0245722 100644 --- a/e2e/Cargo.toml +++ b/e2e/Cargo.toml @@ -15,6 +15,7 @@ build = "build.rs" [dev-dependencies] # used in test assertions chrono = { workspace = true } +fuel-asm = { workspace = true } # TODO: [issue](https://github.com/FuelLabs/fuels-rs/issues/1375) needs to be removed, `ScriptTransaction` and `CreateTransaction` in `fuels` use `fuel_tx::Input` but don't reexport or convert it into a `fuels` owned type fuel-tx = { workspace = true } fuels = { workspace = true } diff --git a/e2e/tests/providers.rs b/e2e/tests/providers.rs index bfcf8633b8..3a0dfc3343 100644 --- a/e2e/tests/providers.rs +++ b/e2e/tests/providers.rs @@ -1,6 +1,7 @@ use std::{ops::Add, path::Path}; use chrono::{DateTime, Duration, TimeZone, Utc}; +use fuel_tx::Witness; use fuels::{ accounts::Account, client::{PageDirection, PaginationRequest}, @@ -1071,3 +1072,58 @@ async fn tx_respects_policies() -> Result<()> { Ok(()) } + +#[tokio::test] +async fn tx_with_witness_data() -> Result<()> { + use fuel_asm::{op, GTFArgs}; + + let wallet = launch_provider_and_get_wallet().await?; + let provider = wallet.try_provider()?; + + let receiver = WalletUnlocked::new_random(Some(provider.clone())); + + let inputs = wallet + .get_asset_inputs_for_amount(*provider.base_asset_id(), 10000, None) + .await?; + let outputs = + wallet.get_asset_outputs_for_amount(receiver.address(), *provider.base_asset_id(), 1); + + let mut tb = ScriptTransactionBuilder::prepare_transfer(inputs, outputs, TxPolicies::default()); + tb.add_signer(wallet.clone())?; + + let script: Vec = vec![ + op::gtf(0x10, 0x00, GTFArgs::ScriptWitnessAtIndex.into()), + op::ret(0x10), + ] + .into_iter() + .collect(); + tb.script = script; + + let expected_data = 15u64; + let witness = Witness::from(expected_data.to_be_bytes().to_vec()); + tb.witnesses_mut().push(witness); + + let tx = tb + .with_tx_policies(TxPolicies::default().with_witness_limit(1000)) + .build(provider) + .await?; + + let status = provider.send_transaction_and_await_commit(tx).await?; + + match status { + TxStatus::Success { receipts } => { + let ret = receipts + .into_iter() + .find_map(|receipt| match receipt { + Receipt::Return { val, .. } => Some(val), + _ => None, + }) + .expect("should have return value"); + + //assert_eq!(ret, expected_data as u64); + } + _ => panic!("expected success status"), + } + + Ok(()) +} diff --git a/packages/fuels-core/src/types/transaction_builders.rs b/packages/fuels-core/src/types/transaction_builders.rs index d8be7505d0..3bf04710be 100644 --- a/packages/fuels-core/src/types/transaction_builders.rs +++ b/packages/fuels-core/src/types/transaction_builders.rs @@ -486,7 +486,8 @@ impl ScriptTransactionBuilder { async fn resolve_fuel_tx(self, dry_runner: impl DryRunner) -> Result