Skip to content

Commit 23f56e0

Browse files
committed
feat: add gas_sponsor example
1 parent 493da01 commit 23f56e0

File tree

4 files changed

+215
-0
lines changed

4 files changed

+215
-0
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
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("0x0000a4984bd495d4346fa208ddff4f5d5e5ad48c21dec631ddebc99809f16900")
16+
sponsor, _ := sdk.AddressFromHex("0x611830d3641a68f94a690dcc25d1f4b0dac948325ac18f6dd32564371735f32c")
17+
18+
builder := sdk.TransactionBuilderInit(sender, client)
19+
20+
packageAddr, _ := sdk.AddressFromHex("0x1")
21+
moduleName, _ := sdk.NewIdentifier("u8")
22+
functionName, _ := sdk.NewIdentifier("max")
23+
24+
builder.MoveCall(
25+
packageAddr,
26+
moduleName,
27+
functionName,
28+
[]*sdk.PtbArgument{sdk.PtbArgumentU8(0), sdk.PtbArgumentU8(1)},
29+
nil,
30+
nil,
31+
)
32+
33+
gasObjId, _ := sdk.ObjectIdFromHex("0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab")
34+
builder.Gas(gasObjId).Sponsor(sponsor)
35+
36+
txn, err := builder.Finish()
37+
if err.(*sdk.SdkFfiError) != nil {
38+
log.Fatalf("Failed to create transaction: %v", err)
39+
}
40+
41+
txnBytes, err := txn.BcsSerialize()
42+
if err != nil {
43+
log.Fatalf("Failed to serialize transaction: %v", err)
44+
}
45+
log.Printf("Signing Digest: %v", sdk.HexEncode(txn.SigningDigest()))
46+
log.Printf("Txn Bytes: %v", sdk.Base64Encode(txnBytes))
47+
48+
skipChecks := bool(false)
49+
res, err := client.DryRunTx(txn, &skipChecks)
50+
if err.(*sdk.SdkFfiError) != nil {
51+
log.Fatalf("Failed to send gas sponsor tx: %v", err)
52+
}
53+
54+
if res.Error != nil {
55+
log.Fatalf("Failed to send gas sponsor tx: %v", *res.Error)
56+
}
57+
58+
log.Print("Gas sponsor tx dry run was successful!")
59+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
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+
"0x0000a4984bd495d4346fa208ddff4f5d5e5ad48c21dec631ddebc99809f16900"
14+
)
15+
val sponsor =
16+
Address.fromHex(
17+
"0x611830d3641a68f94a690dcc25d1f4b0dac948325ac18f6dd32564371735f32c"
18+
)
19+
20+
val builder = TransactionBuilder.init(sender, client)
21+
22+
val packageAddr = Address.fromHex("0x1")
23+
val moduleName = Identifier("u8")
24+
val functionName = Identifier("max")
25+
26+
builder.moveCall(
27+
packageAddr,
28+
moduleName,
29+
functionName,
30+
listOf(PtbArgument.u8(0u), PtbArgument.u8(1u)),
31+
)
32+
33+
val gasObjId =
34+
ObjectId.fromHex(
35+
"0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab"
36+
)
37+
builder.gas(gasObjId).sponsor(sponsor)
38+
39+
val txn = builder.finish()
40+
41+
println("Signing Digest: ${hexEncode(txn.signingDigest())}")
42+
println("Txn Bytes: ${base64Encode(txn.bcsSerialize())}")
43+
44+
val res = client.dryRunTx(txn, false)
45+
46+
if (res.error != null) {
47+
throw Exception("Failed to send gas sponsor tx: ${res.error}")
48+
}
49+
50+
println("Gas sponsor tx dry run was successful!")
51+
} catch (e: Exception) {
52+
e.printStackTrace()
53+
}
54+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
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+
"0x0000a4984bd495d4346fa208ddff4f5d5e5ad48c21dec631ddebc99809f16900"
15+
)
16+
sponsor = Address.from_hex(
17+
"0x611830d3641a68f94a690dcc25d1f4b0dac948325ac18f6dd32564371735f32c"
18+
)
19+
20+
builder = await TransactionBuilder.init(sender, client)
21+
22+
package_addr = Address.from_hex("0x1")
23+
module_name = Identifier("u8")
24+
function_name = Identifier("max")
25+
26+
builder.move_call(
27+
package_addr,
28+
module_name,
29+
function_name,
30+
[PtbArgument.u8(0), PtbArgument.u8(1)],
31+
)
32+
33+
gas_obj_id = ObjectId.from_hex(
34+
"0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab"
35+
)
36+
builder.gas(gas_obj_id).sponsor(sponsor)
37+
38+
txn = await builder.finish()
39+
40+
print("Signing Digest:", hex_encode(txn.signing_digest()))
41+
print("Txn Bytes:", base64_encode(txn.bcs_serialize()))
42+
43+
res = await client.dry_run_tx(txn, False)
44+
if res.error is not None:
45+
raise Exception("Failed to send gas sponsor tx:", res.error)
46+
47+
print("Gas sponsor tx dry run was successful!")
48+
49+
except Exception as e:
50+
print(f"Error: {e}")
51+
52+
53+
if __name__ == "__main__":
54+
asyncio.run(main())
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
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_address =
17+
Address::from_str("0x0000a4984bd495d4346fa208ddff4f5d5e5ad48c21dec631ddebc99809f16900")?;
18+
let sponsor_address =
19+
Address::from_str("0x611830d3641a68f94a690dcc25d1f4b0dac948325ac18f6dd32564371735f32c")?;
20+
21+
let mut builder = TransactionBuilder::new(sender_address).with_client(client.clone());
22+
let tx = builder
23+
.move_call(Address::ONE, "u8", "max")
24+
.arguments((0u8, 1u8))
25+
.gas(ObjectId::from_str(
26+
"0x0b0270ee9d27da0db09651e5f7338dfa32c7ee6441ccefa1f6e305735bcfc7ab",
27+
)?)
28+
.sponsor(sponsor_address)
29+
.to_owned()
30+
.finish()
31+
.await?;
32+
33+
println!("Signing Digest: {}", hex::encode(tx.signing_digest()));
34+
println!(
35+
"Tx Bytes: {}",
36+
base64ct::Base64::encode_string(&bcs::to_bytes(&tx)?)
37+
);
38+
39+
let res = client.dry_run_tx(&tx, false).await?;
40+
41+
if let Some(err) = res.error {
42+
eyre::bail!("Failed to send gas sponsor tx: {err}");
43+
}
44+
45+
println!("Gas sponsor tx dry run was successful!");
46+
47+
Ok(())
48+
}

0 commit comments

Comments
 (0)