From 806c1e2955dd7b6303af46d2652065ffb6d6f013 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Mon, 22 Dec 2025 14:32:21 +0100 Subject: [PATCH 1/2] chore(transaction-builder): rename `name` to `assign` --- .../src/transaction_builder/builder.rs | 6 +++--- .../src/transaction_builder/client_builder.rs | 6 +++--- .../src/builder/mod.rs | 14 +++++++------- crates/iota-sdk-transaction-builder/src/lib.rs | 4 ++-- crates/iota-sdk/examples/dev_inspect.rs | 12 ++++++------ .../iota-sdk/examples/prepare_send_iota_multi.rs | 2 +- crates/iota-sdk/examples/prepare_split_coins.rs | 2 +- crates/iota-sdk/examples/publish_upgrade.rs | 6 +++--- crates/iota-sdk/examples/tx_command_results.rs | 6 +++--- 9 files changed, 29 insertions(+), 29 deletions(-) diff --git a/crates/iota-sdk-ffi/src/transaction_builder/builder.rs b/crates/iota-sdk-ffi/src/transaction_builder/builder.rs index 6b4265f8d..b1a0730ba 100644 --- a/crates/iota-sdk-ffi/src/transaction_builder/builder.rs +++ b/crates/iota-sdk-ffi/src/transaction_builder/builder.rs @@ -151,7 +151,7 @@ impl TransactionBuilder { .move_call(**package, &module.as_str(), &function.as_str()) .arguments(arguments) .type_tags(type_args.into_iter().map(|v| v.0.clone())) - .name(names); + .assign(names); }); self } @@ -218,7 +218,7 @@ impl TransactionBuilder { names: Vec, ) -> Arc { self.write(|builder| { - builder.split_coins(coin, amounts).name(names); + builder.split_coins(coin, amounts).assign(names); }); self } @@ -310,7 +310,7 @@ impl TransactionBuilder { self.write(|builder| { builder .upgrade(**package_id, package_data.0.clone(), upgrade_ticket) - .name(name); + .assign(name); }); self } diff --git a/crates/iota-sdk-ffi/src/transaction_builder/client_builder.rs b/crates/iota-sdk-ffi/src/transaction_builder/client_builder.rs index 32687c91e..b201c1c71 100644 --- a/crates/iota-sdk-ffi/src/transaction_builder/client_builder.rs +++ b/crates/iota-sdk-ffi/src/transaction_builder/client_builder.rs @@ -139,7 +139,7 @@ impl ClientTransactionBuilder { .move_call(**package, &module.as_str(), &function.as_str()) .arguments(arguments) .type_tags(type_args.into_iter().map(|v| v.0.clone())) - .name(names); + .assign(names); }); self } @@ -206,7 +206,7 @@ impl ClientTransactionBuilder { names: Vec, ) -> Arc { self.write(|builder| { - builder.split_coins(coin, amounts).name(names); + builder.split_coins(coin, amounts).assign(names); }); self } @@ -298,7 +298,7 @@ impl ClientTransactionBuilder { self.write(|builder| { builder .upgrade(**package_id, package_data.0.clone(), upgrade_ticket) - .name(name); + .assign(name); }); self } diff --git a/crates/iota-sdk-transaction-builder/src/builder/mod.rs b/crates/iota-sdk-transaction-builder/src/builder/mod.rs index f102b71ad..a79465a17 100644 --- a/crates/iota-sdk-transaction-builder/src/builder/mod.rs +++ b/crates/iota-sdk-transaction-builder/src/builder/mod.rs @@ -356,7 +356,7 @@ impl TransactionBuilder { /// # )?, /// # [1000u64], /// # ) - /// # .name(("coin")); + /// # .assign(("coin")); /// /// builder.transfer_objects( /// Address::from_str("0x0000a4984bd495d4346fa208ddff4f5d5e5ad48c21dec631ddebc99809f16900")?, @@ -591,7 +591,7 @@ impl TransactionBuilder { /// let mut builder = TransactionBuilder::new(sender).with_client(client); /// builder /// .split_coins(coin, [1000u64, 2000, 3000]) - /// .name(("coin1", "coin2", "coin3")) + /// .assign(("coin1", "coin2", "coin3")) /// .transfer_objects(sender, (res("coin1"), res("coin2"), res("coin3"))); /// let txn = builder.finish().await?; /// # Ok(()) @@ -740,7 +740,7 @@ impl TransactionBuilder { /// /// builder /// .make_move_vec([address1, address2]) - /// .name("addresses") + /// .assign("addresses") /// .move_call(Address::FRAMEWORK, "vec_map", "from_keys_values") /// .generics::<(Address, u64)>() /// .arguments((res("addresses"), [10000000u64, 20000000u64])); @@ -1243,7 +1243,7 @@ impl TransactionBuilder<(), Publish> { let cap = self.arg(); self.move_call(Address::FRAMEWORK, "package", "upgrade_package") .arguments([cap]) - .name(name) + .assign(name) .reset() } } @@ -1255,7 +1255,7 @@ impl TransactionBuilder { let cap = self.arg(); self.move_call(Address::FRAMEWORK, "package", "upgrade_package") .arguments([cap]) - .name(name) + .assign(name) .reset() } } @@ -1270,8 +1270,8 @@ impl TransactionBuilder { } impl> TransactionBuilder { - /// Set the name for the last command. - pub fn name(&mut self, name: impl NamedResults) -> &mut Self { + /// Assign a name to the last command's result. + pub fn assign(&mut self, name: impl NamedResults) -> &mut Self { name.push_named_results(&mut self.data); self } diff --git a/crates/iota-sdk-transaction-builder/src/lib.rs b/crates/iota-sdk-transaction-builder/src/lib.rs index cd802ed5c..2b229c50f 100644 --- a/crates/iota-sdk-transaction-builder/src/lib.rs +++ b/crates/iota-sdk-transaction-builder/src/lib.rs @@ -467,7 +467,7 @@ mod tests { // transfer 1 IOTA from Gas coin let gas = tx.get_gas()[0]; - tx.split_coins(gas, [1_000_000_000u64]).name("coin"); + tx.split_coins(gas, [1_000_000_000u64]).assign("coin"); let recipient = Address::generate(rand::thread_rng()); tx.transfer_objects(recipient, [res("coin")]); @@ -604,7 +604,7 @@ mod tests { UpgradePolicy::Compatible as u8, updated_package.digest, )) - .name("ticket"); + .assign("ticket"); // now we can upgrade the package let receipt = tx .upgrade(package_id.unwrap(), updated_package, res("ticket")) diff --git a/crates/iota-sdk/examples/dev_inspect.rs b/crates/iota-sdk/examples/dev_inspect.rs index d3704dc4f..8959d8039 100644 --- a/crates/iota-sdk/examples/dev_inspect.rs +++ b/crates/iota-sdk/examples/dev_inspect.rs @@ -36,19 +36,19 @@ async fn main() -> Result<()> { name: Identifier::new("Registry")?, type_params: vec![], }))]) - .name("iota_names"); + .assign("iota_names"); // Step 2: Create the name object from the string builder .move_call(iota_names_package_address, "name", "new") .arguments([name]) - .name("name"); + .assign("name"); // Step 3: Look up the name record in the registry builder .move_call(iota_names_package_address, "registry", "lookup") .arguments((res("iota_names"), res("name"))) - .name("name_record_opt"); + .assign("name_record_opt"); // Step 4: Borrow the name record from the option builder @@ -60,13 +60,13 @@ async fn main() -> Result<()> { name: Identifier::new("NameRecord")?, type_params: vec![], }))]) - .name("name_record"); + .assign("name_record"); // Step 5: Get the target address from the name record builder .move_call(iota_names_package_address, "name_record", "target_address") .arguments([res("name_record")]) - .name("target_address_opt"); + .assign("target_address_opt"); // Step 6: Borrow the address from the option (this returns the resolved // address) @@ -74,7 +74,7 @@ async fn main() -> Result<()> { .move_call(Address::STD_LIB, "option", "borrow") .arguments([res("target_address_opt")]) .generics::
() - .name("target_address"); + .assign("target_address"); let res = builder.dry_run(true).await?; diff --git a/crates/iota-sdk/examples/prepare_send_iota_multi.rs b/crates/iota-sdk/examples/prepare_send_iota_multi.rs index 32199909d..ae5c8b722 100644 --- a/crates/iota-sdk/examples/prepare_send_iota_multi.rs +++ b/crates/iota-sdk/examples/prepare_send_iota_multi.rs @@ -39,7 +39,7 @@ async fn main() -> Result<()> { let labels: Vec = (0..recipients.len()).map(|i| format!("coin{i}")).collect(); - builder.split_coins(coin, amounts).name(labels.clone()); + builder.split_coins(coin, amounts).assign(labels.clone()); // Transfer each split coin to the corresponding recipient for (i, (address, _)) in recipients.iter().enumerate() { diff --git a/crates/iota-sdk/examples/prepare_split_coins.rs b/crates/iota-sdk/examples/prepare_split_coins.rs index 38983dcd9..053c391d5 100644 --- a/crates/iota-sdk/examples/prepare_split_coins.rs +++ b/crates/iota-sdk/examples/prepare_split_coins.rs @@ -23,7 +23,7 @@ async fn main() -> Result<()> { builder .split_coins(coin, [1000u64, 2000, 3000]) - .name(("coin1", "coin2", "coin3")) + .assign(("coin1", "coin2", "coin3")) .transfer_objects(sender, (res("coin1"), res("coin2"), res("coin3"))); let txn = builder.clone().finish().await?; diff --git a/crates/iota-sdk/examples/publish_upgrade.rs b/crates/iota-sdk/examples/publish_upgrade.rs index de62a39cc..9dd0d3103 100644 --- a/crates/iota-sdk/examples/publish_upgrade.rs +++ b/crates/iota-sdk/examples/publish_upgrade.rs @@ -65,7 +65,7 @@ async fn main() -> Result<()> { builder // Publish the package and receive the upgrade cap .publish(package_data.clone()) - .name("upgrade_cap") + .assign("upgrade_cap") // Transfer the upgrade cap to the sender address .transfer_objects(sender, [res("upgrade_cap")]); @@ -135,10 +135,10 @@ async fn main() -> Result<()> { UpgradePolicy::Compatible as u8, package_data.digest, )) - .name("upgrade_ticket") + .assign("upgrade_ticket") // Upgrade the package to receive an upgrade receipt .upgrade(package_id, package_data, res("upgrade_ticket")) - .name("upgrade_receipt") + .assign("upgrade_receipt") // Commit the upgrade using the receipt .move_call(Address::FRAMEWORK, "package", "commit_upgrade") .arguments((upgrade_cap_id, res("upgrade_receipt"))); diff --git a/crates/iota-sdk/examples/tx_command_results.rs b/crates/iota-sdk/examples/tx_command_results.rs index 3c2f17121..eda76d844 100644 --- a/crates/iota-sdk/examples/tx_command_results.rs +++ b/crates/iota-sdk/examples/tx_command_results.rs @@ -22,17 +22,17 @@ async fn main() -> Result<()> { .move_call(Address::STD_LIB, "u64", "max") .arguments((0u64, 1000u64)) // Assign a name to the result of this command - .name("res0"); + .assign("res0"); builder .move_call(Address::STD_LIB, "u64", "max") .arguments((1000u64, 2000u64)) - .name("res1"); + .assign("res1"); builder // Use the named results of previous commands to use as arguments .split_coins(Argument::Gas, [res("res0"), res("res1")]) // For nested results, a tuple or vec can be used to name them - .name(vec!["coin0", "coin1"]); + .assign(vec!["coin0", "coin1"]); // Use named results as arguments builder.transfer_objects(sender_address, [res("coin0"), res("coin1")]); From 764a9f9b2c7e51abf791b013957418d19499b071 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Mon, 22 Dec 2025 14:57:26 +0100 Subject: [PATCH 2/2] more renaming --- .../go/examples/tx_command_results/main.go | 6 +- bindings/kotlin/examples/TxCommandResults.kt | 6 +- .../python/examples/tx_command_results.py | 6 +- crates/iota-sdk-ffi/README.md | 2 +- .../src/transaction_builder/builder.rs | 2 +- .../src/transaction_builder/client_builder.rs | 2 +- .../src/builder/assigned_results.rs | 78 +++++++++++++++++++ .../src/builder/mod.rs | 40 +++++----- .../src/builder/named_results.rs | 78 ------------------- .../src/builder/ptb_arguments.rs | 4 +- .../iota-sdk-transaction-builder/src/lib.rs | 11 +-- .../iota-sdk/examples/tx_command_results.rs | 4 +- 12 files changed, 120 insertions(+), 119 deletions(-) create mode 100644 crates/iota-sdk-transaction-builder/src/builder/assigned_results.rs delete mode 100644 crates/iota-sdk-transaction-builder/src/builder/named_results.rs diff --git a/bindings/go/examples/tx_command_results/main.go b/bindings/go/examples/tx_command_results/main.go index ca2834050..dd6689c3f 100644 --- a/bindings/go/examples/tx_command_results/main.go +++ b/bindings/go/examples/tx_command_results/main.go @@ -57,13 +57,13 @@ func main() { builder.SplitCoins( iota_sdk.PtbArgumentGas(), - // Use the named results of previous commands to use as arguments + // Use the assigned results of previous commands to use as arguments []*iota_sdk.PtbArgument{iota_sdk.PtbArgumentRes("res0"), iota_sdk.PtbArgumentRes("res1")}, - // For nested results, a tuple or vec can be used to name them + // For nested results, a tuple or vec can be used to assign them []string{"coin0", "coin1"}, ) - // Use named results as arguments + // Use assigned results as arguments builder.TransferObjects(sender, []*iota_sdk.PtbArgument{iota_sdk.PtbArgumentRes("coin0"), iota_sdk.PtbArgumentRes("coin1")}) txn, err := builder.Finish() diff --git a/bindings/kotlin/examples/TxCommandResults.kt b/bindings/kotlin/examples/TxCommandResults.kt index 741deba37..25a256c67 100644 --- a/bindings/kotlin/examples/TxCommandResults.kt +++ b/bindings/kotlin/examples/TxCommandResults.kt @@ -37,13 +37,13 @@ fun main() = runBlocking { builder.splitCoins( PtbArgument.gas(), - // Use the named results of previous commands to use as arguments + // Use the assigned results of previous commands to use as arguments listOf(PtbArgument.res("res0"), PtbArgument.res("res1")), - // For nested results, a tuple or vec can be used to name them + // For nested results, a tuple or vec can be used to assign them listOf("coin0", "coin1"), ) - // Use named results as arguments + // Use assigned results as arguments builder.transferObjects(sender, listOf(PtbArgument.res("coin0"), PtbArgument.res("coin1"))) val txn = builder.finish() diff --git a/bindings/python/examples/tx_command_results.py b/bindings/python/examples/tx_command_results.py index 986a80676..14f66de42 100644 --- a/bindings/python/examples/tx_command_results.py +++ b/bindings/python/examples/tx_command_results.py @@ -38,14 +38,14 @@ async def main(): builder.split_coins( PtbArgument.gas(), - # Use the named results of previous commands as arguments + # Use the assigned results of previous commands as arguments [PtbArgument.res("res0"), PtbArgument.res("res1")], - # For nested results, a tuple or vec can be used to name them + # For nested results, a tuple or vec can be used to assign them ["coin0", "coin1"], ) - # Use named results as arguments + # Use assigned results as arguments builder.transfer_objects( sender, [PtbArgument.res("coin0"), PtbArgument.res("coin1")]) diff --git a/crates/iota-sdk-ffi/README.md b/crates/iota-sdk-ffi/README.md index fa5c7c0b9..fe5663b8e 100644 --- a/crates/iota-sdk-ffi/README.md +++ b/crates/iota-sdk-ffi/README.md @@ -64,7 +64,7 @@ The following methods are available: #### Commands -Each command method adds one or more commands to the final transaction. Some commands have optional follow-up methods. Most command results can be named, which allows them to be used later in the transaction via the `PTBArgument::Res` variant. When a single name is provided, the result will be named, and when a list of names is provided, the names will be used for the individual nested results. +Each command method adds one or more commands to the final transaction. Some commands have optional follow-up methods. Most command results can be assigned a name, which allows them to be used later in the transaction via the `PTBArgument::Res` variant. When a single name is provided, the result will be assigned, and when a list of names is provided, the names will be used for the individual nested results. - `move_call`: Call a move function. - `send_iota`: Send IOTA coins to a recipient address. diff --git a/crates/iota-sdk-ffi/src/transaction_builder/builder.rs b/crates/iota-sdk-ffi/src/transaction_builder/builder.rs index b1a0730ba..53280ed5c 100644 --- a/crates/iota-sdk-ffi/src/transaction_builder/builder.rs +++ b/crates/iota-sdk-ffi/src/transaction_builder/builder.rs @@ -257,7 +257,7 @@ impl TransactionBuilder { .map(|e| builder.apply_argument(e.as_ref())) .collect(), }); - builder.named_command(cmd, name); + builder.assigned_command(cmd, name); }); self } diff --git a/crates/iota-sdk-ffi/src/transaction_builder/client_builder.rs b/crates/iota-sdk-ffi/src/transaction_builder/client_builder.rs index b201c1c71..5477fbf04 100644 --- a/crates/iota-sdk-ffi/src/transaction_builder/client_builder.rs +++ b/crates/iota-sdk-ffi/src/transaction_builder/client_builder.rs @@ -245,7 +245,7 @@ impl ClientTransactionBuilder { .map(|e| builder.apply_argument(e.as_ref())) .collect(), }); - builder.named_command(cmd, name); + builder.assigned_command(cmd, name); }); self } diff --git a/crates/iota-sdk-transaction-builder/src/builder/assigned_results.rs b/crates/iota-sdk-transaction-builder/src/builder/assigned_results.rs new file mode 100644 index 000000000..d3dfd33d9 --- /dev/null +++ b/crates/iota-sdk-transaction-builder/src/builder/assigned_results.rs @@ -0,0 +1,78 @@ +// Copyright 2025 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +use crate::{builder::TransactionBuildData, unresolved::Argument}; + +/// A trait that defines an assigned result, either a string or nothing. +pub trait AssignedResult { + /// Get the assigned result argument. + fn assigned_result(&self, ptb: &mut TransactionBuildData) -> Argument { + Argument::Result((ptb.commands.len() - 1) as _) + } + + /// Push the assigned result to the PTB. + fn push_assigned_result(self, arg: Argument, ptb: &mut TransactionBuildData); +} + +impl AssignedResult for () { + fn push_assigned_result(self, _: Argument, _: &mut TransactionBuildData) {} +} + +impl AssignedResult for &str { + fn push_assigned_result(self, arg: Argument, ptb: &mut TransactionBuildData) { + ptb.assigned_results.insert(self.to_owned(), arg); + } +} + +impl AssignedResult for String { + fn push_assigned_result(self, arg: Argument, ptb: &mut TransactionBuildData) { + ptb.assigned_results.insert(self.to_owned(), arg); + } +} + +impl AssignedResult for Option { + fn push_assigned_result(self, arg: Argument, ptb: &mut TransactionBuildData) { + if let Some(s) = self { + s.push_assigned_result(arg, ptb) + } + } +} + +/// A trait that allows tuples to be used to bind nested assigned results. +pub trait AssignedResults { + /// Push the assigned results to the PTB. + fn push_assigned_results(self, ptb: &mut TransactionBuildData); +} + +impl AssignedResults for T { + fn push_assigned_results(self, ptb: &mut TransactionBuildData) { + let arg = Argument::Result((ptb.commands.len() - 1) as _); + self.push_assigned_result(arg, ptb) + } +} + +impl AssignedResults for Vec { + fn push_assigned_results(self, ptb: &mut TransactionBuildData) { + for (i, v) in self.into_iter().enumerate() { + let arg = Argument::NestedResult((ptb.commands.len() - 1) as _, i as _); + v.push_assigned_result(arg, ptb); + } + } +} + +macro_rules! impl_assigned_result_tuple { + ($(($n:tt, $T:ident)),*) => { + impl<$($T),+> AssignedResults for ($($T),+) + where $($T: AssignedResult),+ + { + fn push_assigned_results(self, ptb: &mut TransactionBuildData) { + $( + let arg = Argument::NestedResult((ptb.commands.len() - 1) as _, $n); + self.$n.push_assigned_result(arg, ptb); + )+ + } + } + }; +} + +variadics_please::all_tuples_enumerated!(impl_assigned_result_tuple, 2, 10, T); diff --git a/crates/iota-sdk-transaction-builder/src/builder/mod.rs b/crates/iota-sdk-transaction-builder/src/builder/mod.rs index a79465a17..5a3883745 100644 --- a/crates/iota-sdk-transaction-builder/src/builder/mod.rs +++ b/crates/iota-sdk-transaction-builder/src/builder/mod.rs @@ -21,8 +21,8 @@ use serde::Serialize; use crate::{ ClientMethods, PTBArgument, SharedMut, WaitForTx, builder::{ + assigned_results::{AssignedResult, AssignedResults}, gas_station::GasStationData, - named_results::{NamedResult, NamedResults}, ptb_arguments::PTBArgumentList, signer::TransactionSigner, }, @@ -34,9 +34,9 @@ use crate::{ }, }; +mod assigned_results; pub(crate) mod client_methods; pub(crate) mod gas_station; -mod named_results; /// Argument types for PTBs pub mod ptb_arguments; pub mod signer; @@ -75,7 +75,7 @@ pub struct TransactionBuildData { /// expiration. expiration: TransactionExpiration, /// The map of user-defined names that map to a particular command's result. - named_results: HashMap, + assigned_results: HashMap, /// The data used for gas station sponsorship. gas_station_data: Option, } @@ -174,14 +174,14 @@ impl TransactionBuildData { } /// Manually set a command with an optional name - pub fn named_command(&mut self, cmd: Command, name: impl NamedResults) { + pub fn assigned_command(&mut self, cmd: Command, name: impl AssignedResults) { self.command(cmd); - name.push_named_results(self); + name.push_assigned_results(self); } - /// Get the value for the given string in the named results map - pub fn get_named_result(&self, name: &str) -> Option { - self.named_results.get(name).copied() + /// Get the value for the given string in the assigned results map + pub fn get_assigned_result(&self, name: &str) -> Option { + self.assigned_results.get(name).copied() } } @@ -197,7 +197,7 @@ impl TransactionBuilder { sender, sponsor: Default::default(), expiration: Default::default(), - named_results: Default::default(), + assigned_results: Default::default(), gas_station_data: Default::default(), }, client: (), @@ -303,13 +303,13 @@ impl TransactionBuilder { } /// Manually set a command with an optional name - pub fn named_command(&mut self, cmd: Command, name: impl NamedResults) { - self.data.named_command(cmd, name); + pub fn assigned_command(&mut self, cmd: Command, name: impl AssignedResults) { + self.data.assigned_command(cmd, name); } - /// Get the value for the given string in the named results map - pub fn get_named_result(&self, name: &str) -> Option { - self.data.get_named_result(name) + /// Get the value for the given string in the assigned results map + pub fn get_assigned_result(&self, name: &str) -> Option { + self.data.get_assigned_result(name) } /// Begin building a move call. @@ -1239,7 +1239,7 @@ impl TransactionBuilder { impl TransactionBuilder<(), Publish> { /// Get the package ID from the UpgradeCap so that it can be used for future /// commands. - pub fn package_id(&mut self, name: impl NamedResult) -> &mut TransactionBuilder { + pub fn package_id(&mut self, name: impl AssignedResult) -> &mut TransactionBuilder { let cap = self.arg(); self.move_call(Address::FRAMEWORK, "package", "upgrade_package") .arguments([cap]) @@ -1251,7 +1251,7 @@ impl TransactionBuilder<(), Publish> { impl TransactionBuilder { /// Get the package ID from the UpgradeCap so that it can be used for future /// commands. - pub fn package_id(&mut self, name: impl NamedResult) -> &mut TransactionBuilder { + pub fn package_id(&mut self, name: impl AssignedResult) -> &mut TransactionBuilder { let cap = self.arg(); self.move_call(Address::FRAMEWORK, "package", "upgrade_package") .arguments([cap]) @@ -1262,8 +1262,8 @@ impl TransactionBuilder { impl TransactionBuilder { /// Finish the publish call and return the UpgradeCap. - pub fn upgrade_cap(&mut self, name: impl NamedResult) -> &mut TransactionBuilder { - name.push_named_results(&mut self.data); + pub fn upgrade_cap(&mut self, name: impl AssignedResult) -> &mut TransactionBuilder { + name.push_assigned_results(&mut self.data); self.reset() } @@ -1271,8 +1271,8 @@ impl TransactionBuilder { impl> TransactionBuilder { /// Assign a name to the last command's result. - pub fn assign(&mut self, name: impl NamedResults) -> &mut Self { - name.push_named_results(&mut self.data); + pub fn assign(&mut self, name: impl AssignedResults) -> &mut Self { + name.push_assigned_results(&mut self.data); self } diff --git a/crates/iota-sdk-transaction-builder/src/builder/named_results.rs b/crates/iota-sdk-transaction-builder/src/builder/named_results.rs deleted file mode 100644 index 9dfe73ec3..000000000 --- a/crates/iota-sdk-transaction-builder/src/builder/named_results.rs +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2025 IOTA Stiftung -// SPDX-License-Identifier: Apache-2.0 - -use crate::{builder::TransactionBuildData, unresolved::Argument}; - -/// A trait that defines a named result, either a string or nothing. -pub trait NamedResult { - /// Get the named result argument. - fn named_result(&self, ptb: &mut TransactionBuildData) -> Argument { - Argument::Result((ptb.commands.len() - 1) as _) - } - - /// Push the named result to the PTB. - fn push_named_result(self, arg: Argument, ptb: &mut TransactionBuildData); -} - -impl NamedResult for () { - fn push_named_result(self, _: Argument, _: &mut TransactionBuildData) {} -} - -impl NamedResult for &str { - fn push_named_result(self, arg: Argument, ptb: &mut TransactionBuildData) { - ptb.named_results.insert(self.to_owned(), arg); - } -} - -impl NamedResult for String { - fn push_named_result(self, arg: Argument, ptb: &mut TransactionBuildData) { - ptb.named_results.insert(self.to_owned(), arg); - } -} - -impl NamedResult for Option { - fn push_named_result(self, arg: Argument, ptb: &mut TransactionBuildData) { - if let Some(s) = self { - s.push_named_result(arg, ptb) - } - } -} - -/// A trait that allows tuples to be used to bind nested named results. -pub trait NamedResults { - /// Push the named results to the PTB. - fn push_named_results(self, ptb: &mut TransactionBuildData); -} - -impl NamedResults for T { - fn push_named_results(self, ptb: &mut TransactionBuildData) { - let arg = Argument::Result((ptb.commands.len() - 1) as _); - self.push_named_result(arg, ptb) - } -} - -impl NamedResults for Vec { - fn push_named_results(self, ptb: &mut TransactionBuildData) { - for (i, v) in self.into_iter().enumerate() { - let arg = Argument::NestedResult((ptb.commands.len() - 1) as _, i as _); - v.push_named_result(arg, ptb); - } - } -} - -macro_rules! impl_named_result_tuple { - ($(($n:tt, $T:ident)),*) => { - impl<$($T),+> NamedResults for ($($T),+) - where $($T: NamedResult),+ - { - fn push_named_results(self, ptb: &mut TransactionBuildData) { - $( - let arg = Argument::NestedResult((ptb.commands.len() - 1) as _, $n); - self.$n.push_named_result(arg, ptb); - )+ - } - } - }; -} - -variadics_please::all_tuples_enumerated!(impl_named_result_tuple, 2, 10, T); diff --git a/crates/iota-sdk-transaction-builder/src/builder/ptb_arguments.rs b/crates/iota-sdk-transaction-builder/src/builder/ptb_arguments.rs index 787a5f2c4..d04829ac3 100644 --- a/crates/iota-sdk-transaction-builder/src/builder/ptb_arguments.rs +++ b/crates/iota-sdk-transaction-builder/src/builder/ptb_arguments.rs @@ -274,10 +274,10 @@ impl PTBArgument for Res { impl PTBArgument for &Res { fn arg(self, ptb: &mut TransactionBuildData) -> Argument { - if let Some(arg) = ptb.named_results.get(&self.0) { + if let Some(arg) = ptb.assigned_results.get(&self.0) { *arg } else { - panic!("no command result named `{}` exists", self.0) + panic!("no command result assigned to `{}` exists", self.0) } } } diff --git a/crates/iota-sdk-transaction-builder/src/lib.rs b/crates/iota-sdk-transaction-builder/src/lib.rs index 2b229c50f..e213c8601 100644 --- a/crates/iota-sdk-transaction-builder/src/lib.rs +++ b/crates/iota-sdk-transaction-builder/src/lib.rs @@ -97,9 +97,10 @@ //! ### Commands //! //! Each command method adds one or more commands to the final transaction. Some -//! commands have optional follow-up methods. All command results can be named -//! via [name](TransactionBuilder::name). Naming a command allows them to be -//! used later in the transaction via the [res] method. +//! commands have optional follow-up methods. All command results can be +//! assigned a name via [assign](TransactionBuilder::assign). Assigning a name +//! to a command allows them to be used later in the transaction via the [res] +//! method. //! //! - [move_call](TransactionBuilder::move_call): Call a move function. //! - `arguments`: Add arguments to the move call. @@ -149,7 +150,7 @@ //! - [pure_bytes](TransactionBuilder::pure_bytes) //! - [pure](TransactionBuilder::pure) //! - [command](TransactionBuilder::command) -//! - [named_command](TransactionBuilder::named_command) +//! - [assigned_command](TransactionBuilder::assigned_command) //! //! ## Finalization and Execution //! @@ -212,7 +213,7 @@ //! - [ObjectReference](iota_types::ObjectReference): An object's reference. //! This will be assumed immutable or owned. //! - [Res](builder::ptb_arguments::Res): A reference to the result of a -//! previous named command, set with [name](TransactionBuilder::name). +//! previous assigned command, set with [assign](TransactionBuilder::assign). //! - [Shared]: Allows specifying shared immutable move objects. //! - [SharedMut]: Allows specifying shared mutable move objects. //! - [Receiving]: Allows specifying receiving move objects. diff --git a/crates/iota-sdk/examples/tx_command_results.rs b/crates/iota-sdk/examples/tx_command_results.rs index eda76d844..dbd225985 100644 --- a/crates/iota-sdk/examples/tx_command_results.rs +++ b/crates/iota-sdk/examples/tx_command_results.rs @@ -29,12 +29,12 @@ async fn main() -> Result<()> { .assign("res1"); builder - // Use the named results of previous commands to use as arguments + // Use the assigned results of previous commands to use as arguments .split_coins(Argument::Gas, [res("res0"), res("res1")]) // For nested results, a tuple or vec can be used to name them .assign(vec!["coin0", "coin1"]); - // Use named results as arguments + // Use assigned results as arguments builder.transfer_objects(sender_address, [res("coin0"), res("coin1")]); let tx = builder.finish().await?;