diff --git a/bindings/go/examples/generic_move_function/main.go b/bindings/go/examples/generic_move_function/main.go index 474a233d8..f3b131368 100644 --- a/bindings/go/examples/generic_move_function/main.go +++ b/bindings/go/examples/generic_move_function/main.go @@ -14,7 +14,6 @@ func main() { client := sdk.GraphQlClientNewDevnet() sender, _ := sdk.AddressFromHex("0x71b4b4f171b4355ff691b7c470579cf1a926f96f724e5f9a30efc4b5f75d085e") - gas_coin_id, _ := sdk.ObjectIdFromHex("0xa1d009e8dafe20b1cba05e08aea488aafae1f89d892c3eaef6c0994e155e441a") builder := sdk.TransactionBuilderInit(sender, client) @@ -37,8 +36,6 @@ func main() { nil, ) - builder.Gas(gas_coin_id).GasBudget(1000000000) - res, err := builder.DryRun(false) if err.(*sdk.SdkFfiError) != nil { log.Fatalf("Failed to call generic Move function: %v", err) diff --git a/bindings/go/examples/prepare_send_iota/main.go b/bindings/go/examples/prepare_send_iota/main.go index ff4582f47..1b55c431a 100644 --- a/bindings/go/examples/prepare_send_iota/main.go +++ b/bindings/go/examples/prepare_send_iota/main.go @@ -18,11 +18,8 @@ func main() { coinObjId, _ := sdk.ObjectIdFromHex("0xd04077fe3b6fad13b3d4ed0d535b7ca92afcac8f0f2a0e0925fb9f4f0b30c699") - gasCoinObjId, _ := sdk.ObjectIdFromHex("0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab") - builder := sdk.TransactionBuilderInit(fromAddress, client) builder.TransferObjects(toAddress, []*sdk.PtbArgument{sdk.PtbArgumentObjectId(coinObjId)}) - builder.Gas(gasCoinObjId).GasBudget(1000000000) txn, err := builder.Finish() if err.(*sdk.SdkFfiError) != nil { @@ -36,7 +33,8 @@ func main() { log.Printf("Signing Digest: %v", sdk.HexEncode(txn.SigningDigest())) log.Printf("Txn Bytes: %v", sdk.Base64Encode(txnBytes)) - res, err := builder.DryRun(false) + skipChecks := bool(false) + res, err := client.DryRunTx(txn, &skipChecks) if err.(*sdk.SdkFfiError) != nil { log.Fatalf("Failed to send IOTA: %v", err) } diff --git a/bindings/go/examples/prepare_send_iota_multi/main.go b/bindings/go/examples/prepare_send_iota_multi/main.go index 31ebc4fd6..4d566da06 100644 --- a/bindings/go/examples/prepare_send_iota_multi/main.go +++ b/bindings/go/examples/prepare_send_iota_multi/main.go @@ -15,7 +15,7 @@ func main() { sender, _ := sdk.AddressFromHex("0x611830d3641a68f94a690dcc25d1f4b0dac948325ac18f6dd32564371735f32c") - gasCoinId, _ := sdk.ObjectIdFromHex("0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab") + coinId, _ := sdk.ObjectIdFromHex("0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab") recipients := []struct { address string @@ -35,16 +35,14 @@ func main() { amounts = append(amounts, r.amount) } - // Split the gas coin into multiple coins - builder.SplitCoins(gasCoinId, amounts, labels) + // Split a coin into multiple coins + builder.SplitCoins(coinId, amounts, labels) for idx, r := range recipients { recipient, _ := sdk.AddressFromHex(r.address) builder.TransferObjects(recipient, []*sdk.PtbArgument{sdk.PtbArgumentRes(labels[idx])}) } - builder.Gas(gasCoinId).GasBudget(1000000000) - txn, err := builder.Finish() if err.(*sdk.SdkFfiError) != nil { log.Fatalf("Failed to create transaction: %v", err) @@ -57,7 +55,8 @@ func main() { log.Printf("Signing Digest: %v", sdk.HexEncode(txn.SigningDigest())) log.Printf("Txn Bytes: %v", sdk.Base64Encode(txnBytes)) - res, err := builder.DryRun(false) + skipChecks := bool(false) + res, err := client.DryRunTx(txn, &skipChecks) if err.(*sdk.SdkFfiError) != nil { log.Fatalf("Failed to dry run send IOTA: %v", err) } diff --git a/bindings/go/examples/stake/main.go b/bindings/go/examples/stake/main.go index badcf33fa..a659d31c0 100644 --- a/bindings/go/examples/stake/main.go +++ b/bindings/go/examples/stake/main.go @@ -34,8 +34,6 @@ func main() { coinObjId, _ := sdk.ObjectIdFromHex("0xd04077fe3b6fad13b3d4ed0d535b7ca92afcac8f0f2a0e0925fb9f4f0b30c699") - gasCoinObjId, _ := sdk.ObjectIdFromHex("0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab") - iotaSystemAddress, _ := sdk.AddressFromHex("0x3") iotaSystemId, _ := sdk.ObjectIdFromHex("0x5") @@ -58,7 +56,6 @@ func main() { nil, nil, ) - builder.Gas(gasCoinObjId).GasBudget(1000000000) res, err := builder.DryRun(false) if err.(*sdk.SdkFfiError) != nil { diff --git a/bindings/go/examples/unstake/main.go b/bindings/go/examples/unstake/main.go index deefbaa67..0119d7413 100644 --- a/bindings/go/examples/unstake/main.go +++ b/bindings/go/examples/unstake/main.go @@ -22,16 +22,6 @@ func main() { } stakedIota := stakedIotas.Data[0] - gasCoinType := sdk.StructTagGasCoin().String() - gasCoins, err := client.Objects(&sdk.ObjectFilter{TypeTag: &gasCoinType, Owner: stakedIota.Owner().AsAddressOpt()}, nil) - if err.(*sdk.SdkFfiError) != nil { - log.Fatalf("Failed to get gas coin: %v", err) - } - if len(gasCoins.Data) == 0 { - log.Fatal("No gas coins found") - } - gasCoin := gasCoins.Data[0] - iotaSystemAddress, _ := sdk.AddressFromHex("0x3") iotaSystemId, _ := sdk.ObjectIdFromHex("0x5") @@ -40,7 +30,7 @@ func main() { requestAddStakeFn, _ := sdk.NewIdentifier("request_withdraw_stake") - builder := sdk.TransactionBuilderInit(gasCoin.Owner().AsAddress(), client) + builder := sdk.TransactionBuilderInit(stakedIota.Owner().AsAddress(), client) builder.MoveCall( iotaSystemAddress, iotaSystemModule, @@ -50,8 +40,6 @@ func main() { nil, ) - builder.Gas(gasCoin.ObjectId()).GasBudget(1000000000) - res, err := builder.DryRun(false) if err.(*sdk.SdkFfiError) != nil { log.Fatalf("Failed to unstake: %v", err) diff --git a/bindings/kotlin/examples/GenericMoveFunction.kt b/bindings/kotlin/examples/GenericMoveFunction.kt index ffcf54638..5fb5a4570 100644 --- a/bindings/kotlin/examples/GenericMoveFunction.kt +++ b/bindings/kotlin/examples/GenericMoveFunction.kt @@ -4,7 +4,6 @@ import iota_sdk.Address import iota_sdk.GraphQlClient import iota_sdk.Identifier -import iota_sdk.ObjectId import iota_sdk.PtbArgument import iota_sdk.TransactionBuilder import iota_sdk.TypeTag @@ -21,11 +20,6 @@ fun main() = runBlocking { "0x71b4b4f171b4355ff691b7c470579cf1a926f96f724e5f9a30efc4b5f75d085e" ) - val gasCoinId = - ObjectId.fromHex( - "0xa1d009e8dafe20b1cba05e08aea488aafae1f89d892c3eaef6c0994e155e441a" - ) - val builder = TransactionBuilder.init(sender, client) val address1 = @@ -62,8 +56,6 @@ fun main() = runBlocking { ) ) - builder.gas(gasCoinId).gasBudget(1000000000uL) - val res = builder.dryRun() if (res.error != null) { diff --git a/bindings/kotlin/examples/PrepareSendIota.kt b/bindings/kotlin/examples/PrepareSendIota.kt index dc4299c14..bc7760728 100644 --- a/bindings/kotlin/examples/PrepareSendIota.kt +++ b/bindings/kotlin/examples/PrepareSendIota.kt @@ -23,11 +23,6 @@ fun main() = runBlocking { "0xd04077fe3b6fad13b3d4ed0d535b7ca92afcac8f0f2a0e0925fb9f4f0b30c699" ) - val gasCoinId = - ObjectId.fromHex( - "0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab" - ) - val builder = TransactionBuilder.init(fromAddress, client) builder.transferObjects( @@ -35,8 +30,6 @@ fun main() = runBlocking { listOf(PtbArgument.objectId(coinId)), ) - builder.gas(gasCoinId).gasBudget(1000000000uL) - val txn = builder.finish() println("Signing Digest: ${hexEncode(txn.signingDigest())}") diff --git a/bindings/kotlin/examples/PrepareSendIotaMulti.kt b/bindings/kotlin/examples/PrepareSendIotaMulti.kt index 76228a8b0..c2ef0d8bf 100644 --- a/bindings/kotlin/examples/PrepareSendIotaMulti.kt +++ b/bindings/kotlin/examples/PrepareSendIotaMulti.kt @@ -22,7 +22,7 @@ fun main() = runBlocking { Address.fromHex( "0x611830d3641a68f94a690dcc25d1f4b0dac948325ac18f6dd32564371735f32c" ) - val gasCoinId = + val coinId = ObjectId.fromHex( "0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab" ) @@ -45,7 +45,7 @@ fun main() = runBlocking { val amounts = recipients.map { it.second } builder.splitCoins( - gasCoinId, + coinId, amounts, labels, ) @@ -53,7 +53,6 @@ fun main() = runBlocking { for ((i, r) in recipients.withIndex()) { builder.transferObjects(Address.fromHex(r.first), listOf(PtbArgument.res(labels[i]))) } - builder.gas(gasCoinId).gasBudget(1000000000uL) val txn = builder.finish() diff --git a/bindings/kotlin/examples/Stake.kt b/bindings/kotlin/examples/Stake.kt index ef7221033..9a602e906 100644 --- a/bindings/kotlin/examples/Stake.kt +++ b/bindings/kotlin/examples/Stake.kt @@ -31,11 +31,6 @@ fun main() = runBlocking { "0xd04077fe3b6fad13b3d4ed0d535b7ca92afcac8f0f2a0e0925fb9f4f0b30c699" ) - val gasCoinId = - ObjectId.fromHex( - "0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab" - ) - val builder = TransactionBuilder.init(myAddress, client) builder.moveCall( @@ -48,7 +43,6 @@ fun main() = runBlocking { PtbArgument.address(validator.address) ), ) - builder.gas(gasCoinId).gasBudget(1000000000uL) val res = builder.dryRun() diff --git a/bindings/kotlin/examples/Unstake.kt b/bindings/kotlin/examples/Unstake.kt index fdb8eb34b..41ef7f80e 100644 --- a/bindings/kotlin/examples/Unstake.kt +++ b/bindings/kotlin/examples/Unstake.kt @@ -7,7 +7,6 @@ import iota_sdk.Identifier import iota_sdk.ObjectFilter import iota_sdk.ObjectId import iota_sdk.PtbArgument -import iota_sdk.StructTag import iota_sdk.TransactionBuilder import kotlinx.coroutines.runBlocking @@ -21,19 +20,7 @@ fun main() = runBlocking { } val stakedIota = stakedIotas.data[0] - val gasCoins = - client.objects( - ObjectFilter( - typeTag = StructTag.gasCoin().toString(), - owner = stakedIota.owner().asAddress() - ) - ) - if (gasCoins.data.isEmpty()) { - throw Exception("no gas coins found") - } - val gasCoin = gasCoins.data[0] - - val builder = TransactionBuilder.init(gasCoin.owner().asAddress(), client) + val builder = TransactionBuilder.init(stakedIota.owner().asAddress(), client) builder.moveCall( Address.fromHex("0x3"), @@ -44,7 +31,6 @@ fun main() = runBlocking { PtbArgument.objectId(stakedIota.objectId()) ), ) - builder.gas(gasCoin.objectId()).gasBudget(1000000000uL) val res = builder.dryRun() diff --git a/bindings/python/examples/generic_move_function.py b/bindings/python/examples/generic_move_function.py index 3b494acd8..cf1f24035 100644 --- a/bindings/python/examples/generic_move_function.py +++ b/bindings/python/examples/generic_move_function.py @@ -12,9 +12,6 @@ async def main(): sender = Address.from_hex( "0x71b4b4f171b4355ff691b7c470579cf1a926f96f724e5f9a30efc4b5f75d085e" ) - gas_coin_id = ObjectId.from_hex( - "0xa1d009e8dafe20b1cba05e08aea488aafae1f89d892c3eaef6c0994e155e441a" - ) builder = await TransactionBuilder.init(sender, client) @@ -51,8 +48,6 @@ async def main(): [TypeTag.new_address(), TypeTag.new_u64()], ) - builder.gas(gas_coin_id).gas_budget(1000000000) - res = await builder.dry_run() if res.error is not None: diff --git a/bindings/python/examples/prepare_send_iota.py b/bindings/python/examples/prepare_send_iota.py index c910deb8c..595dde7ee 100644 --- a/bindings/python/examples/prepare_send_iota.py +++ b/bindings/python/examples/prepare_send_iota.py @@ -22,23 +22,18 @@ async def main(): "0xd04077fe3b6fad13b3d4ed0d535b7ca92afcac8f0f2a0e0925fb9f4f0b30c699" ) - gas_coin_id = ObjectId.from_hex( - "0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab" - ) - builder = await TransactionBuilder.init(from_address, client) builder.transfer_objects( to_address, [PtbArgument.object_id(coin_id)], ) - builder.gas(gas_coin_id).gas_budget(1000000000) txn = await builder.finish() print("Signing Digest:", hex_encode(txn.signing_digest())) print("Txn Bytes:", base64_encode(txn.bcs_serialize())) - res = await builder.dry_run() + res = await client.dry_run_tx(txn) if res.error is not None: raise Exception("Failed to send IOTA:", res.error) diff --git a/bindings/python/examples/prepare_send_iota_multi.py b/bindings/python/examples/prepare_send_iota_multi.py index 5477da316..5f4ed5bc6 100644 --- a/bindings/python/examples/prepare_send_iota_multi.py +++ b/bindings/python/examples/prepare_send_iota_multi.py @@ -11,7 +11,7 @@ async def main(): sender = Address.from_hex( "0x611830d3641a68f94a690dcc25d1f4b0dac948325ac18f6dd32564371735f32c" ) - gas_coin_id = ObjectId.from_hex( + coin_id = ObjectId.from_hex( "0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab" ) @@ -31,17 +31,16 @@ async def main(): builder = await TransactionBuilder.init(sender, client) - builder.split_coins(gas_coin_id, amounts, labels) + builder.split_coins(coin_id, amounts, labels) for i, r in enumerate(recipients): builder.transfer_objects(Address.from_hex(r[0]), [PtbArgument.res(labels[i])]) - builder.gas(gas_coin_id).gas_budget(1000000000) txn = await builder.finish() print("Signing Digest:", hex_encode(txn.signing_digest())) print("Txn Bytes:", base64_encode(txn.bcs_serialize())) - res = await builder.dry_run() + res = await client.dry_run_tx(txn) if res.error is not None: raise Exception(f"Failed to send IOTA: {res.error}") diff --git a/bindings/python/examples/stake.py b/bindings/python/examples/stake.py index 0af638259..c88c06081 100644 --- a/bindings/python/examples/stake.py +++ b/bindings/python/examples/stake.py @@ -25,10 +25,6 @@ async def main(): "0xd04077fe3b6fad13b3d4ed0d535b7ca92afcac8f0f2a0e0925fb9f4f0b30c699" ) - gas_coin_id = ObjectId.from_hex( - "0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab" - ) - builder = await TransactionBuilder.init(my_address, client) builder.move_call( @@ -41,7 +37,6 @@ async def main(): PtbArgument.address(validator.address), ], ) - builder.gas(gas_coin_id).gas_budget(1000000000) res = await builder.dry_run() if res.error is not None: diff --git a/bindings/python/examples/unstake.py b/bindings/python/examples/unstake.py index a662358a8..b379d4a19 100644 --- a/bindings/python/examples/unstake.py +++ b/bindings/python/examples/unstake.py @@ -17,17 +17,9 @@ async def main(): raise Exception("no staked iotas found") staked_iota = staked_iotas.data[0] - gas_coins = await client.objects( - ObjectFilter( - type_tag=str(StructTag.gas_coin()), - owner=staked_iota.owner().as_address(), - ) + builder = await TransactionBuilder.init( + staked_iota.owner().as_address(), client ) - if len(gas_coins.data) == 0: - raise Exception("no gas coin found") - gas_coin = gas_coins.data[0] - - builder = await TransactionBuilder.init(gas_coin.owner().as_address(), client) builder.move_call( Address.from_hex("0x3"), @@ -38,7 +30,6 @@ async def main(): PtbArgument.object_id(staked_iota.object_id()), ], ) - builder.gas(gas_coin.object_id()).gas_budget(1000000000) res = await builder.dry_run() if res.error is not None: diff --git a/crates/iota-graphql-client/examples/generic_move_function.rs b/crates/iota-graphql-client/examples/generic_move_function.rs index 343aef3bb..a83111894 100644 --- a/crates/iota-graphql-client/examples/generic_move_function.rs +++ b/crates/iota-graphql-client/examples/generic_move_function.rs @@ -24,9 +24,7 @@ async fn main() -> Result<()> { builder .move_call(Address::TWO, "vec_map", "from_keys_values") .generics::<(Address, u64)>() - .arguments((vec![address1, address2], vec![10000000u64, 20000000u64])) - .gas("0xa1d009e8dafe20b1cba05e08aea488aafae1f89d892c3eaef6c0994e155e441a".parse()?) - .gas_budget(1000000000); + .arguments((vec![address1, address2], vec![10000000u64, 20000000u64])); let res = builder.dry_run(false).await?; diff --git a/crates/iota-graphql-client/examples/prepare_send_iota.rs b/crates/iota-graphql-client/examples/prepare_send_iota.rs index 1bc0a64ce..f4dabf7d7 100644 --- a/crates/iota-graphql-client/examples/prepare_send_iota.rs +++ b/crates/iota-graphql-client/examples/prepare_send_iota.rs @@ -20,17 +20,10 @@ async fn main() -> Result<()> { let mut builder = TransactionBuilder::new(from_address).with_client(client.clone()); - builder - .transfer_objects( - to_address, - ObjectId::from_str( - "0xd04077fe3b6fad13b3d4ed0d535b7ca92afcac8f0f2a0e0925fb9f4f0b30c699", - )?, - ) - .gas(ObjectId::from_str( - "0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab", - )?) - .gas_budget(1000000000); + builder.transfer_objects( + to_address, + ObjectId::from_str("0xd04077fe3b6fad13b3d4ed0d535b7ca92afcac8f0f2a0e0925fb9f4f0b30c699")?, + ); let txn = builder.finish().await?; diff --git a/crates/iota-graphql-client/examples/prepare_send_iota_multi.rs b/crates/iota-graphql-client/examples/prepare_send_iota_multi.rs index 4d2090cae..d7e026ed6 100644 --- a/crates/iota-graphql-client/examples/prepare_send_iota_multi.rs +++ b/crates/iota-graphql-client/examples/prepare_send_iota_multi.rs @@ -13,7 +13,7 @@ use iota_types::{Address, ObjectId}; async fn main() -> Result<()> { let client = Client::new_devnet(); - let gas_coin = + let coin = ObjectId::from_str("0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab")?; let sender = @@ -38,15 +38,13 @@ async fn main() -> Result<()> { let labels: Vec = (0..recipients.len()).map(|i| format!("coin{i}")).collect(); - builder.split_coins(gas_coin, amounts).name(labels.clone()); + builder.split_coins(coin, amounts).name(labels.clone()); // Transfer each split coin to the corresponding recipient for (i, (address, _)) in recipients.iter().enumerate() { builder.transfer_objects(Address::from_str(address)?, res(&labels[i])); } - builder.gas(gas_coin).gas_budget(1000000000); - let txn = builder.finish().await?; println!("Signing Digest: {}", hex::encode(txn.signing_digest())); diff --git a/crates/iota-graphql-client/examples/stake.rs b/crates/iota-graphql-client/examples/stake.rs index 656218c1b..1189023fd 100644 --- a/crates/iota-graphql-client/examples/stake.rs +++ b/crates/iota-graphql-client/examples/stake.rs @@ -38,11 +38,7 @@ async fn main() -> Result<()> { "0xd04077fe3b6fad13b3d4ed0d535b7ca92afcac8f0f2a0e0925fb9f4f0b30c699", )?, &validator.address.address, - )) - .gas(ObjectId::from_str( - "0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab", - )?) - .gas_budget(1000000000); + )); let res = builder.dry_run(false).await?; diff --git a/crates/iota-graphql-client/examples/unstake.rs b/crates/iota-graphql-client/examples/unstake.rs index 3f24fa494..0dab46775 100644 --- a/crates/iota-graphql-client/examples/unstake.rs +++ b/crates/iota-graphql-client/examples/unstake.rs @@ -6,7 +6,7 @@ use std::str::FromStr; use eyre::{OptionExt, Result}; use iota_graphql_client::{Client, query_types::ObjectFilter}; use iota_transaction_builder::{SharedMut, TransactionBuilder}; -use iota_types::{Address, ObjectId, StructTag}; +use iota_types::{Address, ObjectId}; #[tokio::main] async fn main() -> Result<()> { @@ -26,32 +26,15 @@ async fn main() -> Result<()> { .next() .ok_or_eyre("no staked iota found")?; - // Get a valid gas coin - let gas_coin = client - .objects( - ObjectFilter { - type_: Some(StructTag::gas_coin().to_string()), - owner: Some(*staked_iota.owner().as_address()), - ..Default::default() - }, - Default::default(), - ) - .await? - .data - .into_iter() - .next() - .ok_or_eyre("no gas coin found")?; - - let mut builder = TransactionBuilder::new(*gas_coin.owner().as_address()).with_client(client); + let mut builder = + TransactionBuilder::new(*staked_iota.owner().as_address()).with_client(client); builder .move_call(Address::THREE, "iota_system", "request_withdraw_stake") .arguments(( SharedMut(ObjectId::from_str("0x5")?), staked_iota.object_id(), - )) - .gas(gas_coin.object_id()) - .gas_budget(1000000000); + )); let res = builder.dry_run(false).await?; diff --git a/crates/iota-transaction-builder/src/builder/mod.rs b/crates/iota-transaction-builder/src/builder/mod.rs index 3bb1016b3..27e76dc43 100644 --- a/crates/iota-transaction-builder/src/builder/mod.rs +++ b/crates/iota-transaction-builder/src/builder/mod.rs @@ -9,7 +9,10 @@ use std::{ }; use iota_crypto::IotaSigner; -use iota_graphql_client::{Client, DryRunResult}; +use iota_graphql_client::{ + Client, DryRunResult, + query_types::{ObjectRef, TransactionMetadata}, +}; use iota_types::{ Address, GasPayment, Identifier, ObjectId, ObjectReference, Owner, ProgrammableTransaction, Transaction, TransactionEffects, TransactionExpiration, TypeTag, @@ -813,9 +816,12 @@ impl TransactionBuilder { if self.data.gas_budget.is_none() { let res = self .client - .dry_run_tx(&txn, true) + .dry_run_tx_kind(&txn.kind, true, Default::default()) .await .map_err(Error::Client)?; + if let Some(err) = res.error { + return Err(Error::DryRun(err)); + } txn.gas_payment.budget = res .effects .ok_or_else(|| Error::MissingGasBudget)? @@ -829,9 +835,34 @@ impl TransactionBuilder { /// Dry run the transaction. pub async fn dry_run(mut self, skip_checks: bool) -> Result { let txn = self.resolve_ptb().await?; + if !txn.gas_payment.objects.is_empty() && txn.gas_payment.budget == 0 { + return Err(Error::DryRun( + "gas coins were provided without a gas budget".to_owned(), + )); + } + let gas_objects = txn + .gas_payment + .objects + .iter() + .map(|r| ObjectRef { + address: r.object_id, + digest: r.digest.to_base58(), + version: r.version, + }) + .collect::>(); let res = self .client - .dry_run_tx(&txn, skip_checks) + .dry_run_tx_kind( + &txn.kind, + skip_checks, + TransactionMetadata { + gas_objects: (!gas_objects.is_empty()).then_some(gas_objects), + gas_budget: (txn.gas_payment.budget != 0).then_some(txn.gas_payment.budget), + gas_price: Some(txn.gas_payment.price), + gas_sponsor: Some(txn.gas_payment.owner), + sender: Some(txn.sender), + }, + ) .await .map_err(Error::Client)?; Ok(res) diff --git a/crates/iota-transaction-builder/src/error.rs b/crates/iota-transaction-builder/src/error.rs index be52b98c5..53541e28d 100644 --- a/crates/iota-transaction-builder/src/error.rs +++ b/crates/iota-transaction-builder/src/error.rs @@ -45,4 +45,6 @@ pub enum Error { Signature(iota_crypto::SignatureError), #[error(transparent)] Client(iota_graphql_client::error::Error), + #[error("Failed to dry run transaction: {0}")] + DryRun(String), } diff --git a/crates/iota-transaction-builder/src/lib.rs b/crates/iota-transaction-builder/src/lib.rs index 7f09c19cb..8c94c0f3a 100644 --- a/crates/iota-transaction-builder/src/lib.rs +++ b/crates/iota-transaction-builder/src/lib.rs @@ -151,7 +151,6 @@ mod tests { .unwrap(), )); tx.gas_price(1000); - tx.gas_budget(500000000); tx.finish().unwrap(); }