Skip to content
Open
Show file tree
Hide file tree
Changes from 30 commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
9c94ec0
Add new transaction builder
DaughterOfMars Sep 16, 2025
107c8c4
remove unnecessary methods
DaughterOfMars Sep 16, 2025
d7b7c7f
improvements
DaughterOfMars Sep 16, 2025
756aae1
examples
DaughterOfMars Sep 16, 2025
1615b9a
simplify
DaughterOfMars Sep 16, 2025
73331f1
Update bindings
DaughterOfMars Sep 17, 2025
fab4fbf
fmt and clippy
DaughterOfMars Sep 17, 2025
ce87143
update years
DaughterOfMars Sep 18, 2025
813a883
improved input and gas handling
DaughterOfMars Sep 18, 2025
231d8e4
fix doc
DaughterOfMars Sep 18, 2025
c5cdbc0
fix test
DaughterOfMars Sep 18, 2025
8b8da64
rename new fn
DaughterOfMars Sep 19, 2025
8d92ced
fix gas ownership check
DaughterOfMars Sep 22, 2025
514dfc0
Remove CustomMoveType and fix some issues
DaughterOfMars Sep 22, 2025
79bfa71
clippy
DaughterOfMars Sep 22, 2025
82c878b
reorganize builder files
DaughterOfMars Sep 23, 2025
eff3b8f
make `Res` a fn
DaughterOfMars Sep 23, 2025
a89a33c
Split out name and arg fns
DaughterOfMars Sep 23, 2025
9c9b7c9
update examples
DaughterOfMars Sep 23, 2025
23df6e1
Merge branch 'sdk-bindings' into feat/new-transaction-builder
DaughterOfMars Sep 23, 2025
4382a5f
add command builder for more convenience
DaughterOfMars Sep 23, 2025
509c8f0
missed underflow
DaughterOfMars Sep 23, 2025
f864c55
fix issues with dropping builder
DaughterOfMars Sep 23, 2025
abaaa5f
revert examples
DaughterOfMars Sep 24, 2025
19b6a52
add method for adding multiple gas coins
DaughterOfMars Sep 24, 2025
80489af
wizardry
DaughterOfMars Sep 24, 2025
3ad7456
missed things
DaughterOfMars Sep 24, 2025
19a420d
more improvements
DaughterOfMars Sep 24, 2025
d452ca2
cleanup
DaughterOfMars Sep 24, 2025
e9ab515
add `transfer_value`
DaughterOfMars Sep 24, 2025
de9f30e
doc and fix ordering
DaughterOfMars Sep 24, 2025
5bbf229
improve send_coins
DaughterOfMars Sep 24, 2025
d8651cf
add missing methods to ffi
DaughterOfMars Sep 24, 2025
536bd6f
update bindings
DaughterOfMars Sep 25, 2025
3575542
Merge branch 'sdk-bindings' into feat/new-transaction-builder
DaughterOfMars Sep 25, 2025
2a263e1
Merge branch 'sdk-bindings' into feat/new-transaction-builder
DaughterOfMars Sep 25, 2025
2e31891
Merge branch 'sdk-bindings' into feat/new-transaction-builder
DaughterOfMars Sep 25, 2025
1c71e1b
impl traits for more tuples
DaughterOfMars Sep 25, 2025
e0fd114
rename transfer_iota -> send_iota
DaughterOfMars Sep 25, 2025
1043b12
safety and remove unused fn
DaughterOfMars Sep 25, 2025
dff68be
impl PTBArguments for inputs
DaughterOfMars Sep 25, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ Cargo.lock
*.so
*.dll
__pycache__
build
63 changes: 17 additions & 46 deletions bindings/go/examples/generic_move_function/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
package main

import (
"encoding/binary"
"fmt"
"log"

Expand All @@ -17,64 +16,36 @@ func main() {
sender, _ := sdk.AddressFromHex("0x71b4b4f171b4355ff691b7c470579cf1a926f96f724e5f9a30efc4b5f75d085e")
gas_coin_id, _ := sdk.ObjectIdFromHex("0xa1d009e8dafe20b1cba05e08aea488aafae1f89d892c3eaef6c0994e155e441a")

gas_coin_obj, err := client.Object(gas_coin_id, nil)
if err.(*sdk.SdkFfiError) != nil {
log.Fatalf("Failed to fetch gas coin object: %v", err)
}
gas_coin := sdk.UnresolvedInputFromObject(*gas_coin_obj).WithOwnedKind()

reference_gas_price, err := client.ReferenceGasPrice(nil)
if err.(*sdk.SdkFfiError) != nil {
log.Fatalf("Failed to fetch reference gas price: %v", err)
}

builder := sdk.NewTransactionBuilder()
builder := sdk.TransactionBuilderInit(sender, client)

addr1, _ := sdk.AddressFromHex("0xde49ea53fbadee67d3e35a097cdbea210b659676fc680a0b0c5f11d0763d375e")
addr2, _ := sdk.AddressFromHex("0xe512234aa4ef6184c52663f09612b68f040dd0c45de037d96190a071ca5525b3")

addr1_arg := builder.Input(sdk.UnresolvedInputNewPure(addr1.ToBytes()))
addr2_arg := builder.Input(sdk.UnresolvedInputNewPure(addr2.ToBytes()))

address_type_tag := sdk.TypeTagNewAddress()
balance_type_tag := sdk.TypeTagNewU64()

buf := make([]byte, 8)
binary.LittleEndian.PutUint64(buf, 10_000_000)
bal1_arg := builder.Input(sdk.UnresolvedInputNewPure(buf))
binary.LittleEndian.PutUint64(buf, 20_000_000)
bal2_arg := builder.Input(sdk.UnresolvedInputNewPure(buf))
builder.MakeMoveVec([]*sdk.PtbArgument{sdk.PtbArgumentAddress(addr1), sdk.PtbArgumentAddress(addr2)}, sdk.TypeTagNewAddress(), "addresses")
builder.MakeMoveVec([]*sdk.PtbArgument{sdk.PtbArgumentU64(10_000_000), sdk.PtbArgumentU64(20_000_000)}, sdk.TypeTagNewU64(), "amounts")

arg1 := builder.MakeMoveVec(&address_type_tag, []*sdk.Argument{addr1_arg, addr2_arg})
arg2 := builder.MakeMoveVec(&balance_type_tag, []*sdk.Argument{bal1_arg, bal2_arg})

package_name, _ := sdk.AddressFromHex("0x2")
package_id, _ := sdk.AddressFromHex("0x2")
module_name, _ := sdk.NewIdentifier("vec_map")
function_name, _ := sdk.NewIdentifier("from_keys_values")

function := sdk.Function{Package: package_name,
Module: module_name,
Function: function_name,
TypeArgs: []*sdk.TypeTag{address_type_tag, balance_type_tag},
}

builder.MoveCall(function, []*sdk.Argument{arg1, arg2})
builder.MoveCall(
package_id,
module_name,
function_name,
[]*sdk.PtbArgument{sdk.PtbArgumentRes("addresses"), sdk.PtbArgumentRes("amounts")},
[]*sdk.TypeTag{sdk.TypeTagNewAddress(), sdk.TypeTagNewU64()},
nil,
)

builder.SetGasBudget(50_000_000)
builder.SetGasPrice(*reference_gas_price)
builder.SetSender(sender)
builder.AddGasObjects([]*sdk.UnresolvedInput{gas_coin})
builder.Gas(gas_coin_id).GasBudget(1000000000)

txn, err := builder.Finish()
if err != nil {
log.Fatalf("Failed to create transaction: %v", err)
res, err := builder.DryRun(false)
if err.(*sdk.SdkFfiError) != nil {
log.Fatalf("Failed to call generic Move function: %v", err)
}

skipChecks := false
res, err := client.DryRunTx(txn, &skipChecks)

if res.Error != nil {
log.Fatalf("Failed to call generic Move function: %v", err)
log.Fatalf("Failed to call generic Move function: %v", *res.Error)
}

fmt.Print("Successfully called generic Move function")
Expand Down
48 changes: 9 additions & 39 deletions bindings/go/examples/prepare_send_iota/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,50 +12,20 @@ import (
func main() {
client := sdk.GraphQlClientNewDevnet()

fromAddress, err := sdk.AddressFromHex("0x611830d3641a68f94a690dcc25d1f4b0dac948325ac18f6dd32564371735f32c")
if err != nil {
log.Fatalf("Failed to parse address: %v", err)
}
fromAddress, _ := sdk.AddressFromHex("0x611830d3641a68f94a690dcc25d1f4b0dac948325ac18f6dd32564371735f32c")

toAddress, err := sdk.AddressFromHex("0x0000a4984bd495d4346fa208ddff4f5d5e5ad48c21dec631ddebc99809f16900")
if err != nil {
log.Fatalf("Failed to parse address: %v", err)
}
toAddress, _ := sdk.AddressFromHex("0x0000a4984bd495d4346fa208ddff4f5d5e5ad48c21dec631ddebc99809f16900")

coinObjId, err := sdk.ObjectIdFromHex("0xd04077fe3b6fad13b3d4ed0d535b7ca92afcac8f0f2a0e0925fb9f4f0b30c699")
if err != nil {
log.Fatalf("Failed to parse object ID: %v", err)
}
coin, err := client.Object(coinObjId, nil)
if err.(*sdk.SdkFfiError) != nil {
log.Fatalf("Failed to get coin: %v", err)
}
coinObjId, _ := sdk.ObjectIdFromHex("0xd04077fe3b6fad13b3d4ed0d535b7ca92afcac8f0f2a0e0925fb9f4f0b30c699")

gasCoinObjId, err := sdk.ObjectIdFromHex("0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab")
if err != nil {
log.Fatalf("Failed to parse object ID: %v", err)
}
gasCoin, err := client.Object(gasCoinObjId, nil)
if err.(*sdk.SdkFfiError) != nil {
log.Fatalf("Failed to get gas coin: %v", err)
}
gasCoinObjId, _ := sdk.ObjectIdFromHex("0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab")

builder := sdk.NewTransactionBuilder()
objects := []*sdk.Argument{
builder.Input(sdk.UnresolvedInputFromObject(*coin).WithOwnedKind()),
}
builder.TransferObjects(objects, builder.Input(sdk.UnresolvedInputNewPure(toAddress.ToBytes())))
builder.SetSender(fromAddress)
builder.SetGasBudget(50000000)
gasPrice, err := client.ReferenceGasPrice(nil)
if err.(*sdk.SdkFfiError) != nil {
log.Fatalf("Failed to get gas price: %v", err)
}
builder.SetGasPrice(*gasPrice)
builder.AddGasObjects([]*sdk.UnresolvedInput{sdk.UnresolvedInputFromObject(*gasCoin).WithOwnedKind()})
builder := sdk.TransactionBuilderInit(fromAddress, client)
builder.TransferObjects(toAddress, []*sdk.PtbArgument{sdk.PtbArgumentObjectId(coinObjId)})
builder.Gas(gasCoinObjId).GasBudget(1000000000)

txn, err := builder.Finish()
if err != nil {
if err.(*sdk.SdkFfiError) != nil {
log.Fatalf("Failed to create transaction: %v", err)
}

Expand All @@ -66,7 +36,7 @@ func main() {
log.Printf("Signing Digest: %v", sdk.HexEncode(txn.SigningDigest()))
log.Printf("Txn Bytes: %v", sdk.Base64Encode(txnBytes))

res, err := client.DryRunTx(txn, nil)
res, err := builder.DryRun(false)
if err.(*sdk.SdkFfiError) != nil {
log.Fatalf("Failed to send IOTA: %v", err)
}
Expand Down
66 changes: 18 additions & 48 deletions bindings/go/examples/prepare_send_iota_multi/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
package main

import (
"fmt"
"log"

sdk "bindings/iota_sdk_ffi"
Expand All @@ -12,14 +13,9 @@ import (
func main() {
client := sdk.GraphQlClientNewDevnet()

senderAddress, err := sdk.AddressFromHex("0x611830d3641a68f94a690dcc25d1f4b0dac948325ac18f6dd32564371735f32c")
if err != nil {
log.Fatalf("Failed to parse sender address: %v", err)
}
gasCoinId, err := sdk.ObjectIdFromHex("0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab")
if err != nil {
log.Fatalf("Failed to parse gas coin id: %v", err)
}
sender, _ := sdk.AddressFromHex("0x611830d3641a68f94a690dcc25d1f4b0dac948325ac18f6dd32564371735f32c")

gasCoinId, _ := sdk.ObjectIdFromHex("0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab")

recipients := []struct {
address string
Expand All @@ -29,54 +25,28 @@ func main() {
{"0x2222b466a24399ebcf5ec0f04820812ae20fea1037c736cfec608753aa38b522", 2_000_000_000},
}

gasCoin, err := client.Object(gasCoinId, nil)
if err.(*sdk.SdkFfiError) != nil {
log.Fatalf("Failed to get gas coin: %v", err)
}

builder := sdk.NewTransactionBuilder()
builder := sdk.TransactionBuilderInit(sender, client)

// Prepare split amounts and recipient arguments
var splitAmountArgs []*sdk.Argument
var recipientArgs []*sdk.Argument
for _, r := range recipients {
// Convert uint64 to []byte (little endian)
amountBytes := make([]byte, 8)
for i := uint(0); i < 8; i++ {
amountBytes[i] = byte(r.amount >> (8 * i))
}
splitAmountArgs = append(splitAmountArgs, builder.Input(sdk.UnresolvedInputNewPure(amountBytes)))
recipientAddr, err := sdk.AddressFromHex(r.address)
if err != nil {
log.Fatalf("Failed to parse recipient address: %v", err)
}
recipientArgs = append(recipientArgs, builder.Input(sdk.UnresolvedInputNewPure(recipientAddr.ToBytes())))
// Prepare amounts and labels
var amounts []uint64
var labels []string
for idx, r := range recipients {
labels = append(labels, fmt.Sprintf("coin%v", idx))
amounts = append(amounts, r.amount)
}

// Split the gas coin into multiple coins
splitCoinsResult := builder.SplitCoins(builder.Gas(), splitAmountArgs)
builder.SplitCoins(gasCoinId, amounts, labels)

// Transfer each split coin to its corresponding recipient
for i, recipientArg := range recipientArgs {
coinPtr := splitCoinsResult.GetNestedResult(uint16(i))
if coinPtr == nil {
log.Fatalf("Failed to get split coin result at index %d", i)
}
coinArg := *coinPtr
builder.TransferObjects([]*sdk.Argument{coinArg}, recipientArg)
for idx, r := range recipients {
recipient, _ := sdk.AddressFromHex(r.address)
builder.TransferObjects(recipient, []*sdk.PtbArgument{sdk.PtbArgumentRes(labels[idx])})
}

builder.SetSender(senderAddress)
builder.SetGasBudget(50_000_000)
gasPrice, err := client.ReferenceGasPrice(nil)
if err.(*sdk.SdkFfiError) != nil {
log.Fatalf("Failed to get gas price: %v", err)
}
builder.SetGasPrice(*gasPrice)
builder.AddGasObjects([]*sdk.UnresolvedInput{sdk.UnresolvedInputFromObject(*gasCoin).WithOwnedKind()})
builder.Gas(gasCoinId).GasBudget(1000000000)

txn, err := builder.Finish()
if err != nil {
if err.(*sdk.SdkFfiError) != nil {
log.Fatalf("Failed to create transaction: %v", err)
}

Expand All @@ -87,7 +57,7 @@ func main() {
log.Printf("Signing Digest: %v", sdk.HexEncode(txn.SigningDigest()))
log.Printf("Txn Bytes: %v", sdk.Base64Encode(txnBytes))

res, err := client.DryRunTx(txn, nil)
res, err := builder.DryRun(false)
if err.(*sdk.SdkFfiError) != nil {
log.Fatalf("Failed to dry run send IOTA: %v", err)
}
Expand Down
81 changes: 20 additions & 61 deletions bindings/go/examples/stake/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,7 @@ import (
func main() {
client := sdk.GraphQlClientNewDevnet()

myAddress, err := sdk.AddressFromHex("0x611830d3641a68f94a690dcc25d1f4b0dac948325ac18f6dd32564371735f32c")
if err != nil {
log.Fatalf("Failed to parse address: %v", err)
}
myAddress, _ := sdk.AddressFromHex("0x611830d3641a68f94a690dcc25d1f4b0dac948325ac18f6dd32564371735f32c")

validators, err := client.ActiveValidators(nil, nil)
if err.(*sdk.SdkFfiError) != nil {
Expand All @@ -35,73 +32,35 @@ func main() {
}
log.Printf("Staking to validator %v", validatorName)

coinObjId, err := sdk.ObjectIdFromHex("0xd04077fe3b6fad13b3d4ed0d535b7ca92afcac8f0f2a0e0925fb9f4f0b30c699")
if err != nil {
log.Fatalf("Failed to parse object ID: %v", err)
}
coin, err := client.Object(coinObjId, nil)
if err.(*sdk.SdkFfiError) != nil {
log.Fatalf("Failed to get coin: %v", err)
}
coinObjId, _ := sdk.ObjectIdFromHex("0xd04077fe3b6fad13b3d4ed0d535b7ca92afcac8f0f2a0e0925fb9f4f0b30c699")

gasCoinObjId, err := sdk.ObjectIdFromHex("0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab")
if err != nil {
log.Fatalf("Failed to parse object ID: %v", err)
}
gasCoin, err := client.Object(gasCoinObjId, nil)
if err.(*sdk.SdkFfiError) != nil {
log.Fatalf("Failed to get gas coin: %v", err)
}
gasCoinObjId, _ := sdk.ObjectIdFromHex("0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab")

iotaSystemAddress, err := sdk.AddressFromHex("0x3")
if err != nil {
log.Fatalf("Failed to parse address: %v", err)
}
iotaSystemAddress, _ := sdk.AddressFromHex("0x3")

iotaSystemId, err := sdk.ObjectIdFromHex("0x5")
if err != nil {
log.Fatalf("Failed to parse object ID: %v", err)
}
iotaSystemId, _ := sdk.ObjectIdFromHex("0x5")

iotaSystemModule, err := sdk.NewIdentifier("iota_system")
if err != nil {
log.Fatalf("Failed to parse identifier: %v", err)
}
iotaSystemModule, _ := sdk.NewIdentifier("iota_system")

requestAddStakeFn, err := sdk.NewIdentifier("request_add_stake")
if err != nil {
log.Fatalf("Failed to parse identifier: %v", err)
}
requestAddStakeFn, _ := sdk.NewIdentifier("request_add_stake")

builder := sdk.TransactionBuilderInit(myAddress, client)

builder := sdk.NewTransactionBuilder()
inputs := []*sdk.Argument{
builder.Input(sdk.UnresolvedInputNewShared(iotaSystemId, 1, true)),
builder.Input(sdk.UnresolvedInputFromObject(*coin).WithOwnedKind()),
builder.Input(sdk.UnresolvedInputNewPure(validator.Address.ToBytes())),
}
builder.MoveCall(
sdk.Function{
Package: iotaSystemAddress,
Module: iotaSystemModule,
Function: requestAddStakeFn,
iotaSystemAddress,
iotaSystemModule,
requestAddStakeFn,
[]*sdk.PtbArgument{
sdk.PtbArgumentMutable(iotaSystemId),
sdk.PtbArgumentObjectId(coinObjId),
sdk.PtbArgumentAddress(validator.Address),
},
inputs,
nil,
nil,
)
builder.SetSender(myAddress)
builder.SetGasBudget(50000000)
gasPrice, err := client.ReferenceGasPrice(nil)
if err.(*sdk.SdkFfiError) != nil {
log.Fatalf("Failed to get gas price: %v", err)
}
builder.SetGasPrice(*gasPrice)
builder.AddGasObjects([]*sdk.UnresolvedInput{sdk.UnresolvedInputFromObject(*gasCoin).WithOwnedKind()})

txn, err := builder.Finish()
if err != nil {
log.Fatalf("Failed to create transaction: %v", err)
}
builder.Gas(gasCoinObjId).GasBudget(1000000000)

res, err := client.DryRunTx(txn, nil)
res, err := builder.DryRun(false)
if err.(*sdk.SdkFfiError) != nil {
log.Fatalf("Failed to get gas price: %v", err)
}
Expand Down
Loading
Loading