diff --git a/bindings/go/examples/prepare_merge_coins/main.go b/bindings/go/examples/prepare_merge_coins/main.go new file mode 100644 index 000000000..259f358e5 --- /dev/null +++ b/bindings/go/examples/prepare_merge_coins/main.go @@ -0,0 +1,45 @@ +// Copyright (c) 2025 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +package main + +import ( + "log" + + sdk "bindings/iota_sdk_ffi" +) + +func main() { + client := sdk.GraphQlClientNewDevnet() + + sender, _ := sdk.AddressFromHex("0x611830d3641a68f94a690dcc25d1f4b0dac948325ac18f6dd32564371735f32c") + + coin0, _ := sdk.ObjectIdFromHex("0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab") + coin1, _ := sdk.ObjectIdFromHex("0xd04077fe3b6fad13b3d4ed0d535b7ca92afcac8f0f2a0e0925fb9f4f0b30c699") + + builder := sdk.TransactionBuilderInit(sender, client) + builder.MergeCoins(coin0, []*sdk.ObjectId{coin1}) + + txn, err := builder.Finish() + if err.(*sdk.SdkFfiError) != nil { + log.Fatalf("Failed to create transaction: %v", err) + } + + txnBytes, err := txn.BcsSerialize() + if err != nil { + log.Fatalf("Failed to serialize transaction: %v", err) + } + log.Printf("Signing Digest: %v", sdk.HexEncode(txn.SigningDigest())) + log.Printf("Txn Bytes: %v", sdk.Base64Encode(txnBytes)) + + res, err := builder.DryRun(false) + if err.(*sdk.SdkFfiError) != nil { + log.Fatalf("Failed to merge coins: %v", err) + } + + if res.Error != nil { + log.Fatalf("Failed to merge coins: %v", *res.Error) + } + + log.Print("Merge coins dry run was successful!") +} diff --git a/bindings/kotlin/examples/PrepareMergeCoins.kt b/bindings/kotlin/examples/PrepareMergeCoins.kt new file mode 100644 index 000000000..fc34ef2ac --- /dev/null +++ b/bindings/kotlin/examples/PrepareMergeCoins.kt @@ -0,0 +1,44 @@ +// Copyright (c) 2025 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +import iota_sdk.* +import kotlinx.coroutines.runBlocking + +fun main() = runBlocking { + try { + val client = GraphQlClient.newDevnet() + + val sender = + Address.fromHex( + "0x611830d3641a68f94a690dcc25d1f4b0dac948325ac18f6dd32564371735f32c" + ) + + val coin0 = + ObjectId.fromHex( + "0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab" + ) + val coin1 = + ObjectId.fromHex( + "0xd04077fe3b6fad13b3d4ed0d535b7ca92afcac8f0f2a0e0925fb9f4f0b30c699" + ) + + val builder = TransactionBuilder.init(sender, client) + + builder.mergeCoins(coin0, listOf(coin1)) + + val txn = builder.finish() + + println("Signing Digest: ${hexEncode(txn.signingDigest())}") + println("Txn Bytes: ${base64Encode(txn.bcsSerialize())}") + + val res = builder.dryRun() + + if (res.error != null) { + throw Exception("Failed to merge coins: ${res.error}") + } + + println("Merge coins dry run was successful!") + } catch (e: Exception) { + println("Error: $e") + } +} diff --git a/bindings/python/examples/prepare_merge_coins.py b/bindings/python/examples/prepare_merge_coins.py new file mode 100644 index 000000000..333c6811b --- /dev/null +++ b/bindings/python/examples/prepare_merge_coins.py @@ -0,0 +1,44 @@ +# Copyright (c) 2025 IOTA Stiftung +# SPDX-License-Identifier: Apache-2.0 + +from lib.iota_sdk_ffi import * + +import asyncio + + +async def main(): + try: + client = GraphQlClient.new_devnet() + + sender = Address.from_hex( + "0x611830d3641a68f94a690dcc25d1f4b0dac948325ac18f6dd32564371735f32c" + ) + + coin_0 = ObjectId.from_hex( + "0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab" + ) + coin_1 = ObjectId.from_hex( + "0xd04077fe3b6fad13b3d4ed0d535b7ca92afcac8f0f2a0e0925fb9f4f0b30c699" + ) + + builder = await TransactionBuilder.init(sender, client) + + builder.merge_coins(coin_0, [coin_1]) + + 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() + if res.error is not None: + raise Exception("Failed to merge coins:", res.error) + + print("Merge coins dry run was successful!") + + except Exception as e: + print(f"Error: {e}") + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/crates/iota-graphql-client/examples/prepare_merge_coins.rs b/crates/iota-graphql-client/examples/prepare_merge_coins.rs new file mode 100644 index 000000000..f2838db2b --- /dev/null +++ b/crates/iota-graphql-client/examples/prepare_merge_coins.rs @@ -0,0 +1,44 @@ +// Copyright (c) 2025 IOTA Stiftung +// SPDX-License-Identifier: Apache-2.0 + +use std::str::FromStr; + +use base64ct::Encoding; +use eyre::Result; +use iota_graphql_client::Client; +use iota_transaction_builder::TransactionBuilder; +use iota_types::{Address, ObjectId}; + +#[tokio::main] +async fn main() -> Result<()> { + let client = Client::new_devnet(); + + let sender = + Address::from_str("0x611830d3641a68f94a690dcc25d1f4b0dac948325ac18f6dd32564371735f32c")?; + let coin_0 = + ObjectId::from_str("0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab")?; + let coin_1 = + ObjectId::from_str("0xd04077fe3b6fad13b3d4ed0d535b7ca92afcac8f0f2a0e0925fb9f4f0b30c699")?; + + let mut builder = TransactionBuilder::new(sender).with_client(client.clone()); + + builder.merge_coins(coin_0, [coin_1]); + + let txn = builder.finish().await?; + + println!("Signing Digest: {}", hex::encode(txn.signing_digest())); + println!( + "Txn Bytes: {}", + base64ct::Base64::encode_string(&bcs::to_bytes(&txn)?) + ); + + let res = client.dry_run_tx(&txn, false).await?; + + if let Some(err) = res.error { + eyre::bail!("Failed to merge coin: {err}"); + } + + println!("Merge coin dry run was successful!"); + + Ok(()) +}