Skip to content

Commit 464ee10

Browse files
authored
feat: add prepare_merge_coins example (#262)
1 parent b9ec0a7 commit 464ee10

File tree

4 files changed

+177
-0
lines changed

4 files changed

+177
-0
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// Copyright (c) 2025 IOTA Stiftung
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package main
5+
6+
import (
7+
"log"
8+
9+
sdk "bindings/iota_sdk_ffi"
10+
)
11+
12+
func main() {
13+
client := sdk.GraphQlClientNewDevnet()
14+
15+
sender, _ := sdk.AddressFromHex("0x611830d3641a68f94a690dcc25d1f4b0dac948325ac18f6dd32564371735f32c")
16+
17+
coin0, _ := sdk.ObjectIdFromHex("0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab")
18+
coin1, _ := sdk.ObjectIdFromHex("0xd04077fe3b6fad13b3d4ed0d535b7ca92afcac8f0f2a0e0925fb9f4f0b30c699")
19+
20+
builder := sdk.TransactionBuilderInit(sender, client)
21+
builder.MergeCoins(coin0, []*sdk.ObjectId{coin1})
22+
23+
txn, err := builder.Finish()
24+
if err.(*sdk.SdkFfiError) != nil {
25+
log.Fatalf("Failed to create transaction: %v", err)
26+
}
27+
28+
txnBytes, err := txn.BcsSerialize()
29+
if err != nil {
30+
log.Fatalf("Failed to serialize transaction: %v", err)
31+
}
32+
log.Printf("Signing Digest: %v", sdk.HexEncode(txn.SigningDigest()))
33+
log.Printf("Txn Bytes: %v", sdk.Base64Encode(txnBytes))
34+
35+
res, err := builder.DryRun(false)
36+
if err.(*sdk.SdkFfiError) != nil {
37+
log.Fatalf("Failed to merge coins: %v", err)
38+
}
39+
40+
if res.Error != nil {
41+
log.Fatalf("Failed to merge coins: %v", *res.Error)
42+
}
43+
44+
log.Print("Merge coins dry run was successful!")
45+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// Copyright (c) 2025 IOTA Stiftung
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
import iota_sdk.*
5+
import kotlinx.coroutines.runBlocking
6+
7+
fun main() = runBlocking {
8+
try {
9+
val client = GraphQlClient.newDevnet()
10+
11+
val sender =
12+
Address.fromHex(
13+
"0x611830d3641a68f94a690dcc25d1f4b0dac948325ac18f6dd32564371735f32c"
14+
)
15+
16+
val coin0 =
17+
ObjectId.fromHex(
18+
"0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab"
19+
)
20+
val coin1 =
21+
ObjectId.fromHex(
22+
"0xd04077fe3b6fad13b3d4ed0d535b7ca92afcac8f0f2a0e0925fb9f4f0b30c699"
23+
)
24+
25+
val builder = TransactionBuilder.init(sender, client)
26+
27+
builder.mergeCoins(coin0, listOf(coin1))
28+
29+
val txn = builder.finish()
30+
31+
println("Signing Digest: ${hexEncode(txn.signingDigest())}")
32+
println("Txn Bytes: ${base64Encode(txn.bcsSerialize())}")
33+
34+
val res = builder.dryRun()
35+
36+
if (res.error != null) {
37+
throw Exception("Failed to merge coins: ${res.error}")
38+
}
39+
40+
println("Merge coins dry run was successful!")
41+
} catch (e: Exception) {
42+
println("Error: $e")
43+
}
44+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# Copyright (c) 2025 IOTA Stiftung
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
from lib.iota_sdk_ffi import *
5+
6+
import asyncio
7+
8+
9+
async def main():
10+
try:
11+
client = GraphQlClient.new_devnet()
12+
13+
sender = Address.from_hex(
14+
"0x611830d3641a68f94a690dcc25d1f4b0dac948325ac18f6dd32564371735f32c"
15+
)
16+
17+
coin_0 = ObjectId.from_hex(
18+
"0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab"
19+
)
20+
coin_1 = ObjectId.from_hex(
21+
"0xd04077fe3b6fad13b3d4ed0d535b7ca92afcac8f0f2a0e0925fb9f4f0b30c699"
22+
)
23+
24+
builder = await TransactionBuilder.init(sender, client)
25+
26+
builder.merge_coins(coin_0, [coin_1])
27+
28+
txn = await builder.finish()
29+
30+
print("Signing Digest:", hex_encode(txn.signing_digest()))
31+
print("Txn Bytes:", base64_encode(txn.bcs_serialize()))
32+
33+
res = await builder.dry_run()
34+
if res.error is not None:
35+
raise Exception("Failed to merge coins:", res.error)
36+
37+
print("Merge coins dry run was successful!")
38+
39+
except Exception as e:
40+
print(f"Error: {e}")
41+
42+
43+
if __name__ == "__main__":
44+
asyncio.run(main())
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// Copyright (c) 2025 IOTA Stiftung
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
use std::str::FromStr;
5+
6+
use base64ct::Encoding;
7+
use eyre::Result;
8+
use iota_graphql_client::Client;
9+
use iota_transaction_builder::TransactionBuilder;
10+
use iota_types::{Address, ObjectId};
11+
12+
#[tokio::main]
13+
async fn main() -> Result<()> {
14+
let client = Client::new_devnet();
15+
16+
let sender =
17+
Address::from_str("0x611830d3641a68f94a690dcc25d1f4b0dac948325ac18f6dd32564371735f32c")?;
18+
let coin_0 =
19+
ObjectId::from_str("0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab")?;
20+
let coin_1 =
21+
ObjectId::from_str("0xd04077fe3b6fad13b3d4ed0d535b7ca92afcac8f0f2a0e0925fb9f4f0b30c699")?;
22+
23+
let mut builder = TransactionBuilder::new(sender).with_client(client.clone());
24+
25+
builder.merge_coins(coin_0, [coin_1]);
26+
27+
let txn = builder.finish().await?;
28+
29+
println!("Signing Digest: {}", hex::encode(txn.signing_digest()));
30+
println!(
31+
"Txn Bytes: {}",
32+
base64ct::Base64::encode_string(&bcs::to_bytes(&txn)?)
33+
);
34+
35+
let res = client.dry_run_tx(&txn, false).await?;
36+
37+
if let Some(err) = res.error {
38+
eyre::bail!("Failed to merge coin: {err}");
39+
}
40+
41+
println!("Merge coin dry run was successful!");
42+
43+
Ok(())
44+
}

0 commit comments

Comments
 (0)