|
| 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 | +// === DryRun with ObjectChange Example === |
| 13 | +// This example demonstrates the ObjectChange feature using DryRun, |
| 14 | +// which simulates transaction execution without actual on-chain changes. |
| 15 | +func main() { |
| 16 | + |
| 17 | + // Initialize client |
| 18 | + client := sdk.GraphQlClientNewDevnet() |
| 19 | + |
| 20 | + // Use actual addresses from devnet (these are examples) |
| 21 | + fromAddress, _ := sdk.AddressFromHex("0x611830d3641a68f94a690dcc25d1f4b0dac948325ac18f6dd32564371735f32c") |
| 22 | + |
| 23 | + toAddress, _ := sdk.AddressFromHex("0x0000a4984bd495d4346fa208ddff4f5d5e5ad48c21dec631ddebc99809f16900") |
| 24 | + |
| 25 | + coinObjId, _ := sdk.ObjectIdFromHex("0xd04077fe3b6fad13b3d4ed0d535b7ca92afcac8f0f2a0e0925fb9f4f0b30c699") |
| 26 | + |
| 27 | + gasCoinObjId, _ := sdk.ObjectIdFromHex("0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab") |
| 28 | + |
| 29 | + builder := sdk.TransactionBuilderInit(fromAddress, client) |
| 30 | + builder.TransferObjects(toAddress, []*sdk.PtbArgument{sdk.PtbArgumentObjectId(coinObjId)}) |
| 31 | + builder.Gas(gasCoinObjId).GasBudget(1000000000) |
| 32 | + |
| 33 | + dryRunResult, err := builder.DryRun(false) |
| 34 | + if err.(*sdk.SdkFfiError) != nil { |
| 35 | + log.Fatalf("Dry run failed: %v", err) |
| 36 | + } |
| 37 | + |
| 38 | + if dryRunResult.Error != nil { |
| 39 | + log.Fatalf("Dry run returned an error: %s\n", *dryRunResult.Error) |
| 40 | + } |
| 41 | + |
| 42 | + log.Printf("Dry run succeeded!\n") |
| 43 | + |
| 44 | + // Access transaction effects from dry run |
| 45 | + if dryRunResult.Effects != nil { |
| 46 | + PrintObjectChanges(*dryRunResult.Effects) |
| 47 | + } else { |
| 48 | + log.Println("No transaction effects available in dry run result") |
| 49 | + } |
| 50 | +} |
| 51 | + |
| 52 | +func PrintObjectChanges(effects *sdk.TransactionEffects) { |
| 53 | + log.Println("=== Object Changes (from DryRun) ===") |
| 54 | + |
| 55 | + if !effects.IsV1() { |
| 56 | + log.Println("Effects version is not V1") |
| 57 | + return |
| 58 | + } |
| 59 | + |
| 60 | + effectsV1 := effects.AsV1() |
| 61 | + log.Printf("Total changed objects: %d\n", len(effectsV1.ChangedObjects)) |
| 62 | + |
| 63 | + for i, change := range effectsV1.ChangedObjects { |
| 64 | + log.Printf("Object #%d:\n", i+1) |
| 65 | + log.Printf(" Object ID: %s\n", change.ObjectId.ToHex()) |
| 66 | + |
| 67 | + // Check creation/deletion status using IdOperation |
| 68 | + switch change.IdOperation { |
| 69 | + case sdk.IdOperationCreated: |
| 70 | + log.Println(" Status: CREATED") |
| 71 | + case sdk.IdOperationDeleted: |
| 72 | + log.Println(" Status: DELETED") |
| 73 | + case sdk.IdOperationNone: |
| 74 | + log.Println(" Status: MODIFIED") |
| 75 | + } |
| 76 | + |
| 77 | + // Object type (if available) |
| 78 | + if change.ObjectType != nil { |
| 79 | + log.Printf(" Type: %s\n", *change.ObjectType) |
| 80 | + } else { |
| 81 | + log.Printf(" Type: %v\n", change.ObjectType) |
| 82 | + } |
| 83 | + |
| 84 | + // Input state (state before transaction) |
| 85 | + switch input := change.InputState.(type) { |
| 86 | + case sdk.ObjectInMissing: |
| 87 | + log.Println(" Input State: Missing (new object)") |
| 88 | + case sdk.ObjectInData: |
| 89 | + log.Printf(" Input State: Version=%d, Owner=%s\n", input.Version, input.Owner.String()) |
| 90 | + } |
| 91 | + |
| 92 | + // Output state (state after transaction) |
| 93 | + switch output := change.OutputState.(type) { |
| 94 | + case sdk.ObjectOutMissing: |
| 95 | + log.Println(" Output State: Missing (deleted)") |
| 96 | + case sdk.ObjectOutObjectWrite: |
| 97 | + log.Printf(" Output State: ObjectWrite, Owner=%s\n", output.Owner.String()) |
| 98 | + case sdk.ObjectOutPackageWrite: |
| 99 | + log.Printf(" Output State: PackageWrite, Version=%d\n", output.Version) |
| 100 | + } |
| 101 | + } |
| 102 | +} |
0 commit comments